void CheckMailGoogleCom(SecCertificate cert, int expectedRetainCount) { Assert.That(cert.Handle, Is.Not.EqualTo(IntPtr.Zero), "Handle"); Assert.That(CFGetRetainCount(cert.Handle), Is.EqualTo(expectedRetainCount), "RetainCount"); Assert.That(cert.SubjectSummary, Is.EqualTo("mail.google.com"), "SubjectSummary"); Assert.That((nuint)(uint)mail_google_com.Length, Is.EqualTo(cert.DerData.Length), "DerData"); if (TestRuntime.CheckXcodeVersion(8, 3)) { Assert.That(cert.GetCommonName(), Is.EqualTo("mail.google.com"), "GetCommonName"); Assert.That(cert.GetSerialNumber().ToStableString(), Is.EqualTo("<2b9f7ee5 ca25a625 14204782 753a9bb9>"), "GetSerialNumber"); var emailAddresses = cert.GetEmailAddresses(); Assert.IsTrue(emailAddresses == null || emailAddresses.Length == 0, "GetEmailAddresses"); Assert.NotNull(cert.GetNormalizedIssuerSequence(), "GetNormalizedIssuerSequence"); Assert.NotNull(cert.GetNormalizedSubjectSequence(), "GetNormalizedSubjectSequence"); Assert.NotNull(cert.GetPublicKey(), "GetPublicKey"); } if (TestRuntime.CheckXcodeVersion(9, 0)) { NSError err; Assert.That(cert.GetSerialNumber(out err).ToStableString(), Is.EqualTo("<2b9f7ee5 ca25a625 14204782 753a9bb9>"), "GetSerialNumber/NSError"); Assert.Null(err, "err"); } if (TestRuntime.CheckXcodeVersion(10, 0)) { Assert.NotNull(cert.GetKey(), "GetKey"); } }
void CheckMailGoogleCom(SecCertificate cert, int expectedRetainCount) { Assert.That(cert.Handle, Is.Not.EqualTo(IntPtr.Zero), "Handle"); Assert.That(CFGetRetainCount(cert.Handle), Is.EqualTo(expectedRetainCount), "RetainCount"); Assert.That(cert.SubjectSummary, Is.EqualTo("mail.google.com"), "SubjectSummary"); Assert.That((nuint)(uint)mail_google_com.Length, Is.EqualTo(cert.DerData.Length), "DerData"); if (TestRuntime.CheckXcodeVersion(8, 3)) { Assert.That(cert.GetCommonName(), Is.EqualTo("mail.google.com"), "GetCommonName"); Assert.That(cert.GetSerialNumber().Description, Is.EqualTo("<2b9f7ee5 ca25a625 14204782 753a9bb9>"), "GetSerialNumber"); Assert.Null(cert.GetEmailAddresses(), "GetEmailAddresses"); Assert.NotNull(cert.GetNormalizedIssuerSequence(), "GetNormalizedIssuerSequence"); Assert.NotNull(cert.GetNormalizedSubjectSequence(), "GetNormalizedSubjectSequence"); Assert.NotNull(cert.GetPublicKey(), "GetPublicKey"); } }
/* Extract a public key from certificate and append to a header to all key types * Returns nil if the key type in the certificate can not be recognized/extracted * else base64 sha256 hashes of all combinations currently supported */ string[] PublicKeyWithHeader(X509Certificate2 cert) { /* The return value */ string[] allKeyWithHeaders = new string[kSupportedCertCount]; int currentKeys = 0; /* We need to use ios native code to allow ECC public key extraction which is * not implemented in C#/Xamarin */ byte[] rawData = cert.GetRawCertData(); if (rawData == null) { return(null); } SecCertificate secCertificate = new SecCertificate(rawData); // Get public key and its byte representation for later copy SecKey publicKey = secCertificate.GetPublicKey(); byte[] publicKeyBytes = publicKey.GetExternalRepresentation().ToArray(); /* Append combinations header + public key */ // ECC P256 byte[] keyECCP256WithHeader = new byte[ecdsaSecp256r1SPKIHeader.Length + publicKeyBytes.Length]; ecdsaSecp256r1SPKIHeader.CopyTo(keyECCP256WithHeader, 0); publicKeyBytes.CopyTo(keyECCP256WithHeader, ecdsaSecp256r1SPKIHeader.Length); allKeyWithHeaders[currentKeys++] = base64Sha2StringFromBytes(keyECCP256WithHeader); // RSA2048 byte[] keyRSA2048WithHeader = new byte[rsa2048SPKIHeader.Length + publicKeyBytes.Length]; rsa2048SPKIHeader.CopyTo(keyRSA2048WithHeader, 0); publicKeyBytes.CopyTo(keyRSA2048WithHeader, rsa2048SPKIHeader.Length); allKeyWithHeaders[currentKeys++] = base64Sha2StringFromBytes(keyRSA2048WithHeader); // ECC P384 byte[] keyECCP384WithHeader = new byte[ecdsaSecp384r1SPKIHeader.Length + publicKeyBytes.Length]; ecdsaSecp384r1SPKIHeader.CopyTo(keyECCP384WithHeader, 0); publicKeyBytes.CopyTo(keyECCP384WithHeader, ecdsaSecp384r1SPKIHeader.Length); allKeyWithHeaders[currentKeys++] = base64Sha2StringFromBytes(keyECCP384WithHeader); // RSA4096 byte[] keyRSA4096WithHeader = new byte[rsa4096SPKIHeader.Length + publicKeyBytes.Length]; rsa4096SPKIHeader.CopyTo(keyRSA4096WithHeader, 0); publicKeyBytes.CopyTo(keyRSA4096WithHeader, rsa4096SPKIHeader.Length); allKeyWithHeaders[currentKeys++] = base64Sha2StringFromBytes(keyRSA4096WithHeader); return(allKeyWithHeaders); }