SSHGlobals.Mod 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. MODULE SSHGlobals;
  2. IMPORT SYSTEM,
  3. Texts, TextUtilities, UTF8Strings, Strings, Commands,
  4. Ciphers := CryptoCiphers, Out := KernelLog;
  5. CONST
  6. ConfigFile* = "SSH.Configuration.Text";
  7. HostkeysFile* = "SSH.KnownHosts.Data"; (* entries in openssh format! *)
  8. PrivateKeyFile* = "SSH.RSAKey.priv";
  9. PublicKeyFile* = "SSH.RSAKey.pub"; (* openssh format *)
  10. HT= 09X; CR = 0DX; NL = 0AX;
  11. TYPE
  12. Buffer = POINTER TO ARRAY OF CHAR;
  13. VAR
  14. buf: Buffer;
  15. bp: LONGINT; (* current position in buf *)
  16. debug-: SET; (* bits: {0}: verbose
  17. transport level:
  18. {1}: trace protocol,
  19. {2}: trace protocol more detailed
  20. {3}: show I/O packets (type only)
  21. {4}: show I/O packets (with contents)
  22. ....
  23. *)
  24. hexd: ARRAY 17 OF CHAR; (* constant *)
  25. (*-------------- Debugging -----------------------*)
  26. PROCEDURE SetDebug*( context: Commands.Context );
  27. VAR i: LONGINT;
  28. BEGIN
  29. IF context.arg.GetInteger( i, FALSE ) THEN
  30. debug := SYSTEM.VAL( SET, i )
  31. ELSE
  32. context.result := Commands.CommandParseError;
  33. END;
  34. END SetDebug;
  35. (*--------------- SSH configuration -----------------*)
  36. PROCEDURE NextLine;
  37. BEGIN
  38. REPEAT
  39. WHILE (buf[bp] = HT) OR (buf[bp] >= ' ') DO INC( bp ) END;
  40. WHILE (buf[bp] = CR) OR (buf[bp] = NL) DO INC( bp ) END
  41. UNTIL (buf[bp] # '#') OR (buf[bp] = 0X); (* skip comments *)
  42. END NextLine;
  43. PROCEDURE GetConfigString( VAR str: ARRAY OF CHAR );
  44. VAR i: LONGINT;
  45. BEGIN
  46. WHILE(buf[bp] = HT) OR (buf[bp] = ' ') DO INC( bp ) END;
  47. i := 0;
  48. WHILE buf[bp] > ' ' DO
  49. str[i] := buf[bp]; INC( i ); INC( bp )
  50. END;
  51. str[i] := 0X
  52. END GetConfigString;
  53. PROCEDURE GetConfigInt( VAR i: LONGINT );
  54. BEGIN
  55. WHILE(buf[bp] = HT) OR (buf[bp] = ' ') DO INC( bp ) END;
  56. i := 0;
  57. WHILE (buf[bp] >= '0') & (buf[bp] <= '9') DO
  58. i := 10*i + ORD( buf[bp] ) - ORD( '0' );
  59. INC( bp )
  60. END
  61. END GetConfigInt;
  62. PROCEDURE GetCipherList*( VAR list: ARRAY OF CHAR );
  63. VAR n: INTEGER;
  64. x: ARRAY 64 OF CHAR;
  65. BEGIN
  66. IF buf = NIL THEN buf := GetConfigBuffer() END;
  67. bp := 0; n := 0; COPY( "", list );
  68. IF buf[bp] = '#' THEN NextLine END;
  69. WHILE buf[bp] # 0X DO
  70. GetConfigString( x );
  71. IF x = "cipher" THEN
  72. GetConfigString( x );
  73. IF n > 0 THEN Strings.Append( list, "," ) END;
  74. Strings.Append( list, x ); INC( n );
  75. END;
  76. NextLine
  77. END
  78. END GetCipherList;
  79. PROCEDURE GetHMacList*( VAR list: ARRAY OF CHAR );
  80. VAR n: INTEGER;
  81. x: ARRAY 64 OF CHAR;
  82. BEGIN
  83. IF buf = NIL THEN buf := GetConfigBuffer() END;
  84. bp := 0; n := 0; COPY( "", list );
  85. IF buf[bp] = '#' THEN NextLine END;
  86. WHILE buf[bp] # 0X DO
  87. GetConfigString( x );
  88. IF x = "hmac" THEN
  89. GetConfigString( x );
  90. IF n > 0 THEN Strings.Append( list, "," ) END;
  91. Strings.Append( list, x ); INC( n );
  92. END;
  93. NextLine
  94. END
  95. END GetHMacList;
  96. PROCEDURE GetCipherParams*( CONST name: ARRAY OF CHAR;
  97. VAR modname: ARRAY OF CHAR;
  98. VAR bits: LONGINT;
  99. VAR mode: SHORTINT );
  100. VAR x: ARRAY 128 OF CHAR;
  101. BEGIN
  102. IF buf = NIL THEN buf := GetConfigBuffer() END;
  103. bp := 0;
  104. COPY( "unknown", modname ); bits := 0;
  105. IF buf[bp] = '#' THEN NextLine END;
  106. REPEAT
  107. GetConfigString( x );
  108. IF x = "cipher" THEN GetConfigString( x );
  109. IF x = name THEN
  110. GetConfigString( modname ); GetConfigInt( bits );
  111. GetConfigString( x );
  112. IF x = "CBC" THEN mode := Ciphers.CBC
  113. ELSIF x = "CTR" THEN mode := Ciphers.CTR
  114. ELSE mode := Ciphers.ECB
  115. END;
  116. END
  117. END;
  118. NextLine
  119. UNTIL (buf[bp] = 0X) OR (modname # "unknown")
  120. END GetCipherParams;
  121. PROCEDURE GetHMacParams*( CONST name: ARRAY OF CHAR;
  122. VAR modname: ARRAY OF CHAR; VAR bytes: LONGINT );
  123. VAR x: ARRAY 128 OF CHAR;
  124. BEGIN
  125. IF buf = NIL THEN buf := GetConfigBuffer() END;
  126. bp := 0;
  127. COPY( "unknown", modname ); bytes := 0;
  128. IF buf[bp] = '#' THEN NextLine END;
  129. REPEAT
  130. GetConfigString( x );
  131. IF x = "hmac" THEN GetConfigString( x );
  132. IF x = name THEN
  133. GetConfigString( modname ); GetConfigInt( bytes )
  134. END
  135. END;
  136. NextLine
  137. UNTIL (buf[bp] = 0X) OR (modname # "unknown")
  138. END GetHMacParams;
  139. PROCEDURE ExpandBuf( VAR buf: Buffer; newSize: LONGINT );
  140. VAR newBuf: Buffer; i: LONGINT;
  141. BEGIN
  142. IF LEN( buf^ ) >= newSize THEN RETURN END;
  143. NEW( newBuf, newSize );
  144. FOR i := 0 TO LEN( buf^ ) - 1 DO newBuf[i] := buf[i] END;
  145. buf := newBuf;
  146. END ExpandBuf;
  147. PROCEDURE GetConfigBuffer(): Buffer;
  148. VAR
  149. text: Texts.Text; r: Texts.TextReader;
  150. ch, format, len, i, j, bytesPerChar: LONGINT; res: WORD;
  151. buffer: Buffer;
  152. BEGIN
  153. NEW( text );
  154. TextUtilities.LoadAuto( text, ConfigFile, format, res );
  155. IF res # 0 THEN
  156. Out.String( "could not open file " ); Out.String( ConfigFile ); Out.Ln
  157. ELSE
  158. text.AcquireRead;
  159. NEW( r, text ); r.SetPosition( 0 );
  160. len := text.GetLength();
  161. bytesPerChar := 2;
  162. NEW( buffer, bytesPerChar*len );
  163. j := 0;
  164. FOR i := 0 TO len - 1 DO r.ReadCh( ch );
  165. WHILE ~UTF8Strings.EncodeChar( ch, buffer^, j ) DO
  166. (* buffer too small *)
  167. INC( bytesPerChar );
  168. ExpandBuf( buffer, bytesPerChar*len );
  169. END
  170. END;
  171. buffer[j] := 0X;
  172. text.ReleaseRead;
  173. RETURN buffer
  174. END
  175. END GetConfigBuffer;
  176. BEGIN
  177. buf := NIL;
  178. hexd := "0123456789ABCDEF";
  179. END SSHGlobals.