CryptoCiphers.Mod 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. MODULE CryptoCiphers; (** empty cipher *)
  2. (* 2002.07.22 g.f. *)
  3. CONST
  4. (** cipher modes *)
  5. ECB* = 0; (** electronic codebook mode *)
  6. CBC* = 1; (** cipher-block chaining mode *)
  7. CTR* = 2; (** counter mode *)
  8. (** error codes *)
  9. Ok* = 0;
  10. TYPE
  11. Cipher* = OBJECT
  12. VAR
  13. name-: ARRAY 64 OF CHAR;
  14. blockSize-: LONGINT; (** cipher block size (bytes) *)
  15. isKeyInitialized*: BOOLEAN;
  16. mode-: SHORTINT; (** ECB, CBC *)
  17. len1, len2: INTEGER;
  18. PROCEDURE appsize( size: LONGINT );
  19. VAR i, t, d: LONGINT;
  20. BEGIN
  21. IF (size = 64) OR (size = 128) THEN RETURN END;
  22. len2 := len1; i := 0; t := 10000;
  23. WHILE t > size DO t := t DIV 10 END;
  24. REPEAT
  25. d := size DIV t MOD 10; name[len2] := CHR( 48 + d ); INC( len2 ); t := t DIV 10
  26. UNTIL t = 0;
  27. name[len2] := 0X
  28. END appsize;
  29. PROCEDURE appmode( CONST str: ARRAY OF CHAR );
  30. VAR i, j: INTEGER; c: CHAR;
  31. BEGIN
  32. j := len2; i := 0;
  33. REPEAT c := str[i]; INC( i ); name[j] := c; INC( j ) UNTIL c = 0X;
  34. END appmode;
  35. (** initialize key for de/encryption *)
  36. PROCEDURE InitKey*( CONST src: ARRAY OF CHAR; keybits: LONGINT );
  37. BEGIN
  38. appsize( keybits ); isKeyInitialized := TRUE
  39. END InitKey;
  40. (** set initialization vector, change mode to CBC; MUST be invoked AFTER Initkey *)
  41. PROCEDURE SetIV*( CONST src: ARRAY OF CHAR; mode: SHORTINT );
  42. BEGIN
  43. ASSERT( isKeyInitialized ); (* initKey must have been called before *)
  44. ASSERT( mode IN {CBC, CTR} );
  45. SELF.mode := mode;
  46. IF mode = CBC THEN appmode( "-cbc" ) ELSE appmode( "-ctr" ) END
  47. END SetIV;
  48. (** encrypts len bytes of data; len must be a multiple of blockSize *)
  49. PROCEDURE Encrypt*( VAR buf: ARRAY OF CHAR; pos, len: LONGINT );
  50. (* empty Cipher does nothing *)
  51. END Encrypt;
  52. (** decrypts len bytes of data; len must be a multiple of blockSize *)
  53. PROCEDURE Decrypt*( VAR buf: ARRAY OF CHAR; pos, len: LONGINT );
  54. (* empty Cipher does nothing *)
  55. END Decrypt;
  56. (** this method is invoked by subclasses; blocksize in bytes *)
  57. PROCEDURE SetNameAndBlocksize*( CONST name: ARRAY OF CHAR; size: LONGINT );
  58. BEGIN
  59. COPY( name, SELF.name ); len1 := 0;
  60. WHILE name[len1] # 0X DO INC( len1 ) END;
  61. len2 := len1; blockSize := size;
  62. END SetNameAndBlocksize;
  63. PROCEDURE & Init*;
  64. BEGIN
  65. mode := ECB; isKeyInitialized := FALSE;
  66. SetNameAndBlocksize( "empty cipher", 8 );
  67. END Init;
  68. END Cipher;
  69. CipherFactory = PROCEDURE ( ): Cipher;
  70. (** create a new cipher object of the subtype given in modname*)
  71. PROCEDURE NewCipher*( CONST modname: ARRAY OF CHAR ): Cipher;
  72. VAR cipher: Cipher; factory: CipherFactory;
  73. BEGIN
  74. cipher := NIL;
  75. IF modname # "" THEN
  76. GETPROCEDURE( modname, "NewCipher", factory );
  77. IF (factory # NIL ) THEN cipher := factory() END
  78. ELSE NEW( cipher )
  79. END;
  80. RETURN cipher;
  81. END NewCipher;
  82. END CryptoCiphers.