Browse Source

minor consistency fix.

Ugochukwu Mmaduekwe 7 years ago
parent
commit
794c18460e
33 changed files with 933 additions and 799 deletions
  1. 2 2
      CryptoLib/src/Asn1/ClpDerObjectIdentifier.pas
  2. 41 32
      CryptoLib/src/Asn1/CryptoPro/ClpCryptoProObjectIdentifiers.pas
  3. 267 258
      CryptoLib/src/Asn1/CryptoPro/ClpECGost3410NamedCurves.pas
  4. 14 8
      CryptoLib/src/Asn1/Iana/ClpIanaObjectIdentifiers.pas
  5. 23 16
      CryptoLib/src/Asn1/Misc/ClpMiscObjectIdentifiers.pas
  6. 33 21
      CryptoLib/src/Asn1/Nist/ClpNistNamedCurves.pas
  7. 63 57
      CryptoLib/src/Asn1/Nist/ClpNistObjectIdentifiers.pas
  8. 9 4
      CryptoLib/src/Asn1/Oiw/ClpOiwObjectIdentifiers.pas
  9. 16 10
      CryptoLib/src/Asn1/Pkcs/ClpPkcsObjectIdentifiers.pas
  10. 34 26
      CryptoLib/src/Asn1/RossStandart/ClpRosstandartObjectIdentifiers.pas
  11. 87 73
      CryptoLib/src/Asn1/Sec/ClpSecNamedCurves.pas
  12. 54 47
      CryptoLib/src/Asn1/Sec/ClpSecObjectIdentifiers.pas
  13. 15 9
      CryptoLib/src/Asn1/TeleTrust/ClpTeleTrusTObjectIdentifiers.pas
  14. 65 59
      CryptoLib/src/Asn1/X9/ClpX9ObjectIdentifiers.pas
  15. 2 2
      CryptoLib/src/Crypto/ClpBufferedCipherBase.pas
  16. 30 17
      CryptoLib/src/Crypto/EC/ClpCustomNamedCurves.pas
  17. 2 2
      CryptoLib/src/Crypto/Engines/ClpAesEngine.pas
  18. 2 2
      CryptoLib/src/Crypto/Engines/ClpAesLightEngine.pas
  19. 1 1
      CryptoLib/src/Crypto/Signers/ClpECDsaSigner.pas
  20. 126 112
      CryptoLib/src/Math/ClpBigInteger.pas
  21. 1 1
      CryptoLib/src/Math/EC/Abc/ClpTnaf.pas
  22. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256K1Field.pas
  23. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP384R1Field.pas
  24. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP521R1Field.pas
  25. 1 1
      CryptoLib/src/Math/Field/ClpFiniteFields.pas
  26. 1 1
      CryptoLib/src/Math/Raw/ClpMod.pas
  27. 1 1
      CryptoLib/src/Security/ClpCipherUtilities.pas
  28. 7 7
      CryptoLib/src/Security/ClpDigestUtilities.pas
  29. 4 4
      CryptoLib/src/Security/ClpGeneratorUtilities.pas
  30. 4 4
      CryptoLib/src/Security/ClpMacUtilities.pas
  31. 1 1
      CryptoLib/src/Security/ClpParameterUtilities.pas
  32. 11 5
      CryptoLib/src/Security/ClpSecureRandom.pas
  33. 10 10
      CryptoLib/src/Security/ClpSignerUtilities.pas

+ 2 - 2
CryptoLib/src/Asn1/ClpDerObjectIdentifier.pas

@@ -383,7 +383,7 @@ begin
     // TODO Leading zeroes?
     // TODO Leading zeroes?
     if (CharInSet(ch, ['0' .. '9'])) then
     if (CharInSet(ch, ['0' .. '9'])) then
     begin
     begin
-      periodAllowed := true;
+      periodAllowed := True;
       System.Dec(pos);
       System.Dec(pos);
       continue;
       continue;
     end;
     end;
@@ -445,7 +445,7 @@ var
 begin
 begin
   value := 0;
   value := 0;
   bigValue := Default (TBigInteger);
   bigValue := Default (TBigInteger);
-  first := true;
+  first := True;
   objId := TStringList.Create();
   objId := TStringList.Create();
   objId.LineBreak := '';
   objId.LineBreak := '';
   try
   try

+ 41 - 32
CryptoLib/src/Asn1/CryptoPro/ClpCryptoProObjectIdentifiers.pas

@@ -35,9 +35,10 @@ type
     // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2)}
     // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2)}
     GostID: String = '1.2.643.2.2';
     GostID: String = '1.2.643.2.2';
 
 
-    class var
+  class var
 
 
-      FGostR3411, FGostR3410x2001, FGostR3410x94, FGostR28147Cbc,
+    FIsBooted: Boolean;
+    FGostR3411, FGostR3410x2001, FGostR3410x94, FGostR28147Cbc,
       FID_Gost28147_89_CryptoPro_A_ParamSet, FGostR3411x94CryptoProParam,
       FID_Gost28147_89_CryptoPro_A_ParamSet, FGostR3411x94CryptoProParam,
       FGostR3411Hmac, FGostR3410x2001CryptoProA, FGostElSgDH3410Default,
       FGostR3411Hmac, FGostR3410x2001CryptoProA, FGostElSgDH3410Default,
       FGostR3410x94CryptoProXchB, FGostR3410x94CryptoProXchC,
       FGostR3410x94CryptoProXchB, FGostR3410x94CryptoProXchC,
@@ -303,45 +304,53 @@ end;
 
 
 class procedure TCryptoProObjectIdentifiers.Boot;
 class procedure TCryptoProObjectIdentifiers.Boot;
 begin
 begin
-  FGostR3411 := TDerObjectIdentifier.Create(GostID + '.9');
-  FGostR3411Hmac := TDerObjectIdentifier.Create(GostID + '.10');
+  if not FIsBooted then
+  begin
+    FGostR3411 := TDerObjectIdentifier.Create(GostID + '.9');
+    FGostR3411Hmac := TDerObjectIdentifier.Create(GostID + '.10');
 
 
-  FGostR28147Cbc := TDerObjectIdentifier.Create(GostID + '.21');
+    FGostR28147Cbc := TDerObjectIdentifier.Create(GostID + '.21');
 
 
-  FID_Gost28147_89_CryptoPro_A_ParamSet := TDerObjectIdentifier.Create
-    (GostID + '.31.1');
+    FID_Gost28147_89_CryptoPro_A_ParamSet := TDerObjectIdentifier.Create
+      (GostID + '.31.1');
 
 
-  FGostR3410x94 := TDerObjectIdentifier.Create(GostID + '.20');
-  FGostR3410x2001 := TDerObjectIdentifier.Create(GostID + '.19');
-  FGostR3411x94WithGostR3410x94 := TDerObjectIdentifier.Create(GostID + '.4');
-  FGostR3411x94WithGostR3410x2001 := TDerObjectIdentifier.Create(GostID + '.3');
+    FGostR3410x94 := TDerObjectIdentifier.Create(GostID + '.20');
+    FGostR3410x2001 := TDerObjectIdentifier.Create(GostID + '.19');
+    FGostR3411x94WithGostR3410x94 := TDerObjectIdentifier.Create(GostID + '.4');
+    FGostR3411x94WithGostR3410x2001 := TDerObjectIdentifier.Create
+      (GostID + '.3');
 
 
-  // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) hashes(30) }
-  FGostR3411x94CryptoProParamSet := TDerObjectIdentifier.Create
-    (GostID + '.30.1');
+    // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) hashes(30) }
+    FGostR3411x94CryptoProParamSet := TDerObjectIdentifier.Create
+      (GostID + '.30.1');
 
 
-  // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) signs(32) }
-  FGostR3410x94CryptoProA := TDerObjectIdentifier.Create(GostID + '.32.2');
-  FGostR3410x94CryptoProB := TDerObjectIdentifier.Create(GostID + '.32.3');
-  FGostR3410x94CryptoProC := TDerObjectIdentifier.Create(GostID + '.32.4');
-  FGostR3410x94CryptoProD := TDerObjectIdentifier.Create(GostID + '.32.5');
+    // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) signs(32) }
+    FGostR3410x94CryptoProA := TDerObjectIdentifier.Create(GostID + '.32.2');
+    FGostR3410x94CryptoProB := TDerObjectIdentifier.Create(GostID + '.32.3');
+    FGostR3410x94CryptoProC := TDerObjectIdentifier.Create(GostID + '.32.4');
+    FGostR3410x94CryptoProD := TDerObjectIdentifier.Create(GostID + '.32.5');
 
 
-  // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) exchanges(33) }
-  FGostR3410x94CryptoProXchA := TDerObjectIdentifier.Create(GostID + '.33.1');
-  FGostR3410x94CryptoProXchB := TDerObjectIdentifier.Create(GostID + '.33.2');
-  FGostR3410x94CryptoProXchC := TDerObjectIdentifier.Create(GostID + '.33.3');
+    // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) exchanges(33) }
+    FGostR3410x94CryptoProXchA := TDerObjectIdentifier.Create(GostID + '.33.1');
+    FGostR3410x94CryptoProXchB := TDerObjectIdentifier.Create(GostID + '.33.2');
+    FGostR3410x94CryptoProXchC := TDerObjectIdentifier.Create(GostID + '.33.3');
 
 
-  // { iso(1) member-body(2)ru(643) rans(2) cryptopro(2) ecc-signs(35) }
-  FGostR3410x2001CryptoProA := TDerObjectIdentifier.Create(GostID + '.35.1');
-  FGostR3410x2001CryptoProB := TDerObjectIdentifier.Create(GostID + '.35.2');
-  FGostR3410x2001CryptoProC := TDerObjectIdentifier.Create(GostID + '.35.3');
+    // { iso(1) member-body(2)ru(643) rans(2) cryptopro(2) ecc-signs(35) }
+    FGostR3410x2001CryptoProA := TDerObjectIdentifier.Create(GostID + '.35.1');
+    FGostR3410x2001CryptoProB := TDerObjectIdentifier.Create(GostID + '.35.2');
+    FGostR3410x2001CryptoProC := TDerObjectIdentifier.Create(GostID + '.35.3');
 
 
-  // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) ecc-exchanges(36) }
-  FGostR3410x2001CryptoProXchA := TDerObjectIdentifier.Create(GostID + '.36.0');
-  FGostR3410x2001CryptoProXchB := TDerObjectIdentifier.Create(GostID + '.36.1');
+    // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) ecc-exchanges(36) }
+    FGostR3410x2001CryptoProXchA := TDerObjectIdentifier.Create
+      (GostID + '.36.0');
+    FGostR3410x2001CryptoProXchB := TDerObjectIdentifier.Create
+      (GostID + '.36.1');
+
+    FGostElSgDH3410Default := TDerObjectIdentifier.Create(GostID + '.36.0');
+    FGostElSgDH3410x1 := TDerObjectIdentifier.Create(GostID + '.36.1');
 
 
-  FGostElSgDH3410Default := TDerObjectIdentifier.Create(GostID + '.36.0');
-  FGostElSgDH3410x1 := TDerObjectIdentifier.Create(GostID + '.36.1');
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 class constructor TCryptoProObjectIdentifiers.CryptoProObjectIdentifiers;
 class constructor TCryptoProObjectIdentifiers.CryptoProObjectIdentifiers;

+ 267 - 258
CryptoLib/src/Asn1/CryptoPro/ClpECGost3410NamedCurves.pas

@@ -41,6 +41,7 @@ type
 
 
   strict private
   strict private
   class var
   class var
+    FIsBooted: Boolean;
     Fparameters: TDictionary<IDerObjectIdentifier, IECDomainParameters>;
     Fparameters: TDictionary<IDerObjectIdentifier, IECDomainParameters>;
     FobjIds: TDictionary<String, IDerObjectIdentifier>;
     FobjIds: TDictionary<String, IDerObjectIdentifier>;
     Fnames: TDictionary<IDerObjectIdentifier, String>;
     Fnames: TDictionary<IDerObjectIdentifier, String>;
@@ -96,264 +97,272 @@ var
   curve: IFPCurve;
   curve: IFPCurve;
   ecParams: IECDomainParameters;
   ecParams: IECDomainParameters;
 begin
 begin
- // TBigInteger.Boot;
-  Fparameters := TDictionary<IDerObjectIdentifier,
-    IECDomainParameters>.Create();
-  FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
-  Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
-
-  mod_p := TBigInteger.Create
-    ('115792089237316195423570985008687907853269984665640564039457584007913129639319');
-  mod_q := TBigInteger.Create
-    ('115792089237316195423570985008687907853073762908499243225378155805079068850323');
-
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('115792089237316195423570985008687907853269984665640564039457584007913129639316'),
-    // a
-    TBigInteger.Create('166'), // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create('1'), // x
-    TBigInteger.Create
-    ('64033881142927202683649881450433473985931760268884941288852745803908878638612')
-    ), // y
-    mod_q);
-
-  Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProA,
-    ecParams);
-
-  mod_p := TBigInteger.Create
-    ('115792089237316195423570985008687907853269984665640564039457584007913129639319');
-  mod_q := TBigInteger.Create
-    ('115792089237316195423570985008687907853073762908499243225378155805079068850323');
-
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('115792089237316195423570985008687907853269984665640564039457584007913129639316'),
-    TBigInteger.Create('166'), mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create('1'), // x
-    TBigInteger.Create
-    ('64033881142927202683649881450433473985931760268884941288852745803908878638612')
-    ), // y
-    mod_q);
-
-  Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA,
-    ecParams);
-
-  mod_p := TBigInteger.Create
-    ('57896044618658097711785492504343953926634992332820282019728792003956564823193');
-  // p
-  mod_q := TBigInteger.Create
-    ('57896044618658097711785492504343953927102133160255826820068844496087732066703');
-  // q
-
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('57896044618658097711785492504343953926634992332820282019728792003956564823190'),
-    // a
-    TBigInteger.Create
-    ('28091019353058090096996979000309560759124368558014865957655842872397301267595'),
-    // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create('1'), // x
-    TBigInteger.Create
-    ('28792665814854611296992347458380284135028636778229113005756334730996303888124')
-    ), // y
-    mod_q); // q
-
-  Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProB,
-    ecParams);
-
-  mod_p := TBigInteger.Create
-    ('70390085352083305199547718019018437841079516630045180471284346843705633502619');
-  mod_q := TBigInteger.Create
-    ('70390085352083305199547718019018437840920882647164081035322601458352298396601');
-
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('70390085352083305199547718019018437841079516630045180471284346843705633502616'),
-    TBigInteger.Create('32858'), mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create('0'),
-    TBigInteger.Create
-    ('29818893917731240733471273240314769927240550812383695689146495261604565990247')
-    ), mod_q);
-
-  Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB,
-    ecParams);
-
-  mod_p := TBigInteger.Create
-    ('70390085352083305199547718019018437841079516630045180471284346843705633502619');
-  // p
-  mod_q := TBigInteger.Create
-    ('70390085352083305199547718019018437840920882647164081035322601458352298396601');
-  // q
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('70390085352083305199547718019018437841079516630045180471284346843705633502616'),
-    // a
-    TBigInteger.Create('32858'), // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create('0'), // x
-    TBigInteger.Create
-    ('29818893917731240733471273240314769927240550812383695689146495261604565990247')
-    ), // y
-    mod_q); // q
-
-  Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProC,
-    ecParams);
-
-  // GOST34.10 2012
-  mod_p := TBigInteger.Create
-    ('115792089237316195423570985008687907853269984665640564039457584007913129639319');
-  // p
-  mod_q := TBigInteger.Create
-    ('115792089237316195423570985008687907853073762908499243225378155805079068850323');
-  // q
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('115792089237316195423570985008687907853269984665640564039457584007913129639316'),
-    // a
-    TBigInteger.Create('166'), // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create('1'), // x
-    TBigInteger.Create
-    ('64033881142927202683649881450433473985931760268884941288852745803908878638612')
-    ), // y
-    mod_q); // q
-
-  Fparameters.Add(TRosstandartObjectIdentifiers.
-    id_tc26_gost_3410_12_256_paramSetA, ecParams);
-
-  mod_p := TBigInteger.Create
-    ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7',
-    16); // p
-  mod_q := TBigInteger.Create
-    ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275',
-    16); // q
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4',
-    16), // a
-    TBigInteger.Create
-    ('E8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760',
-    16), // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create
-    ('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003'),
-    // x
-    TBigInteger.Create
-    ('7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4',
-    16)), // y
-    mod_q); // q
-
-  Fparameters.Add(TRosstandartObjectIdentifiers.
-    id_tc26_gost_3410_12_512_paramSetA, ecParams);
-
-  mod_p := TBigInteger.Create
-    ('8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F',
-    16); // p
-  mod_q := TBigInteger.Create
-    ('800000000000000000000000000000000000000000000000000000000000000149A1EC142565A545ACFDB77BD9D40CFA8B996712101BEA0EC6346C54374F25BD',
-    16); // q
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C',
-    16), // a
-    TBigInteger.Create
-    ('687D1B459DC841457E3E06CF6F5E2517B97C7D614AF138BCBF85DC806C4B289F3E965D2DB1416D217F8B276FAD1AB69C50F78BEE1FA3106EFB8CCBC7C5140116',
-    16), // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create
-    ('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002'),
-    // x
-    TBigInteger.Create
-    ('1A8F7EDA389B094C2C071E3647A8940F3C123B697578C213BE6DD9E6C8EC7335DCB228FD1EDF4A39152CBCAAF8C0398828041055F94CEEEC7E21340780FE41BD',
-    16)), // y
-    mod_q); // q
-
-  Fparameters.Add(TRosstandartObjectIdentifiers.
-    id_tc26_gost_3410_12_512_paramSetB, ecParams);
-
-  mod_p := TBigInteger.Create
-    ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7',
-    16); // p
-  mod_q := TBigInteger.Create
-    ('3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC98CDBA46506AB004C33A9FF5147502CC8EDA9E7A769A12694623CEF47F023ED',
-    16); // q
-  curve := TFpCurve.Create(mod_p, // p
-    TBigInteger.Create
-    ('DC9203E514A721875485A529D2C722FB187BC8980EB866644DE41C68E143064546E861C0E2C9EDD92ADE71F46FCF50FF2AD97F951FDA9F2A2EB6546F39689BD3',
-    16), // a
-    TBigInteger.Create
-    ('B4C4EE28CEBC6C2C8AC12952CF37F16AC7EFB6A9F69F4B57FFDA2E4F0DE5ADE038CBC2FFF719D2C18DE0284B8BFEF3B52B8CC7A5F5BF0A3C8D2319A5312557E1',
-    16), // b
-    mod_q, TBigInteger.One);
-
-  ecParams := TECDomainParameters.Create(curve,
-    curve.CreatePoint(TBigInteger.Create
-    ('E2E31EDFC23DE7BDEBE241CE593EF5DE2295B7A9CBAEF021D385F7074CEA043AA27272A7AE602BF2A7B9033DB9ED3610C6FB85487EAE97AAC5BC7928C1950148',
-    16), // x
-    TBigInteger.Create
-    ('F5CE40D95B5EB899ABBCCFF5911CB8577939804D6527378B8C108C3D2090FF9BE18E2D33E3021ED2EF32D85822423B6304F726AA854BAE07D0396E9A9ADDC40F',
-    16)), // y
-    mod_q); // q
-
-  Fparameters.Add(TRosstandartObjectIdentifiers.
-    id_tc26_gost_3410_12_512_paramSetC, ecParams);
-
-  FobjIds.Add('GostR3410-2001-CryptoPro-A',
-    TCryptoProObjectIdentifiers.GostR3410x2001CryptoProA);
-  FobjIds.Add('GostR3410-2001-CryptoPro-B',
-    TCryptoProObjectIdentifiers.GostR3410x2001CryptoProB);
-  FobjIds.Add('GostR3410-2001-CryptoPro-C',
-    TCryptoProObjectIdentifiers.GostR3410x2001CryptoProC);
-  FobjIds.Add('GostR3410-2001-CryptoPro-XchA',
-    TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA);
-  FobjIds.Add('GostR3410-2001-CryptoPro-XchB',
-    TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB);
-  FobjIds.Add('Tc26-Gost-3410-12-256-paramSetA',
-    TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_256_paramSetA);
-  FobjIds.Add('Tc26-Gost-3410-12-512-paramSetA',
-    TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetA);
-  FobjIds.Add('Tc26-Gost-3410-12-512-paramSetB',
-    TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetB);
-  FobjIds.Add('Tc26-Gost-3410-12-512-paramSetC',
-    TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetC);
-
-  Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProA,
-    'GostR3410-2001-CryptoPro-A');
-  Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProB,
-    'GostR3410-2001-CryptoPro-B');
-  Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProC,
-    'GostR3410-2001-CryptoPro-C');
-  Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA,
-    'GostR3410-2001-CryptoPro-XchA');
-  Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB,
-    'GostR3410-2001-CryptoPro-XchB');
-  Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_256_paramSetA,
-    'Tc26-Gost-3410-12-256-paramSetA');
-  Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetA,
-    'Tc26-Gost-3410-12-512-paramSetA');
-  Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetB,
-    'Tc26-Gost-3410-12-512-paramSetB');
-  Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetC,
-    'Tc26-Gost-3410-12-512-paramSetC');
+  if not FIsBooted then
+  begin
+    TBigInteger.Boot;
+    TCryptoProObjectIdentifiers.Boot;
+    TRosstandartObjectIdentifiers.Boot;
+
+    Fparameters := TDictionary<IDerObjectIdentifier,
+      IECDomainParameters>.Create();
+    FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
+    Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
+
+    mod_p := TBigInteger.Create
+      ('115792089237316195423570985008687907853269984665640564039457584007913129639319');
+    mod_q := TBigInteger.Create
+      ('115792089237316195423570985008687907853073762908499243225378155805079068850323');
+
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('115792089237316195423570985008687907853269984665640564039457584007913129639316'),
+      // a
+      TBigInteger.Create('166'), // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create('1'), // x
+      TBigInteger.Create
+      ('64033881142927202683649881450433473985931760268884941288852745803908878638612')
+      ), // y
+      mod_q);
+
+    Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProA,
+      ecParams);
+
+    mod_p := TBigInteger.Create
+      ('115792089237316195423570985008687907853269984665640564039457584007913129639319');
+    mod_q := TBigInteger.Create
+      ('115792089237316195423570985008687907853073762908499243225378155805079068850323');
+
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('115792089237316195423570985008687907853269984665640564039457584007913129639316'),
+      TBigInteger.Create('166'), mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create('1'), // x
+      TBigInteger.Create
+      ('64033881142927202683649881450433473985931760268884941288852745803908878638612')
+      ), // y
+      mod_q);
+
+    Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA,
+      ecParams);
+
+    mod_p := TBigInteger.Create
+      ('57896044618658097711785492504343953926634992332820282019728792003956564823193');
+    // p
+    mod_q := TBigInteger.Create
+      ('57896044618658097711785492504343953927102133160255826820068844496087732066703');
+    // q
+
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('57896044618658097711785492504343953926634992332820282019728792003956564823190'),
+      // a
+      TBigInteger.Create
+      ('28091019353058090096996979000309560759124368558014865957655842872397301267595'),
+      // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create('1'), // x
+      TBigInteger.Create
+      ('28792665814854611296992347458380284135028636778229113005756334730996303888124')
+      ), // y
+      mod_q); // q
+
+    Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProB,
+      ecParams);
+
+    mod_p := TBigInteger.Create
+      ('70390085352083305199547718019018437841079516630045180471284346843705633502619');
+    mod_q := TBigInteger.Create
+      ('70390085352083305199547718019018437840920882647164081035322601458352298396601');
+
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('70390085352083305199547718019018437841079516630045180471284346843705633502616'),
+      TBigInteger.Create('32858'), mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create('0'),
+      TBigInteger.Create
+      ('29818893917731240733471273240314769927240550812383695689146495261604565990247')
+      ), mod_q);
+
+    Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB,
+      ecParams);
+
+    mod_p := TBigInteger.Create
+      ('70390085352083305199547718019018437841079516630045180471284346843705633502619');
+    // p
+    mod_q := TBigInteger.Create
+      ('70390085352083305199547718019018437840920882647164081035322601458352298396601');
+    // q
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('70390085352083305199547718019018437841079516630045180471284346843705633502616'),
+      // a
+      TBigInteger.Create('32858'), // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create('0'), // x
+      TBigInteger.Create
+      ('29818893917731240733471273240314769927240550812383695689146495261604565990247')
+      ), // y
+      mod_q); // q
+
+    Fparameters.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProC,
+      ecParams);
+
+    // GOST34.10 2012
+    mod_p := TBigInteger.Create
+      ('115792089237316195423570985008687907853269984665640564039457584007913129639319');
+    // p
+    mod_q := TBigInteger.Create
+      ('115792089237316195423570985008687907853073762908499243225378155805079068850323');
+    // q
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('115792089237316195423570985008687907853269984665640564039457584007913129639316'),
+      // a
+      TBigInteger.Create('166'), // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create('1'), // x
+      TBigInteger.Create
+      ('64033881142927202683649881450433473985931760268884941288852745803908878638612')
+      ), // y
+      mod_q); // q
+
+    Fparameters.Add(TRosstandartObjectIdentifiers.
+      id_tc26_gost_3410_12_256_paramSetA, ecParams);
+
+    mod_p := TBigInteger.Create
+      ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7',
+      16); // p
+    mod_q := TBigInteger.Create
+      ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27E69532F48D89116FF22B8D4E0560609B4B38ABFAD2B85DCACDB1411F10B275',
+      16); // q
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC4',
+      16), // a
+      TBigInteger.Create
+      ('E8C2505DEDFC86DDC1BD0B2B6667F1DA34B82574761CB0E879BD081CFD0B6265EE3CB090F30D27614CB4574010DA90DD862EF9D4EBEE4761503190785A71C760',
+      16), // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create
+      ('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003'),
+      // x
+      TBigInteger.Create
+      ('7503CFE87A836AE3A61B8816E25450E6CE5E1C93ACF1ABC1778064FDCBEFA921DF1626BE4FD036E93D75E6A50E3A41E98028FE5FC235F5B889A589CB5215F2A4',
+      16)), // y
+      mod_q); // q
+
+    Fparameters.Add(TRosstandartObjectIdentifiers.
+      id_tc26_gost_3410_12_512_paramSetA, ecParams);
+
+    mod_p := TBigInteger.Create
+      ('8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F',
+      16); // p
+    mod_q := TBigInteger.Create
+      ('800000000000000000000000000000000000000000000000000000000000000149A1EC142565A545ACFDB77BD9D40CFA8B996712101BEA0EC6346C54374F25BD',
+      16); // q
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006C',
+      16), // a
+      TBigInteger.Create
+      ('687D1B459DC841457E3E06CF6F5E2517B97C7D614AF138BCBF85DC806C4B289F3E965D2DB1416D217F8B276FAD1AB69C50F78BEE1FA3106EFB8CCBC7C5140116',
+      16), // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create
+      ('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002'),
+      // x
+      TBigInteger.Create
+      ('1A8F7EDA389B094C2C071E3647A8940F3C123B697578C213BE6DD9E6C8EC7335DCB228FD1EDF4A39152CBCAAF8C0398828041055F94CEEEC7E21340780FE41BD',
+      16)), // y
+      mod_q); // q
+
+    Fparameters.Add(TRosstandartObjectIdentifiers.
+      id_tc26_gost_3410_12_512_paramSetB, ecParams);
+
+    mod_p := TBigInteger.Create
+      ('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC7',
+      16); // p
+    mod_q := TBigInteger.Create
+      ('3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC98CDBA46506AB004C33A9FF5147502CC8EDA9E7A769A12694623CEF47F023ED',
+      16); // q
+    curve := TFpCurve.Create(mod_p, // p
+      TBigInteger.Create
+      ('DC9203E514A721875485A529D2C722FB187BC8980EB866644DE41C68E143064546E861C0E2C9EDD92ADE71F46FCF50FF2AD97F951FDA9F2A2EB6546F39689BD3',
+      16), // a
+      TBigInteger.Create
+      ('B4C4EE28CEBC6C2C8AC12952CF37F16AC7EFB6A9F69F4B57FFDA2E4F0DE5ADE038CBC2FFF719D2C18DE0284B8BFEF3B52B8CC7A5F5BF0A3C8D2319A5312557E1',
+      16), // b
+      mod_q, TBigInteger.One);
+
+    ecParams := TECDomainParameters.Create(curve,
+      curve.CreatePoint(TBigInteger.Create
+      ('E2E31EDFC23DE7BDEBE241CE593EF5DE2295B7A9CBAEF021D385F7074CEA043AA27272A7AE602BF2A7B9033DB9ED3610C6FB85487EAE97AAC5BC7928C1950148',
+      16), // x
+      TBigInteger.Create
+      ('F5CE40D95B5EB899ABBCCFF5911CB8577939804D6527378B8C108C3D2090FF9BE18E2D33E3021ED2EF32D85822423B6304F726AA854BAE07D0396E9A9ADDC40F',
+      16)), // y
+      mod_q); // q
+
+    Fparameters.Add(TRosstandartObjectIdentifiers.
+      id_tc26_gost_3410_12_512_paramSetC, ecParams);
+
+    FobjIds.Add('GostR3410-2001-CryptoPro-A',
+      TCryptoProObjectIdentifiers.GostR3410x2001CryptoProA);
+    FobjIds.Add('GostR3410-2001-CryptoPro-B',
+      TCryptoProObjectIdentifiers.GostR3410x2001CryptoProB);
+    FobjIds.Add('GostR3410-2001-CryptoPro-C',
+      TCryptoProObjectIdentifiers.GostR3410x2001CryptoProC);
+    FobjIds.Add('GostR3410-2001-CryptoPro-XchA',
+      TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA);
+    FobjIds.Add('GostR3410-2001-CryptoPro-XchB',
+      TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB);
+    FobjIds.Add('Tc26-Gost-3410-12-256-paramSetA',
+      TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_256_paramSetA);
+    FobjIds.Add('Tc26-Gost-3410-12-512-paramSetA',
+      TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetA);
+    FobjIds.Add('Tc26-Gost-3410-12-512-paramSetB',
+      TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetB);
+    FobjIds.Add('Tc26-Gost-3410-12-512-paramSetC',
+      TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetC);
+
+    Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProA,
+      'GostR3410-2001-CryptoPro-A');
+    Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProB,
+      'GostR3410-2001-CryptoPro-B');
+    Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProC,
+      'GostR3410-2001-CryptoPro-C');
+    Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchA,
+      'GostR3410-2001-CryptoPro-XchA');
+    Fnames.Add(TCryptoProObjectIdentifiers.GostR3410x2001CryptoProXchB,
+      'GostR3410-2001-CryptoPro-XchB');
+    Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_256_paramSetA,
+      'Tc26-Gost-3410-12-256-paramSetA');
+    Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetA,
+      'Tc26-Gost-3410-12-512-paramSetA');
+    Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetB,
+      'Tc26-Gost-3410-12-512-paramSetB');
+    Fnames.Add(TRosstandartObjectIdentifiers.id_tc26_gost_3410_12_512_paramSetC,
+      'Tc26-Gost-3410-12-512-paramSetC');
+
+    FIsBooted := True;
+  end;
 
 
 end;
 end;
 
 

+ 14 - 8
CryptoLib/src/Asn1/Iana/ClpIanaObjectIdentifiers.pas

@@ -34,9 +34,9 @@ type
     // {iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) ipsec(8) isakmpOakley(1)}
     // {iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) ipsec(8) isakmpOakley(1)}
     //
     //
 
 
-    class var
-
-      FIsakmpOakley, FHmacMD5, FHmacSha1, FHmacTiger, FHmacRipeMD160
+  class var
+    FIsBooted: Boolean;
+    FIsakmpOakley, FHmacMD5, FHmacSha1, FHmacTiger, FHmacRipeMD160
       : IDerObjectIdentifier;
       : IDerObjectIdentifier;
 
 
     class function GetIsakmpOakley: IDerObjectIdentifier; static; inline;
     class function GetIsakmpOakley: IDerObjectIdentifier; static; inline;
@@ -95,14 +95,20 @@ end;
 
 
 class procedure TIanaObjectIdentifiers.Boot;
 class procedure TIanaObjectIdentifiers.Boot;
 begin
 begin
-  FIsakmpOakley := TDerObjectIdentifier.Create('1.3.6.1.5.5.8.1');
+  if not FIsBooted then
+  begin
+
+    FIsakmpOakley := TDerObjectIdentifier.Create('1.3.6.1.5.5.8.1');
 
 
-  FHmacMD5 := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.1');
-  FHmacSha1 := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.2');
+    FHmacMD5 := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.1');
+    FHmacSha1 := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.2');
 
 
-  FHmacTiger := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.3');
+    FHmacTiger := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.3');
 
 
-  FHmacRipeMD160 := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.4');
+    FHmacRipeMD160 := TDerObjectIdentifier.Create(IsakmpOakley.ID + '.4');
+
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 class constructor TIanaObjectIdentifiers.IanaObjectIdentifiers;
 class constructor TIanaObjectIdentifiers.IanaObjectIdentifiers;

+ 23 - 16
CryptoLib/src/Asn1/Misc/ClpMiscObjectIdentifiers.pas

@@ -30,9 +30,10 @@ type
 
 
   strict private
   strict private
 
 
-    class var
+  class var
 
 
-      Fblake2, Fid_blake2b160, Fid_blake2b256, Fid_blake2b384, Fid_blake2b512,
+    FIsBooted: Boolean;
+    Fblake2, Fid_blake2b160, Fid_blake2b256, Fid_blake2b384, Fid_blake2b512,
       Fid_blake2s128, Fid_blake2s160, Fid_blake2s224, Fid_blake2s256
       Fid_blake2s128, Fid_blake2s160, Fid_blake2s224, Fid_blake2s256
       : IDerObjectIdentifier;
       : IDerObjectIdentifier;
 
 
@@ -119,20 +120,26 @@ end;
 
 
 class procedure TMiscObjectIdentifiers.Boot;
 class procedure TMiscObjectIdentifiers.Boot;
 begin
 begin
-  //
-  // Blake2b and Blake2s
-  //
-  Fblake2 := TDerObjectIdentifier.Create('1.3.6.1.4.1.1722.12.2');
-
-  Fid_blake2b160 := blake2.Branch('1.5');
-  Fid_blake2b256 := blake2.Branch('1.8');
-  Fid_blake2b384 := blake2.Branch('1.12');
-  Fid_blake2b512 := blake2.Branch('1.16');
-
-  Fid_blake2s128 := blake2.Branch('2.4');
-  Fid_blake2s160 := blake2.Branch('2.5');
-  Fid_blake2s224 := blake2.Branch('2.7');
-  Fid_blake2s256 := blake2.Branch('2.8');
+
+  if not FIsBooted then
+  begin
+    //
+    // Blake2b and Blake2s
+    //
+    Fblake2 := TDerObjectIdentifier.Create('1.3.6.1.4.1.1722.12.2');
+
+    Fid_blake2b160 := blake2.Branch('1.5');
+    Fid_blake2b256 := blake2.Branch('1.8');
+    Fid_blake2b384 := blake2.Branch('1.12');
+    Fid_blake2b512 := blake2.Branch('1.16');
+
+    Fid_blake2s128 := blake2.Branch('2.4');
+    Fid_blake2s160 := blake2.Branch('2.5');
+    Fid_blake2s224 := blake2.Branch('2.7');
+    Fid_blake2s256 := blake2.Branch('2.8');
+
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 class constructor TMiscObjectIdentifiers.MiscObjectIdentifiers;
 class constructor TMiscObjectIdentifiers.MiscObjectIdentifiers;

+ 33 - 21
CryptoLib/src/Asn1/Nist/ClpNistNamedCurves.pas

@@ -41,6 +41,7 @@ type
   strict private
   strict private
 
 
   class var
   class var
+    FIsBooted: Boolean;
     FobjIds: TDictionary<String, IDerObjectIdentifier>;
     FobjIds: TDictionary<String, IDerObjectIdentifier>;
     Fnames: TDictionary<IDerObjectIdentifier, String>;
     Fnames: TDictionary<IDerObjectIdentifier, String>;
 
 
@@ -83,6 +84,8 @@ type
     // */
     // */
     class property Names: TCryptoLibStringArray read GetNames;
     class property Names: TCryptoLibStringArray read GetNames;
 
 
+    class procedure Boot; static;
+
   end;
   end;
 
 
 implementation
 implementation
@@ -141,29 +144,38 @@ begin
   result := Fnames.Values.ToArray();
   result := Fnames.Values.ToArray();
 end;
 end;
 
 
-class constructor TNistNamedCurves.CreateNistNamedCurves;
+class procedure TNistNamedCurves.Boot;
 begin
 begin
-  FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
-  Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
-
-  DefineCurveAlias('B-163', TSecObjectIdentifiers.SecT163r2);
-  DefineCurveAlias('B-233', TSecObjectIdentifiers.SecT233r1);
-  DefineCurveAlias('B-283', TSecObjectIdentifiers.SecT283r1);
-  DefineCurveAlias('B-409', TSecObjectIdentifiers.SecT409r1);
-  DefineCurveAlias('B-571', TSecObjectIdentifiers.SecT571r1);
-
-  DefineCurveAlias('K-163', TSecObjectIdentifiers.SecT163k1);
-  DefineCurveAlias('K-233', TSecObjectIdentifiers.SecT233k1);
-  DefineCurveAlias('K-283', TSecObjectIdentifiers.SecT283k1);
-  DefineCurveAlias('K-409', TSecObjectIdentifiers.SecT409k1);
-  DefineCurveAlias('K-571', TSecObjectIdentifiers.SecT571k1);
-
-  DefineCurveAlias('P-192', TSecObjectIdentifiers.SecP192r1);
-  DefineCurveAlias('P-224', TSecObjectIdentifiers.SecP224r1);
-  DefineCurveAlias('P-256', TSecObjectIdentifiers.SecP256r1);
-  DefineCurveAlias('P-384', TSecObjectIdentifiers.SecP384r1);
-  DefineCurveAlias('P-521', TSecObjectIdentifiers.SecP521r1);
+  if not FIsBooted then
+  begin
+    FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
+    Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
+
+    DefineCurveAlias('B-163', TSecObjectIdentifiers.SecT163r2);
+    DefineCurveAlias('B-233', TSecObjectIdentifiers.SecT233r1);
+    DefineCurveAlias('B-283', TSecObjectIdentifiers.SecT283r1);
+    DefineCurveAlias('B-409', TSecObjectIdentifiers.SecT409r1);
+    DefineCurveAlias('B-571', TSecObjectIdentifiers.SecT571r1);
+
+    DefineCurveAlias('K-163', TSecObjectIdentifiers.SecT163k1);
+    DefineCurveAlias('K-233', TSecObjectIdentifiers.SecT233k1);
+    DefineCurveAlias('K-283', TSecObjectIdentifiers.SecT283k1);
+    DefineCurveAlias('K-409', TSecObjectIdentifiers.SecT409k1);
+    DefineCurveAlias('K-571', TSecObjectIdentifiers.SecT571k1);
+
+    DefineCurveAlias('P-192', TSecObjectIdentifiers.SecP192r1);
+    DefineCurveAlias('P-224', TSecObjectIdentifiers.SecP224r1);
+    DefineCurveAlias('P-256', TSecObjectIdentifiers.SecP256r1);
+    DefineCurveAlias('P-384', TSecObjectIdentifiers.SecP384r1);
+    DefineCurveAlias('P-521', TSecObjectIdentifiers.SecP521r1);
+
+    FIsBooted := True;
+  end;
+end;
 
 
+class constructor TNistNamedCurves.CreateNistNamedCurves;
+begin
+  TNistNamedCurves.Boot;
 end;
 end;
 
 
 class destructor TNistNamedCurves.DestroyNistNamedCurves;
 class destructor TNistNamedCurves.DestroyNistNamedCurves;

+ 63 - 57
CryptoLib/src/Asn1/Nist/ClpNistObjectIdentifiers.pas

@@ -30,9 +30,10 @@ type
 
 
   strict private
   strict private
 
 
-    class var
+  class var
 
 
-      FNistAlgorithm, FHashAlgs, FSigAlgs, FIdSha256, FIdSha384, FIdSha512,
+    FIsBooted: Boolean;
+    FNistAlgorithm, FHashAlgs, FSigAlgs, FIdSha256, FIdSha384, FIdSha512,
       FIdSha224, FIdSha512_224, FIdSha512_256, FIdSha3_224, FIdSha3_256,
       FIdSha224, FIdSha512_224, FIdSha512_256, FIdSha3_224, FIdSha3_256,
       FIdSha3_384, FIdSha3_512, FIdHMacWithSha3_224, FIdHMacWithSha3_256,
       FIdSha3_384, FIdSha3_512, FIdHMacWithSha3_224, FIdHMacWithSha3_256,
       FIdHMacWithSha3_384, FIdHMacWithSha3_512, FAES, FIdAES128Ecb,
       FIdHMacWithSha3_384, FIdHMacWithSha3_512, FAES, FIdAES128Ecb,
@@ -411,61 +412,66 @@ end;
 
 
 class procedure TNistObjectIdentifiers.Boot;
 class procedure TNistObjectIdentifiers.Boot;
 begin
 begin
-  FNistAlgorithm := TDerObjectIdentifier.Create('2.16.840.1.101.3.4');
-  FHashAlgs := NistAlgorithm.Branch('2');
-
-  FIdSha256 := HashAlgs.Branch('1');
-  FIdSha384 := HashAlgs.Branch('2');
-  FIdSha512 := HashAlgs.Branch('3');
-  FIdSha224 := HashAlgs.Branch('4');
-  FIdSha512_224 := HashAlgs.Branch('5');
-  FIdSha512_256 := HashAlgs.Branch('6');
-  FIdSha3_224 := HashAlgs.Branch('7');
-  FIdSha3_256 := HashAlgs.Branch('8');
-  FIdSha3_384 := HashAlgs.Branch('9');
-  FIdSha3_512 := HashAlgs.Branch('10');
-
-  FIdHMacWithSha3_224 := HashAlgs.Branch('13');
-  FIdHMacWithSha3_256 := HashAlgs.Branch('14');
-  FIdHMacWithSha3_384 := HashAlgs.Branch('15');
-  FIdHMacWithSha3_512 := HashAlgs.Branch('16');
-
-  FAES := TDerObjectIdentifier.Create(NistAlgorithm.id + '.1');
-
-  FIdAES128Ecb := TDerObjectIdentifier.Create(AES.id + '.1');
-  FIdAes128Cbc := TDerObjectIdentifier.Create(AES.id + '.2');
-  FIdAes128Ofb := TDerObjectIdentifier.Create(AES.id + '.3');
-  FIdAes128Cfb := TDerObjectIdentifier.Create(AES.id + '.4');
-  FidAes192Ecb := TDerObjectIdentifier.Create(AES.id + '.21');
-  FIdAes192Cbc := TDerObjectIdentifier.Create(AES.id + '.22');
-  FIdAes192Ofb := TDerObjectIdentifier.Create(AES.id + '.23');
-  FIdAes192Cfb := TDerObjectIdentifier.Create(AES.id + '.24');
-  FIdAes256Ecb := TDerObjectIdentifier.Create(AES.id + '.41');
-  FIdAes256Cbc := TDerObjectIdentifier.Create(AES.id + '.42');
-  FIdAes256Ofb := TDerObjectIdentifier.Create(AES.id + '.43');
-  FIdAes256Cfb := TDerObjectIdentifier.Create(AES.id + '.44');
-
-  //
-  // signatures
-  //
-  FSigAlgs := NistAlgorithm.Branch('3');
-  FIdDsaWithSha2 := SigAlgs;
-
-  FDsaWithSha224 := TDerObjectIdentifier.Create(SigAlgs.id + '.1');
-  FDsaWithSha256 := TDerObjectIdentifier.Create(SigAlgs.id + '.2');
-  FDsaWithSha384 := TDerObjectIdentifier.Create(SigAlgs.id + '.3');
-  FDsaWithSha512 := TDerObjectIdentifier.Create(SigAlgs.id + '.4');
-
-  FIdDsaWithSha3_224 := TDerObjectIdentifier.Create(SigAlgs.id + '.5');
-  FIdDsaWithSha3_256 := TDerObjectIdentifier.Create(SigAlgs.id + '.6');
-  FIdDsaWithSha3_384 := TDerObjectIdentifier.Create(SigAlgs.id + '.7');
-  FIdDsaWithSha3_512 := TDerObjectIdentifier.Create(SigAlgs.id + '.8');
-
-  // ECDSA with SHA-3
-  FIdECDsaWithSha3_224 := TDerObjectIdentifier.Create(SigAlgs.id + '.9');
-  FIdECDsaWithSha3_256 := TDerObjectIdentifier.Create(SigAlgs.id + '.10');
-  FIdECDsaWithSha3_384 := TDerObjectIdentifier.Create(SigAlgs.id + '.11');
-  FIdECDsaWithSha3_512 := TDerObjectIdentifier.Create(SigAlgs.id + '.12');
+  if not FIsBooted then
+  begin
+    FNistAlgorithm := TDerObjectIdentifier.Create('2.16.840.1.101.3.4');
+    FHashAlgs := NistAlgorithm.Branch('2');
+
+    FIdSha256 := HashAlgs.Branch('1');
+    FIdSha384 := HashAlgs.Branch('2');
+    FIdSha512 := HashAlgs.Branch('3');
+    FIdSha224 := HashAlgs.Branch('4');
+    FIdSha512_224 := HashAlgs.Branch('5');
+    FIdSha512_256 := HashAlgs.Branch('6');
+    FIdSha3_224 := HashAlgs.Branch('7');
+    FIdSha3_256 := HashAlgs.Branch('8');
+    FIdSha3_384 := HashAlgs.Branch('9');
+    FIdSha3_512 := HashAlgs.Branch('10');
+
+    FIdHMacWithSha3_224 := HashAlgs.Branch('13');
+    FIdHMacWithSha3_256 := HashAlgs.Branch('14');
+    FIdHMacWithSha3_384 := HashAlgs.Branch('15');
+    FIdHMacWithSha3_512 := HashAlgs.Branch('16');
+
+    FAES := TDerObjectIdentifier.Create(NistAlgorithm.id + '.1');
+
+    FIdAES128Ecb := TDerObjectIdentifier.Create(AES.id + '.1');
+    FIdAes128Cbc := TDerObjectIdentifier.Create(AES.id + '.2');
+    FIdAes128Ofb := TDerObjectIdentifier.Create(AES.id + '.3');
+    FIdAes128Cfb := TDerObjectIdentifier.Create(AES.id + '.4');
+    FidAes192Ecb := TDerObjectIdentifier.Create(AES.id + '.21');
+    FIdAes192Cbc := TDerObjectIdentifier.Create(AES.id + '.22');
+    FIdAes192Ofb := TDerObjectIdentifier.Create(AES.id + '.23');
+    FIdAes192Cfb := TDerObjectIdentifier.Create(AES.id + '.24');
+    FIdAes256Ecb := TDerObjectIdentifier.Create(AES.id + '.41');
+    FIdAes256Cbc := TDerObjectIdentifier.Create(AES.id + '.42');
+    FIdAes256Ofb := TDerObjectIdentifier.Create(AES.id + '.43');
+    FIdAes256Cfb := TDerObjectIdentifier.Create(AES.id + '.44');
+
+    //
+    // signatures
+    //
+    FSigAlgs := NistAlgorithm.Branch('3');
+    FIdDsaWithSha2 := SigAlgs;
+
+    FDsaWithSha224 := TDerObjectIdentifier.Create(SigAlgs.id + '.1');
+    FDsaWithSha256 := TDerObjectIdentifier.Create(SigAlgs.id + '.2');
+    FDsaWithSha384 := TDerObjectIdentifier.Create(SigAlgs.id + '.3');
+    FDsaWithSha512 := TDerObjectIdentifier.Create(SigAlgs.id + '.4');
+
+    FIdDsaWithSha3_224 := TDerObjectIdentifier.Create(SigAlgs.id + '.5');
+    FIdDsaWithSha3_256 := TDerObjectIdentifier.Create(SigAlgs.id + '.6');
+    FIdDsaWithSha3_384 := TDerObjectIdentifier.Create(SigAlgs.id + '.7');
+    FIdDsaWithSha3_512 := TDerObjectIdentifier.Create(SigAlgs.id + '.8');
+
+    // ECDSA with SHA-3
+    FIdECDsaWithSha3_224 := TDerObjectIdentifier.Create(SigAlgs.id + '.9');
+    FIdECDsaWithSha3_256 := TDerObjectIdentifier.Create(SigAlgs.id + '.10');
+    FIdECDsaWithSha3_384 := TDerObjectIdentifier.Create(SigAlgs.id + '.11');
+    FIdECDsaWithSha3_512 := TDerObjectIdentifier.Create(SigAlgs.id + '.12');
+
+    FIsBooted := True;
+  end;
 
 
 end;
 end;
 
 

+ 9 - 4
CryptoLib/src/Asn1/Oiw/ClpOiwObjectIdentifiers.pas

@@ -30,9 +30,10 @@ type
 
 
   strict private
   strict private
 
 
-    class var
+  class var
 
 
-      FIdSha1, FDsaWithSha1: IDerObjectIdentifier;
+    FIsBooted: Boolean;
+    FIdSha1, FDsaWithSha1: IDerObjectIdentifier;
 
 
     class function GetIdSha1: IDerObjectIdentifier; static; inline;
     class function GetIdSha1: IDerObjectIdentifier; static; inline;
     class function GetDsaWithSha1: IDerObjectIdentifier; static; inline;
     class function GetDsaWithSha1: IDerObjectIdentifier; static; inline;
@@ -57,8 +58,12 @@ implementation
 
 
 class procedure TOiwObjectIdentifiers.Boot;
 class procedure TOiwObjectIdentifiers.Boot;
 begin
 begin
-  FIdSha1 := TDerObjectIdentifier.Create('1.3.14.3.2.26');
-  FDsaWithSha1 := TDerObjectIdentifier.Create('1.3.14.3.2.27');
+  if not FIsBooted then
+  begin
+    FIdSha1 := TDerObjectIdentifier.Create('1.3.14.3.2.26');
+    FDsaWithSha1 := TDerObjectIdentifier.Create('1.3.14.3.2.27');
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 class function TOiwObjectIdentifiers.GetDsaWithSha1: IDerObjectIdentifier;
 class function TOiwObjectIdentifiers.GetDsaWithSha1: IDerObjectIdentifier;

+ 16 - 10
CryptoLib/src/Asn1/Pkcs/ClpPkcsObjectIdentifiers.pas

@@ -36,9 +36,10 @@ type
     //
     //
     DigestAlgorithm: String = '1.2.840.113549.2';
     DigestAlgorithm: String = '1.2.840.113549.2';
 
 
-    class var
+  class var
 
 
-      FMD2, FMD4, FMD5, FIdHmacWithSha1, FIdHmacWithSha224, FIdHmacWithSha256,
+    FIsBooted: Boolean;
+    FMD2, FMD4, FMD5, FIdHmacWithSha1, FIdHmacWithSha224, FIdHmacWithSha256,
       FIdHmacWithSha384, FIdHmacWithSha512: IDerObjectIdentifier;
       FIdHmacWithSha384, FIdHmacWithSha512: IDerObjectIdentifier;
 
 
     class function GetMD2: IDerObjectIdentifier; static; inline;
     class function GetMD2: IDerObjectIdentifier; static; inline;
@@ -91,14 +92,19 @@ implementation
 
 
 class procedure TPkcsObjectIdentifiers.Boot;
 class procedure TPkcsObjectIdentifiers.Boot;
 begin
 begin
-  FMD2 := TDerObjectIdentifier.Create(DigestAlgorithm + '.2');
-  FMD4 := TDerObjectIdentifier.Create(DigestAlgorithm + '.4');
-  FMD5 := TDerObjectIdentifier.Create(DigestAlgorithm + '.5');
-  FIdHmacWithSha1 := TDerObjectIdentifier.Create(DigestAlgorithm + '.7');
-  FIdHmacWithSha224 := TDerObjectIdentifier.Create(DigestAlgorithm + '.8');
-  FIdHmacWithSha256 := TDerObjectIdentifier.Create(DigestAlgorithm + '.9');
-  FIdHmacWithSha384 := TDerObjectIdentifier.Create(DigestAlgorithm + '.10');
-  FIdHmacWithSha512 := TDerObjectIdentifier.Create(DigestAlgorithm + '.11');
+  if not FIsBooted then
+  begin
+    FMD2 := TDerObjectIdentifier.Create(DigestAlgorithm + '.2');
+    FMD4 := TDerObjectIdentifier.Create(DigestAlgorithm + '.4');
+    FMD5 := TDerObjectIdentifier.Create(DigestAlgorithm + '.5');
+    FIdHmacWithSha1 := TDerObjectIdentifier.Create(DigestAlgorithm + '.7');
+    FIdHmacWithSha224 := TDerObjectIdentifier.Create(DigestAlgorithm + '.8');
+    FIdHmacWithSha256 := TDerObjectIdentifier.Create(DigestAlgorithm + '.9');
+    FIdHmacWithSha384 := TDerObjectIdentifier.Create(DigestAlgorithm + '.10');
+    FIdHmacWithSha512 := TDerObjectIdentifier.Create(DigestAlgorithm + '.11');
+
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 class function TPkcsObjectIdentifiers.GetIdHmacWithSha1: IDerObjectIdentifier;
 class function TPkcsObjectIdentifiers.GetIdHmacWithSha1: IDerObjectIdentifier;

+ 34 - 26
CryptoLib/src/Asn1/RossStandart/ClpRosstandartObjectIdentifiers.pas

@@ -29,9 +29,10 @@ type
   TRosstandartObjectIdentifiers = class abstract(TObject)
   TRosstandartObjectIdentifiers = class abstract(TObject)
   strict private
   strict private
 
 
-    class var
+  class var
 
 
-      Frosstandart, Fid_tc26_gost_3410_12_512_paramSetC,
+    FIsBooted: Boolean;
+    Frosstandart, Fid_tc26_gost_3410_12_512_paramSetC,
       Fid_tc26_gost_3410_12_512_paramSetA, Fid_tc26_gost_28147_param_Z,
       Fid_tc26_gost_3410_12_512_paramSetA, Fid_tc26_gost_28147_param_Z,
       Fid_tc26_gost_3410_12_256_paramSetA, Fid_tc26_hmac_gost_3411_12_512,
       Fid_tc26_gost_3410_12_256_paramSetA, Fid_tc26_hmac_gost_3411_12_512,
       Fid_tc26_hmac_gost_3411_12_256, Fid_tc26_agreement_gost_3410_12_512,
       Fid_tc26_hmac_gost_3411_12_256, Fid_tc26_agreement_gost_3410_12_512,
@@ -257,49 +258,56 @@ end;
 
 
 class procedure TRosstandartObjectIdentifiers.Boot;
 class procedure TRosstandartObjectIdentifiers.Boot;
 begin
 begin
-  Frosstandart := TDerObjectIdentifier.Create('1.2.643.7');
 
 
-  Fid_tc26 := rosstandart.Branch('1');
+  if not FIsBooted then
+  begin
 
 
-  Fid_tc26_gost_3411_12_256 := id_tc26.Branch('1.2.2');
+    Frosstandart := TDerObjectIdentifier.Create('1.2.643.7');
 
 
-  Fid_tc26_gost_3411_12_512 := id_tc26.Branch('1.2.3');
+    Fid_tc26 := rosstandart.Branch('1');
 
 
-  Fid_tc26_hmac_gost_3411_12_256 := id_tc26.Branch('1.4.1');
+    Fid_tc26_gost_3411_12_256 := id_tc26.Branch('1.2.2');
 
 
-  Fid_tc26_hmac_gost_3411_12_512 := id_tc26.Branch('1.4.2');
+    Fid_tc26_gost_3411_12_512 := id_tc26.Branch('1.2.3');
 
 
-  Fid_tc26_gost_3410_12_256 := id_tc26.Branch('1.1.1');
+    Fid_tc26_hmac_gost_3411_12_256 := id_tc26.Branch('1.4.1');
 
 
-  Fid_tc26_gost_3410_12_512 := id_tc26.Branch('1.1.2');
+    Fid_tc26_hmac_gost_3411_12_512 := id_tc26.Branch('1.4.2');
 
 
-  Fid_tc26_signwithdigest_gost_3410_12_256 := id_tc26.Branch('1.3.2');
+    Fid_tc26_gost_3410_12_256 := id_tc26.Branch('1.1.1');
 
 
-  Fid_tc26_signwithdigest_gost_3410_12_512 := id_tc26.Branch('1.3.3');
+    Fid_tc26_gost_3410_12_512 := id_tc26.Branch('1.1.2');
 
 
-  Fid_tc26_agreement := id_tc26.Branch('1.6');
+    Fid_tc26_signwithdigest_gost_3410_12_256 := id_tc26.Branch('1.3.2');
 
 
-  Fid_tc26_agreement_gost_3410_12_256 := id_tc26_agreement.Branch('1');
+    Fid_tc26_signwithdigest_gost_3410_12_512 := id_tc26.Branch('1.3.3');
 
 
-  Fid_tc26_agreement_gost_3410_12_512 := id_tc26_agreement.Branch('2');
+    Fid_tc26_agreement := id_tc26.Branch('1.6');
 
 
-  Fid_tc26_gost_3410_12_256_paramSet := id_tc26.Branch('2.1.1');
+    Fid_tc26_agreement_gost_3410_12_256 := id_tc26_agreement.Branch('1');
 
 
-  Fid_tc26_gost_3410_12_256_paramSetA :=
-    id_tc26_gost_3410_12_256_paramSet.Branch('1');
+    Fid_tc26_agreement_gost_3410_12_512 := id_tc26_agreement.Branch('2');
 
 
-  Fid_tc26_gost_3410_12_512_paramSet := id_tc26.Branch('2.1.2');
+    Fid_tc26_gost_3410_12_256_paramSet := id_tc26.Branch('2.1.1');
 
 
-  Fid_tc26_gost_3410_12_512_paramSetA :=
-    id_tc26_gost_3410_12_512_paramSet.Branch('1');
+    Fid_tc26_gost_3410_12_256_paramSetA :=
+      id_tc26_gost_3410_12_256_paramSet.Branch('1');
 
 
-  Fid_tc26_gost_3410_12_512_paramSetB :=
-    id_tc26_gost_3410_12_512_paramSet.Branch('2');
+    Fid_tc26_gost_3410_12_512_paramSet := id_tc26.Branch('2.1.2');
 
 
-  Fid_tc26_gost_3410_12_512_paramSetC :=
-    id_tc26_gost_3410_12_512_paramSet.Branch('3');
+    Fid_tc26_gost_3410_12_512_paramSetA :=
+      id_tc26_gost_3410_12_512_paramSet.Branch('1');
 
 
-  Fid_tc26_gost_28147_param_Z := id_tc26.Branch('2.5.1.1');
+    Fid_tc26_gost_3410_12_512_paramSetB :=
+      id_tc26_gost_3410_12_512_paramSet.Branch('2');
+
+    Fid_tc26_gost_3410_12_512_paramSetC :=
+      id_tc26_gost_3410_12_512_paramSet.Branch('3');
+
+    Fid_tc26_gost_28147_param_Z := id_tc26.Branch('2.5.1.1');
+
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 end.
 end.

+ 87 - 73
CryptoLib/src/Asn1/Sec/ClpSecNamedCurves.pas

@@ -48,6 +48,7 @@ type
   strict private
   strict private
 
 
   class var
   class var
+    FIsBooted: Boolean;
     FobjIds: TDictionary<String, IDerObjectIdentifier>;
     FobjIds: TDictionary<String, IDerObjectIdentifier>;
     Fnames: TDictionary<IDerObjectIdentifier, String>;
     Fnames: TDictionary<IDerObjectIdentifier, String>;
     Fcurves: TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>;
     Fcurves: TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>;
@@ -96,6 +97,8 @@ type
     // */
     // */
     class property Names: TCryptoLibStringArray read GetNames;
     class property Names: TCryptoLibStringArray read GetNames;
 
 
+    class procedure Boot(); static;
+
   type
   type
 
 
     /// <summary>
     /// <summary>
@@ -819,79 +822,7 @@ end;
 
 
 class constructor TSecNamedCurves.CreateSecNamedCurves;
 class constructor TSecNamedCurves.CreateSecNamedCurves;
 begin
 begin
-  FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
-  Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
-  Fcurves := TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>.Create();
-
- // TSecObjectIdentifiers.Boot;
-
-  DefineCurve('secp112r1', TSecObjectIdentifiers.SecP112r1,
-    TSecp112r1Holder.Instance);
-  DefineCurve('secp112r2', TSecObjectIdentifiers.SecP112r2,
-    TSecp112r2Holder.Instance);
-  DefineCurve('secp128r1', TSecObjectIdentifiers.SecP128r1,
-    TSecp128r1Holder.Instance);
-  DefineCurve('secp128r2', TSecObjectIdentifiers.SecP128r2,
-    TSecp128r2Holder.Instance);
-  DefineCurve('secp160k1', TSecObjectIdentifiers.SecP160k1,
-    TSecp160k1Holder.Instance);
-  DefineCurve('secp160r1', TSecObjectIdentifiers.SecP160r1,
-    TSecp160r1Holder.Instance);
-  DefineCurve('secp160r2', TSecObjectIdentifiers.SecP160r2,
-    TSecp160r2Holder.Instance);
-  DefineCurve('secp192k1', TSecObjectIdentifiers.SecP192k1,
-    TSecp192k1Holder.Instance);
-  DefineCurve('secp192r1', TSecObjectIdentifiers.SecP192r1,
-    TSecp192r1Holder.Instance);
-  DefineCurve('secp224k1', TSecObjectIdentifiers.SecP224k1,
-    TSecp224k1Holder.Instance);
-  DefineCurve('secp224r1', TSecObjectIdentifiers.SecP224r1,
-    TSecp224r1Holder.Instance);
-  DefineCurve('secp256k1', TSecObjectIdentifiers.SecP256k1,
-    TSecp256k1Holder.Instance);
-  DefineCurve('secp256r1', TSecObjectIdentifiers.SecP256r1,
-    TSecp256r1Holder.Instance);
-  DefineCurve('secp384r1', TSecObjectIdentifiers.SecP384r1,
-    TSecp384r1Holder.Instance);
-  DefineCurve('secp521r1', TSecObjectIdentifiers.SecP521r1,
-    TSecp521r1Holder.Instance);
-
-  DefineCurve('sect113r1', TSecObjectIdentifiers.SecT113r1,
-    TSect113r1Holder.Instance);
-  DefineCurve('sect113r2', TSecObjectIdentifiers.SecT113r2,
-    TSect113r2Holder.Instance);
-  DefineCurve('sect131r1', TSecObjectIdentifiers.SecT131r1,
-    TSect131r1Holder.Instance);
-  DefineCurve('sect131r2', TSecObjectIdentifiers.SecT131r2,
-    TSect131r2Holder.Instance);
-  DefineCurve('sect163k1', TSecObjectIdentifiers.SecT163k1,
-    TSect163k1Holder.Instance);
-  DefineCurve('sect163r1', TSecObjectIdentifiers.SecT163r1,
-    TSect163r1Holder.Instance);
-  DefineCurve('sect163r2', TSecObjectIdentifiers.SecT163r2,
-    TSect163r2Holder.Instance);
-  DefineCurve('sect193r1', TSecObjectIdentifiers.SecT193r1,
-    TSect193r1Holder.Instance);
-  DefineCurve('sect193r2', TSecObjectIdentifiers.SecT193r2,
-    TSect193r2Holder.Instance);
-  DefineCurve('sect233k1', TSecObjectIdentifiers.SecT233k1,
-    TSect233k1Holder.Instance);
-  DefineCurve('sect233r1', TSecObjectIdentifiers.SecT233r1,
-    TSect233r1Holder.Instance);
-  DefineCurve('sect239k1', TSecObjectIdentifiers.SecT239k1,
-    TSect239k1Holder.Instance);
-  DefineCurve('sect283k1', TSecObjectIdentifiers.SecT283k1,
-    TSect283k1Holder.Instance);
-  DefineCurve('sect283r1', TSecObjectIdentifiers.SecT283r1,
-    TSect283r1Holder.Instance);
-  DefineCurve('sect409k1', TSecObjectIdentifiers.SecT409k1,
-    TSect409k1Holder.Instance);
-  DefineCurve('sect409r1', TSecObjectIdentifiers.SecT409r1,
-    TSect409r1Holder.Instance);
-  DefineCurve('sect571k1', TSecObjectIdentifiers.SecT571k1,
-    TSect571k1Holder.Instance);
-  DefineCurve('sect571r1', TSecObjectIdentifiers.SecT571r1,
-    TSect571r1Holder.Instance);
+  TSecNamedCurves.Boot;
 end;
 end;
 
 
 class destructor TSecNamedCurves.DestroySecNamedCurves;
 class destructor TSecNamedCurves.DestroySecNamedCurves;
@@ -901,6 +832,89 @@ begin
   Fcurves.Free;
   Fcurves.Free;
 end;
 end;
 
 
+class procedure TSecNamedCurves.Boot;
+begin
+  if not FIsBooted then
+  begin
+    FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
+    Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
+    Fcurves := TDictionary<IDerObjectIdentifier,
+      IX9ECParametersHolder>.Create();
+
+    TSecObjectIdentifiers.Boot;
+
+    DefineCurve('secp112r1', TSecObjectIdentifiers.SecP112r1,
+      TSecp112r1Holder.Instance);
+    DefineCurve('secp112r2', TSecObjectIdentifiers.SecP112r2,
+      TSecp112r2Holder.Instance);
+    DefineCurve('secp128r1', TSecObjectIdentifiers.SecP128r1,
+      TSecp128r1Holder.Instance);
+    DefineCurve('secp128r2', TSecObjectIdentifiers.SecP128r2,
+      TSecp128r2Holder.Instance);
+    DefineCurve('secp160k1', TSecObjectIdentifiers.SecP160k1,
+      TSecp160k1Holder.Instance);
+    DefineCurve('secp160r1', TSecObjectIdentifiers.SecP160r1,
+      TSecp160r1Holder.Instance);
+    DefineCurve('secp160r2', TSecObjectIdentifiers.SecP160r2,
+      TSecp160r2Holder.Instance);
+    DefineCurve('secp192k1', TSecObjectIdentifiers.SecP192k1,
+      TSecp192k1Holder.Instance);
+    DefineCurve('secp192r1', TSecObjectIdentifiers.SecP192r1,
+      TSecp192r1Holder.Instance);
+    DefineCurve('secp224k1', TSecObjectIdentifiers.SecP224k1,
+      TSecp224k1Holder.Instance);
+    DefineCurve('secp224r1', TSecObjectIdentifiers.SecP224r1,
+      TSecp224r1Holder.Instance);
+    DefineCurve('secp256k1', TSecObjectIdentifiers.SecP256k1,
+      TSecp256k1Holder.Instance);
+    DefineCurve('secp256r1', TSecObjectIdentifiers.SecP256r1,
+      TSecp256r1Holder.Instance);
+    DefineCurve('secp384r1', TSecObjectIdentifiers.SecP384r1,
+      TSecp384r1Holder.Instance);
+    DefineCurve('secp521r1', TSecObjectIdentifiers.SecP521r1,
+      TSecp521r1Holder.Instance);
+
+    DefineCurve('sect113r1', TSecObjectIdentifiers.SecT113r1,
+      TSect113r1Holder.Instance);
+    DefineCurve('sect113r2', TSecObjectIdentifiers.SecT113r2,
+      TSect113r2Holder.Instance);
+    DefineCurve('sect131r1', TSecObjectIdentifiers.SecT131r1,
+      TSect131r1Holder.Instance);
+    DefineCurve('sect131r2', TSecObjectIdentifiers.SecT131r2,
+      TSect131r2Holder.Instance);
+    DefineCurve('sect163k1', TSecObjectIdentifiers.SecT163k1,
+      TSect163k1Holder.Instance);
+    DefineCurve('sect163r1', TSecObjectIdentifiers.SecT163r1,
+      TSect163r1Holder.Instance);
+    DefineCurve('sect163r2', TSecObjectIdentifiers.SecT163r2,
+      TSect163r2Holder.Instance);
+    DefineCurve('sect193r1', TSecObjectIdentifiers.SecT193r1,
+      TSect193r1Holder.Instance);
+    DefineCurve('sect193r2', TSecObjectIdentifiers.SecT193r2,
+      TSect193r2Holder.Instance);
+    DefineCurve('sect233k1', TSecObjectIdentifiers.SecT233k1,
+      TSect233k1Holder.Instance);
+    DefineCurve('sect233r1', TSecObjectIdentifiers.SecT233r1,
+      TSect233r1Holder.Instance);
+    DefineCurve('sect239k1', TSecObjectIdentifiers.SecT239k1,
+      TSect239k1Holder.Instance);
+    DefineCurve('sect283k1', TSecObjectIdentifiers.SecT283k1,
+      TSect283k1Holder.Instance);
+    DefineCurve('sect283r1', TSecObjectIdentifiers.SecT283r1,
+      TSect283r1Holder.Instance);
+    DefineCurve('sect409k1', TSecObjectIdentifiers.SecT409k1,
+      TSect409k1Holder.Instance);
+    DefineCurve('sect409r1', TSecObjectIdentifiers.SecT409r1,
+      TSect409r1Holder.Instance);
+    DefineCurve('sect571k1', TSecObjectIdentifiers.SecT571k1,
+      TSect571k1Holder.Instance);
+    DefineCurve('sect571r1', TSecObjectIdentifiers.SecT571r1,
+      TSect571r1Holder.Instance);
+
+    FIsBooted := True;
+  end;
+end;
+
 { TSecNamedCurves.TSecp112r1Holder }
 { TSecNamedCurves.TSecp112r1Holder }
 
 
 function TSecNamedCurves.TSecp112r1Holder.CreateParameters: IX9ECParameters;
 function TSecNamedCurves.TSecp112r1Holder.CreateParameters: IX9ECParameters;

+ 54 - 47
CryptoLib/src/Asn1/Sec/ClpSecObjectIdentifiers.pas

@@ -36,15 +36,15 @@ type
 
 
   strict private
   strict private
 
 
-    class var
+  class var
 
 
-      FSecT193r1, FSecP112r2, FEllipticCurve, FSecP224r1, FSecP160r2,
-      FSecT233r1, FSecP112r1, FSecT409r1, FSecP192k1, FSecT131r2, FSecT283k1,
-      FSecT113r2, FSecT163r2, FSecP160r1, FSecT239k1, FSecP521r1, FSecP256r1,
-      FSecT131r1, FSecT113r1, FSecT163r1, FSecP224k1, FSecT233k1, FSecT409k1,
-      FSecP160k1, FSecT571r1, FSecP256k1, FSecT163k1, FSecP128r2, FSecT571k1,
-      FSecP128r1, FSecP192r1, FSecT283r1, FSecT193r2,
-      FSecP384r1: IDerObjectIdentifier;
+    FIsBooted: Boolean;
+    FSecT193r1, FSecP112r2, FEllipticCurve, FSecP224r1, FSecP160r2, FSecT233r1,
+      FSecP112r1, FSecT409r1, FSecP192k1, FSecT131r2, FSecT283k1, FSecT113r2,
+      FSecT163r2, FSecP160r1, FSecT239k1, FSecP521r1, FSecP256r1, FSecT131r1,
+      FSecT113r1, FSecT163r1, FSecP224k1, FSecT233k1, FSecT409k1, FSecP160k1,
+      FSecT571r1, FSecP256k1, FSecT163k1, FSecP128r2, FSecT571k1, FSecP128r1,
+      FSecP192r1, FSecT283r1, FSecT193r2, FSecP384r1: IDerObjectIdentifier;
 
 
     class constructor SecObjectIdentifiers();
     class constructor SecObjectIdentifiers();
 
 
@@ -302,45 +302,52 @@ end;
 
 
 class procedure TSecObjectIdentifiers.Boot;
 class procedure TSecObjectIdentifiers.Boot;
 begin
 begin
-  FEllipticCurve := TDerObjectIdentifier.Create('1.3.132.0');
-
-  FSecT163k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.1');
-  FSecT163r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.2');
-  FSecT239k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.3');
-  FSecT113r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.4');
-  FSecT113r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.5');
-  FSecP112r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.6');
-  FSecP112r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.7');
-  FSecP160r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.8');
-  FSecP160k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.9');
-  FSecP256k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.10');
-  FSecT163r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.15');
-  FSecT283k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.16');
-  FSecT283r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.17');
-  FSecT131r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.22');
-  FSecT131r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.23');
-  FSecT193r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.24');
-  FSecT193r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.25');
-  FSecT233k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.26');
-  FSecT233r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.27');
-  FSecP128r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.28');
-  FSecP128r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.29');
-  FSecP160r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.30');
-  FSecP192k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.31');
-  FSecP224k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.32');
-  FSecP224r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.33');
-  FSecP384r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.34');
-  FSecP521r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.35');
-  FSecT409k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.36');
-  FSecT409r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.37');
-  FSecT571k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.38');
-  FSecT571r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.39');
-
- // TX9ObjectIdentifiers.Boot;
-
-  FSecP192r1 := TX9ObjectIdentifiers.Prime192v1;
-
-  FSecP256r1 := TX9ObjectIdentifiers.Prime256v1;
+
+  if not FIsBooted then
+  begin
+
+    FEllipticCurve := TDerObjectIdentifier.Create('1.3.132.0');
+
+    FSecT163k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.1');
+    FSecT163r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.2');
+    FSecT239k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.3');
+    FSecT113r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.4');
+    FSecT113r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.5');
+    FSecP112r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.6');
+    FSecP112r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.7');
+    FSecP160r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.8');
+    FSecP160k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.9');
+    FSecP256k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.10');
+    FSecT163r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.15');
+    FSecT283k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.16');
+    FSecT283r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.17');
+    FSecT131r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.22');
+    FSecT131r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.23');
+    FSecT193r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.24');
+    FSecT193r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.25');
+    FSecT233k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.26');
+    FSecT233r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.27');
+    FSecP128r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.28');
+    FSecP128r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.29');
+    FSecP160r2 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.30');
+    FSecP192k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.31');
+    FSecP224k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.32');
+    FSecP224r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.33');
+    FSecP384r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.34');
+    FSecP521r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.35');
+    FSecT409k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.36');
+    FSecT409r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.37');
+    FSecT571k1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.38');
+    FSecT571r1 := TDerObjectIdentifier.Create(EllipticCurve.Id + '.39');
+
+    TX9ObjectIdentifiers.Boot;
+
+    FSecP192r1 := TX9ObjectIdentifiers.Prime192v1;
+
+    FSecP256r1 := TX9ObjectIdentifiers.Prime256v1;
+
+    FIsBooted := True;
+  end;
 
 
 end;
 end;
 
 

+ 15 - 9
CryptoLib/src/Asn1/TeleTrust/ClpTeleTrusTObjectIdentifiers.pas

@@ -30,9 +30,10 @@ type
 
 
   strict private
   strict private
 
 
-    class var
+  class var
 
 
-      FTeleTrusTAlgorithm, FRipeMD160, FRipeMD128, FRipeMD256, FECSign,
+    FIsBooted: Boolean;
+    FTeleTrusTAlgorithm, FRipeMD160, FRipeMD128, FRipeMD256, FECSign,
       FECSignWithSha1, FECSignWithRipeMD160: IDerObjectIdentifier;
       FECSignWithSha1, FECSignWithRipeMD160: IDerObjectIdentifier;
 
 
     class function GetRipeMD128: IDerObjectIdentifier; static; inline;
     class function GetRipeMD128: IDerObjectIdentifier; static; inline;
@@ -105,15 +106,20 @@ end;
 
 
 class procedure TTeleTrusTObjectIdentifiers.Boot;
 class procedure TTeleTrusTObjectIdentifiers.Boot;
 begin
 begin
-  FTeleTrusTAlgorithm := TDerObjectIdentifier.Create('1.3.36.3');
-  FRipeMD160 := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.2.1');
-  FRipeMD128 := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.2.2');
-  FRipeMD256 := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.2.3');
+  if not FIsBooted then
+  begin
+    FTeleTrusTAlgorithm := TDerObjectIdentifier.Create('1.3.36.3');
+    FRipeMD160 := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.2.1');
+    FRipeMD128 := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.2.2');
+    FRipeMD256 := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.2.3');
 
 
-  FECSign := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.3.2');
+    FECSign := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID + '.3.2');
 
 
-  FECSignWithSha1 := TDerObjectIdentifier.Create(ECSign.ID + '.1');
-  FECSignWithRipeMD160 := TDerObjectIdentifier.Create(ECSign.ID + '.2');
+    FECSignWithSha1 := TDerObjectIdentifier.Create(ECSign.ID + '.1');
+    FECSignWithRipeMD160 := TDerObjectIdentifier.Create(ECSign.ID + '.2');
+
+    FIsBooted := True;
+  end;
 
 
 end;
 end;
 
 

+ 65 - 59
CryptoLib/src/Asn1/X9/ClpX9ObjectIdentifiers.pas

@@ -39,9 +39,10 @@ type
 
 
     AnsiX962: String = '1.2.840.10045';
     AnsiX962: String = '1.2.840.10045';
 
 
-    class var
+  class var
 
 
-      Fansi_X9_62, FIdFieldType, FPrimeField, FCharacteristicTwoField, FGNBasis,
+    FIsBooted: Boolean;
+    Fansi_X9_62, FIdFieldType, FPrimeField, FCharacteristicTwoField, FGNBasis,
       FTPBasis, FPPBasis, Fid_ecSigType, FECDsaWithSha1, Fid_publicKeyType,
       FTPBasis, FPPBasis, Fid_ecSigType, FECDsaWithSha1, Fid_publicKeyType,
       FIdECPublicKey, FECDsaWithSha2, FECDsaWithSha224, FECDsaWithSha256,
       FIdECPublicKey, FECDsaWithSha2, FECDsaWithSha224, FECDsaWithSha256,
       FECDsaWithSha384, FECDsaWithSha512, FEllipticCurve, FPrimeCurve,
       FECDsaWithSha384, FECDsaWithSha512, FEllipticCurve, FPrimeCurve,
@@ -270,63 +271,68 @@ end;
 
 
 class procedure TX9ObjectIdentifiers.Boot;
 class procedure TX9ObjectIdentifiers.Boot;
 begin
 begin
-  Fansi_X9_62 := TDerObjectIdentifier.Create(AnsiX962);
-
-  FIdFieldType := ansi_X9_62.Branch('1');
-
-  FPrimeField := IdFieldType.Branch('1');
-
-  FCharacteristicTwoField := IdFieldType.Branch('2');
-
-  FGNBasis := CharacteristicTwoField.Branch('3.1');
-  FTPBasis := CharacteristicTwoField.Branch('3.2');
-  FPPBasis := CharacteristicTwoField.Branch('3.3');
-
-  Fid_ecSigType := ansi_X9_62.Branch('4');
-  //
-  FECDsaWithSha1 := id_ecSigType.Branch('1');
-
-  Fid_publicKeyType := ansi_X9_62.Branch('2');
-
-  FIdECPublicKey := id_publicKeyType.Branch('1');
-
-  FECDsaWithSha2 := id_ecSigType.Branch('3');
-
-  FECDsaWithSha224 := ECDsaWithSha2.Branch('1');
-  FECDsaWithSha256 := ECDsaWithSha2.Branch('2');
-  FECDsaWithSha384 := ECDsaWithSha2.Branch('3');
-  FECDsaWithSha512 := ECDsaWithSha2.Branch('4');
-  //
-  //
-  // named curves
-  //
-  FEllipticCurve := ansi_X9_62.Branch('3');
-
-  //
-  // Prime
-  //
-  FPrimeCurve := EllipticCurve.Branch('1');
-
-  FPrime192v1 := PrimeCurve.Branch('1');
-  FPrime192v2 := PrimeCurve.Branch('2');
-  FPrime192v3 := PrimeCurve.Branch('3');
-  FPrime239v1 := PrimeCurve.Branch('4');
-  FPrime239v2 := PrimeCurve.Branch('5');
-  FPrime239v3 := PrimeCurve.Branch('6');
-  FPrime256v1 := PrimeCurve.Branch('7');
-
-  //
-  // DSA
-  //
-  // dsapublicnumber OBJECT IDENTIFIER ::= { iso(1) member-body(2)
-  // us(840) ansi-x957(10040) number-type(4) 1 }
-  FIdDsa := TDerObjectIdentifier.Create('1.2.840.10040.4.1');
-
-  // /**
-  // *   id-dsa-with-sha1 OBJECT IDENTIFIER ::=  { iso(1) member-body(2)
-  // *         us(840) x9-57 (10040) x9cm(4) 3 }
-  // */
-  FIdDsaWithSha1 := TDerObjectIdentifier.Create('1.2.840.10040.4.3');
+  if not FIsBooted then
+  begin
+    Fansi_X9_62 := TDerObjectIdentifier.Create(AnsiX962);
+
+    FIdFieldType := ansi_X9_62.Branch('1');
+
+    FPrimeField := IdFieldType.Branch('1');
+
+    FCharacteristicTwoField := IdFieldType.Branch('2');
+
+    FGNBasis := CharacteristicTwoField.Branch('3.1');
+    FTPBasis := CharacteristicTwoField.Branch('3.2');
+    FPPBasis := CharacteristicTwoField.Branch('3.3');
+
+    Fid_ecSigType := ansi_X9_62.Branch('4');
+    //
+    FECDsaWithSha1 := id_ecSigType.Branch('1');
+
+    Fid_publicKeyType := ansi_X9_62.Branch('2');
+
+    FIdECPublicKey := id_publicKeyType.Branch('1');
+
+    FECDsaWithSha2 := id_ecSigType.Branch('3');
+
+    FECDsaWithSha224 := ECDsaWithSha2.Branch('1');
+    FECDsaWithSha256 := ECDsaWithSha2.Branch('2');
+    FECDsaWithSha384 := ECDsaWithSha2.Branch('3');
+    FECDsaWithSha512 := ECDsaWithSha2.Branch('4');
+    //
+    //
+    // named curves
+    //
+    FEllipticCurve := ansi_X9_62.Branch('3');
+
+    //
+    // Prime
+    //
+    FPrimeCurve := EllipticCurve.Branch('1');
+
+    FPrime192v1 := PrimeCurve.Branch('1');
+    FPrime192v2 := PrimeCurve.Branch('2');
+    FPrime192v3 := PrimeCurve.Branch('3');
+    FPrime239v1 := PrimeCurve.Branch('4');
+    FPrime239v2 := PrimeCurve.Branch('5');
+    FPrime239v3 := PrimeCurve.Branch('6');
+    FPrime256v1 := PrimeCurve.Branch('7');
+
+    //
+    // DSA
+    //
+    // dsapublicnumber OBJECT IDENTIFIER ::= { iso(1) member-body(2)
+    // us(840) ansi-x957(10040) number-type(4) 1 }
+    FIdDsa := TDerObjectIdentifier.Create('1.2.840.10040.4.1');
+
+    // /**
+    // *   id-dsa-with-sha1 OBJECT IDENTIFIER ::=  { iso(1) member-body(2)
+    // *         us(840) x9-57 (10040) x9cm(4) 3 }
+    // */
+    FIdDsaWithSha1 := TDerObjectIdentifier.Create('1.2.840.10040.4.3');
+
+    FIsBooted := True;
+  end;
 
 
 end;
 end;
 
 

+ 2 - 2
CryptoLib/src/Crypto/ClpBufferedCipherBase.pas

@@ -41,7 +41,7 @@ type
 
 
     class function GetEmptyBuffer: TCryptoLibByteArray; static; inline;
     class function GetEmptyBuffer: TCryptoLibByteArray; static; inline;
 
 
-    class constructor CreateBufferedCipherBase();
+    class constructor BufferedCipherBase();
 
 
   strict protected
   strict protected
 
 
@@ -104,7 +104,7 @@ implementation
 
 
 { TBufferedCipherBase }
 { TBufferedCipherBase }
 
 
-class constructor TBufferedCipherBase.CreateBufferedCipherBase;
+class constructor TBufferedCipherBase.BufferedCipherBase;
 begin
 begin
   System.SetLength(FEmptyBuffer, 0);
   System.SetLength(FEmptyBuffer, 0);
 end;
 end;

+ 30 - 17
CryptoLib/src/Crypto/EC/ClpCustomNamedCurves.pas

@@ -55,6 +55,7 @@ type
 
 
   class var
   class var
 
 
+    FIsBooted: Boolean;
     FnameToCurve: TDictionary<String, IX9ECParametersHolder>;
     FnameToCurve: TDictionary<String, IX9ECParametersHolder>;
     FnameToOid: TDictionary<String, IDerObjectIdentifier>;
     FnameToOid: TDictionary<String, IDerObjectIdentifier>;
     FoidToCurve: TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>;
     FoidToCurve: TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>;
@@ -112,6 +113,8 @@ type
     // */
     // */
     class property Names: TCryptoLibStringArray read GetNames;
     class property Names: TCryptoLibStringArray read GetNames;
 
 
+    class procedure Boot(); static;
+
   type
   type
 
 
     /// <summary>
     /// <summary>
@@ -207,6 +210,7 @@ end;
 // FnameToCurve.Add(LName, curve);
 // FnameToCurve.Add(LName, curve);
 // end;
 // end;
 //
 //
+
 class function TCustomNamedCurves.ConfigureCurve(const curve: IECCurve)
 class function TCustomNamedCurves.ConfigureCurve(const curve: IECCurve)
   : IECCurve;
   : IECCurve;
 begin
 begin
@@ -277,23 +281,7 @@ end;
 
 
 class constructor TCustomNamedCurves.CreateSecNamedCurves;
 class constructor TCustomNamedCurves.CreateSecNamedCurves;
 begin
 begin
-  FnameToCurve := TDictionary<String, IX9ECParametersHolder>.Create();
-  FnameToOid := TDictionary<String, IDerObjectIdentifier>.Create();
-  FoidToCurve := TDictionary<IDerObjectIdentifier,
-    IX9ECParametersHolder>.Create();
-  FoidToName := TDictionary<IDerObjectIdentifier, String>.Create();
-
-  Fnames := TList<String>.Create();
-
-  DefineCurveWithOid('secp256k1', TSecObjectIdentifiers.SecP256k1,
-    TSecP256K1Holder.Instance);
-
-  DefineCurveWithOid('secp384r1', TSecObjectIdentifiers.SecP384r1,
-    TSecP384R1Holder.Instance);
-
-  DefineCurveWithOid('secp521r1', TSecObjectIdentifiers.SecP521r1,
-    TSecP521R1Holder.Instance);
-
+  TCustomNamedCurves.Boot;
 end;
 end;
 
 
 class destructor TCustomNamedCurves.DestroySecNamedCurves;
 class destructor TCustomNamedCurves.DestroySecNamedCurves;
@@ -305,6 +293,31 @@ begin
   Fnames.Free;
   Fnames.Free;
 end;
 end;
 
 
+class procedure TCustomNamedCurves.Boot;
+begin
+  if not FIsBooted then
+  begin
+    FnameToCurve := TDictionary<String, IX9ECParametersHolder>.Create();
+    FnameToOid := TDictionary<String, IDerObjectIdentifier>.Create();
+    FoidToCurve := TDictionary<IDerObjectIdentifier,
+      IX9ECParametersHolder>.Create();
+    FoidToName := TDictionary<IDerObjectIdentifier, String>.Create();
+
+    Fnames := TList<String>.Create();
+
+    DefineCurveWithOid('secp256k1', TSecObjectIdentifiers.SecP256k1,
+      TSecP256K1Holder.Instance);
+
+    DefineCurveWithOid('secp384r1', TSecObjectIdentifiers.SecP384r1,
+      TSecP384R1Holder.Instance);
+
+    DefineCurveWithOid('secp521r1', TSecObjectIdentifiers.SecP521r1,
+      TSecP521R1Holder.Instance);
+
+    FIsBooted := True;
+  end;
+end;
+
 { TCustomNamedCurves.TSecP256K1Holder }
 { TCustomNamedCurves.TSecP256K1Holder }
 
 
 function TCustomNamedCurves.TSecP256K1Holder.CreateParameters: IX9ECParameters;
 function TCustomNamedCurves.TSecP256K1Holder.CreateParameters: IX9ECParameters;

+ 2 - 2
CryptoLib/src/Crypto/Engines/ClpAesEngine.pas

@@ -131,7 +131,7 @@ type
 
 
     class function Inv_Mcol(x: UInt32): UInt32; static; inline;
     class function Inv_Mcol(x: UInt32): UInt32; static; inline;
     class function SubWord(x: UInt32): UInt32; static; inline;
     class function SubWord(x: UInt32): UInt32; static; inline;
-    class constructor CreateAesEngine();
+    class constructor AesEngine();
 
 
   public
   public
 
 
@@ -289,7 +289,7 @@ begin
 
 
 end;
 end;
 
 
-class constructor TAesEngine.CreateAesEngine;
+class constructor TAesEngine.AesEngine;
 begin
 begin
   TAesEngine.Boot;
   TAesEngine.Boot;
 end;
 end;

+ 2 - 2
CryptoLib/src/Crypto/Engines/ClpAesLightEngine.pas

@@ -131,7 +131,7 @@ type
     class function Mcol(x: UInt32): UInt32; static; inline;
     class function Mcol(x: UInt32): UInt32; static; inline;
     class function Inv_Mcol(x: UInt32): UInt32; static; inline;
     class function Inv_Mcol(x: UInt32): UInt32; static; inline;
     class function SubWord(x: UInt32): UInt32; static; inline;
     class function SubWord(x: UInt32): UInt32; static; inline;
-    class constructor CreateAesLightEngine();
+    class constructor AesLightEngine();
 
 
   public
   public
     /// <summary>
     /// <summary>
@@ -209,7 +209,7 @@ begin
     $D4, $B3, $7D, $FA, $EF, $C5, $91);
     $D4, $B3, $7D, $FA, $EF, $C5, $91);
 end;
 end;
 
 
-class constructor TAesLightEngine.CreateAesLightEngine;
+class constructor TAesLightEngine.AesLightEngine;
 begin
 begin
   TAesLightEngine.Boot;
   TAesLightEngine.Boot;
 end;
 end;

+ 1 - 1
CryptoLib/src/Crypto/Signers/ClpECDsaSigner.pas

@@ -166,7 +166,7 @@ end;
 
 
 class constructor TECDsaSigner.ECDsaSigner;
 class constructor TECDsaSigner.ECDsaSigner;
 begin
 begin
- // TBigInteger.Boot;
+  TBigInteger.Boot;
   FEight := TBigInteger.ValueOf(8);
   FEight := TBigInteger.ValueOf(8);
 end;
 end;
 
 

+ 126 - 112
CryptoLib/src/Math/ClpBigInteger.pas

@@ -103,6 +103,7 @@ type
 
 
   class var
   class var
 
 
+    FIsBooted: Boolean;
     FZero, FOne, FTwo, FThree, FFour, FTen: TBigInteger;
     FZero, FOne, FTwo, FThree, FFour, FTen: TBigInteger;
     // Each list has a product < 2^31
     // Each list has a product < 2^31
     FprimeLists: TCryptoLibMatrixInt32Array;
     FprimeLists: TCryptoLibMatrixInt32Array;
@@ -799,129 +800,142 @@ var
   product, j: Int32;
   product, j: Int32;
 begin
 begin
 
 
-  System.SetLength(FZeroEncoding, 0);
-  System.SetLength(FZeroMagnitude, 0);
-  FprimeLists := TCryptoLibMatrixInt32Array.Create
-    (TCryptoLibInt32Array.Create(3, 5, 7, 11, 13, 17, 19, 23),
-    TCryptoLibInt32Array.Create(29, 31, 37, 41, 43),
-    TCryptoLibInt32Array.Create(47, 53, 59, 61, 67),
-    TCryptoLibInt32Array.Create(71, 73, 79, 83), TCryptoLibInt32Array.Create(89,
-    97, 101, 103),
-
-    TCryptoLibInt32Array.Create(107, 109, 113, 127),
-    TCryptoLibInt32Array.Create(131, 137, 139, 149),
-    TCryptoLibInt32Array.Create(151, 157, 163, 167),
-    TCryptoLibInt32Array.Create(173, 179, 181, 191),
-    TCryptoLibInt32Array.Create(193, 197, 199, 211),
-
-    TCryptoLibInt32Array.Create(223, 227, 229), TCryptoLibInt32Array.Create(233,
-    239, 241), TCryptoLibInt32Array.Create(251, 257, 263),
-    TCryptoLibInt32Array.Create(269, 271, 277), TCryptoLibInt32Array.Create(281,
-    283, 293),
-
-    TCryptoLibInt32Array.Create(307, 311, 313), TCryptoLibInt32Array.Create(317,
-    331, 337), TCryptoLibInt32Array.Create(347, 349, 353),
-    TCryptoLibInt32Array.Create(359, 367, 373), TCryptoLibInt32Array.Create(379,
-    383, 389),
-
-    TCryptoLibInt32Array.Create(397, 401, 409), TCryptoLibInt32Array.Create(419,
-    421, 431), TCryptoLibInt32Array.Create(433, 439, 443),
-    TCryptoLibInt32Array.Create(449, 457, 461), TCryptoLibInt32Array.Create(463,
-    467, 479),
-
-    TCryptoLibInt32Array.Create(487, 491, 499), TCryptoLibInt32Array.Create(503,
-    509, 521), TCryptoLibInt32Array.Create(523, 541, 547),
-    TCryptoLibInt32Array.Create(557, 563, 569), TCryptoLibInt32Array.Create(571,
-    577, 587),
-
-    TCryptoLibInt32Array.Create(593, 599, 601), TCryptoLibInt32Array.Create(607,
-    613, 617), TCryptoLibInt32Array.Create(619, 631, 641),
-    TCryptoLibInt32Array.Create(643, 647, 653), TCryptoLibInt32Array.Create(659,
-    661, 673),
-
-    TCryptoLibInt32Array.Create(677, 683, 691), TCryptoLibInt32Array.Create(701,
-    709, 719), TCryptoLibInt32Array.Create(727, 733, 739),
-    TCryptoLibInt32Array.Create(743, 751, 757), TCryptoLibInt32Array.Create(761,
-    769, 773),
-
-    TCryptoLibInt32Array.Create(787, 797, 809), TCryptoLibInt32Array.Create(811,
-    821, 823), TCryptoLibInt32Array.Create(827, 829, 839),
-    TCryptoLibInt32Array.Create(853, 857, 859), TCryptoLibInt32Array.Create(863,
-    877, 881),
-
-    TCryptoLibInt32Array.Create(883, 887, 907), TCryptoLibInt32Array.Create(911,
-    919, 929), TCryptoLibInt32Array.Create(937, 941, 947),
-    TCryptoLibInt32Array.Create(953, 967, 971), TCryptoLibInt32Array.Create(977,
-    983, 991),
-
-    TCryptoLibInt32Array.Create(997, 1009, 1013),
-    TCryptoLibInt32Array.Create(1019, 1021, 1031),
-    TCryptoLibInt32Array.Create(1033, 1039, 1049),
-    TCryptoLibInt32Array.Create(1051, 1061, 1063),
-    TCryptoLibInt32Array.Create(1069, 1087, 1091),
-
-    TCryptoLibInt32Array.Create(1093, 1097, 1103),
-    TCryptoLibInt32Array.Create(1109, 1117, 1123),
-    TCryptoLibInt32Array.Create(1129, 1151, 1153),
-    TCryptoLibInt32Array.Create(1163, 1171, 1181),
-    TCryptoLibInt32Array.Create(1187, 1193, 1201),
-
-    TCryptoLibInt32Array.Create(1213, 1217, 1223),
-    TCryptoLibInt32Array.Create(1229, 1231, 1237),
-    TCryptoLibInt32Array.Create(1249, 1259, 1277),
-    TCryptoLibInt32Array.Create(1279, 1283, 1289));
-
-  //TSecureRandom.Boot;
-
-  FRandomSource := TSecureRandom.Create();
-
-  FZero := TBigInteger.Create(0, FZeroMagnitude, false);
-  FZero.FnBits := 0;
-  FZero.FnBitLength := 0;
-
-  System.SetLength(FSMALL_CONSTANTS, 17);
-
-  FSMALL_CONSTANTS[0] := FZero;
-
-  i := 1;
-
-  while i < UInt32(System.length(FSMALL_CONSTANTS)) do
-  begin
-    FSMALL_CONSTANTS[i] := CreateUValueOf(i);
-    System.Inc(i);
-  end;
+  if not FIsBooted then
+  begin
+    System.SetLength(FZeroEncoding, 0);
+    System.SetLength(FZeroMagnitude, 0);
+    FprimeLists := TCryptoLibMatrixInt32Array.Create
+      (TCryptoLibInt32Array.Create(3, 5, 7, 11, 13, 17, 19, 23),
+      TCryptoLibInt32Array.Create(29, 31, 37, 41, 43),
+      TCryptoLibInt32Array.Create(47, 53, 59, 61, 67),
+      TCryptoLibInt32Array.Create(71, 73, 79, 83),
+      TCryptoLibInt32Array.Create(89, 97, 101, 103),
+
+      TCryptoLibInt32Array.Create(107, 109, 113, 127),
+      TCryptoLibInt32Array.Create(131, 137, 139, 149),
+      TCryptoLibInt32Array.Create(151, 157, 163, 167),
+      TCryptoLibInt32Array.Create(173, 179, 181, 191),
+      TCryptoLibInt32Array.Create(193, 197, 199, 211),
+
+      TCryptoLibInt32Array.Create(223, 227, 229),
+      TCryptoLibInt32Array.Create(233, 239, 241),
+      TCryptoLibInt32Array.Create(251, 257, 263),
+      TCryptoLibInt32Array.Create(269, 271, 277),
+      TCryptoLibInt32Array.Create(281, 283, 293),
+
+      TCryptoLibInt32Array.Create(307, 311, 313),
+      TCryptoLibInt32Array.Create(317, 331, 337),
+      TCryptoLibInt32Array.Create(347, 349, 353),
+      TCryptoLibInt32Array.Create(359, 367, 373),
+      TCryptoLibInt32Array.Create(379, 383, 389),
+
+      TCryptoLibInt32Array.Create(397, 401, 409),
+      TCryptoLibInt32Array.Create(419, 421, 431),
+      TCryptoLibInt32Array.Create(433, 439, 443),
+      TCryptoLibInt32Array.Create(449, 457, 461),
+      TCryptoLibInt32Array.Create(463, 467, 479),
+
+      TCryptoLibInt32Array.Create(487, 491, 499),
+      TCryptoLibInt32Array.Create(503, 509, 521),
+      TCryptoLibInt32Array.Create(523, 541, 547),
+      TCryptoLibInt32Array.Create(557, 563, 569),
+      TCryptoLibInt32Array.Create(571, 577, 587),
+
+      TCryptoLibInt32Array.Create(593, 599, 601),
+      TCryptoLibInt32Array.Create(607, 613, 617),
+      TCryptoLibInt32Array.Create(619, 631, 641),
+      TCryptoLibInt32Array.Create(643, 647, 653),
+      TCryptoLibInt32Array.Create(659, 661, 673),
+
+      TCryptoLibInt32Array.Create(677, 683, 691),
+      TCryptoLibInt32Array.Create(701, 709, 719),
+      TCryptoLibInt32Array.Create(727, 733, 739),
+      TCryptoLibInt32Array.Create(743, 751, 757),
+      TCryptoLibInt32Array.Create(761, 769, 773),
+
+      TCryptoLibInt32Array.Create(787, 797, 809),
+      TCryptoLibInt32Array.Create(811, 821, 823),
+      TCryptoLibInt32Array.Create(827, 829, 839),
+      TCryptoLibInt32Array.Create(853, 857, 859),
+      TCryptoLibInt32Array.Create(863, 877, 881),
+
+      TCryptoLibInt32Array.Create(883, 887, 907),
+      TCryptoLibInt32Array.Create(911, 919, 929),
+      TCryptoLibInt32Array.Create(937, 941, 947),
+      TCryptoLibInt32Array.Create(953, 967, 971),
+      TCryptoLibInt32Array.Create(977, 983, 991),
+
+      TCryptoLibInt32Array.Create(997, 1009, 1013),
+      TCryptoLibInt32Array.Create(1019, 1021, 1031),
+      TCryptoLibInt32Array.Create(1033, 1039, 1049),
+      TCryptoLibInt32Array.Create(1051, 1061, 1063),
+      TCryptoLibInt32Array.Create(1069, 1087, 1091),
+
+      TCryptoLibInt32Array.Create(1093, 1097, 1103),
+      TCryptoLibInt32Array.Create(1109, 1117, 1123),
+      TCryptoLibInt32Array.Create(1129, 1151, 1153),
+      TCryptoLibInt32Array.Create(1163, 1171, 1181),
+      TCryptoLibInt32Array.Create(1187, 1193, 1201),
+
+      TCryptoLibInt32Array.Create(1213, 1217, 1223),
+      TCryptoLibInt32Array.Create(1229, 1231, 1237),
+      TCryptoLibInt32Array.Create(1249, 1259, 1277),
+      TCryptoLibInt32Array.Create(1279, 1283, 1289));
+
+    TSecureRandom.Boot;
+
+    FRandomSource := TSecureRandom.Create();
+
+    FZero := TBigInteger.Create(0, FZeroMagnitude, false);
+    FZero.FnBits := 0;
+    FZero.FnBitLength := 0;
+
+    System.SetLength(FSMALL_CONSTANTS, 17);
+
+    FSMALL_CONSTANTS[0] := FZero;
+
+    i := 1;
+
+    while i < UInt32(System.length(FSMALL_CONSTANTS)) do
+    begin
+      FSMALL_CONSTANTS[i] := CreateUValueOf(i);
+      System.Inc(i);
+    end;
 
 
-  FOne := FSMALL_CONSTANTS[1];
-  FTwo := FSMALL_CONSTANTS[2];
-  FThree := FSMALL_CONSTANTS[3];
-  FFour := FSMALL_CONSTANTS[4];
-  FTen := FSMALL_CONSTANTS[10];
+    FOne := FSMALL_CONSTANTS[1];
+    FTwo := FSMALL_CONSTANTS[2];
+    FThree := FSMALL_CONSTANTS[3];
+    FFour := FSMALL_CONSTANTS[4];
+    FTen := FSMALL_CONSTANTS[10];
 
 
-  Fradix2 := ValueOf(2);
-  Fradix2E := Fradix2.Pow(chunk2);
+    Fradix2 := ValueOf(2);
+    Fradix2E := Fradix2.Pow(chunk2);
 
 
-  Fradix8 := ValueOf(8);
-  Fradix8E := Fradix8.Pow(chunk8);
+    Fradix8 := ValueOf(8);
+    Fradix8E := Fradix8.Pow(chunk8);
 
 
-  Fradix10 := ValueOf(10);
+    Fradix10 := ValueOf(10);
 
 
-  Fradix10E := Fradix10.Pow(chunk10);
+    Fradix10E := Fradix10.Pow(chunk10);
 
 
-  Fradix16 := ValueOf(16);
-  Fradix16E := Fradix16.Pow(chunk16);
+    Fradix16 := ValueOf(16);
+    Fradix16E := Fradix16.Pow(chunk16);
 
 
-  System.SetLength(FprimeProducts, System.length(primeLists));
+    System.SetLength(FprimeProducts, System.length(primeLists));
 
 
-  for i := 0 to System.Pred(System.length(primeLists)) do
-  begin
-    primeList := primeLists[i];
-    product := primeList[0];
-    for j := 1 to System.Pred(System.length(primeList)) do
+    for i := 0 to System.Pred(System.length(primeLists)) do
     begin
     begin
-      product := product * primeList[j];
+      primeList := primeLists[i];
+      product := primeList[0];
+      for j := 1 to System.Pred(System.length(primeList)) do
+      begin
+        product := product * primeList[j];
+      end;
+
+      FprimeProducts[i] := product;
     end;
     end;
 
 
-    FprimeProducts[i] := product;
+    FIsBooted := True;
   end;
   end;
 
 
 end;
 end;

+ 1 - 1
CryptoLib/src/Math/EC/Abc/ClpTnaf.pas

@@ -1114,7 +1114,7 @@ end;
 
 
 class constructor TTnaf.Tnaf;
 class constructor TTnaf.Tnaf;
 begin
 begin
- // TBigInteger.Boot;
+  TBigInteger.Boot;
   FMinusOne := TBigInteger.One.Negate();
   FMinusOne := TBigInteger.One.Negate();
   FMinusTwo := TBigInteger.Two.Negate();
   FMinusTwo := TBigInteger.Two.Negate();
   FMinusThree := TBigInteger.Three.Negate();
   FMinusThree := TBigInteger.Three.Negate();

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256K1Field.pas

@@ -43,7 +43,7 @@ type
 
 
     class function GetP: TCryptoLibUInt32Array; static; inline;
     class function GetP: TCryptoLibUInt32Array; static; inline;
 
 
-    class constructor CreateSecP256K1Field();
+    class constructor SecP256K1Field();
 
 
   public
   public
     class procedure Add(x, y, z: TCryptoLibUInt32Array); static; inline;
     class procedure Add(x, y, z: TCryptoLibUInt32Array); static; inline;
@@ -74,7 +74,7 @@ implementation
 
 
 { TSecP256K1Field }
 { TSecP256K1Field }
 
 
-class constructor TSecP256K1Field.CreateSecP256K1Field;
+class constructor TSecP256K1Field.SecP256K1Field;
 begin
 begin
   FP := TCryptoLibUInt32Array.Create($FFFFFC2F, $FFFFFFFE, $FFFFFFFF, $FFFFFFFF,
   FP := TCryptoLibUInt32Array.Create($FFFFFC2F, $FFFFFFFE, $FFFFFFFF, $FFFFFFFF,
     $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF);
     $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF);

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP384R1Field.pas

@@ -46,7 +46,7 @@ type
     class procedure AddPInvTo(z: TCryptoLibUInt32Array); static;
     class procedure AddPInvTo(z: TCryptoLibUInt32Array); static;
     class procedure SubPInvFrom(z: TCryptoLibUInt32Array); static;
     class procedure SubPInvFrom(z: TCryptoLibUInt32Array); static;
 
 
-    class constructor CreateSecP384R1Field();
+    class constructor SecP384R1Field();
 
 
   public
   public
     class procedure Add(x, y, z: TCryptoLibUInt32Array); static; inline;
     class procedure Add(x, y, z: TCryptoLibUInt32Array); static; inline;
@@ -74,7 +74,7 @@ implementation
 
 
 { TSecP384R1Field }
 { TSecP384R1Field }
 
 
-class constructor TSecP384R1Field.CreateSecP384R1Field;
+class constructor TSecP384R1Field.SecP384R1Field;
 begin
 begin
   FP := TCryptoLibUInt32Array.Create($FFFFFFFF, $00000000, $00000000, $FFFFFFFF,
   FP := TCryptoLibUInt32Array.Create($FFFFFFFF, $00000000, $00000000, $FFFFFFFF,
     $FFFFFFFE, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF,
     $FFFFFFFE, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF,

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP521R1Field.pas

@@ -41,7 +41,7 @@ type
 
 
     class function GetP: TCryptoLibUInt32Array; static; inline;
     class function GetP: TCryptoLibUInt32Array; static; inline;
 
 
-    class constructor CreateSecP521R1Field();
+    class constructor SecP521R1Field();
 
 
   strict protected
   strict protected
     class procedure ImplMultiply(x, y, zz: TCryptoLibUInt32Array);
     class procedure ImplMultiply(x, y, zz: TCryptoLibUInt32Array);
@@ -71,7 +71,7 @@ implementation
 
 
 { TSecP521R1Field }
 { TSecP521R1Field }
 
 
-class constructor TSecP521R1Field.CreateSecP521R1Field;
+class constructor TSecP521R1Field.SecP521R1Field;
 begin
 begin
   FP := TCryptoLibUInt32Array.Create($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF,
   FP := TCryptoLibUInt32Array.Create($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF,
     $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF,
     $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF,

+ 1 - 1
CryptoLib/src/Math/Field/ClpFiniteFields.pas

@@ -62,7 +62,7 @@ implementation
 
 
 class constructor TFiniteFields.FiniteFields;
 class constructor TFiniteFields.FiniteFields;
 begin
 begin
- // TBigInteger.Boot;
+  TBigInteger.Boot;
   FGF_2 := TPrimeField.Create(TBigInteger.ValueOf(2));
   FGF_2 := TPrimeField.Create(TBigInteger.ValueOf(2));
   FGF_3 := TPrimeField.Create(TBigInteger.ValueOf(3));
   FGF_3 := TPrimeField.Create(TBigInteger.ValueOf(3));
 end;
 end;

+ 1 - 1
CryptoLib/src/Math/Raw/ClpMod.pas

@@ -231,7 +231,7 @@ end;
 
 
 class constructor TMod.&Mod;
 class constructor TMod.&Mod;
 begin
 begin
-  // TSecureRandom.Boot;
+  TSecureRandom.Boot;
   FRandomSource := TSecureRandom.Create();
   FRandomSource := TSecureRandom.Create();
 end;
 end;
 
 

+ 1 - 1
CryptoLib/src/Security/ClpCipherUtilities.pas

@@ -123,7 +123,7 @@ begin
   Falgorithms := TDictionary<string, string>.Create();
   Falgorithms := TDictionary<string, string>.Create();
   Foids := TDictionary<string, IDerObjectIdentifier>.Create();
   Foids := TDictionary<string, IDerObjectIdentifier>.Create();
 
 
- // TNistObjectIdentifiers.Boot;
+  TNistObjectIdentifiers.Boot;
 
 
   // TODO Flesh out the list of aliases
   // TODO Flesh out the list of aliases
 
 

+ 7 - 7
CryptoLib/src/Security/ClpDigestUtilities.pas

@@ -371,18 +371,18 @@ begin
 
 
   Falgorithms.Add('NULL', 'NULL'); // Null Digest
   Falgorithms.Add('NULL', 'NULL'); // Null Digest
 
 
- // TPkcsObjectIdentifiers.Boot;
+  TPkcsObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TPkcsObjectIdentifiers.MD2.id, 'MD2');
   Falgorithms.Add(TPkcsObjectIdentifiers.MD2.id, 'MD2');
   Falgorithms.Add(TPkcsObjectIdentifiers.MD4.id, 'MD4');
   Falgorithms.Add(TPkcsObjectIdentifiers.MD4.id, 'MD4');
   Falgorithms.Add(TPkcsObjectIdentifiers.MD5.id, 'MD5');
   Falgorithms.Add(TPkcsObjectIdentifiers.MD5.id, 'MD5');
 
 
- // TOiwObjectIdentifiers.Boot;
+  TOiwObjectIdentifiers.Boot;
 
 
   Falgorithms.Add('SHA1', 'SHA-1');
   Falgorithms.Add('SHA1', 'SHA-1');
   Falgorithms.Add(TOiwObjectIdentifiers.IdSha1.id, 'SHA-1');
   Falgorithms.Add(TOiwObjectIdentifiers.IdSha1.id, 'SHA-1');
 
 
- // TNistObjectIdentifiers.Boot;
+  TNistObjectIdentifiers.Boot;
 
 
   Falgorithms.Add('SHA224', 'SHA-224');
   Falgorithms.Add('SHA224', 'SHA-224');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha224.id, 'SHA-224');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha224.id, 'SHA-224');
@@ -397,7 +397,7 @@ begin
   Falgorithms.Add('SHA512/256', 'SHA-512/256');
   Falgorithms.Add('SHA512/256', 'SHA-512/256');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha512_256.id, 'SHA-512/256');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha512_256.id, 'SHA-512/256');
 
 
- // TTeleTrusTObjectIdentifiers.Boot;
+  TTeleTrusTObjectIdentifiers.Boot;
 
 
   Falgorithms.Add('RIPEMD-128', 'RIPEMD128');
   Falgorithms.Add('RIPEMD-128', 'RIPEMD128');
   Falgorithms.Add(TTeleTrusTObjectIdentifiers.RIPEMD128.id, 'RIPEMD128');
   Falgorithms.Add(TTeleTrusTObjectIdentifiers.RIPEMD128.id, 'RIPEMD128');
@@ -408,7 +408,7 @@ begin
   Falgorithms.Add('RIPEMD-320', 'RIPEMD320');
   Falgorithms.Add('RIPEMD-320', 'RIPEMD320');
   // Falgorithms.Add(TTeleTrusTObjectIdentifiers.RipeMD320.Id,'RIPEMD320');
   // Falgorithms.Add(TTeleTrusTObjectIdentifiers.RipeMD320.Id,'RIPEMD320');
 
 
- // TCryptoProObjectIdentifiers.Boot;
+  TCryptoProObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411.id, 'GOST3411');
   Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411.id, 'GOST3411');
 
 
@@ -417,7 +417,7 @@ begin
   Falgorithms.Add(TNistObjectIdentifiers.IdSha3_384.id, 'SHA3-384');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha3_384.id, 'SHA3-384');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha3_512.id, 'SHA3-512');
   Falgorithms.Add(TNistObjectIdentifiers.IdSha3_512.id, 'SHA3-512');
 
 
- // TMiscObjectIdentifiers.Boot;
+  TMiscObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2b160.id, 'BLAKE2B-160');
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2b160.id, 'BLAKE2B-160');
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2b256.id, 'BLAKE2B-256');
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2b256.id, 'BLAKE2B-256');
@@ -428,7 +428,7 @@ begin
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2s224.id, 'BLAKE2S-224');
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2s224.id, 'BLAKE2S-224');
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2s256.id, 'BLAKE2S-256');
   Falgorithms.Add(TMiscObjectIdentifiers.id_blake2s256.id, 'BLAKE2S-256');
 
 
- // TRosstandartObjectIdentifiers.Boot;
+  TRosstandartObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TRosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256.
   Falgorithms.Add(TRosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256.
     id, 'HMAC-GOST3411-2012-256');
     id, 'HMAC-GOST3411-2012-256');

+ 4 - 4
CryptoLib/src/Security/ClpGeneratorUtilities.pas

@@ -170,7 +170,7 @@ begin
   FkpgAlgorithms := TDictionary<String, String>.Create();
   FkpgAlgorithms := TDictionary<String, String>.Create();
   FdefaultKeySizes := TDictionary<String, Int32>.Create();
   FdefaultKeySizes := TDictionary<String, Int32>.Create();
 
 
- // TNistObjectIdentifiers.Boot;
+  TNistObjectIdentifiers.Boot;
 
 
   //
   //
   // key generators.
   // key generators.
@@ -197,13 +197,13 @@ begin
   //
   //
   // HMac key generators
   // HMac key generators
   //
   //
- // TIanaObjectIdentifiers.Boot;
+  TIanaObjectIdentifiers.Boot;
 
 
   AddHMacKeyGenerator('MD2', []);
   AddHMacKeyGenerator('MD2', []);
   AddHMacKeyGenerator('MD4', []);
   AddHMacKeyGenerator('MD4', []);
   AddHMacKeyGenerator('MD5', [TIanaObjectIdentifiers.HmacMD5.ID]);
   AddHMacKeyGenerator('MD5', [TIanaObjectIdentifiers.HmacMD5.ID]);
 
 
- // TPkcsObjectIdentifiers.Boot;
+  TPkcsObjectIdentifiers.Boot;
 
 
   AddHMacKeyGenerator('SHA1', [TPkcsObjectIdentifiers.IdHmacWithSha1.ID,
   AddHMacKeyGenerator('SHA1', [TPkcsObjectIdentifiers.IdHmacWithSha1.ID,
     TIanaObjectIdentifiers.HmacSha1.ID]);
     TIanaObjectIdentifiers.HmacSha1.ID]);
@@ -226,7 +226,7 @@ begin
   AddHMacKeyGenerator('RIPEMD160', [TIanaObjectIdentifiers.HmacRipeMD160.ID]);
   AddHMacKeyGenerator('RIPEMD160', [TIanaObjectIdentifiers.HmacRipeMD160.ID]);
   AddHMacKeyGenerator('TIGER', [TIanaObjectIdentifiers.HmacTiger.ID]);
   AddHMacKeyGenerator('TIGER', [TIanaObjectIdentifiers.HmacTiger.ID]);
 
 
- // TRosstandartObjectIdentifiers.Boot;
+  TRosstandartObjectIdentifiers.Boot;
 
 
   AddHMacKeyGenerator('GOST3411-2012-256',
   AddHMacKeyGenerator('GOST3411-2012-256',
     [TRosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256.ID]);
     [TRosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256.ID]);

+ 4 - 4
CryptoLib/src/Security/ClpMacUtilities.pas

@@ -82,14 +82,14 @@ class procedure TMacUtilities.Boot;
 begin
 begin
   Falgorithms := TDictionary<string, string>.Create();
   Falgorithms := TDictionary<string, string>.Create();
 
 
- // TIanaObjectIdentifiers.Boot;
+  TIanaObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TIanaObjectIdentifiers.HmacMD5.id, 'HMAC-MD5');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacMD5.id, 'HMAC-MD5');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacRipeMD160.id, 'HMAC-RIPEMD160');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacRipeMD160.id, 'HMAC-RIPEMD160');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacSha1.id, 'HMAC-SHA1');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacSha1.id, 'HMAC-SHA1');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacTiger.id, 'HMAC-TIGER');
   Falgorithms.Add(TIanaObjectIdentifiers.HmacTiger.id, 'HMAC-TIGER');
 
 
- // TPkcsObjectIdentifiers.Boot;
+  TPkcsObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha1.id, 'HMAC-SHA1');
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha1.id, 'HMAC-SHA1');
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha224.id, 'HMAC-SHA224');
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha224.id, 'HMAC-SHA224');
@@ -97,7 +97,7 @@ begin
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha384.id, 'HMAC-SHA384');
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha384.id, 'HMAC-SHA384');
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha512.id, 'HMAC-SHA512');
   Falgorithms.Add(TPkcsObjectIdentifiers.IdHmacWithSha512.id, 'HMAC-SHA512');
 
 
- // TNistObjectIdentifiers.Boot;
+  TNistObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TNistObjectIdentifiers.IdHMacWithSha3_224.id,
   Falgorithms.Add(TNistObjectIdentifiers.IdHMacWithSha3_224.id,
     'HMAC-SHA3-224');
     'HMAC-SHA3-224');
@@ -108,7 +108,7 @@ begin
   Falgorithms.Add(TNistObjectIdentifiers.IdHMacWithSha3_512.id,
   Falgorithms.Add(TNistObjectIdentifiers.IdHMacWithSha3_512.id,
     'HMAC-SHA3-512');
     'HMAC-SHA3-512');
 
 
-//  TRosstandartObjectIdentifiers.Boot;
+  TRosstandartObjectIdentifiers.Boot;
 
 
   Falgorithms.Add(TRosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256.
   Falgorithms.Add(TRosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256.
     id, 'HMAC-GOST3411-2012-256');
     id, 'HMAC-GOST3411-2012-256');

+ 1 - 1
CryptoLib/src/Security/ClpParameterUtilities.pas

@@ -107,7 +107,7 @@ begin
   Falgorithms := TDictionary<String, String>.Create();
   Falgorithms := TDictionary<String, String>.Create();
   FbasicIVSizes := TDictionary<string, Integer>.Create();
   FbasicIVSizes := TDictionary<string, Integer>.Create();
 
 
- // TNistObjectIdentifiers.Boot;
+  TNistObjectIdentifiers.Boot;
 
 
   AddAlgorithm('AES', []);
   AddAlgorithm('AES', []);
   AddAlgorithm('AES128', ['2.16.840.1.101.3.4.2',
   AddAlgorithm('AES128', ['2.16.840.1.101.3.4.2',

+ 11 - 5
CryptoLib/src/Security/ClpSecureRandom.pas

@@ -50,6 +50,7 @@ type
   strict private
   strict private
   class var
   class var
 
 
+    FIsBooted: Boolean;
     FCounter: Int64;
     FCounter: Int64;
     Fmaster: ISecureRandom;
     Fmaster: ISecureRandom;
     FDoubleScale: Double;
     FDoubleScale: Double;
@@ -268,7 +269,6 @@ end;
 class constructor TSecureRandom.CreateSecureRandom;
 class constructor TSecureRandom.CreateSecureRandom;
 begin
 begin
   TSecureRandom.Boot;
   TSecureRandom.Boot;
-  FLock := TCriticalSection.Create;
 end;
 end;
 
 
 class destructor TSecureRandom.DestroySecureRandom;
 class destructor TSecureRandom.DestroySecureRandom;
@@ -310,10 +310,16 @@ end;
 
 
 class procedure TSecureRandom.Boot;
 class procedure TSecureRandom.Boot;
 begin
 begin
-  FCounter := TTimes.NanoTime();
-  Fmaster := TSecureRandom.Create(TCryptoApiRandomGenerator.Create()
-    as ICryptoApiRandomGenerator);
-  FDoubleScale := Power(2.0, 64.0);
+  if not FIsBooted then
+  begin
+    FLock := TCriticalSection.Create;
+    FCounter := TTimes.NanoTime();
+    Fmaster := TSecureRandom.Create(TCryptoApiRandomGenerator.Create()
+      as ICryptoApiRandomGenerator);
+    FDoubleScale := Power(2.0, 64.0);
+
+    FIsBooted := True;
+  end;
 end;
 end;
 
 
 constructor TSecureRandom.Create;
 constructor TSecureRandom.Create;

+ 10 - 10
CryptoLib/src/Security/ClpSignerUtilities.pas

@@ -108,11 +108,11 @@ begin
   Falgorithms := TDictionary<String, String>.Create();
   Falgorithms := TDictionary<String, String>.Create();
   Foids := TDictionary<String, IDerObjectIdentifier>.Create();
   Foids := TDictionary<String, IDerObjectIdentifier>.Create();
 
 
- // TX9ObjectIdentifiers.Boot;
- // TOiwObjectIdentifiers.Boot;
- // TNistObjectIdentifiers.Boot;
- // TTeleTrusTObjectIdentifiers.Boot;
- // TCryptoProObjectIdentifiers.Boot;
+  TX9ObjectIdentifiers.Boot;
+  TOiwObjectIdentifiers.Boot;
+  TNistObjectIdentifiers.Boot;
+  TTeleTrusTObjectIdentifiers.Boot;
+  TCryptoProObjectIdentifiers.Boot;
 
 
   Falgorithms.Add('NONEWITHDSA', 'NONEwithDSA');
   Falgorithms.Add('NONEWITHDSA', 'NONEwithDSA');
   Falgorithms.Add('DSAWITHNONE', 'NONEwithDSA');
   Falgorithms.Add('DSAWITHNONE', 'NONEwithDSA');
@@ -213,11 +213,11 @@ begin
   Falgorithms.Add(TTeleTrusTObjectIdentifiers.ECSignWithRipeMD160.id,
   Falgorithms.Add(TTeleTrusTObjectIdentifiers.ECSignWithRipeMD160.id,
     'RIPEMD160withECDSA');
     'RIPEMD160withECDSA');
 
 
-//   Falgorithms.Add('GOST-3410', 'GOST3410');
-//   Falgorithms.Add('GOST-3410-94', 'GOST3410');
-//   Falgorithms.Add('GOST3411WITHGOST3410', 'GOST3410');
-//   Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94.id,
-//   'GOST3410');
+  // Falgorithms.Add('GOST-3410', 'GOST3410');
+  // Falgorithms.Add('GOST-3410-94', 'GOST3410');
+  // Falgorithms.Add('GOST3411WITHGOST3410', 'GOST3410');
+  // Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94.id,
+  // 'GOST3410');
 
 
   // Falgorithms.Add('ECGOST-3410', 'ECGOST3410');
   // Falgorithms.Add('ECGOST-3410', 'ECGOST3410');
   // Falgorithms.Add('ECGOST-3410-2001', 'ECGOST3410');
   // Falgorithms.Add('ECGOST-3410-2001', 'ECGOST3410');