CryptoDiffieHellman.Mod 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. MODULE CryptoDiffieHellman;
  2. IMPORT B := CryptoBigNumbers, Log := KernelLog;
  3. TYPE
  4. DH* = OBJECT
  5. VAR
  6. p, g: B.BigNumber;
  7. priv: B.BigNumber;
  8. initstate: SET32;
  9. PROCEDURE & Init*( prkeybits: INTEGER; CONST pname: ARRAY OF CHAR );
  10. BEGIN
  11. ASSERT( (prkeybits > 0) OR (pname # "") );
  12. IF pname # "" THEN
  13. GetDHPrime( pname, p, g ); priv := B.NewRandRange( p );
  14. initstate := {1, 2, 3}
  15. ELSE
  16. priv := B.NewRand( prkeybits, 1, 0 );
  17. initstate := {3}
  18. END;
  19. END Init;
  20. PROCEDURE ComputeKey*( pub: B.BigNumber ): B.BigNumber;
  21. BEGIN
  22. ASSERT( initstate = {1, 2, 3} );
  23. RETURN B.ModExp( pub, priv, p );
  24. END ComputeKey;
  25. PROCEDURE GenPubKey*( ): B.BigNumber;
  26. BEGIN
  27. ASSERT( initstate = {1, 2, 3} );
  28. RETURN B.ModExp( g, priv, p );
  29. END GenPubKey;
  30. PROCEDURE SetPrime*( prime, gen: B.BigNumber );
  31. BEGIN
  32. B.Copy( prime, p ); B.Copy( gen, g );
  33. initstate := initstate + {1, 2}
  34. END SetPrime;
  35. PROCEDURE SetPrivKey*( key: B.BigNumber );
  36. BEGIN
  37. B.Copy( key, priv );
  38. initstate := initstate + {3}
  39. END SetPrivKey;
  40. END DH;
  41. PROCEDURE GetDHPrime( CONST name: ARRAY OF CHAR; VAR p, g: B.BigNumber );
  42. VAR
  43. buf: ARRAY 1048 OF CHAR;
  44. pos: LONGINT;
  45. PROCEDURE Append( CONST val: ARRAY OF CHAR );
  46. VAR i: LONGINT; c: CHAR;
  47. BEGIN
  48. FOR i := 0 TO LEN( val ) - 1 DO
  49. c := val[i];
  50. IF c > ' ' THEN buf[pos] := c; INC( pos ) END
  51. END;
  52. END Append;
  53. BEGIN
  54. IF name = "dh.ssl.192" THEN (* openssl 1.0 *)
  55. pos := 0;
  56. Append( "D4A0BA02 50B6FD2E C626E7EF D637DF76 C716E22D 0944B88B" );
  57. B.AssignHex( p, buf, 48 );
  58. B.AssignInt( g, 3 )
  59. ELSIF name = "dh.ssl.512" THEN (* openssl 1.0 *)
  60. pos := 0;
  61. Append( "DA583C16 D9852289 D0E4AF75 6F4CCA92 DD4BE533 B804FB0F" );
  62. Append( "ED94EF9C 8A4403ED 574650D3 6999DB29 D776276B A2D3D412" );
  63. Append( "E218F4DD 1E084CF6 D8003E7C 4774E833" );
  64. B.AssignHex( p, buf, 128 );
  65. B.AssignInt( g, 2 );
  66. ELSIF name = "dh.ssl.1024" THEN (* openssl 1.0 *)
  67. pos := 0;
  68. Append( "F881897D 1424C5D1 E6F7BF3A E490F4FC 73FB34B5 FA4C56A2" );
  69. Append( "EAA7E9C0 C0CE89E1 FA633FB0 6B3266F1 D17BB000 8FCA87C2" );
  70. Append( "AE988926 17C205D2 EC08D08C FF17528C C5079303 B1F62FB8" );
  71. Append( "1C524727 1BDBD18D 9D691D52 4B3281AA 7F00C8DC E6D9CCC1" );
  72. Append( "112D3734 6CEA0297 4B0EBBB1 71330915 FDDD2387 075E89AB" );
  73. Append( "6B7C5FEC A624DC53" );
  74. B.AssignHex( p, buf, 256 );
  75. B.AssignInt( g, 2 )
  76. ELSIF name = "dh.1536.MODP" THEN (* rfc 2409 *)
  77. pos := 0;
  78. Append( "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" );
  79. Append( "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" );
  80. Append( "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" );
  81. Append( "E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF" );
  82. B.AssignHex( p, buf, 192 );
  83. B.AssignInt( g, 2 )
  84. ELSIF name = "dh.ssh.group1" THEN (* rfc 2409 *)
  85. pos := 0;
  86. Append( "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" );
  87. Append( "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" );
  88. Append( "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" );
  89. Append( "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" );
  90. Append( "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381" );
  91. Append( "FFFFFFFF FFFFFFFF" );
  92. B.AssignHex( p, buf, 256 );
  93. B.AssignInt( g, 2 )
  94. ELSIF name = "dh.ssh.group14" THEN (* rfc 3526 *)
  95. pos := 0;
  96. Append( "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" );
  97. Append( "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" );
  98. Append( "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" );
  99. Append( "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" );
  100. Append( "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" );
  101. Append( "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" );
  102. Append( "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" );
  103. Append( "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" );
  104. Append( "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" );
  105. Append( "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" );
  106. Append( "15728E5A 8AACAA68 FFFFFFFF FFFFFFFF" );
  107. B.AssignHex( p, buf, 512 );
  108. B.AssignInt( g, 2 )
  109. ELSIF name = "dh.1024.MODP.160" THEN (* rfc 5140 *)
  110. pos := 0;
  111. Append( "B10B8F96 A080E01D DE92DE5E AE5D54EC 52C99FBC FB06A3C6" );
  112. Append( "9A6A9DCA 52D23B61 6073E286 75A23D18 9838EF1E 2EE652C0" );
  113. Append( "13ECB4AE A9061123 24975C3C D49B83BF ACCBDD7D 90C4BD70" );
  114. Append( "98488E9C 219A7372 4EFFD6FA E5644738 FAA31A4F F55BCCC0" );
  115. Append( "A151AF5F 0DC8B4BD 45BF37DF 365C1A65 E68CFDA7 6D4DA708" );
  116. Append( "DF1FB2BC 2E4A4371" );
  117. B.AssignHex( p, buf, 256 );
  118. pos := 0;
  119. Append( "A4D1CBD5 C3FD3412 6765A442 EFB99905 F8104DD2 58AC507F" );
  120. Append( "D6406CFF 14266D31 266FEA1E 5C41564B 777E690F 5504F213" );
  121. Append( "160217B4 B01B886A 5E91547F 9E2749F4 D7FBD7D3 B9A92EE1" );
  122. Append( "909D0D22 63F80A76 A6A24C08 7A091F53 1DBF0A01 69B6A28A" );
  123. Append( "D662A4D1 8E73AFA3 2D779D59 18D08BC8 858F4DCE F97C2A24" );
  124. Append( "855E6EEB 22B3B2E5" );
  125. B.AssignHex( g, buf, 256 );
  126. ELSIF name = "dh.2048.MODP.224" THEN (* rfc 5140 *)
  127. pos := 0;
  128. Append( "AD107E1E 9123A9D0 D660FAA7 9559C51F A20D64E5 683B9FD1" );
  129. Append( "B54B1597 B61D0A75 E6FA141D F95A56DB AF9A3C40 7BA1DF15" );
  130. Append( "EB3D688A 309C180E 1DE6B85A 1274A0A6 6D3F8152 AD6AC212" );
  131. Append( "9037C9ED EFDA4DF8 D91E8FEF 55B7394B 7AD5B7D0 B6C12207" );
  132. Append( "C9F98D11 ED34DBF6 C6BA0B2C 8BBC27BE 6A00E0A0 B9C49708" );
  133. Append( "B3BF8A31 70918836 81286130 BC8985DB 1602E714 415D9330" );
  134. Append( "278273C7 DE31EFDC 7310F712 1FD5A074 15987D9A DC0A486D" );
  135. Append( "CDF93ACC 44328387 315D75E1 98C641A4 80CD86A1 B9E587E8" );
  136. Append( "BE60E69C C928B2B9 C52172E4 13042E9B 23F10B0E 16E79763" );
  137. Append( "C9B53DCF 4BA80A29 E3FB73C1 6B8E75B9 7EF363E2 FFA31F71" );
  138. Append( "CF9DE538 4E71B81C 0AC4DFFE 0C10E64F" );
  139. B.AssignHex( p, buf, 512 );
  140. pos := 0;
  141. Append( "AC4032EF 4F2D9AE3 9DF30B5C 8FFDAC50 6CDEBE7B 89998CAF" );
  142. Append( "74866A08 CFE4FFE3 A6824A4E 10B9A6F0 DD921F01 A70C4AFA" );
  143. Append( "AB739D77 00C29F52 C57DB17C 620A8652 BE5E9001 A8D66AD7" );
  144. Append( "C1766910 1999024A F4D02727 5AC1348B B8A762D0 521BC98A" );
  145. Append( "E2471504 22EA1ED4 09939D54 DA7460CD B5F6C6B2 50717CBE" );
  146. Append( "F180EB34 118E98D1 19529A45 D6F83456 6E3025E3 16A330EF" );
  147. Append( "BB77A86F 0C1AB15B 051AE3D4 28C8F8AC B70A8137 150B8EEB" );
  148. Append( "10E183ED D19963DD D9E263E4 770589EF 6AA21E7F 5F2FF381" );
  149. Append( "B539CCE3 409D13CD 566AFBB4 8D6C0191 81E1BCFE 94B30269" );
  150. Append( "EDFE72FE 9B6AA4BD 7B5A0F1C 71CFFF4C 19C418E1 F6EC0179" );
  151. Append( "81BC087F 2A7065B3 84B890D3 191F2BFA" );
  152. B.AssignHex( g, buf, 512 );
  153. ELSIF name = "dh.2048.MODP.256" THEN (* rfc 5140 *)
  154. pos := 0;
  155. Append( "87A8E61D B4B6663C FFBBD19C 65195999 8CEEF608 660DD0F2" );
  156. Append( "5D2CEED4 435E3B00 E00DF8F1 D61957D4 FAF7DF45 61B2AA30" );
  157. Append( "16C3D911 34096FAA 3BF4296D 830E9A7C 209E0C64 97517ABD" );
  158. Append( "5A8A9D30 6BCF67ED 91F9E672 5B4758C0 22E0B1EF 4275BF7B" );
  159. Append( "6C5BFC11 D45F9088 B941F54E B1E59BB8 BC39A0BF 12307F5C" );
  160. Append( "4FDB70C5 81B23F76 B63ACAE1 CAA6B790 2D525267 35488A0E" );
  161. Append( "F13C6D9A 51BFA4AB 3AD83477 96524D8E F6A167B5 A41825D9" );
  162. Append( "67E144E5 14056425 1CCACB83 E6B486F6 B3CA3F79 71506026" );
  163. Append( "C0B857F6 89962856 DED4010A BD0BE621 C3A3960A 54E710C3" );
  164. Append( "75F26375 D7014103 A4B54330 C198AF12 6116D227 6E11715F" );
  165. Append( "693877FA D7EF09CA DB094AE9 1E1A1597" );
  166. B.AssignHex( p, buf, 512 );
  167. pos := 0;
  168. Append( "3FB32C9B 73134D0B 2E775066 60EDBD48 4CA7B18F 21EF2054" );
  169. Append( "07F4793A 1A0BA125 10DBC150 77BE463F FF4FED4A AC0BB555" );
  170. Append( "BE3A6C1B 0C6B47B1 BC3773BF 7E8C6F62 901228F8 C28CBB18" );
  171. Append( "A55AE313 41000A65 0196F931 C77A57F2 DDF463E5 E9EC144B" );
  172. Append( "777DE62A AAB8A862 8AC376D2 82D6ED38 64E67982 428EBC83" );
  173. Append( "1D14348F 6F2F9193 B5045AF2 767164E1 DFC967C1 FB3F2E55" );
  174. Append( "A4BD1BFF E83B9C80 D052B985 D182EA0A DB2A3B73 13D3FE14" );
  175. Append( "C8484B1E 052588B9 B7D2BBD2 DF016199 ECD06E15 57CD0915" );
  176. Append( "B3353BBB 64E0EC37 7FD02837 0DF92B52 C7891428 CDC67EB6" );
  177. Append( "184B523D 1DB246C3 2F630784 90F00EF8 D647D148 D4795451" );
  178. Append( "5E2327CF EF98C582 664B4C0F 6CC41659" );
  179. B.AssignHex( g, buf, 512 );
  180. ELSE
  181. Log.String( "### unknown Diffie Hellman prime '" ); Log.String( name ); Log.String( "' " );
  182. Log.Ln;
  183. HALT( 99 )
  184. END ;
  185. END GetDHPrime;
  186. END CryptoDiffieHellman.