Checksum.Mod 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. MODULE Checksum; (** AUTHOR "GF"; PURPOSE "compute md5, sha1 and sha3 checksums" *)
  2. IMPORT Commands, Files, Streams, Hashes := CryptoHashes;
  3. VAR
  4. hexdigits: ARRAY 17 OF CHAR;
  5. PROCEDURE MD5*( c: Commands.Context );
  6. BEGIN
  7. Do( c, Hashes.NewHash( "CryptoMD5" ) )
  8. END MD5;
  9. PROCEDURE SHA1*( c: Commands.Context );
  10. BEGIN
  11. Do( c, Hashes.NewHash( "CryptoSHA1" ) )
  12. END SHA1;
  13. PROCEDURE SHA3*( c: Commands.Context );
  14. VAR h: Hashes.Hash;
  15. BEGIN
  16. h := Hashes.NewHash( "CryptoSHA3" );
  17. (* h.SetNameAndSize( "", 32 ) *) (* 256 bit, default *)
  18. Do( c, h )
  19. END SHA3;
  20. PROCEDURE Do( c: Commands.Context; h: Hashes.Hash );
  21. VAR
  22. f: Files.File; r: Files.Reader;
  23. fname: ARRAY 256 OF CHAR;
  24. BEGIN
  25. WHILE OpenNextFile( c, f ) DO
  26. Files.OpenReader( r, f, 0 );
  27. ComputeHash( r, h, c.out );
  28. f.GetName( fname );
  29. c.out.String( ' ' ); c.out.String( fname ); c.out.Ln;
  30. c.out.Update
  31. END;
  32. END Do;
  33. PROCEDURE OpenNextFile( c: Commands.Context; VAR f: Files.File ): BOOLEAN;
  34. VAR
  35. fname: ARRAY 64 OF CHAR;
  36. BEGIN
  37. IF c.arg.GetString( fname ) THEN
  38. f := Files.Old( fname );
  39. IF f = NIL THEN
  40. c.error.String( "File " ); c.error.String( fname ); c.error.String( " not fond" );
  41. c.error.Ln; c.error.Update;
  42. RETURN FALSE
  43. ELSE
  44. RETURN TRUE
  45. END
  46. ELSE
  47. RETURN FALSE
  48. END
  49. END OpenNextFile;
  50. PROCEDURE ComputeHash( r: Files.Reader; h: Hashes.Hash; out: Streams.Writer );
  51. VAR
  52. buf: ARRAY 128 OF CHAR;
  53. got, i, x: LONGINT;
  54. BEGIN
  55. h.Initialize;
  56. WHILE r.Available() > 0 DO
  57. r.Bytes( buf, 0, 64, got );
  58. h.Update( buf, 0, got )
  59. END;
  60. h.GetHash( buf, 0 );
  61. FOR i := 0 TO h.size - 1 DO
  62. x := ORD( buf[i] );
  63. out.Char( hexdigits[x DIV 16] );
  64. out.Char( hexdigits[x MOD 16] )
  65. END;
  66. END ComputeHash;
  67. BEGIN
  68. hexdigits := "0123456789abcdef"
  69. END Checksum.
  70. Checksum.MD5
  71. Files.Mod
  72. Unix.UnixFiles.Mod
  73. NoFile.Mod
  74. ~
  75. Checksum.SHA1 Files.Mod ~
  76. Checksum.SHA3 Files.Mod ~
  77. System.Free Checksum ~