|  | 
| 50 | 50 | using Org.BouncyCastle.Asn1; | 
| 51 | 51 | using Org.BouncyCastle.Asn1.Pkcs; | 
| 52 | 52 | using Org.BouncyCastle.Asn1.X509; | 
|  | 53 | +using Org.BouncyCastle.Asn1.X9; | 
| 53 | 54 | using Org.BouncyCastle.Bcpg; | 
| 54 | 55 | using Org.BouncyCastle.Crypto; | 
| 55 | 56 | using Org.BouncyCastle.Crypto.Generators; | 
| @@ -484,9 +485,61 @@ public static (Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricKeyP | 
| 484 | 485 |             return (certificate, subjectKeyPair.Private); | 
| 485 | 486 |         } | 
| 486 | 487 | 
 | 
|  | 488 | +        public static (Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricKeyParameter privateKey) CreateSelfSignedEcdsaCert(string subjectName, string issuerName) | 
|  | 489 | +        { | 
|  | 490 | +            var randomGenerator = new CryptoApiRandomGenerator(); | 
|  | 491 | +            var random = new SecureRandom(randomGenerator); | 
|  | 492 | + | 
|  | 493 | +            // Choose an elliptic curve, e.g., secp256r1 (P-256) | 
|  | 494 | +            var ecSpec = ECNamedCurveTable.GetByName("secp256r1"); | 
|  | 495 | + | 
|  | 496 | +            // Convert X9ECParameters to ECDomainParameters | 
|  | 497 | +            var ecDomainParameters = new ECDomainParameters(ecSpec.Curve, ecSpec.G, ecSpec.N, ecSpec.H, ecSpec.GetSeed()); | 
|  | 498 | + | 
|  | 499 | +            // Generate ECDSA key pair | 
|  | 500 | +            var keyPairGenerator = new ECKeyPairGenerator("EC"); | 
|  | 501 | +            var keyGenerationParameters = new ECKeyGenerationParameters(ecDomainParameters, random); | 
|  | 502 | +            keyPairGenerator.Init(keyGenerationParameters); | 
|  | 503 | +            var subjectKeyPair = keyPairGenerator.GenerateKeyPair(); | 
|  | 504 | + | 
|  | 505 | +            // Generate ECDSA signature factory | 
|  | 506 | +            ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA256WITHECDSA", subjectKeyPair.Private, random); | 
|  | 507 | + | 
|  | 508 | +            // The Certificate Generator | 
|  | 509 | +            var certificateGenerator = new X509V3CertificateGenerator(); | 
|  | 510 | +            certificateGenerator.SetSerialNumber(BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random)); | 
|  | 511 | +            certificateGenerator.SetIssuerDN(new X509Name(issuerName)); | 
|  | 512 | +            certificateGenerator.SetSubjectDN(new X509Name(subjectName)); | 
|  | 513 | +            certificateGenerator.SetNotBefore(DateTime.UtcNow.Date); | 
|  | 514 | +            certificateGenerator.SetNotAfter(DateTime.UtcNow.Date.AddYears(70)); | 
|  | 515 | +            certificateGenerator.SetPublicKey(subjectKeyPair.Public); | 
|  | 516 | + | 
|  | 517 | +            // Generate the self-signed certificate | 
|  | 518 | +            var certificate = certificateGenerator.Generate(signatureFactory); | 
|  | 519 | + | 
|  | 520 | +            return (certificate, subjectKeyPair.Private); | 
|  | 521 | +        } | 
|  | 522 | + | 
| 487 | 523 |         public static (Org.BouncyCastle.Crypto.Tls.Certificate certificate, AsymmetricKeyParameter privateKey) CreateSelfSignedTlsCert() | 
| 488 | 524 |         { | 
| 489 | 525 |             return CreateSelfSignedTlsCert("CN=localhost", "CN=root", null); | 
|  | 526 | + | 
|  | 527 | +            // Testing with ECDSA certificate. Worked with aiortc WebRTC Python library. | 
|  | 528 | +            // ECDSA is recommended over RSA but is it as well supported as of 14 Oct 2024?? | 
|  | 529 | +            // ECSA failed with: | 
|  | 530 | +            //  - libwebrtc (albeit a 3 year old verison) | 
|  | 531 | +            //  - webrtc-rs (Rust library) | 
|  | 532 | +            //  - werift-webtc (nodejs) | 
|  | 533 | +            // ECDA Succeeded with: | 
|  | 534 | +            //  - aiortc (Python library) | 
|  | 535 | +            //  - pion (Go library) | 
|  | 536 | + | 
|  | 537 | +            //var (cert, key) = CreateSelfSignedEcdsaCert("CN=localhost", "CN=root"); | 
|  | 538 | + | 
|  | 539 | +            //var chain = new Org.BouncyCastle.Asn1.X509.X509CertificateStructure[] { X509CertificateStructure.GetInstance(cert.GetEncoded()) }; | 
|  | 540 | +            //var tlsCertificate = new Org.BouncyCastle.Crypto.Tls.Certificate(chain); | 
|  | 541 | + | 
|  | 542 | +            //return (tlsCertificate, key); | 
| 490 | 543 |         } | 
| 491 | 544 | 
 | 
| 492 | 545 |         public static (Org.BouncyCastle.Crypto.Tls.Certificate certificate, AsymmetricKeyParameter privateKey) CreateSelfSignedTlsCert(string subjectName, string issuerName, AsymmetricKeyParameter issuerPrivateKey) | 
|  | 
0 commit comments