IdFIPS.pas 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. unit IdFIPS;
  2. interface
  3. {$I IdCompilerDefines.inc}
  4. {
  5. IMPORTANT!!!
  6. This unit does not directly provide FIPS support. It centralizes some Indy
  7. encryption functions and exposes a function to get and set a FIPS mode that is
  8. implemented by the library that hooks this unit.
  9. The idea is that Indy will not have a FIPS certification per se but will be
  10. able to utilize cryptographic modules that are FIPS compliant.
  11. In addition, this unit provides a way of centralizing all hashing and HMAC
  12. functions and to control dependancies in Indy.
  13. }
  14. uses
  15. IdException, IdGlobal
  16. {$IFDEF DOTNET}
  17. , System.Security.Cryptography
  18. {$ENDIF}
  19. ;
  20. type
  21. {$IFDEF DOTNET}
  22. TIdHashIntCtx = System.Security.Cryptography.HashAlgorithm;
  23. TIdHMACIntCtx = System.Security.Cryptography.HMAC;
  24. {$ELSE}
  25. TIdHashIntCtx = Pointer;
  26. TIdHMACIntCtx = Pointer;
  27. {$ENDIF}
  28. EIdFIPSAlgorithmNotAllowed = class(EIdException);
  29. TGetFIPSMode = function: Boolean;
  30. TSetFIPSMode = function(const AMode: Boolean): Boolean;
  31. TIsHashingIntfAvail = function: Boolean;
  32. TGetHashInst = function: TIdHashIntCtx;
  33. TUpdateHashInst = procedure(ACtx: TIdHashIntCtx; const AIn: TIdBytes);
  34. TFinalHashInst = function(ACtx: TIdHashIntCtx): TIdBytes;
  35. TIsHMACAvail = function : Boolean;
  36. TIsHMACIntfAvail = function : Boolean;
  37. TGetHMACInst = function (const AKey : TIdBytes) : TIdHMACIntCtx;
  38. TUpdateHMACInst = procedure(ACtx : TIdHMACIntCtx; const AIn: TIdBytes);
  39. TFinalHMACInst = function(ACtx: TIdHMACIntCtx): TIdBytes;
  40. TLoadHashLibrary = function: Boolean;
  41. TLoadNTLMLibrary = function: Boolean;
  42. TIsNTLMFuncsAvail = function: Boolean;
  43. TNTLMGetLmChallengeResponse = function(const APassword: String; const ANonce: TIdBytes): TIdBytes;
  44. TNTLMGetNtChallengeResponse = function(const APassword: String; const ANonce: TIdBytes): TIdBytes;
  45. var
  46. GetFIPSMode: TGetFIPSMode;
  47. SetFIPSMode: TSetFIPSMode;
  48. IsHashingIntfAvail: TIsHashingIntfAvail;
  49. GetMD2HashInst: TGetHashInst;
  50. IsMD2HashIntfAvail: TIsHashingIntfAvail;
  51. GetMD4HashInst: TGetHashInst;
  52. IsMD4HashIntfAvail: TIsHashingIntfAvail;
  53. GetMD5HashInst: TGetHashInst;
  54. IsMD5HashIntfAvail: TIsHashingIntfAvail;
  55. GetSHA1HashInst: TGetHashInst;
  56. IsSHA1HashIntfAvail: TIsHashingIntfAvail;
  57. GetSHA224HashInst: TGetHashInst;
  58. IsSHA224HashIntfAvail: TIsHashingIntfAvail;
  59. GetSHA256HashInst: TGetHashInst;
  60. IsSHA256HashIntfAvail: TIsHashingIntfAvail;
  61. GetSHA384HashInst: TGetHashInst;
  62. IsSHA384HashIntfAvail: TIsHashingIntfAvail;
  63. GetSHA512HashInst: TGetHashInst;
  64. IsSHA512HashIntfAvail: TIsHashingIntfAvail;
  65. UpdateHashInst: TUpdateHashInst;
  66. FinalHashInst: TFinalHashInst;
  67. IsHMACAvail : TIsHMACAvail;
  68. IsHMACMD5Avail : TIsHMACIntfAvail;
  69. GetHMACMD5HashInst: TGetHMACInst;
  70. IsHMACSHA1Avail : TIsHMACIntfAvail;
  71. GetHMACSHA1HashInst: TGetHMACInst;
  72. IsHMACSHA224Avail : TIsHMACIntfAvail;
  73. GetHMACSHA224HashInst: TGetHMACInst;
  74. IsHMACSHA256Avail : TIsHMACIntfAvail;
  75. GetHMACSHA256HashInst: TGetHMACInst;
  76. IsHMACSHA384Avail : TIsHMACIntfAvail;
  77. GetHMACSHA384HashInst: TGetHMACInst;
  78. IsHMACSHA512Avail : TIsHMACIntfAvail;
  79. GetHMACSHA512HashInst: TGetHMACInst;
  80. UpdateHMACInst : TUpdateHMACInst;
  81. FinalHMACInst : TFinalHMACInst;
  82. LoadHashLibrary : TLoadHashLibrary;
  83. LoadNTLMLibrary : TLoadNTLMLibrary;
  84. IsNTLMFuncsAvail : TIsNTLMFuncsAvail;
  85. NTLMGetLmChallengeResponse: TNTLMGetLmChallengeResponse;
  86. NTLMGetNtChallengeResponse: TNTLMGetNtChallengeResponse;
  87. procedure CheckMD2Permitted;
  88. procedure CheckMD4Permitted;
  89. procedure CheckMD5Permitted;
  90. procedure FIPSAlgorithmNotAllowed(const AAlgorithm: String);
  91. implementation
  92. uses
  93. IdResourceStringsProtocols, SysUtils;
  94. // TODO: for .NET, implement functions that use .NET Hash/HMAC classes
  95. procedure CheckMD2Permitted; {$IFDEF USE_INLINE} inline; {$ENDIF}
  96. begin
  97. if GetFIPSMode then begin
  98. FIPSAlgorithmNotAllowed('MD2');
  99. end;
  100. end;
  101. procedure CheckMD4Permitted; {$IFDEF USE_INLINE} inline; {$ENDIF}
  102. begin
  103. if GetFIPSMode then begin
  104. FIPSAlgorithmNotAllowed('MD4');
  105. end;
  106. end;
  107. procedure CheckMD5Permitted; {$IFDEF USE_INLINE} inline; {$ENDIF}
  108. begin
  109. if GetFIPSMode then begin
  110. FIPSAlgorithmNotAllowed('MD5');
  111. end;
  112. end;
  113. procedure FIPSAlgorithmNotAllowed(const AAlgorithm: String);
  114. {$IFDEF USE_INLINE} inline; {$ENDIF}
  115. begin
  116. raise EIdFIPSAlgorithmNotAllowed.CreateFmt(RSFIPSAlgorithmNotAllowed, [AAlgorithm]);
  117. end;
  118. // fips mode default procs
  119. function DefGetFIPSMode: Boolean;
  120. begin
  121. Result := False;
  122. end;
  123. function DefSetFIPSMode(const AMode: Boolean): Boolean;
  124. begin
  125. // leave this empty as we may not be using something that supports FIPS
  126. Result := False;
  127. end;
  128. function DefIsHashingIntfAvail: Boolean;
  129. begin
  130. Result := False;
  131. end;
  132. function DefIsHashIntfAvail: Boolean;
  133. begin
  134. Result := False;
  135. end;
  136. function DefGetHashInst : TIdHashIntCtx;
  137. begin
  138. Result := nil;
  139. end;
  140. procedure DefUpdateHashInst(ACtx: TIdHashIntCtx; const AIn: TIdBytes);
  141. begin
  142. end;
  143. function DefFinalHashInst(ACtx: TIdHashIntCtx): TIdBytes;
  144. begin
  145. SetLength(Result, 0);
  146. end;
  147. function DefIsHMACAvail : Boolean;
  148. begin
  149. Result := False;
  150. end;
  151. function DefIsHMACIntfAvail: Boolean;
  152. begin
  153. Result := False;
  154. end;
  155. function DefGetHMACInst(const AKey : TIdBytes) : TIdHMACIntCtx;
  156. begin
  157. Result := nil;
  158. end;
  159. procedure DefUpdateHMACInst(ACtx : TIdHMACIntCtx; const AIn: TIdBytes);
  160. begin
  161. end;
  162. function DefFinalHMACInst(ACtx: TIdHMACIntCtx): TIdBytes;
  163. begin
  164. SetLength(Result, 0);
  165. end;
  166. function DefLoadHashLibrary: Boolean;
  167. begin
  168. Result := False;
  169. end;
  170. function DefLoadNTLMLibrary: Boolean;
  171. begin
  172. Result := False;
  173. end;
  174. function DefIsNTLMFuncsAvail: Boolean;
  175. begin
  176. Result := False;
  177. end;
  178. function DefNTLMGetLmChallengeResponse(const APassword: String; const ANonce: TIdBytes): TIdBytes;
  179. begin
  180. SetLength(Result, 0);
  181. end;
  182. function DefNTLMGetNtChallengeResponse(const APassword: String; const ANonce: TIdBytes): TIdBytes;
  183. begin
  184. SetLength(Result, 0);
  185. end;
  186. initialization
  187. GetFIPSMode := DefGetFIPSMode;
  188. SetFIPSMode := DefSetFIPSMode;
  189. IsHashingIntfAvail := DefIsHashingIntfAvail;
  190. IsMD2HashIntfAvail := DefIsHashIntfAvail;
  191. GetMD2HashInst := DefGetHashInst;
  192. IsMD4HashIntfAvail := DefIsHashIntfAvail;
  193. GetMD4HashInst := DefGetHashInst;
  194. IsMD5HashIntfAvail := DefIsHashIntfAvail;
  195. GetMD5HashInst := DefGetHashInst;
  196. IsSHA1HashIntfAvail := DefIsHashIntfAvail;
  197. GetSHA1HashInst := DefGetHashInst;
  198. IsSHA224HashIntfAvail := DefIsHashIntfAvail;
  199. GetSHA224HashInst := DefGetHashInst;
  200. IsSHA256HashIntfAvail := DefIsHashIntfAvail;
  201. GetSHA256HashInst := DefGetHashInst;
  202. IsSHA384HashIntfAvail := DefIsHashIntfAvail;
  203. GetSHA384HashInst := DefGetHashInst;
  204. IsSHA512HashIntfAvail := DefIsHashIntfAvail;
  205. GetSHA512HashInst := DefGetHashInst;
  206. UpdateHashInst := DefUpdateHashInst;
  207. FinalHashInst := DefFinalHashInst;
  208. IsHMACAvail := DefIsHMACAvail;
  209. IsHMACMD5Avail := DefIsHMACIntfAvail;
  210. GetHMACMD5HashInst := DefGetHMACInst;
  211. IsHMACSHA1Avail := DefIsHMACIntfAvail;
  212. GetHMACSHA1HashInst := DefGetHMACInst;
  213. IsHMACSHA224Avail := DefIsHMACIntfAvail;
  214. GetHMACSHA224HashInst := DefGetHMACInst;
  215. IsHMACSHA256Avail := DefIsHMACIntfAvail;
  216. GetHMACSHA256HashInst := DefGetHMACInst;
  217. IsHMACSHA384Avail := DefIsHMACIntfAvail;
  218. GetHMACSHA384HashInst := DefGetHMACInst;
  219. IsHMACSHA512Avail := DefIsHMACIntfAvail;
  220. GetHMACSHA512HashInst := DefGetHMACInst;
  221. UpdateHMACInst := DefUpdateHMACInst;
  222. FinalHMACInst := DefFinalHMACInst;
  223. LoadHashLibrary := DefLoadHashLibrary;
  224. LoadNTLMLibrary := DefLoadNTLMLibrary;
  225. IsNTLMFuncsAvail := DefIsNTLMFuncsAvail;
  226. NTLMGetLmChallengeResponse := DefNTLMGetLmChallengeResponse;
  227. NTLMGetNtChallengeResponse := DefNTLMGetNtChallengeResponse;
  228. end.