| Index: net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
|
| diff --git a/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp b/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
|
| index d65990025eeaf9ea43016f1f7eddbf112e195fc1..20768f0b34fe6238c8c70f49f0f5e6e491f0e708 100644
|
| --- a/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
|
| +++ b/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
|
| @@ -197,28 +197,45 @@ nsPKCS12Blob_ImportHelper(const char* pkcs12_data,
|
| CK_BBOOL attribute_data = CK_FALSE;
|
| attribute_value.data = &attribute_data;
|
| attribute_value.len = sizeof(attribute_data);
|
| - CERTCertList* cert_list = SEC_PKCS12DecoderGetCerts(dcx);
|
| -
|
| - // Iterate through each certificate in the chain and mark corresponding
|
| - // private key as unextractable.
|
| - for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list);
|
| - !CERT_LIST_END(node, cert_list); node = CERT_LIST_NEXT(node)) {
|
| - SECKEYPrivateKey* privKey = PK11_FindKeyByDERCert(slot,
|
| - node->cert,
|
| - NULL); // wincx
|
| +
|
| + srv = SEC_PKCS12DecoderIterateInit(dcx);
|
| + if (srv) goto finish;
|
| +
|
| + const SEC_PKCS12DecoderItem* decoder_item = NULL;
|
| + // Iterate through all the imported PKCS12 items and mark any accompanying
|
| + // private keys as unextractable.
|
| + while (SEC_PKCS12DecoderIterateNext(dcx, &decoder_item) == SECSuccess) {
|
| + if (decoder_item->type != SEC_OID_PKCS12_V1_CERT_BAG_ID)
|
| + continue;
|
| + if (!decoder_item->hasKey)
|
| + continue;
|
| +
|
| + // Once we have determined that the imported certificate has an
|
| + // associated private key too, only then can we mark the key as
|
| + // unextractable.
|
| + CERTCertificate* cert = PK11_FindCertFromDERCertItem(
|
| + slot, decoder_item->der,
|
| + NULL); // wincx
|
| + if (!cert) {
|
| + LOG(ERROR) << "Could not grab a handle to the certificate in the slot "
|
| + << "from the corresponding PKCS#12 DER certificate.";
|
| + continue;
|
| + }
|
| + SECKEYPrivateKey* privKey = PK11_FindPrivateKeyFromCert(slot, cert,
|
| + NULL); // wincx
|
| + CERT_DestroyCertificate(cert);
|
| if (privKey) {
|
| // Mark the private key as unextractable.
|
| srv = PK11_WriteRawAttribute(PK11_TypePrivKey, privKey, CKA_EXTRACTABLE,
|
| &attribute_value);
|
| SECKEY_DestroyPrivateKey(privKey);
|
| if (srv) {
|
| - LOG(ERROR) << "Couldn't set CKA_EXTRACTABLE attribute on private "
|
| + LOG(ERROR) << "Could not set CKA_EXTRACTABLE attribute on private "
|
| << "key.";
|
| break;
|
| }
|
| }
|
| }
|
| - CERT_DestroyCertList(cert_list);
|
| if (srv) goto finish;
|
| }
|
|
|
|
|