@@ -83,7 +83,22 @@ interface
8383 ClpEncoders,
8484 // ClpSecNamedCurves,
8585 ClpCustomNamedCurves,
86- ClpConverters;
86+ ClpConverters,
87+ ClpX500Name,
88+ ClpIX500Name,
89+ ClpPkcs10CertificationRequest,
90+ ClpIPkcs10CertificationRequest,
91+ // Ed25519 support
92+ ClpEd25519KeyPairGenerator,
93+ ClpIEd25519KeyPairGenerator,
94+ ClpEd25519KeyGenerationParameters,
95+ ClpIEd25519KeyGenerationParameters,
96+ ClpIEd25519PublicKeyParameters,
97+ ClpIEd25519PrivateKeyParameters,
98+ ClpEd25519,
99+ ClpIEd25519,
100+ ClpAsn1Objects,
101+ ClpIAsn1Objects;
87102
88103type
89104
@@ -163,6 +178,16 @@ TUsageExamples = class sealed(TObject)
163178 class procedure BinaryCompatiblePascalCoinECIESDecryptExistingPayloadDemo
164179 (const PrivateKeyInHex, EncryptedMessageInHex,
165180 ACurveName: string); static;
181+
182+ // / <summary>
183+ // / Generate a PKCS#10 Certificate Signing Request using ECDSA
184+ // / </summary>
185+ class procedure GenerateCSRWithECDSA (); static;
186+
187+ // / <summary>
188+ // / Generate a PKCS#10 Certificate Signing Request using Ed25519 (EdDSA)
189+ // / </summary>
190+ class procedure GenerateCSRWithEdDSA (); static;
166191 end ;
167192
168193implementation
@@ -997,4 +1022,161 @@ class procedure TUsageExamples.RecreatePublicKeyFromXAndYCoordByteArray;
9971022 FCurve := GetCurveByName(CurveName);
9981023end ;
9991024
1025+ class procedure TUsageExamples.GenerateCSRWithECDSA ;
1026+
1027+ procedure GenerateCSRForCurve (const curveName, digestName: string);
1028+ var
1029+ curve: IX9ECParameters;
1030+ domain: IECDomainParameters;
1031+ generator: IECKeyPairGenerator;
1032+ keygenParams: IECKeyGenerationParameters;
1033+ KeyPair: IAsymmetricCipherKeyPair;
1034+ privParams: IECPrivateKeyParameters;
1035+ pubParams: IECPublicKeyParameters;
1036+ subject: IX500Name;
1037+ builder: IPkcs10CertificationRequestBuilder;
1038+ csr: IPkcs10CertificationRequest;
1039+ digest: IDigest;
1040+ pemString: string;
1041+ customExtOid: IDerObjectIdentifier;
1042+ customExtValue: IDerUtf8String;
1043+ begin
1044+ Writeln(' === Generating CSR with curve: ' + curveName + ' ===' + sLineBreak);
1045+
1046+ // 1. Generate EC Key Pair
1047+ curve := GetCurveByName(curveName);
1048+ domain := TECDomainParameters.Create(curve.Curve, curve.G, curve.N,
1049+ curve.H, curve.GetSeed);
1050+ generator := TECKeyPairGenerator.Create(' ECDSA' );
1051+ keygenParams := TECKeyGenerationParameters.Create(domain, FRandom);
1052+ generator.Init(keygenParams);
1053+
1054+ KeyPair := generator.GenerateKeyPair();
1055+ privParams := KeyPair.Private as IECPrivateKeyParameters;
1056+ pubParams := KeyPair.Public as IECPublicKeyParameters;
1057+
1058+ Writeln(' Generated EC Key Pair using curve: ' + curveName);
1059+
1060+ // 2. Build X.500 Distinguished Name
1061+ subject := TX500NameBuilder.Create
1062+ .AddCommonName(' Example CSR - ' + curveName)
1063+ .AddOrganization(' CryptoLib4Pascal' )
1064+ .AddOrganizationalUnit(' Development' )
1065+ .AddCountry(' US' )
1066+ .Build;
1067+
1068+ // 3. Create digest for signing
1069+ digest := TDigestUtilities.GetDigest(digestName);
1070+ Writeln(' Using digest algorithm: ' + digest.AlgorithmName);
1071+
1072+ // 4. Create custom extension (example: application-specific OID)
1073+ customExtOid := TDerObjectIdentifier.Create(' 1.2.3.4.5.6.7.8.9' );
1074+ customExtValue := TDerUtf8String.Create(' CryptoLib4Pascal Custom Extension' );
1075+
1076+ // 5. Build PKCS#10 CSR with extensions
1077+ builder := TECDSACertificationRequestBuilder.Create(digest);
1078+ csr := builder
1079+ .SetSubject(subject)
1080+ .SetPublicKey(pubParams)
1081+ .AddExtension(customExtOid, False, customExtValue) // Custom extension
1082+ .AddSubjectKeyIdentifier() // X.509 Subject Key Identifier
1083+ .Build(privParams);
1084+
1085+ Writeln(' CSR built successfully with extensions!' );
1086+
1087+ // 6. Get PEM encoded CSR
1088+ pemString := csr.GetPemEncoded;
1089+
1090+ Writeln(' PEM Encoded CSR:' );
1091+ Writeln(pemString);
1092+ end ;
1093+
1094+ const
1095+ MethodName = ' GenerateCSRWithECDSA' ;
1096+ begin
1097+ Writeln(' MethodName is: ' + MethodName + sLineBreak);
1098+ Writeln(' Demonstrating PKCS#10 CSR generation with various ECDSA curves' + sLineBreak);
1099+
1100+ // Demonstrate with different curves
1101+ // P-256 (NIST prime256v1) - most commonly used for web certificates
1102+ GenerateCSRForCurve(' P-256' , ' SHA-256' );
1103+
1104+ // P-384 (NIST secp384r1) - stronger security
1105+ GenerateCSRForCurve(' P-384' , ' SHA-384' );
1106+
1107+ // P-521 (NIST secp521r1) - highest NIST security level
1108+ GenerateCSRForCurve(' P-521' , ' SHA-512' );
1109+
1110+ // secp256k1 - used by Bitcoin and Ethereum
1111+ GenerateCSRForCurve(' secp256k1' , ' SHA-256' );
1112+
1113+ Writeln(' ' );
1114+ end ;
1115+
1116+ class procedure TUsageExamples.GenerateCSRWithEdDSA ;
1117+ var
1118+ ed25519Instance: IEd25519;
1119+ generator: IEd25519KeyPairGenerator;
1120+ keygenParams: IEd25519KeyGenerationParameters;
1121+ KeyPair: IAsymmetricCipherKeyPair;
1122+ privParams: IEd25519PrivateKeyParameters;
1123+ pubParams: IEd25519PublicKeyParameters;
1124+ subject: IX500Name;
1125+ builder: IPkcs10CertificationRequestBuilder;
1126+ csr: IPkcs10CertificationRequest;
1127+ pemString: string;
1128+ customExtOid: IDerObjectIdentifier;
1129+ customExtValue: IDerUtf8String;
1130+ const
1131+ MethodName = ' GenerateCSRWithEdDSA' ;
1132+ begin
1133+ Writeln(' MethodName is: ' + MethodName + sLineBreak);
1134+ Writeln(' Demonstrating PKCS#10 CSR generation with Ed25519 (EdDSA)' + sLineBreak);
1135+
1136+ // 1. Generate Ed25519 Key Pair
1137+ ed25519Instance := TEd25519.Create();
1138+ generator := TEd25519KeyPairGenerator.Create(ed25519Instance);
1139+ keygenParams := TEd25519KeyGenerationParameters.Create(FRandom);
1140+ generator.Init(keygenParams);
1141+
1142+ KeyPair := generator.GenerateKeyPair();
1143+ privParams := KeyPair.Private as IEd25519PrivateKeyParameters;
1144+ pubParams := KeyPair.Public as IEd25519PublicKeyParameters;
1145+
1146+ Writeln(' Generated Ed25519 Key Pair' );
1147+
1148+ // 2. Build X.500 Distinguished Name
1149+ subject := TX500NameBuilder.Create
1150+ .AddCommonName(' Example Ed25519 CSR' )
1151+ .AddOrganization(' CryptoLib4Pascal' )
1152+ .AddOrganizationalUnit(' Development' )
1153+ .AddCountry(' US' )
1154+ .Build;
1155+
1156+ Writeln(' Built X.500 Distinguished Name' );
1157+
1158+ // 3. Create custom extension (example: application-specific OID)
1159+ customExtOid := TDerObjectIdentifier.Create(' 1.2.3.4.5.6.7.8.9' );
1160+ customExtValue := TDerUtf8String.Create(' CryptoLib4Pascal Ed25519 Extension' );
1161+
1162+ // 4. Build PKCS#10 CSR using Ed25519 with extensions
1163+ builder := TEdDSACertificationRequestBuilder.Create;
1164+ csr := builder
1165+ .SetSubject(subject)
1166+ .SetPublicKey(pubParams)
1167+ .AddExtension(customExtOid, False, customExtValue) // Custom extension
1168+ .AddSubjectKeyIdentifier() // X.509 Subject Key Identifier
1169+ .Build(privParams);
1170+
1171+ Writeln(' CSR built successfully with Ed25519 and extensions!' );
1172+
1173+ // 5. Get PEM encoded CSR
1174+ pemString := csr.GetPemEncoded;
1175+
1176+ Writeln(' PEM Encoded CSR:' );
1177+ Writeln(pemString);
1178+
1179+ Writeln(' ' );
1180+ end ;
1181+
10001182end .
0 commit comments