|
|
@@ -1,340 +0,0 @@
|
|
|
-{ *********************************************************************************** }
|
|
|
-{ * CryptoLib Library * }
|
|
|
-{ * Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe * }
|
|
|
-{ * Github Repository <https://github.com/Xor-el> * }
|
|
|
-
|
|
|
-{ * Distributed under the MIT software license, see the accompanying file LICENSE * }
|
|
|
-{ * or visit http://www.opensource.org/licenses/mit-license.php. * }
|
|
|
-
|
|
|
-{ * Acknowledgements: * }
|
|
|
-{ * * }
|
|
|
-{ * Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring * }
|
|
|
-{ * development of this library * }
|
|
|
-
|
|
|
-{ * ******************************************************************************* * }
|
|
|
-
|
|
|
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
|
|
|
-
|
|
|
-unit Pkcs10CertRequestTests;
|
|
|
-
|
|
|
-interface
|
|
|
-
|
|
|
-{$IFDEF FPC}
|
|
|
-{$MODE DELPHI}
|
|
|
-{$ENDIF FPC}
|
|
|
-
|
|
|
-uses
|
|
|
- SysUtils,
|
|
|
- Generics.Collections,
|
|
|
-{$IFDEF FPC}
|
|
|
- fpcunit,
|
|
|
- testregistry,
|
|
|
-{$ELSE}
|
|
|
- TestFramework,
|
|
|
-{$ENDIF FPC}
|
|
|
- ClpAsn1Objects,
|
|
|
- ClpIAsn1Objects,
|
|
|
- ClpIX509Extension,
|
|
|
- ClpBigInteger,
|
|
|
- ClpCryptoLibTypes,
|
|
|
- ClpIAsymmetricCipherKeyPair,
|
|
|
- ClpIAsymmetricCipherKeyPairGenerator,
|
|
|
- ClpGeneratorUtilities,
|
|
|
- ClpSecureRandom,
|
|
|
- ClpISecureRandom,
|
|
|
- ClpKeyGenerationParameters,
|
|
|
- ClpIKeyGenerationParameters,
|
|
|
- ClpRsaParameters,
|
|
|
- ClpIRsaParameters,
|
|
|
- ClpRsaGenerators,
|
|
|
- ClpPkcsAsn1Objects,
|
|
|
- ClpIPkcsAsn1Objects,
|
|
|
- ClpPkcsObjectIdentifiers,
|
|
|
- ClpPkcs10CertificationRequest,
|
|
|
- ClpIPkcs10CertificationRequest,
|
|
|
- ClpX509Asn1Objects,
|
|
|
- ClpIX509Asn1Objects,
|
|
|
- CryptoLibTestBase;
|
|
|
-
|
|
|
-type
|
|
|
-
|
|
|
- TPkcs10CertRequestTest = class(TCryptoLibAlgorithmTestCase)
|
|
|
- strict private
|
|
|
- const
|
|
|
- EmptyExtensionsReqBase64 =
|
|
|
- 'MIICVDCCATwCAQAwADCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKy8' +
|
|
|
- '4oC/QPFkRBE04LIA5njEulZx/EEh+J2spnThoRwk+oycYEVKp95NSfGTAoNjTwUv' +
|
|
|
- 'TdB9c1PCPE1DmgZIVLEVvouB7sZbMbLSI0d//oMO/Wr/CZmvjPGB8DID7RJs0eqO' +
|
|
|
- 'gLgSuyBVrwbcSKtxH4NrNDsS5IZXCcE3xzkxMDdz72m9jvIrl2ivi+YmJ7cJo3N+' +
|
|
|
- 'DBEqHZW28oytOmVo+8zhxvnHb9w26GJEOxN5zYbiIVW2vU9OfeF9te+Rhnks43Pk' +
|
|
|
- 'YDDP2U4hR7q0BYrdkeWdA1ReleYyn/haeAoIVLZMANIOXobiqASKqSusVq9tLD67' +
|
|
|
- '7TAywl5AVq8GOBzlXZUCAwEAAaAPMA0GCSqGSIb3DQEJDjEAMA0GCSqGSIb3DQEB' +
|
|
|
- 'CwUAA4IBAQAXck62gJw1deVOLVFAwBNVNXgJarHtDg3pauHTHvN+pSbdOTe1aRzb' +
|
|
|
- 'Tt4/govtuuGZsGWlUqiglLpl6qeS7Pe9m+WJwhH5yXnJ3yvy2Lc/XkeVQ0kt8uFg' +
|
|
|
- '30UyrgKng6LDgUGFjDSiFr3dK8S/iYpDu/qpl1bWJPWmfmnIXzZWWvBdUTKlfoD9' +
|
|
|
- '/NLIWINEzHQIBXGy2uLhutYOvDq0WDGOgtdFC8my/QajaJh5lo6mM/PlmcYjK286' +
|
|
|
- 'EdGSIxdME7hoW/ljA5355S820QZDkYx1tI/Y/YaY5KVOntwfDQzQiwWZ2PtpTqSK' +
|
|
|
- 'KYe2Ujb362yaERCE13DJC4Us9j8OOXcW';
|
|
|
-
|
|
|
- strict private
|
|
|
- var
|
|
|
- FReq1: TCryptoLibByteArray;
|
|
|
- FReq2: TCryptoLibByteArray;
|
|
|
-
|
|
|
- procedure SetUpTestData;
|
|
|
- procedure BasicPkcs10Test(const ATestName: String; const AReq: TCryptoLibByteArray);
|
|
|
- procedure BuildPerformRequestPair(out AReq1, AReq2: IPkcs10CertificationRequest);
|
|
|
-
|
|
|
- protected
|
|
|
- procedure SetUp; override;
|
|
|
-
|
|
|
- published
|
|
|
- procedure TestBasicCR;
|
|
|
- procedure TestUniversalCR;
|
|
|
- procedure TestEmptyExtRequest;
|
|
|
- procedure TestBrokenRequestWithDuplicateExtension;
|
|
|
- procedure TestPerformRoundTrip;
|
|
|
- procedure TestPerformVerify;
|
|
|
- procedure TestPerformPublicKeyMatch;
|
|
|
-
|
|
|
- end;
|
|
|
-
|
|
|
-implementation
|
|
|
-
|
|
|
-{ TPkcs10CertRequestTest }
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.SetUpTestData;
|
|
|
-begin
|
|
|
- FReq1 := DecodeBase64('MIHoMIGTAgEAMC4xDjAMBgNVBAMTBVRlc3QyMQ8wDQYDVQQKEwZBbmFUb20xCzAJBgNVBAYTAlNF' +
|
|
|
- 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALlEt31Tzt2MlcOljvacJgzQVhmlMoqAOgqJ9Pgd3Gux' +
|
|
|
- 'Z7/WcIlgW4QCB7WZT21O1YoghwBhPDMcNGrHei9kHQkCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA0EA' +
|
|
|
- 'NDEI4ecNtJ3uHwGGlitNFq9WxcoZ0djbQJ5hABMotav6gtqlrwKXY2evaIrsNwkJtNdwwH18aQDU' +
|
|
|
- 'KCjOuBL38Q==');
|
|
|
-
|
|
|
- FReq2 := DecodeBase64('MIIB6TCCAVICAQAwgagxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRQwEgYDVQQH' +
|
|
|
- 'EwtTYW50YSBDbGFyYTEMMAoGA1UEChMDQUJCMVEwTwYDVQQLHEhQAAAAAAAAAG8AAAAAAAAAdwAA' +
|
|
|
- 'AAAAAABlAAAAAAAAAHIAAAAAAAAAIAAAAAAAAABUAAAAAAAAABxIAAAAAAAARAAAAAAAAAAxDTAL' +
|
|
|
- 'BgNVBAMTBGJsdWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANETRZ+6occCOrFxNhfKIp4C' +
|
|
|
- 'mMkxwhBNb7TnnahpbM9O0r4hrBPcfYuL7u9YX/jN0YNUP+/CiT39HhSe/bikaBPDEyNsl988I8vX' +
|
|
|
- 'piEdgxYq/+LTgGHbjRsRYCkPtmzwBbuBldNF8bV7pu0v4UScSsExmGqqDlX1TbPU8KkPU1iTAgMB' +
|
|
|
- 'AAGgADANBgkqhkiG9w0BAQQFAAOBgQAFbrs9qUwh93CtETk7DeUD5HcdCnxauo1bck44snSV6MZV' +
|
|
|
- 'OCIGaYu1501kmhEvAtVVRr6SEHwimfQDDIjnrWwYsEr/DT6tkTZAbfRd3qUu3iKjT0H0vlUZp0hJ' +
|
|
|
- '66mINtBM84uZFBfoXiWY8M3FuAnGmvy6ah/dYtJorTxLKiGkew==');
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.SetUp;
|
|
|
-begin
|
|
|
- inherited SetUp;
|
|
|
- SetUpTestData;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.BasicPkcs10Test(const ATestName: String; const AReq: TCryptoLibByteArray);
|
|
|
-var
|
|
|
- LCertReq: ICertificationRequest;
|
|
|
- LBytes: TCryptoLibByteArray;
|
|
|
-begin
|
|
|
- try
|
|
|
- LCertReq := TCertificationRequest.GetInstance(AReq);
|
|
|
-
|
|
|
- LBytes := LCertReq.GetDerEncoded();
|
|
|
-
|
|
|
- if not AreEqual(LBytes, AReq) then
|
|
|
- begin
|
|
|
- Fail(Format('Pkcs10: %s failed comparison test', [ATestName]));
|
|
|
- end;
|
|
|
- except
|
|
|
- on E: Exception do
|
|
|
- begin
|
|
|
- Fail(Format('Pkcs10: Exception - %s %s', [ATestName, E.Message]));
|
|
|
- end;
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestBasicCR;
|
|
|
-begin
|
|
|
- BasicPkcs10Test('Basic CR', FReq1);
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestUniversalCR;
|
|
|
-begin
|
|
|
- BasicPkcs10Test('Universal CR', FReq2);
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestEmptyExtRequest;
|
|
|
-var
|
|
|
- LReq: IPkcs10CertificationRequest;
|
|
|
- LEncoded: TCryptoLibByteArray;
|
|
|
-begin
|
|
|
- LEncoded := DecodeBase64(EmptyExtensionsReqBase64);
|
|
|
- LReq := TPkcs10CertificationRequest.Create(LEncoded);
|
|
|
- try
|
|
|
- LReq.GetRequestedExtensions();
|
|
|
- Fail('no exception thrown');
|
|
|
- except
|
|
|
- on E: EInvalidOperationCryptoLibException do
|
|
|
- CheckEquals('pkcs_9_at_extensionRequest present but has no value', E.Message, 'Exception message');
|
|
|
- on E: Exception do
|
|
|
- Fail('Expected EInvalidOperationCryptoLibException, got ' + E.ClassName + ': ' + E.Message);
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestBrokenRequestWithDuplicateExtension;
|
|
|
-var
|
|
|
- LKpg: IAsymmetricCipherKeyPairGenerator;
|
|
|
- LKp: IAsymmetricCipherKeyPair;
|
|
|
- LOrder: TCryptoLibGenericArray<IDerObjectIdentifier>;
|
|
|
- LValues: TCryptoLibStringArray;
|
|
|
- LSubject: IX509Name;
|
|
|
- LName1, LName2: IGeneralName;
|
|
|
- LGenNames1, LGenNames2: IGeneralNames;
|
|
|
- LExtSeq: IAsn1Sequence;
|
|
|
- LAttrSet: IAsn1Set;
|
|
|
- LAttr: IAttributePkcs;
|
|
|
- LAttrs: IAsn1Set;
|
|
|
- LReq1, LReq2: IPkcs10CertificationRequest;
|
|
|
- LBytes: TCryptoLibByteArray;
|
|
|
- LExtensions: IX509Extensions;
|
|
|
- LExt: IX509Extension;
|
|
|
- LReturnedNames: IGeneralNames;
|
|
|
- LEnc1, LEnc2: TCryptoLibByteArray;
|
|
|
- LRsaPub1, LRsaPub2: IRsaKeyParameters;
|
|
|
- LKeyGenParams: IKeyGenerationParameters;
|
|
|
-begin
|
|
|
- LKpg := TGeneratorUtilities.GetKeyPairGenerator('RSA');
|
|
|
- LKeyGenParams := TKeyGenerationParameters.Create(TSecureRandom.MasterRandom, 2048);
|
|
|
- LKpg.Init(LKeyGenParams);
|
|
|
- LKp := LKpg.GenerateKeyPair();
|
|
|
-
|
|
|
- SetLength(LOrder, 5);
|
|
|
- LOrder[0] := TX509Name.C;
|
|
|
- LOrder[1] := TX509Name.O;
|
|
|
- LOrder[2] := TX509Name.L;
|
|
|
- LOrder[3] := TX509Name.ST;
|
|
|
- LOrder[4] := TX509Name.EmailAddress;
|
|
|
- SetLength(LValues, 5);
|
|
|
- LValues[0] := 'AU';
|
|
|
- LValues[1] := 'The Legion of the Bouncy Castle';
|
|
|
- LValues[2] := 'Melbourne';
|
|
|
- LValues[3] := 'Victoria';
|
|
|
- LValues[4] := '[email protected]';
|
|
|
- LSubject := TX509Name.Create(LOrder, LValues);
|
|
|
-
|
|
|
- LName1 := TGeneralName.Create(TGeneralName.DnsName, 'bc1.local');
|
|
|
- LName2 := TGeneralName.Create(TGeneralName.DnsName, 'bc2.local');
|
|
|
-
|
|
|
- LGenNames1 := TGeneralNames.Create(LName1);
|
|
|
- LGenNames2 := TGeneralNames.Create(LName2);
|
|
|
- LExtSeq := TDerSequence.FromElements(
|
|
|
- TDerSequence.Create([
|
|
|
- TX509Extensions.SubjectAlternativeName,
|
|
|
- TDerOctetString.Create(LGenNames1.GetEncoded()) as IDerOctetString
|
|
|
- ]) as IDerSequence,
|
|
|
- TDerSequence.Create([
|
|
|
- TX509Extensions.SubjectAlternativeName,
|
|
|
- TDerOctetString.Create(LGenNames2.GetEncoded()) as IDerOctetString
|
|
|
- ]) as IDerSequence
|
|
|
- );
|
|
|
- LAttrSet := TDerSet.FromElement(LExtSeq);
|
|
|
- LAttr := TAttributePkcs.Create(TPkcsObjectIdentifiers.Pkcs9AtExtensionRequest, LAttrSet);
|
|
|
- LAttrs := TDerSet.FromElement(LAttr);
|
|
|
-
|
|
|
- LReq1 := TPkcs10CertificationRequest.Create(
|
|
|
- 'SHA256withRSA', LSubject, LKp.Public, LAttrs, LKp.Private);
|
|
|
- LBytes := LReq1.GetEncoded();
|
|
|
- LReq2 := TPkcs10CertificationRequest.Create(LBytes);
|
|
|
-
|
|
|
- CheckTrue(LReq2.Verify(), 'SHA256withRSA: Failed Verify check');
|
|
|
-
|
|
|
- if Supports(LReq2.GetPublicKey(), IRsaKeyParameters, LRsaPub2) and
|
|
|
- Supports(LReq1.GetPublicKey(), IRsaKeyParameters, LRsaPub1) then
|
|
|
- CheckTrue(LRsaPub1.Equals(LRsaPub2), 'RSA: Failed public key check')
|
|
|
- else
|
|
|
- Fail('RSA: Failed to get RSA public keys');
|
|
|
-
|
|
|
- LExtensions := LReq2.GetRequestedExtensions();
|
|
|
- Check(LExtensions <> nil, 'expected extensions');
|
|
|
- LExt := LExtensions.GetExtension(TX509Extensions.SubjectAlternativeName);
|
|
|
- Check(LExt <> nil, 'expected SubjectAlternativeName extension');
|
|
|
- LReturnedNames := TGeneralNames.GetInstance(LExt.GetParsedValue());
|
|
|
- CheckEquals(2, LReturnedNames.GetCount(), 'expected 2 names');
|
|
|
- LEnc1 := LName1.GetEncoded();
|
|
|
- LEnc2 := LName2.GetEncoded();
|
|
|
- CheckTrue(AreEqual(LReturnedNames.GetNames[0].GetEncoded(), LEnc1), 'expected name 1');
|
|
|
- CheckTrue(AreEqual(LReturnedNames.GetNames[1].GetEncoded(), LEnc2), 'expected name 2');
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.BuildPerformRequestPair(out AReq1, AReq2: IPkcs10CertificationRequest);
|
|
|
-var
|
|
|
- LKpg: IAsymmetricCipherKeyPairGenerator;
|
|
|
- LKp: IAsymmetricCipherKeyPair;
|
|
|
- LOrder: TCryptoLibGenericArray<IDerObjectIdentifier>;
|
|
|
- LValues: TCryptoLibStringArray;
|
|
|
- LSubject: IX509Name;
|
|
|
- LBytes: TCryptoLibByteArray;
|
|
|
- LKeyGenParams: IKeyGenerationParameters;
|
|
|
-begin
|
|
|
- LKpg := TGeneratorUtilities.GetKeyPairGenerator('RSA');
|
|
|
- LKeyGenParams := TRsaKeyGenerationParameters.Create(
|
|
|
- TBigInteger.ValueOf($10001), TSecureRandom.MasterRandom, 512, 25);
|
|
|
- LKpg.Init(LKeyGenParams);
|
|
|
- LKp := LKpg.GenerateKeyPair();
|
|
|
-
|
|
|
- SetLength(LOrder, 5);
|
|
|
- LOrder[0] := TX509Name.C;
|
|
|
- LOrder[1] := TX509Name.O;
|
|
|
- LOrder[2] := TX509Name.L;
|
|
|
- LOrder[3] := TX509Name.ST;
|
|
|
- LOrder[4] := TX509Name.EmailAddress;
|
|
|
- SetLength(LValues, 5);
|
|
|
- LValues[0] := 'NG';
|
|
|
- LValues[1] := 'CryptoLib4Pascal';
|
|
|
- LValues[2] := 'Alausa';
|
|
|
- LValues[3] := 'Lagos';
|
|
|
- LValues[4] := '[email protected]';
|
|
|
- LSubject := TX509Name.Create(LOrder, LValues);
|
|
|
-
|
|
|
- AReq1 := TPkcs10CertificationRequest.Create(
|
|
|
- 'SHA1withRSA', LSubject, LKp.Public, nil, LKp.Private);
|
|
|
- LBytes := AReq1.GetEncoded();
|
|
|
- AReq2 := TPkcs10CertificationRequest.Create(LBytes);
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestPerformRoundTrip;
|
|
|
-var
|
|
|
- LReq1, LReq2: IPkcs10CertificationRequest;
|
|
|
-begin
|
|
|
- BuildPerformRequestPair(LReq1, LReq2);
|
|
|
- Check(LReq1 <> nil, 'request before round-trip');
|
|
|
- Check(LReq2 <> nil, 'request after round-trip');
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestPerformVerify;
|
|
|
-var
|
|
|
- LReq1, LReq2: IPkcs10CertificationRequest;
|
|
|
-begin
|
|
|
- BuildPerformRequestPair(LReq1, LReq2);
|
|
|
- CheckTrue(LReq2.Verify(), 'Failed verify check');
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TPkcs10CertRequestTest.TestPerformPublicKeyMatch;
|
|
|
-var
|
|
|
- LReq1, LReq2: IPkcs10CertificationRequest;
|
|
|
- LRsaPub1, LRsaPub2: IRsaKeyParameters;
|
|
|
-begin
|
|
|
- BuildPerformRequestPair(LReq1, LReq2);
|
|
|
- if Supports(LReq2.GetPublicKey(), IRsaKeyParameters, LRsaPub2) and
|
|
|
- Supports(LReq1.GetPublicKey(), IRsaKeyParameters, LRsaPub1) then
|
|
|
- CheckTrue(LRsaPub1.Equals(LRsaPub2), 'Failed public key check')
|
|
|
- else
|
|
|
- Fail('Failed to get RSA public keys for comparison');
|
|
|
-end;
|
|
|
-
|
|
|
-initialization
|
|
|
-
|
|
|
-{$IFDEF FPC}
|
|
|
-RegisterTest(TPkcs10CertRequestTest);
|
|
|
-{$ELSE}
|
|
|
-RegisterTest(TPkcs10CertRequestTest.Suite);
|
|
|
-{$ENDIF FPC}
|
|
|
-
|
|
|
-end.
|