/// <summary> /// export to proprietary xml format /// </summary> /// <returns>public key and private key in proprietary xml form, plus with some attributes redundantly expressed in the XML</returns> public string ToXml() { var toser = new CertificateAuthorityForEphemeralCertsXml { SerialNumber = PublicKey.SerialNumber, SubjectName = PublicKey.SubjectName.Name, Expires = PublicKey.GetExpirationDateString(), Thumbprint = PublicKey.Thumbprint, PrivateKeyParameters = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)PrivateKeyBouncy), PublicKeyData = PublicKey.Export(X509ContentType.Cert) }; var sb = new StringBuilder(); using (var sw = new StringWriter(sb)) { var xser = new XmlSerializer(typeof(CertificateAuthorityForEphemeralCertsXml)); xser.Serialize(sw, toser); return(sb.ToString()); } }
/// <summary> /// build from xml serial struct /// </summary> /// <param name="xel"></param> private CertificateAuthority(CertificateAuthorityForEphemeralCertsXml xel) { SubjectName = xel.SubjectName; PrivateKeyBouncy = DotNetUtilities.GetRsaKeyPair(xel.PrivateKeyParameters).Private; var cert = new X509Certificate2(xel.PublicKeyData); PublicKey = cert; KeySize = cert.PublicKey.Key.KeySize; if (SubjectName != cert.SubjectName.Name) { throw new InvalidOperationException($"xml CA invalid: expecting subject {cert.SubjectName.Name}"); } if (xel.Thumbprint != cert.Thumbprint) { throw new InvalidOperationException($"xml CA invalid: expecting Thumbprint {cert.Thumbprint}"); } if (xel.SerialNumber != cert.SerialNumber) { throw new InvalidOperationException($"xml CA invalid: expecting Serial {cert.SerialNumber}"); } }