Index: patches/nss-export-private-key-info.patch |
diff --git a/patches/nss-export-private-key-info.patch b/patches/nss-export-private-key-info.patch |
deleted file mode 100644 |
index 1a49f0e56bf7f792471d06b0523ae37bb7e57aff..0000000000000000000000000000000000000000 |
--- a/patches/nss-export-private-key-info.patch |
+++ /dev/null |
@@ -1,213 +0,0 @@ |
-diff --git a/lib/pk11wrap/pk11akey.c b/lib/pk11wrap/pk11akey.c |
---- a/lib/pk11wrap/pk11akey.c |
-+++ b/lib/pk11wrap/pk11akey.c |
-@@ -1708,17 +1708,23 @@ done: |
- } |
- |
- return rv; |
- } |
- |
- SECKEYPrivateKeyInfo * |
- PK11_ExportPrivateKeyInfo(CERTCertificate *cert, void *wincx) |
- { |
-- return NULL; |
-+ SECKEYPrivateKeyInfo *pki = NULL; |
-+ SECKEYPrivateKey *pk = PK11_FindKeyByAnyCert(cert, wincx); |
-+ if (pk != NULL) { |
-+ pki = PK11_ExportPrivKeyInfo(pk, wincx); |
-+ SECKEY_DestroyPrivateKey(pk); |
-+ } |
-+ return pki; |
- } |
- |
- SECKEYEncryptedPrivateKeyInfo * |
- PK11_ExportEncryptedPrivKeyInfo( |
- PK11SlotInfo *slot, /* optional, encrypt key in this slot */ |
- SECOidTag algTag, /* encrypt key with this algorithm */ |
- SECItem *pwitem, /* password for PBE encryption */ |
- SECKEYPrivateKey *pk, /* encrypt this private key */ |
-diff --git a/lib/pk11wrap/pk11obj.c b/lib/pk11wrap/pk11obj.c |
---- a/lib/pk11wrap/pk11obj.c |
-+++ b/lib/pk11wrap/pk11obj.c |
-@@ -76,16 +76,19 @@ PK11_DestroyTokenObject(PK11SlotInfo *sl |
- PK11_RestoreROSession(slot,rwsession); |
- return rv; |
- } |
- |
- /* |
- * Read in a single attribute into a SECItem. Allocate space for it with |
- * PORT_Alloc unless an arena is supplied. In the latter case use the arena |
- * to allocate the space. |
-+ * |
-+ * PK11_ReadAttribute sets the 'data' and 'len' fields of the SECItem but |
-+ * does not modify its 'type' field. |
- */ |
- SECStatus |
- PK11_ReadAttribute(PK11SlotInfo *slot, CK_OBJECT_HANDLE id, |
- CK_ATTRIBUTE_TYPE type, PLArenaPool *arena, SECItem *result) { |
- CK_ATTRIBUTE attr = { 0, NULL, 0 }; |
- CK_RV crv; |
- |
- attr.type = type; |
-diff --git a/lib/pk11wrap/pk11pk12.c b/lib/pk11wrap/pk11pk12.c |
---- a/lib/pk11wrap/pk11pk12.c |
-+++ b/lib/pk11wrap/pk11pk12.c |
-@@ -13,16 +13,17 @@ |
- #include "secmodi.h" |
- #include "pkcs11.h" |
- #include "pk11func.h" |
- #include "secitem.h" |
- #include "key.h" |
- #include "secoid.h" |
- #include "secasn1.h" |
- #include "secerr.h" |
-+#include "prerror.h" |
- |
- |
- |
- /* These data structures should move to a common .h file shared between the |
- * wrappers and the pkcs 12 code. */ |
- |
- /* |
- ** RSA Raw Private Key structures |
-@@ -511,8 +512,117 @@ PK11_ImportPrivateKeyInfo(PK11SlotInfo * |
- SECItem *nickname, SECItem *publicValue, PRBool isPerm, |
- PRBool isPrivate, unsigned int keyUsage, void *wincx) |
- { |
- return PK11_ImportPrivateKeyInfoAndReturnKey(slot, pki, nickname, |
- publicValue, isPerm, isPrivate, keyUsage, NULL, wincx); |
- |
- } |
- |
-+SECItem * |
-+PK11_ExportDERPrivateKeyInfo(SECKEYPrivateKey *pk, void *wincx) |
-+{ |
-+ SECKEYPrivateKeyInfo *pki = PK11_ExportPrivKeyInfo(pk, wincx); |
-+ SECItem *derPKI; |
-+ |
-+ if (!pki) { |
-+ return NULL; |
-+ } |
-+ derPKI = SEC_ASN1EncodeItem(NULL, NULL, pki, |
-+ SECKEY_PrivateKeyInfoTemplate); |
-+ SECKEY_DestroyPrivateKeyInfo(pki, PR_TRUE); |
-+ return derPKI; |
-+} |
-+ |
-+static PRBool |
-+ReadAttribute(SECKEYPrivateKey *key, CK_ATTRIBUTE_TYPE type, |
-+ PLArenaPool *arena, SECItem *output) |
-+{ |
-+ SECStatus rv = PK11_ReadAttribute(key->pkcs11Slot, key->pkcs11ID, type, |
-+ arena, output); |
-+ return rv == SECSuccess; |
-+} |
-+ |
-+/* |
-+ * The caller is responsible for freeing the return value by passing it to |
-+ * SECKEY_DestroyPrivateKeyInfo(..., PR_TRUE). |
-+ */ |
-+SECKEYPrivateKeyInfo * |
-+PK11_ExportPrivKeyInfo(SECKEYPrivateKey *pk, void *wincx) |
-+{ |
-+ /* PrivateKeyInfo version (always zero) */ |
-+ const unsigned char pkiVersion = 0; |
-+ /* RSAPrivateKey version (always zero) */ |
-+ const unsigned char rsaVersion = 0; |
-+ PLArenaPool *arena = NULL; |
-+ SECKEYRawPrivateKey rawKey; |
-+ SECKEYPrivateKeyInfo *pki; |
-+ SECItem *encoded; |
-+ SECStatus rv; |
-+ |
-+ if (pk->keyType != rsaKey) { |
-+ PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); |
-+ goto loser; |
-+ } |
-+ |
-+ arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); |
-+ if (!arena) { |
-+ goto loser; |
-+ } |
-+ memset(&rawKey, 0, sizeof(rawKey)); |
-+ rawKey.keyType = pk->keyType; |
-+ rawKey.u.rsa.version.type = siUnsignedInteger; |
-+ rawKey.u.rsa.version.data = (unsigned char *)PORT_ArenaAlloc(arena, 1); |
-+ if (!rawKey.u.rsa.version.data) { |
-+ goto loser; |
-+ } |
-+ rawKey.u.rsa.version.data[0] = rsaVersion; |
-+ rawKey.u.rsa.version.len = 1; |
-+ |
-+ /* Read the component attributes of the private key */ |
-+ prepare_rsa_priv_key_export_for_asn1(&rawKey); |
-+ if (!ReadAttribute(pk, CKA_MODULUS, arena, &rawKey.u.rsa.modulus) || |
-+ !ReadAttribute(pk, CKA_PUBLIC_EXPONENT, arena, |
-+ &rawKey.u.rsa.publicExponent) || |
-+ !ReadAttribute(pk, CKA_PRIVATE_EXPONENT, arena, |
-+ &rawKey.u.rsa.privateExponent) || |
-+ !ReadAttribute(pk, CKA_PRIME_1, arena, &rawKey.u.rsa.prime1) || |
-+ !ReadAttribute(pk, CKA_PRIME_2, arena, &rawKey.u.rsa.prime2) || |
-+ !ReadAttribute(pk, CKA_EXPONENT_1, arena, |
-+ &rawKey.u.rsa.exponent1) || |
-+ !ReadAttribute(pk, CKA_EXPONENT_2, arena, |
-+ &rawKey.u.rsa.exponent2) || |
-+ !ReadAttribute(pk, CKA_COEFFICIENT, arena, |
-+ &rawKey.u.rsa.coefficient)) { |
-+ goto loser; |
-+ } |
-+ |
-+ pki = PORT_ArenaZNew(arena, SECKEYPrivateKeyInfo); |
-+ if (!pki) { |
-+ goto loser; |
-+ } |
-+ encoded = SEC_ASN1EncodeItem(arena, &pki->privateKey, &rawKey, |
-+ SECKEY_RSAPrivateKeyExportTemplate); |
-+ if (!encoded) { |
-+ goto loser; |
-+ } |
-+ rv = SECOID_SetAlgorithmID(arena, &pki->algorithm, |
-+ SEC_OID_PKCS1_RSA_ENCRYPTION, NULL); |
-+ if (rv != SECSuccess) { |
-+ goto loser; |
-+ } |
-+ pki->version.type = siUnsignedInteger; |
-+ pki->version.data = (unsigned char *)PORT_ArenaAlloc(arena, 1); |
-+ if (!pki->version.data) { |
-+ goto loser; |
-+ } |
-+ pki->version.data[0] = pkiVersion; |
-+ pki->version.len = 1; |
-+ pki->arena = arena; |
-+ |
-+ return pki; |
-+ |
-+loser: |
-+ if (arena) { |
-+ PORT_FreeArena(arena, PR_TRUE); |
-+ } |
-+ return NULL; |
-+} |
-diff --git a/lib/pk11wrap/pk11pub.h b/lib/pk11wrap/pk11pub.h |
---- a/lib/pk11wrap/pk11pub.h |
-+++ b/lib/pk11wrap/pk11pub.h |
-@@ -554,16 +554,19 @@ SECStatus PK11_ImportEncryptedPrivateKey |
- SECItem *nickname, SECItem *publicValue, PRBool isPerm, |
- PRBool isPrivate, KeyType type, |
- unsigned int usage, void *wincx); |
- SECStatus PK11_ImportEncryptedPrivateKeyInfoAndReturnKey(PK11SlotInfo *slot, |
- SECKEYEncryptedPrivateKeyInfo *epki, SECItem *pwitem, |
- SECItem *nickname, SECItem *publicValue, PRBool isPerm, |
- PRBool isPrivate, KeyType type, |
- unsigned int usage, SECKEYPrivateKey** privk, void *wincx); |
-+SECItem *PK11_ExportDERPrivateKeyInfo(SECKEYPrivateKey *pk, void *wincx); |
-+SECKEYPrivateKeyInfo *PK11_ExportPrivKeyInfo( |
-+ SECKEYPrivateKey *pk, void *wincx); |
- SECKEYPrivateKeyInfo *PK11_ExportPrivateKeyInfo( |
- CERTCertificate *cert, void *wincx); |
- SECKEYEncryptedPrivateKeyInfo *PK11_ExportEncryptedPrivKeyInfo( |
- PK11SlotInfo *slot, SECOidTag algTag, SECItem *pwitem, |
- SECKEYPrivateKey *pk, int iteration, void *wincx); |
- SECKEYEncryptedPrivateKeyInfo *PK11_ExportEncryptedPrivateKeyInfo( |
- PK11SlotInfo *slot, SECOidTag algTag, SECItem *pwitem, |
- CERTCertificate *cert, int iteration, void *wincx); |