Index: net/base/x509_certificate_win.cc |
=================================================================== |
--- net/base/x509_certificate_win.cc (revision 113824) |
+++ net/base/x509_certificate_win.cc (working copy) |
@@ -1177,4 +1177,39 @@ |
length); |
} |
+// static |
+void X509Certificate::GetPublicKeyInfo(OSCertHandle cert_handle, |
+ size_t* size_bits, |
+ PublicKeyType* type) { |
+ PCCRYPT_OID_INFO oid_info = CryptFindOIDInfo( |
+ CRYPT_OID_INFO_OID_KEY, |
+ cert_handle->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId, |
+ CRYPT_SIGN_ALG_OID_GROUP_ID); |
Ryan Sleevi
2011/12/13 05:45:35
CRYPT_PUBKEY_ALG_OID_GROUP_ID
|
+ CHECK(oid_info); |
+ CHECK(oid_info->dwGroupId == CRYPT_SIGN_ALG_OID_GROUP_ID); |
Ryan Sleevi
2011/12/13 05:45:35
CHECK_EQ(oid_info->dwGroupId, CRYPT_PUBKEY_ALG_OID
|
+ CHECK(oid_info->ExtraInfo.cbData >= sizeof(DWORD)); |
Ryan Sleevi
2011/12/13 05:45:35
Delete this CHECK (ExtraInfo.cbData may be 0 if no
|
+ DWORD id = *reinterpret_cast<DWORD*>(oid_info->ExtraInfo.pbData); |
Ryan Sleevi
2011/12/13 05:45:35
Delete this (updated below at line 1197)
|
+ |
+ *size_bits = CertGetPublicKeyLength( |
+ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, |
+ &cert_handle->pCertInfo->SubjectPublicKeyInfo); |
+ |
+ switch (id) { |
Ryan Sleevi
2011/12/13 05:45:35
switch (id) -> switch (oid_info->AlgId) {
|
+ case CALG_RSA_SIGN: |
Ryan Sleevi
2011/12/13 05:45:35
add
case CALG_RSA_KEYX:
|
+ *type = kPublicKeyTypeRSA; |
+ break; |
+ case CALG_DSS_SIGN: |
+ *type = kPublicKeyTypeDSA; |
+ break; |
+ case CALG_ECDSA: |
+ *type = kPublicKeyTypeECDSA; |
+ break; |
+ case CALG_ECDH: |
+ *type = kPublicKeyTypeECDH; |
+ break; |
+ default: |
+ *type = kPublicKeyTypeUnknown; |
+ } |
+} |
+ |
} // namespace net |