ClpSignerUtilities.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. { *********************************************************************************** }
  2. { * CryptoLib Library * }
  3. { * Copyright (c) 2018 Ugochukwu Mmaduekwe * }
  4. { * Github Repository <https://github.com/Xor-el> * }
  5. { * Distributed under the MIT software license, see the accompanying file LICENSE * }
  6. { * or visit http://www.opensource.org/licenses/mit-license.php. * }
  7. { * Acknowledgements: * }
  8. { * * }
  9. { * Thanks to Sphere 10 Software (http://sphere10.com) for sponsoring * }
  10. { * the development of this library * }
  11. { * ******************************************************************************* * }
  12. (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
  13. unit ClpSignerUtilities;
  14. {$I ..\Include\CryptoLib.inc}
  15. interface
  16. uses
  17. SysUtils,
  18. Generics.Collections,
  19. ClpCryptoLibTypes,
  20. HlpHashFactory,
  21. HlpIHash,
  22. ClpDsaDigestSigner,
  23. ClpECSchnorrSigner,
  24. ClpX9ObjectIdentifiers,
  25. ClpTeleTrusTObjectIdentifiers,
  26. ClpCryptoProObjectIdentifiers,
  27. ClpECDsaSigner,
  28. ClpIECDsaSigner,
  29. ClpISigner,
  30. ClpIDerObjectIdentifier;
  31. resourcestring
  32. SMechanismNil = 'Mechanism';
  33. SAlgorithmNil = 'Algorithm';
  34. SUnRecognizedAlgorithm = 'Signer " %s " not recognised.';
  35. type
  36. /// <summary>
  37. /// Signer Utility class contains methods that can not be specifically
  38. /// grouped into other classes.
  39. /// </summary>
  40. TSignerUtilities = class sealed(TObject)
  41. strict private
  42. class var
  43. Falgorithms: TDictionary<String, String>;
  44. Foids: TDictionary<String, IDerObjectIdentifier>;
  45. class function GetAlgorithms: TCryptoLibStringArray; static; inline;
  46. class constructor CreateSignerUtilities();
  47. class destructor DestroySignerUtilities();
  48. public
  49. /// <summary>
  50. /// Returns an ObjectIdentifier for a given encoding.
  51. /// </summary>
  52. /// <param name="mechanism">A string representation of the encoding.</param>
  53. /// <returns>A DerObjectIdentifier, null if the OID is not available.</returns>
  54. // TODO Don't really want to support this
  55. class function GetObjectIdentifier(mechanism: String): IDerObjectIdentifier;
  56. static; inline;
  57. class function GetEncodingName(const oid: IDerObjectIdentifier): String;
  58. static; inline;
  59. class function GetSigner(const id: IDerObjectIdentifier): ISigner; overload;
  60. static; inline;
  61. class function GetSigner(algorithm: String): ISigner; overload; static;
  62. class property Algorithms: TCryptoLibStringArray read GetAlgorithms;
  63. end;
  64. implementation
  65. { TSignerUtilities }
  66. class constructor TSignerUtilities.CreateSignerUtilities;
  67. begin
  68. Falgorithms := TDictionary<String, String>.Create();
  69. Foids := TDictionary<String, IDerObjectIdentifier>.Create();
  70. TX9ObjectIdentifiers.Boot;
  71. TTeleTrusTObjectIdentifiers.Boot;
  72. TCryptoProObjectIdentifiers.Boot;
  73. Falgorithms.Add('NONEWITHECDSA', 'NONEwithECDSA');
  74. Falgorithms.Add('ECDSAWITHNONE', 'NONEwithECDSA');
  75. Falgorithms.Add('ECDSA', 'SHA-1withECDSA');
  76. Falgorithms.Add('SHA1/ECDSA', 'SHA-1withECDSA');
  77. Falgorithms.Add('SHA-1/ECDSA', 'SHA-1withECDSA');
  78. Falgorithms.Add('ECDSAWITHSHA1', 'SHA-1withECDSA');
  79. Falgorithms.Add('ECDSAWITHSHA-1', 'SHA-1withECDSA');
  80. Falgorithms.Add('SHA1WITHECDSA', 'SHA-1withECDSA');
  81. Falgorithms.Add('SHA-1WITHECDSA', 'SHA-1withECDSA');
  82. Falgorithms.Add(TX9ObjectIdentifiers.ECDsaWithSha1.id, 'SHA-1withECDSA');
  83. Falgorithms.Add(TTeleTrusTObjectIdentifiers.ECSignWithSha1.id,
  84. 'SHA-1withECDSA');
  85. Falgorithms.Add('SHA224/ECDSA', 'SHA-224withECDSA');
  86. Falgorithms.Add('SHA-224/ECDSA', 'SHA-224withECDSA');
  87. Falgorithms.Add('ECDSAWITHSHA224', 'SHA-224withECDSA');
  88. Falgorithms.Add('ECDSAWITHSHA-224', 'SHA-224withECDSA');
  89. Falgorithms.Add('SHA224WITHECDSA', 'SHA-224withECDSA');
  90. Falgorithms.Add('SHA-224WITHECDSA', 'SHA-224withECDSA');
  91. Falgorithms.Add(TX9ObjectIdentifiers.ECDsaWithSha224.id, 'SHA-224withECDSA');
  92. Falgorithms.Add('SHA256/ECDSA', 'SHA-256withECDSA');
  93. Falgorithms.Add('SHA-256/ECDSA', 'SHA-256withECDSA');
  94. Falgorithms.Add('ECDSAWITHSHA256', 'SHA-256withECDSA');
  95. Falgorithms.Add('ECDSAWITHSHA-256', 'SHA-256withECDSA');
  96. Falgorithms.Add('SHA256WITHECDSA', 'SHA-256withECDSA');
  97. Falgorithms.Add('SHA-256WITHECDSA', 'SHA-256withECDSA');
  98. Falgorithms.Add(TX9ObjectIdentifiers.ECDsaWithSha256.id, 'SHA-256withECDSA');
  99. Falgorithms.Add('SHA384/ECDSA', 'SHA-384withECDSA');
  100. Falgorithms.Add('SHA-384/ECDSA', 'SHA-384withECDSA');
  101. Falgorithms.Add('ECDSAWITHSHA384', 'SHA-384withECDSA');
  102. Falgorithms.Add('ECDSAWITHSHA-384', 'SHA-384withECDSA');
  103. Falgorithms.Add('SHA384WITHECDSA', 'SHA-384withECDSA');
  104. Falgorithms.Add('SHA-384WITHECDSA', 'SHA-384withECDSA');
  105. Falgorithms.Add(TX9ObjectIdentifiers.ECDsaWithSha384.id, 'SHA-384withECDSA');
  106. Falgorithms.Add('SHA512/ECDSA', 'SHA-512withECDSA');
  107. Falgorithms.Add('SHA-512/ECDSA', 'SHA-512withECDSA');
  108. Falgorithms.Add('ECDSAWITHSHA512', 'SHA-512withECDSA');
  109. Falgorithms.Add('ECDSAWITHSHA-512', 'SHA-512withECDSA');
  110. Falgorithms.Add('SHA512WITHECDSA', 'SHA-512withECDSA');
  111. Falgorithms.Add('SHA-512WITHECDSA', 'SHA-512withECDSA');
  112. Falgorithms.Add(TX9ObjectIdentifiers.ECDsaWithSha512.id, 'SHA-512withECDSA');
  113. Falgorithms.Add('RIPEMD160/ECDSA', 'RIPEMD160withECDSA');
  114. Falgorithms.Add('ECDSAWITHRIPEMD160', 'RIPEMD160withECDSA');
  115. Falgorithms.Add('RIPEMD160WITHECDSA', 'RIPEMD160withECDSA');
  116. Falgorithms.Add(TTeleTrusTObjectIdentifiers.ECSignWithRipeMD160.id,
  117. 'RIPEMD160withECDSA');
  118. // Falgorithms.Add('GOST-3410', 'GOST3410');
  119. // Falgorithms.Add('GOST-3410-94', 'GOST3410');
  120. // Falgorithms.Add('GOST3411WITHGOST3410', 'GOST3410');
  121. // Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94.id,
  122. // 'GOST3410');
  123. // Falgorithms.Add('ECGOST-3410', 'ECGOST3410');
  124. // Falgorithms.Add('ECGOST-3410-2001', 'ECGOST3410');
  125. // Falgorithms.Add('GOST3411WITHECGOST3410', 'ECGOST3410');
  126. // Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001.id,
  127. // 'ECGOST3410');
  128. Foids.Add('SHA-1withECDSA', TX9ObjectIdentifiers.ECDsaWithSha1);
  129. Foids.Add('SHA-224withECDSA', TX9ObjectIdentifiers.ECDsaWithSha224);
  130. Foids.Add('SHA-256withECDSA', TX9ObjectIdentifiers.ECDsaWithSha256);
  131. Foids.Add('SHA-384withECDSA', TX9ObjectIdentifiers.ECDsaWithSha384);
  132. Foids.Add('SHA-512withECDSA', TX9ObjectIdentifiers.ECDsaWithSha512);
  133. // Foids.Add('GOST3410',
  134. // TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
  135. //
  136. // Foids.Add('ECGOST3410',
  137. // TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
  138. // ECSCHNORR BSI
  139. Falgorithms.Add('SHA1/ECSCHNORR/BSI', 'SHA-1withECSCHNORRBSI');
  140. Falgorithms.Add('SHA-1/ECSCHNORR/BSI', 'SHA-1withECSCHNORRBSI');
  141. Falgorithms.Add('ECSCHNORRBSIWITHSHA1', 'SHA-1withECSCHNORRBSI');
  142. Falgorithms.Add('ECSCHNORRBSIWITHSHA-1', 'SHA-1withECSCHNORRBSI');
  143. Falgorithms.Add('SHA1WITHECSCHNORRBSI', 'SHA-1withECSCHNORRBSI');
  144. Falgorithms.Add('SHA-1WITHECSCHNORRBSI', 'SHA-1withECSCHNORRBSI');
  145. Falgorithms.Add('SHA224/ECSCHNORR/BSI', 'SHA-224withECSCHNORRBSI');
  146. Falgorithms.Add('SHA-224/ECSCHNORR/BSI', 'SHA-224withECSCHNORRBSI');
  147. Falgorithms.Add('ECSCHNORRBSIWITHSHA224', 'SHA-224withECSCHNORRBSI');
  148. Falgorithms.Add('ECSCHNORRBSIWITHSHA-224', 'SHA-224withECSCHNORRBSI');
  149. Falgorithms.Add('SHA224WITHECSCHNORRBSI', 'SHA-224withECSCHNORRBSI');
  150. Falgorithms.Add('SHA-224WITHECSCHNORRBSI', 'SHA-224withECSCHNORRBSI');
  151. Falgorithms.Add('SHA256/ECSCHNORR/BSI', 'SHA-256withECSCHNORRBSI');
  152. Falgorithms.Add('SHA-256/ECSCHNORR/BSI', 'SHA-256withECSCHNORRBSI');
  153. Falgorithms.Add('ECSCHNORRBSIWITHSHA256', 'SHA-256withECSCHNORRBSI');
  154. Falgorithms.Add('ECSCHNORRBSIWITHSHA-256', 'SHA-256withECSCHNORRBSI');
  155. Falgorithms.Add('SHA256WITHECSCHNORRBSI', 'SHA-256withECSCHNORRBSI');
  156. Falgorithms.Add('SHA-256WITHECSCHNORRBSI', 'SHA-256withECSCHNORRBSI');
  157. Falgorithms.Add('SHA384/ECSCHNORR/BSI', 'SHA-384withECSCHNORRBSI');
  158. Falgorithms.Add('SHA-384/ECSCHNORR/BSI', 'SHA-384withECSCHNORRBSI');
  159. Falgorithms.Add('ECSCHNORRBSIWITHSHA384', 'SHA-384withECSCHNORRBSI');
  160. Falgorithms.Add('ECSCHNORRBSIWITHSHA-384', 'SHA-384withECSCHNORRBSI');
  161. Falgorithms.Add('SHA384WITHECSCHNORRBSI', 'SHA-384withECSCHNORRBSI');
  162. Falgorithms.Add('SHA-384WITHECSCHNORRBSI', 'SHA-384withECSCHNORRBSI');
  163. Falgorithms.Add('SHA512/ECSCHNORR/BSI', 'SHA-512withECSCHNORRBSI');
  164. Falgorithms.Add('SHA-512/ECSCHNORR/BSI', 'SHA-512withECSCHNORRBSI');
  165. Falgorithms.Add('ECSCHNORRBSIWITHSHA512', 'SHA-512withECSCHNORRBSI');
  166. Falgorithms.Add('ECSCHNORRBSIWITHSHA-512', 'SHA-512withECSCHNORRBSI');
  167. Falgorithms.Add('SHA512WITHECSCHNORRBSI', 'SHA-512withECSCHNORRBSI');
  168. Falgorithms.Add('SHA-512WITHECSCHNORRBSI', 'SHA-512withECSCHNORRBSI');
  169. Falgorithms.Add('RIPEMD160/ECSCHNORR/BSI', 'RIPEMD160withECSCHNORRBSI');
  170. Falgorithms.Add('ECSCHNORRBSIWITHRIPEMD160', 'RIPEMD160withECSCHNORRBSI');
  171. Falgorithms.Add('RIPEMD160WITHECSCHNORRBSI', 'RIPEMD160withECSCHNORRBSI');
  172. // ECSCHNORR ISO
  173. Falgorithms.Add('SHA1/ECSCHNORR/ISO', 'SHA-1withECSCHNORRISO');
  174. Falgorithms.Add('SHA-1/ECSCHNORR/ISO', 'SHA-1withECSCHNORRISO');
  175. Falgorithms.Add('ECSCHNORRISOWITHSHA1', 'SHA-1withECSCHNORRISO');
  176. Falgorithms.Add('ECSCHNORRISOWITHSHA-1', 'SHA-1withECSCHNORRISO');
  177. Falgorithms.Add('SHA1WITHECSCHNORRISO', 'SHA-1withECSCHNORRISO');
  178. Falgorithms.Add('SHA-1WITHECSCHNORRISO', 'SHA-1withECSCHNORRISO');
  179. Falgorithms.Add('SHA224/ECSCHNORR/ISO', 'SHA-224withECSCHNORRISO');
  180. Falgorithms.Add('SHA-224/ECSCHNORR/ISO', 'SHA-224withECSCHNORRISO');
  181. Falgorithms.Add('ECSCHNORRISOWITHSHA224', 'SHA-224withECSCHNORRISO');
  182. Falgorithms.Add('ECSCHNORRISOWITHSHA-224', 'SHA-224withECSCHNORRISO');
  183. Falgorithms.Add('SHA224WITHECSCHNORRISO', 'SHA-224withECSCHNORRISO');
  184. Falgorithms.Add('SHA-224WITHECSCHNORRISO', 'SHA-224withECSCHNORRISO');
  185. Falgorithms.Add('SHA256/ECSCHNORR/ISO', 'SHA-256withECSCHNORRISO');
  186. Falgorithms.Add('SHA-256/ECSCHNORR/ISO', 'SHA-256withECSCHNORRISO');
  187. Falgorithms.Add('ECSCHNORRISOWITHSHA256', 'SHA-256withECSCHNORRISO');
  188. Falgorithms.Add('ECSCHNORRISOWITHSHA-256', 'SHA-256withECSCHNORRISO');
  189. Falgorithms.Add('SHA256WITHECSCHNORRISO', 'SHA-256withECSCHNORRISO');
  190. Falgorithms.Add('SHA-256WITHECSCHNORRISO', 'SHA-256withECSCHNORRISO');
  191. Falgorithms.Add('SHA384/ECSCHNORR/ISO', 'SHA-384withECSCHNORRISO');
  192. Falgorithms.Add('SHA-384/ECSCHNORR/ISO', 'SHA-384withECSCHNORRISO');
  193. Falgorithms.Add('ECSCHNORRISOWITHSHA384', 'SHA-384withECSCHNORRISO');
  194. Falgorithms.Add('ECSCHNORRISOWITHSHA-384', 'SHA-384withECSCHNORRISO');
  195. Falgorithms.Add('SHA384WITHECSCHNORRISO', 'SHA-384withECSCHNORRISO');
  196. Falgorithms.Add('SHA-384WITHECSCHNORRISO', 'SHA-384withECSCHNORRISO');
  197. Falgorithms.Add('SHA512/ECSCHNORR/ISO', 'SHA-512withECSCHNORRISO');
  198. Falgorithms.Add('SHA-512/ECSCHNORR/ISO', 'SHA-512withECSCHNORRISO');
  199. Falgorithms.Add('ECSCHNORRISOWITHSHA512', 'SHA-512withECSCHNORRISO');
  200. Falgorithms.Add('ECSCHNORRISOWITHSHA-512', 'SHA-512withECSCHNORRISO');
  201. Falgorithms.Add('SHA512WITHECSCHNORRISO', 'SHA-512withECSCHNORRISO');
  202. Falgorithms.Add('SHA-512WITHECSCHNORRISO', 'SHA-512withECSCHNORRISO');
  203. Falgorithms.Add('RIPEMD160/ECSCHNORR/ISO', 'RIPEMD160withECSCHNORRISO');
  204. Falgorithms.Add('ECSCHNORRISOWITHRIPEMD160', 'RIPEMD160withECSCHNORRISO');
  205. Falgorithms.Add('RIPEMD160WITHECSCHNORRISO', 'RIPEMD160withECSCHNORRISO');
  206. // ECSCHNORR ISOx
  207. Falgorithms.Add('SHA1/ECSCHNORR/ISOx', 'SHA-1withECSCHNORRISOx');
  208. Falgorithms.Add('SHA-1/ECSCHNORR/ISOx', 'SHA-1withECSCHNORRISOx');
  209. Falgorithms.Add('ECSCHNORRISOxWITHSHA1', 'SHA-1withECSCHNORRISOx');
  210. Falgorithms.Add('ECSCHNORRISOxWITHSHA-1', 'SHA-1withECSCHNORRISOx');
  211. Falgorithms.Add('SHA1WITHECSCHNORRISOx', 'SHA-1withECSCHNORRISOx');
  212. Falgorithms.Add('SHA-1WITHECSCHNORRISOx', 'SHA-1withECSCHNORRISOx');
  213. Falgorithms.Add('SHA224/ECSCHNORR/ISOx', 'SHA-224withECSCHNORRISOx');
  214. Falgorithms.Add('SHA-224/ECSCHNORR/ISOx', 'SHA-224withECSCHNORRISOx');
  215. Falgorithms.Add('ECSCHNORRISOxWITHSHA224', 'SHA-224withECSCHNORRISOx');
  216. Falgorithms.Add('ECSCHNORRISOxWITHSHA-224', 'SHA-224withECSCHNORRISOx');
  217. Falgorithms.Add('SHA224WITHECSCHNORRISOx', 'SHA-224withECSCHNORRISOx');
  218. Falgorithms.Add('SHA-224WITHECSCHNORRISOx', 'SHA-224withECSCHNORRISOx');
  219. Falgorithms.Add('SHA256/ECSCHNORR/ISOx', 'SHA-256withECSCHNORRISOx');
  220. Falgorithms.Add('SHA-256/ECSCHNORR/ISOx', 'SHA-256withECSCHNORRISOx');
  221. Falgorithms.Add('ECSCHNORRISOxWITHSHA256', 'SHA-256withECSCHNORRISOx');
  222. Falgorithms.Add('ECSCHNORRISOxWITHSHA-256', 'SHA-256withECSCHNORRISOx');
  223. Falgorithms.Add('SHA256WITHECSCHNORRISOx', 'SHA-256withECSCHNORRISOx');
  224. Falgorithms.Add('SHA-256WITHECSCHNORRISOx', 'SHA-256withECSCHNORRISOx');
  225. Falgorithms.Add('SHA384/ECSCHNORR/ISOx', 'SHA-384withECSCHNORRISOx');
  226. Falgorithms.Add('SHA-384/ECSCHNORR/ISOx', 'SHA-384withECSCHNORRISOx');
  227. Falgorithms.Add('ECSCHNORRISOxWITHSHA384', 'SHA-384withECSCHNORRISOx');
  228. Falgorithms.Add('ECSCHNORRISOxWITHSHA-384', 'SHA-384withECSCHNORRISOx');
  229. Falgorithms.Add('SHA384WITHECSCHNORRISOx', 'SHA-384withECSCHNORRISOx');
  230. Falgorithms.Add('SHA-384WITHECSCHNORRISOx', 'SHA-384withECSCHNORRISOx');
  231. Falgorithms.Add('SHA512/ECSCHNORR/ISOx', 'SHA-512withECSCHNORRISOx');
  232. Falgorithms.Add('SHA-512/ECSCHNORR/ISOx', 'SHA-512withECSCHNORRISOx');
  233. Falgorithms.Add('ECSCHNORRISOxWITHSHA512', 'SHA-512withECSCHNORRISOx');
  234. Falgorithms.Add('ECSCHNORRISOxWITHSHA-512', 'SHA-512withECSCHNORRISOx');
  235. Falgorithms.Add('SHA512WITHECSCHNORRISOx', 'SHA-512withECSCHNORRISOx');
  236. Falgorithms.Add('SHA-512WITHECSCHNORRISOx', 'SHA-512withECSCHNORRISOx');
  237. Falgorithms.Add('RIPEMD160/ECSCHNORR/ISOx', 'RIPEMD160withECSCHNORRISOx');
  238. Falgorithms.Add('ECSCHNORRISOxWITHRIPEMD160', 'RIPEMD160withECSCHNORRISOx');
  239. Falgorithms.Add('RIPEMD160WITHECSCHNORRISOx', 'RIPEMD160withECSCHNORRISOx');
  240. // ECSCHNORR LIBSECP
  241. Falgorithms.Add('SHA1/ECSCHNORR/LIBSECP', 'SHA-1withECSCHNORRLIBSECP');
  242. Falgorithms.Add('SHA-1/ECSCHNORR/LIBSECP', 'SHA-1withECSCHNORRLIBSECP');
  243. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA1', 'SHA-1withECSCHNORRLIBSECP');
  244. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-1', 'SHA-1withECSCHNORRLIBSECP');
  245. Falgorithms.Add('SHA1WITHECSCHNORRLIBSECP', 'SHA-1withECSCHNORRLIBSECP');
  246. Falgorithms.Add('SHA-1WITHECSCHNORRLIBSECP', 'SHA-1withECSCHNORRLIBSECP');
  247. Falgorithms.Add('SHA224/ECSCHNORR/LIBSECP', 'SHA-224withECSCHNORRLIBSECP');
  248. Falgorithms.Add('SHA-224/ECSCHNORR/LIBSECP', 'SHA-224withECSCHNORRLIBSECP');
  249. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA224', 'SHA-224withECSCHNORRLIBSECP');
  250. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-224', 'SHA-224withECSCHNORRLIBSECP');
  251. Falgorithms.Add('SHA224WITHECSCHNORRLIBSECP', 'SHA-224withECSCHNORRLIBSECP');
  252. Falgorithms.Add('SHA-224WITHECSCHNORRLIBSECP', 'SHA-224withECSCHNORRLIBSECP');
  253. Falgorithms.Add('SHA256/ECSCHNORR/LIBSECP', 'SHA-256withECSCHNORRLIBSECP');
  254. Falgorithms.Add('SHA-256/ECSCHNORR/LIBSECP', 'SHA-256withECSCHNORRLIBSECP');
  255. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA256', 'SHA-256withECSCHNORRLIBSECP');
  256. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-256', 'SHA-256withECSCHNORRLIBSECP');
  257. Falgorithms.Add('SHA256WITHECSCHNORRLIBSECP', 'SHA-256withECSCHNORRLIBSECP');
  258. Falgorithms.Add('SHA-256WITHECSCHNORRLIBSECP', 'SHA-256withECSCHNORRLIBSECP');
  259. Falgorithms.Add('SHA384/ECSCHNORR/LIBSECP', 'SHA-384withECSCHNORRLIBSECP');
  260. Falgorithms.Add('SHA-384/ECSCHNORR/LIBSECP', 'SHA-384withECSCHNORRLIBSECP');
  261. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA384', 'SHA-384withECSCHNORRLIBSECP');
  262. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-384', 'SHA-384withECSCHNORRLIBSECP');
  263. Falgorithms.Add('SHA384WITHECSCHNORRLIBSECP', 'SHA-384withECSCHNORRLIBSECP');
  264. Falgorithms.Add('SHA-384WITHECSCHNORRLIBSECP', 'SHA-384withECSCHNORRLIBSECP');
  265. Falgorithms.Add('SHA512/ECSCHNORR/LIBSECP', 'SHA-512withECSCHNORRLIBSECP');
  266. Falgorithms.Add('SHA-512/ECSCHNORR/LIBSECP', 'SHA-512withECSCHNORRLIBSECP');
  267. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA512', 'SHA-512withECSCHNORRLIBSECP');
  268. Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-512', 'SHA-512withECSCHNORRLIBSECP');
  269. Falgorithms.Add('SHA512WITHECSCHNORRLIBSECP', 'SHA-512withECSCHNORRLIBSECP');
  270. Falgorithms.Add('SHA-512WITHECSCHNORRLIBSECP', 'SHA-512withECSCHNORRLIBSECP');
  271. Falgorithms.Add('RIPEMD160/ECSCHNORR/LIBSECP',
  272. 'RIPEMD160withECSCHNORRLIBSECP');
  273. Falgorithms.Add('ECSCHNORRLIBSECPWITHRIPEMD160',
  274. 'RIPEMD160withECSCHNORRLIBSECP');
  275. Falgorithms.Add('RIPEMD160WITHECSCHNORRLIBSECP',
  276. 'RIPEMD160withECSCHNORRLIBSECP');
  277. end;
  278. class destructor TSignerUtilities.DestroySignerUtilities;
  279. begin
  280. Falgorithms.Free;
  281. Foids.Free;
  282. end;
  283. class function TSignerUtilities.GetAlgorithms: TCryptoLibStringArray;
  284. begin
  285. Result := Foids.Keys.ToArray;
  286. end;
  287. class function TSignerUtilities.GetEncodingName
  288. (const oid: IDerObjectIdentifier): String;
  289. begin
  290. Falgorithms.TryGetValue(oid.id, Result);
  291. end;
  292. class function TSignerUtilities.GetObjectIdentifier(mechanism: String)
  293. : IDerObjectIdentifier;
  294. var
  295. aliased: string;
  296. begin
  297. if (mechanism = '') then
  298. begin
  299. raise EArgumentNilCryptoLibException.CreateRes(@SMechanismNil);
  300. end;
  301. mechanism := UpperCase(mechanism);
  302. if (Falgorithms.TryGetValue(mechanism, aliased)) then
  303. begin
  304. mechanism := aliased;
  305. end;
  306. Foids.TryGetValue(mechanism, Result);
  307. end;
  308. class function TSignerUtilities.GetSigner
  309. (const id: IDerObjectIdentifier): ISigner;
  310. begin
  311. Result := GetSigner(id.id);
  312. end;
  313. class function TSignerUtilities.GetSigner(algorithm: String): ISigner;
  314. var
  315. mechanism: string;
  316. HashInstance: IHash;
  317. begin
  318. if (algorithm = '') then
  319. begin
  320. raise EArgumentNilCryptoLibException.CreateRes(@SAlgorithmNil);
  321. end;
  322. algorithm := UpperCase(algorithm);
  323. if (not Falgorithms.TryGetValue(algorithm, mechanism)) then
  324. begin
  325. mechanism := algorithm;
  326. end;
  327. if (mechanism = 'NONEwithECDSA') then
  328. begin
  329. HashInstance := THashFactory.TNullDigestFactory.CreateNullDigest();
  330. HashInstance.Initialize;
  331. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  332. HashInstance));
  333. Exit;
  334. end;
  335. if (mechanism = 'SHA-1withECDSA') then
  336. begin
  337. HashInstance := THashFactory.TCrypto.CreateSHA1();
  338. HashInstance.Initialize;
  339. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  340. HashInstance));
  341. Exit;
  342. end;
  343. if (mechanism = 'SHA-224withECDSA') then
  344. begin
  345. HashInstance := THashFactory.TCrypto.CreateSHA2_224();
  346. HashInstance.Initialize;
  347. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  348. HashInstance));
  349. Exit;
  350. end;
  351. if (mechanism = 'SHA-256withECDSA') then
  352. begin
  353. HashInstance := THashFactory.TCrypto.CreateSHA2_256();
  354. HashInstance.Initialize;
  355. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  356. HashInstance));
  357. Exit;
  358. end;
  359. if (mechanism = 'SHA-384withECDSA') then
  360. begin
  361. HashInstance := THashFactory.TCrypto.CreateSHA2_384();
  362. HashInstance.Initialize;
  363. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  364. HashInstance));
  365. Exit;
  366. end;
  367. if (mechanism = 'SHA-512withECDSA') then
  368. begin
  369. HashInstance := THashFactory.TCrypto.CreateSHA2_512();
  370. HashInstance.Initialize;
  371. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  372. HashInstance));
  373. Exit;
  374. end;
  375. if (mechanism = 'RIPEMD160withECDSA') then
  376. begin
  377. HashInstance := THashFactory.TCrypto.CreateRIPEMD160();
  378. HashInstance.Initialize;
  379. Result := (TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner,
  380. HashInstance));
  381. Exit;
  382. end;
  383. //
  384. if (mechanism = 'SHA-1withECSCHNORRBSI') then
  385. begin
  386. HashInstance := THashFactory.TCrypto.CreateSHA1();
  387. HashInstance.Initialize;
  388. Result := TECSchnorrSigner.Create(HashInstance, 'BSI');
  389. Exit;
  390. end;
  391. if (mechanism = 'SHA-224withECSCHNORRBSI') then
  392. begin
  393. HashInstance := THashFactory.TCrypto.CreateSHA2_224();
  394. HashInstance.Initialize;
  395. Result := TECSchnorrSigner.Create(HashInstance, 'BSI');
  396. Exit;
  397. end;
  398. if (mechanism = 'SHA-256withECSCHNORRBSI') then
  399. begin
  400. HashInstance := THashFactory.TCrypto.CreateSHA2_256();
  401. HashInstance.Initialize;
  402. Result := TECSchnorrSigner.Create(HashInstance, 'BSI');
  403. Exit;
  404. end;
  405. if (mechanism = 'SHA-384withECSCHNORRBSI') then
  406. begin
  407. HashInstance := THashFactory.TCrypto.CreateSHA2_384();
  408. HashInstance.Initialize;
  409. Result := TECSchnorrSigner.Create(HashInstance, 'BSI');
  410. Exit;
  411. end;
  412. if (mechanism = 'SHA-512withECSCHNORRBSI') then
  413. begin
  414. HashInstance := THashFactory.TCrypto.CreateSHA2_512();
  415. HashInstance.Initialize;
  416. Result := TECSchnorrSigner.Create(HashInstance, 'BSI');
  417. Exit;
  418. end;
  419. if (mechanism = 'RIPEMD160withECSCHNORRBSI') then
  420. begin
  421. HashInstance := THashFactory.TCrypto.CreateRIPEMD160();
  422. HashInstance.Initialize;
  423. Result := TECSchnorrSigner.Create(HashInstance, 'BSI');
  424. Exit;
  425. end;
  426. //
  427. if (mechanism = 'SHA-1withECSCHNORRISO') then
  428. begin
  429. HashInstance := THashFactory.TCrypto.CreateSHA1();
  430. HashInstance.Initialize;
  431. Result := TECSchnorrSigner.Create(HashInstance, 'ISO');
  432. Exit;
  433. end;
  434. if (mechanism = 'SHA-224withECSCHNORRISO') then
  435. begin
  436. HashInstance := THashFactory.TCrypto.CreateSHA2_224();
  437. HashInstance.Initialize;
  438. Result := TECSchnorrSigner.Create(HashInstance, 'ISO');
  439. Exit;
  440. end;
  441. if (mechanism = 'SHA-256withECSCHNORRISO') then
  442. begin
  443. HashInstance := THashFactory.TCrypto.CreateSHA2_256();
  444. HashInstance.Initialize;
  445. Result := TECSchnorrSigner.Create(HashInstance, 'ISO');
  446. Exit;
  447. end;
  448. if (mechanism = 'SHA-384withECSCHNORRISO') then
  449. begin
  450. HashInstance := THashFactory.TCrypto.CreateSHA2_384();
  451. HashInstance.Initialize;
  452. Result := TECSchnorrSigner.Create(HashInstance, 'ISO');
  453. Exit;
  454. end;
  455. if (mechanism = 'SHA-512withECSCHNORRISO') then
  456. begin
  457. HashInstance := THashFactory.TCrypto.CreateSHA2_512();
  458. HashInstance.Initialize;
  459. Result := TECSchnorrSigner.Create(HashInstance, 'ISO');
  460. Exit;
  461. end;
  462. if (mechanism = 'RIPEMD160withECSCHNORRISO') then
  463. begin
  464. HashInstance := THashFactory.TCrypto.CreateRIPEMD160();
  465. HashInstance.Initialize;
  466. Result := TECSchnorrSigner.Create(HashInstance, 'ISO');
  467. Exit;
  468. end;
  469. //
  470. if (CompareText(mechanism, 'SHA-1withECSCHNORRISOx') = 0) then
  471. begin
  472. HashInstance := THashFactory.TCrypto.CreateSHA1();
  473. HashInstance.Initialize;
  474. Result := TECSchnorrSigner.Create(HashInstance, 'ISOx');
  475. Exit;
  476. end;
  477. if (CompareText(mechanism, 'SHA-224withECSCHNORRISOx') = 0) then
  478. begin
  479. HashInstance := THashFactory.TCrypto.CreateSHA2_224();
  480. HashInstance.Initialize;
  481. Result := TECSchnorrSigner.Create(HashInstance, 'ISOx');
  482. Exit;
  483. end;
  484. if (CompareText(mechanism, 'SHA-256withECSCHNORRISOx') = 0) then
  485. begin
  486. HashInstance := THashFactory.TCrypto.CreateSHA2_256();
  487. HashInstance.Initialize;
  488. Result := TECSchnorrSigner.Create(HashInstance, 'ISOx');
  489. Exit;
  490. end;
  491. if (CompareText(mechanism, 'SHA-384withECSCHNORRISOx') = 0) then
  492. begin
  493. HashInstance := THashFactory.TCrypto.CreateSHA2_384();
  494. HashInstance.Initialize;
  495. Result := TECSchnorrSigner.Create(HashInstance, 'ISOx');
  496. Exit;
  497. end;
  498. if (CompareText(mechanism, 'SHA-512withECSCHNORRISOx') = 0) then
  499. begin
  500. HashInstance := THashFactory.TCrypto.CreateSHA2_512();
  501. HashInstance.Initialize;
  502. Result := TECSchnorrSigner.Create(HashInstance, 'ISOx');
  503. Exit;
  504. end;
  505. if (CompareText(mechanism, 'RIPEMD160withECSCHNORRISOx') = 0) then
  506. begin
  507. HashInstance := THashFactory.TCrypto.CreateRIPEMD160();
  508. HashInstance.Initialize;
  509. Result := TECSchnorrSigner.Create(HashInstance, 'ISOx');
  510. Exit;
  511. end;
  512. //
  513. if (mechanism = 'SHA-1withECSCHNORRLIBSECP') then
  514. begin
  515. HashInstance := THashFactory.TCrypto.CreateSHA1();
  516. HashInstance.Initialize;
  517. Result := TECSchnorrSigner.Create(HashInstance, 'LIBSECP');
  518. Exit;
  519. end;
  520. if (mechanism = 'SHA-224withECSCHNORRLIBSECP') then
  521. begin
  522. HashInstance := THashFactory.TCrypto.CreateSHA2_224();
  523. HashInstance.Initialize;
  524. Result := TECSchnorrSigner.Create(HashInstance, 'LIBSECP');
  525. Exit;
  526. end;
  527. if (mechanism = 'SHA-256withECSCHNORRLIBSECP') then
  528. begin
  529. HashInstance := THashFactory.TCrypto.CreateSHA2_256();
  530. HashInstance.Initialize;
  531. Result := TECSchnorrSigner.Create(HashInstance, 'LIBSECP');
  532. Exit;
  533. end;
  534. if (mechanism = 'SHA-384withECSCHNORRLIBSECP') then
  535. begin
  536. HashInstance := THashFactory.TCrypto.CreateSHA2_384();
  537. HashInstance.Initialize;
  538. Result := TECSchnorrSigner.Create(HashInstance, 'LIBSECP');
  539. Exit;
  540. end;
  541. if (mechanism = 'SHA-512withECSCHNORRLIBSECP') then
  542. begin
  543. HashInstance := THashFactory.TCrypto.CreateSHA2_512();
  544. HashInstance.Initialize;
  545. Result := TECSchnorrSigner.Create(HashInstance, 'LIBSECP');
  546. Exit;
  547. end;
  548. if (mechanism = 'RIPEMD160withECSCHNORRLIBSECP') then
  549. begin
  550. HashInstance := THashFactory.TCrypto.CreateRIPEMD160();
  551. HashInstance.Initialize;
  552. Result := TECSchnorrSigner.Create(HashInstance, 'LIBSECP');
  553. Exit;
  554. end;
  555. raise ESecurityUtilityCryptoLibException.CreateResFmt(@SUnRecognizedAlgorithm,
  556. [algorithm]);
  557. end;
  558. end.