summaryrefslogtreecommitdiff
path: root/nss/lib/softoken/legacydb/lgcreate.c
diff options
context:
space:
mode:
Diffstat (limited to 'nss/lib/softoken/legacydb/lgcreate.c')
-rw-r--r--nss/lib/softoken/legacydb/lgcreate.c918
1 files changed, 477 insertions, 441 deletions
diff --git a/nss/lib/softoken/legacydb/lgcreate.c b/nss/lib/softoken/legacydb/lgcreate.c
index c5ce99e..a0d2b2e 100644
--- a/nss/lib/softoken/legacydb/lgcreate.c
+++ b/nss/lib/softoken/legacydb/lgcreate.c
@@ -3,34 +3,34 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "secitem.h"
#include "pkcs11.h"
-#include "lgdb.h"
+#include "lgdb.h"
#include "pcert.h"
#include "lowkeyi.h"
#include "blapi.h"
#include "secder.h"
#include "secasn1.h"
-#include "keydbi.h"
+#include "keydbi.h"
/*
* ******************** Object Creation Utilities ***************************
*/
/*
- * check the consistancy and initialize a Certificate Object
+ * check the consistancy and initialize a Certificate Object
*/
static CK_RV
lg_createCertObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
- const CK_ATTRIBUTE *templ, CK_ULONG count)
+ const CK_ATTRIBUTE *templ, CK_ULONG count)
{
SECItem derCert;
NSSLOWCERTCertificate *cert;
NSSLOWCERTCertTrust *trust = NULL;
- NSSLOWCERTCertTrust userTrust =
- { CERTDB_USER, CERTDB_USER, CERTDB_USER };
- NSSLOWCERTCertTrust defTrust =
- { CERTDB_TRUSTED_UNKNOWN,
- CERTDB_TRUSTED_UNKNOWN, CERTDB_TRUSTED_UNKNOWN };
+ NSSLOWCERTCertTrust userTrust =
+ { CERTDB_USER, CERTDB_USER, CERTDB_USER };
+ NSSLOWCERTCertTrust defTrust =
+ { CERTDB_TRUSTED_UNKNOWN,
+ CERTDB_TRUSTED_UNKNOWN, CERTDB_TRUSTED_UNKNOWN };
char *label = NULL;
char *email = NULL;
SECStatus rv;
@@ -43,68 +43,69 @@ lg_createCertObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
/* we can't store any certs private */
if (lg_isTrue(CKA_PRIVATE, templ, count)) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
-
+
/* We only support X.509 Certs for now */
crv = lg_GetULongAttribute(CKA_CERTIFICATE_TYPE, templ, count, &type);
if (crv != CKR_OK) {
- return crv;
+ return crv;
}
if (type != CKC_X_509) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
/* X.509 Certificate */
-
if (certHandle == NULL) {
- return CKR_TOKEN_WRITE_PROTECTED;
+ return CKR_TOKEN_WRITE_PROTECTED;
}
- /* get the der cert */
+ /* get the der cert */
attribute = lg_FindAttribute(CKA_VALUE, templ, count);
if (!attribute) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
derCert.type = 0;
derCert.data = (unsigned char *)attribute->pValue;
- derCert.len = attribute->ulValueLen ;
+ derCert.len = attribute->ulValueLen;
label = lg_getString(CKA_LABEL, templ, count);
- cert = nsslowcert_FindCertByDERCert(certHandle, &derCert);
+ cert = nsslowcert_FindCertByDERCert(certHandle, &derCert);
if (cert == NULL) {
- cert = nsslowcert_DecodeDERCertificate(&derCert, label);
- inDB = PR_FALSE;
+ cert = nsslowcert_DecodeDERCertificate(&derCert, label);
+ inDB = PR_FALSE;
}
if (cert == NULL) {
- if (label) PORT_Free(label);
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ if (label)
+ PORT_Free(label);
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
keyHandle = lg_getKeyDB(sdb);
if (keyHandle) {
- if (nsslowkey_KeyForCertExists(keyHandle,cert)) {
- trust = &userTrust;
- }
+ if (nsslowkey_KeyForCertExists(keyHandle, cert)) {
+ trust = &userTrust;
+ }
}
if (!inDB) {
- if (!trust) trust = &defTrust;
- rv = nsslowcert_AddPermCert(certHandle, cert, label, trust);
+ if (!trust)
+ trust = &defTrust;
+ rv = nsslowcert_AddPermCert(certHandle, cert, label, trust);
} else {
- rv = trust ? nsslowcert_ChangeCertTrust(certHandle,cert,trust) :
- SECSuccess;
+ rv = trust ? nsslowcert_ChangeCertTrust(certHandle, cert, trust) : SECSuccess;
}
- if (label) PORT_Free(label);
+ if (label)
+ PORT_Free(label);
if (rv != SECSuccess) {
- nsslowcert_DestroyCertificate(cert);
- return CKR_DEVICE_ERROR;
+ nsslowcert_DestroyCertificate(cert);
+ return CKR_DEVICE_ERROR;
}
/*
@@ -112,18 +113,18 @@ lg_createCertObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
*/
email = lg_getString(CKA_NSS_EMAIL, templ, count);
if (email) {
- certDBEntrySMime *entry;
-
- entry = nsslowcert_ReadDBSMimeEntry(certHandle,email);
- if (!entry) {
- nsslowcert_SaveSMimeProfile(certHandle, email,
- &cert->derSubject, NULL, NULL);
- } else {
- nsslowcert_DestroyDBEntry((certDBEntry *)entry);
- }
- PORT_Free(email);
- }
- *handle=lg_mkHandle(sdb,&cert->certKey,LG_TOKEN_TYPE_CERT);
+ certDBEntrySMime *entry;
+
+ entry = nsslowcert_ReadDBSMimeEntry(certHandle, email);
+ if (!entry) {
+ nsslowcert_SaveSMimeProfile(certHandle, email,
+ &cert->derSubject, NULL, NULL);
+ } else {
+ nsslowcert_DestroyDBEntry((certDBEntry *)entry);
+ }
+ PORT_Free(email);
+ }
+ *handle = lg_mkHandle(sdb, &cert->certKey, LG_TOKEN_TYPE_CERT);
nsslowcert_DestroyCertificate(cert);
return CKR_OK;
@@ -132,32 +133,30 @@ lg_createCertObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
unsigned int
lg_MapTrust(CK_TRUST trust, PRBool clientAuth)
{
- unsigned int trustCA = clientAuth ? CERTDB_TRUSTED_CLIENT_CA :
- CERTDB_TRUSTED_CA;
+ unsigned int trustCA = clientAuth ? CERTDB_TRUSTED_CLIENT_CA : CERTDB_TRUSTED_CA;
switch (trust) {
- case CKT_NSS_TRUSTED:
- return CERTDB_TERMINAL_RECORD|CERTDB_TRUSTED;
- case CKT_NSS_TRUSTED_DELEGATOR:
- return CERTDB_VALID_CA|trustCA;
- case CKT_NSS_MUST_VERIFY_TRUST:
- return CERTDB_MUST_VERIFY;
- case CKT_NSS_NOT_TRUSTED:
- return CERTDB_TERMINAL_RECORD;
- case CKT_NSS_VALID_DELEGATOR: /* implies must verify */
- return CERTDB_VALID_CA;
- default:
- break;
+ case CKT_NSS_TRUSTED:
+ return CERTDB_TERMINAL_RECORD | CERTDB_TRUSTED;
+ case CKT_NSS_TRUSTED_DELEGATOR:
+ return CERTDB_VALID_CA | trustCA;
+ case CKT_NSS_MUST_VERIFY_TRUST:
+ return CERTDB_MUST_VERIFY;
+ case CKT_NSS_NOT_TRUSTED:
+ return CERTDB_TERMINAL_RECORD;
+ case CKT_NSS_VALID_DELEGATOR: /* implies must verify */
+ return CERTDB_VALID_CA;
+ default:
+ break;
}
return CERTDB_TRUSTED_UNKNOWN;
}
-
-
+
/*
- * check the consistancy and initialize a Trust Object
+ * check the consistancy and initialize a Trust Object
*/
static CK_RV
lg_createTrustObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
- const CK_ATTRIBUTE *templ, CK_ULONG count)
+ const CK_ATTRIBUTE *templ, CK_ULONG count)
{
const CK_ATTRIBUTE *issuer = NULL;
const CK_ATTRIBUTE *serial = NULL;
@@ -175,30 +174,30 @@ lg_createTrustObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
/* we can't store any certs private */
if (lg_isTrue(CKA_PRIVATE, templ, count)) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
if (certHandle == NULL) {
- return CKR_TOKEN_WRITE_PROTECTED;
+ return CKR_TOKEN_WRITE_PROTECTED;
}
issuer = lg_FindAttribute(CKA_ISSUER, templ, count);
serial = lg_FindAttribute(CKA_SERIAL_NUMBER, templ, count);
if (issuer && serial) {
- issuerSN.derIssuer.data = (unsigned char *)issuer->pValue;
- issuerSN.derIssuer.len = issuer->ulValueLen ;
+ issuerSN.derIssuer.data = (unsigned char *)issuer->pValue;
+ issuerSN.derIssuer.len = issuer->ulValueLen;
- issuerSN.serialNumber.data = (unsigned char *)serial->pValue;
- issuerSN.serialNumber.len = serial->ulValueLen ;
+ issuerSN.serialNumber.data = (unsigned char *)serial->pValue;
+ issuerSN.serialNumber.len = serial->ulValueLen;
- cert = nsslowcert_FindCertByIssuerAndSN(certHandle,&issuerSN);
+ cert = nsslowcert_FindCertByIssuerAndSN(certHandle, &issuerSN);
}
if (cert == NULL) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
-
+
lg_GetULongAttribute(CKA_TRUST_SERVER_AUTH, templ, count, &sslTrust);
lg_GetULongAttribute(CKA_TRUST_CLIENT_AUTH, templ, count, &clientTrust);
lg_GetULongAttribute(CKA_TRUST_EMAIL_PROTECTION, templ, count, &emailTrust);
@@ -206,284 +205,283 @@ lg_createTrustObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
stepUp = CK_FALSE;
trust = lg_FindAttribute(CKA_TRUST_STEP_UP_APPROVED, templ, count);
if (trust) {
- if (trust->ulValueLen == sizeof(CK_BBOOL)) {
- stepUp = *(CK_BBOOL*)trust->pValue;
- }
+ if (trust->ulValueLen == sizeof(CK_BBOOL)) {
+ stepUp = *(CK_BBOOL *)trust->pValue;
+ }
}
/* preserve certain old fields */
if (cert->trust) {
- dbTrust.sslFlags = cert->trust->sslFlags & CERTDB_PRESERVE_TRUST_BITS;
- dbTrust.emailFlags=
- cert->trust->emailFlags & CERTDB_PRESERVE_TRUST_BITS;
- dbTrust.objectSigningFlags =
- cert->trust->objectSigningFlags & CERTDB_PRESERVE_TRUST_BITS;
+ dbTrust.sslFlags = cert->trust->sslFlags & CERTDB_PRESERVE_TRUST_BITS;
+ dbTrust.emailFlags =
+ cert->trust->emailFlags & CERTDB_PRESERVE_TRUST_BITS;
+ dbTrust.objectSigningFlags =
+ cert->trust->objectSigningFlags & CERTDB_PRESERVE_TRUST_BITS;
}
- dbTrust.sslFlags |= lg_MapTrust(sslTrust,PR_FALSE);
- dbTrust.sslFlags |= lg_MapTrust(clientTrust,PR_TRUE);
- dbTrust.emailFlags |= lg_MapTrust(emailTrust,PR_FALSE);
- dbTrust.objectSigningFlags |= lg_MapTrust(signTrust,PR_FALSE);
+ dbTrust.sslFlags |= lg_MapTrust(sslTrust, PR_FALSE);
+ dbTrust.sslFlags |= lg_MapTrust(clientTrust, PR_TRUE);
+ dbTrust.emailFlags |= lg_MapTrust(emailTrust, PR_FALSE);
+ dbTrust.objectSigningFlags |= lg_MapTrust(signTrust, PR_FALSE);
if (stepUp) {
- dbTrust.sslFlags |= CERTDB_GOVT_APPROVED_CA;
+ dbTrust.sslFlags |= CERTDB_GOVT_APPROVED_CA;
}
- rv = nsslowcert_ChangeCertTrust(certHandle,cert,&dbTrust);
- *handle=lg_mkHandle(sdb,&cert->certKey,LG_TOKEN_TYPE_TRUST);
+ rv = nsslowcert_ChangeCertTrust(certHandle, cert, &dbTrust);
+ *handle = lg_mkHandle(sdb, &cert->certKey, LG_TOKEN_TYPE_TRUST);
nsslowcert_DestroyCertificate(cert);
if (rv != SECSuccess) {
- return CKR_DEVICE_ERROR;
+ return CKR_DEVICE_ERROR;
}
return CKR_OK;
}
/*
- * check the consistancy and initialize a Trust Object
+ * check the consistancy and initialize a Trust Object
*/
static CK_RV
lg_createSMimeObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
- const CK_ATTRIBUTE *templ, CK_ULONG count)
+ const CK_ATTRIBUTE *templ, CK_ULONG count)
{
- SECItem derSubj,rawProfile,rawTime,emailKey;
+ SECItem derSubj, rawProfile, rawTime, emailKey;
SECItem *pRawProfile = NULL;
SECItem *pRawTime = NULL;
char *email = NULL;
const CK_ATTRIBUTE *subject = NULL,
- *profile = NULL,
- *time = NULL;
+ *profile = NULL,
+ *time = NULL;
SECStatus rv;
NSSLOWCERTCertDBHandle *certHandle;
CK_RV ck_rv = CKR_OK;
/* we can't store any certs private */
- if (lg_isTrue(CKA_PRIVATE,templ,count)) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ if (lg_isTrue(CKA_PRIVATE, templ, count)) {
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
certHandle = lg_getCertDB(sdb);
if (certHandle == NULL) {
- return CKR_TOKEN_WRITE_PROTECTED;
+ return CKR_TOKEN_WRITE_PROTECTED;
}
/* lookup SUBJECT */
- subject = lg_FindAttribute(CKA_SUBJECT,templ,count);
+ subject = lg_FindAttribute(CKA_SUBJECT, templ, count);
PORT_Assert(subject);
if (!subject) {
- ck_rv = CKR_ATTRIBUTE_VALUE_INVALID;
- goto loser;
+ ck_rv = CKR_ATTRIBUTE_VALUE_INVALID;
+ goto loser;
}
derSubj.data = (unsigned char *)subject->pValue;
- derSubj.len = subject->ulValueLen ;
+ derSubj.len = subject->ulValueLen;
derSubj.type = 0;
/* lookup VALUE */
- profile = lg_FindAttribute(CKA_VALUE,templ,count);
+ profile = lg_FindAttribute(CKA_VALUE, templ, count);
if (profile) {
- rawProfile.data = (unsigned char *)profile->pValue;
- rawProfile.len = profile->ulValueLen ;
- rawProfile.type = siBuffer;
- pRawProfile = &rawProfile;
+ rawProfile.data = (unsigned char *)profile->pValue;
+ rawProfile.len = profile->ulValueLen;
+ rawProfile.type = siBuffer;
+ pRawProfile = &rawProfile;
}
/* lookup Time */
- time = lg_FindAttribute(CKA_NSS_SMIME_TIMESTAMP,templ,count);
+ time = lg_FindAttribute(CKA_NSS_SMIME_TIMESTAMP, templ, count);
if (time) {
- rawTime.data = (unsigned char *)time->pValue;
- rawTime.len = time->ulValueLen ;
- rawTime.type = siBuffer;
- pRawTime = &rawTime;
+ rawTime.data = (unsigned char *)time->pValue;
+ rawTime.len = time->ulValueLen;
+ rawTime.type = siBuffer;
+ pRawTime = &rawTime;
}
-
- email = lg_getString(CKA_NSS_EMAIL,templ,count);
+ email = lg_getString(CKA_NSS_EMAIL, templ, count);
if (!email) {
- ck_rv = CKR_ATTRIBUTE_VALUE_INVALID;
- goto loser;
+ ck_rv = CKR_ATTRIBUTE_VALUE_INVALID;
+ goto loser;
}
/* Store S/MIME Profile by SUBJECT */
- rv = nsslowcert_SaveSMimeProfile(certHandle, email, &derSubj,
- pRawProfile,pRawTime);
+ rv = nsslowcert_SaveSMimeProfile(certHandle, email, &derSubj,
+ pRawProfile, pRawTime);
if (rv != SECSuccess) {
- ck_rv = CKR_DEVICE_ERROR;
- goto loser;
+ ck_rv = CKR_DEVICE_ERROR;
+ goto loser;
}
emailKey.data = (unsigned char *)email;
- emailKey.len = PORT_Strlen(email)+1;
+ emailKey.len = PORT_Strlen(email) + 1;
*handle = lg_mkHandle(sdb, &emailKey, LG_TOKEN_TYPE_SMIME);
loser:
- if (email) PORT_Free(email);
+ if (email)
+ PORT_Free(email);
return ck_rv;
}
/*
- * check the consistancy and initialize a Trust Object
+ * check the consistancy and initialize a Trust Object
*/
static CK_RV
lg_createCrlObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
- const CK_ATTRIBUTE *templ, CK_ULONG count)
+ const CK_ATTRIBUTE *templ, CK_ULONG count)
{
PRBool isKRL = PR_FALSE;
- SECItem derSubj,derCrl;
+ SECItem derSubj, derCrl;
char *url = NULL;
- const CK_ATTRIBUTE *subject,*crl;
+ const CK_ATTRIBUTE *subject, *crl;
SECStatus rv;
NSSLOWCERTCertDBHandle *certHandle;
certHandle = lg_getCertDB(sdb);
/* we can't store any private crls */
- if (lg_isTrue(CKA_PRIVATE,templ,count)) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ if (lg_isTrue(CKA_PRIVATE, templ, count)) {
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
if (certHandle == NULL) {
- return CKR_TOKEN_WRITE_PROTECTED;
+ return CKR_TOKEN_WRITE_PROTECTED;
}
/* lookup SUBJECT */
- subject = lg_FindAttribute(CKA_SUBJECT,templ,count);
+ subject = lg_FindAttribute(CKA_SUBJECT, templ, count);
if (!subject) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
derSubj.data = (unsigned char *)subject->pValue;
- derSubj.len = subject->ulValueLen ;
+ derSubj.len = subject->ulValueLen;
/* lookup VALUE */
- crl = lg_FindAttribute(CKA_VALUE,templ,count);
+ crl = lg_FindAttribute(CKA_VALUE, templ, count);
PORT_Assert(crl);
if (!crl) {
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
derCrl.data = (unsigned char *)crl->pValue;
- derCrl.len = crl->ulValueLen ;
+ derCrl.len = crl->ulValueLen;
- url = lg_getString(CKA_NSS_URL,templ,count);
- isKRL = lg_isTrue(CKA_NSS_KRL,templ,count);
+ url = lg_getString(CKA_NSS_URL, templ, count);
+ isKRL = lg_isTrue(CKA_NSS_KRL, templ, count);
/* Store CRL by SUBJECT */
rv = nsslowcert_AddCrl(certHandle, &derCrl, &derSubj, url, isKRL);
if (url) {
- PORT_Free(url);
+ PORT_Free(url);
}
if (rv != SECSuccess) {
- return CKR_DEVICE_ERROR;
+ return CKR_DEVICE_ERROR;
}
/* if we overwrote the existing CRL, poison the handle entry so we get
* a new object handle */
- (void) lg_poisonHandle(sdb, &derSubj,
- isKRL ? LG_TOKEN_KRL_HANDLE : LG_TOKEN_TYPE_CRL);
+ (void)lg_poisonHandle(sdb, &derSubj,
+ isKRL ? LG_TOKEN_KRL_HANDLE : LG_TOKEN_TYPE_CRL);
*handle = lg_mkHandle(sdb, &derSubj,
- isKRL ? LG_TOKEN_KRL_HANDLE : LG_TOKEN_TYPE_CRL);
+ isKRL ? LG_TOKEN_KRL_HANDLE : LG_TOKEN_TYPE_CRL);
return CKR_OK;
}
/*
- * check the consistancy and initialize a Public Key Object
+ * check the consistancy and initialize a Public Key Object
*/
static CK_RV
lg_createPublicKeyObject(SDB *sdb, CK_KEY_TYPE key_type,
- CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
+ CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
{
CK_ATTRIBUTE_TYPE pubKeyAttr = CKA_VALUE;
CK_RV crv = CKR_OK;
NSSLOWKEYPrivateKey *priv;
- SECItem pubKeySpace = {siBuffer, NULL, 0};
+ SECItem pubKeySpace = { siBuffer, NULL, 0 };
SECItem *pubKey;
#ifndef NSS_DISABLE_ECC
- SECItem pubKey2Space = {siBuffer, NULL, 0};
+ SECItem pubKey2Space = { siBuffer, NULL, 0 };
PLArenaPool *arena = NULL;
#endif /* NSS_DISABLE_ECC */
NSSLOWKEYDBHandle *keyHandle = NULL;
-
switch (key_type) {
- case CKK_RSA:
- pubKeyAttr = CKA_MODULUS;
- break;
+ case CKK_RSA:
+ pubKeyAttr = CKA_MODULUS;
+ break;
#ifndef NSS_DISABLE_ECC
- case CKK_EC:
- pubKeyAttr = CKA_EC_POINT;
- break;
+ case CKK_EC:
+ pubKeyAttr = CKA_EC_POINT;
+ break;
#endif /* NSS_DISABLE_ECC */
- case CKK_DSA:
- case CKK_DH:
- break;
- default:
- return CKR_ATTRIBUTE_VALUE_INVALID;
+ case CKK_DSA:
+ case CKK_DH:
+ break;
+ default:
+ return CKR_ATTRIBUTE_VALUE_INVALID;
}
-
pubKey = &pubKeySpace;
- crv = lg_Attribute2SSecItem(NULL,pubKeyAttr,templ,count,pubKey);
- if (crv != CKR_OK) return crv;
+ crv = lg_Attribute2SSecItem(NULL, pubKeyAttr, templ, count, pubKey);
+ if (crv != CKR_OK)
+ return crv;
#ifndef NSS_DISABLE_ECC
if (key_type == CKK_EC) {
- SECStatus rv;
- /*
- * for ECC, use the decoded key first.
- */
- arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
- if (arena == NULL) {
- crv = CKR_HOST_MEMORY;
- goto done;
- }
- rv= SEC_QuickDERDecodeItem(arena, &pubKey2Space,
- SEC_ASN1_GET(SEC_OctetStringTemplate),
- pubKey);
- if (rv != SECSuccess) {
- /* decode didn't work, just try the pubKey */
- PORT_FreeArena(arena, PR_FALSE);
- arena = NULL;
- } else {
- /* try the decoded pub key first */
- pubKey = &pubKey2Space;
- }
+ SECStatus rv;
+ /*
+ * for ECC, use the decoded key first.
+ */
+ arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
+ if (arena == NULL) {
+ crv = CKR_HOST_MEMORY;
+ goto done;
+ }
+ rv = SEC_QuickDERDecodeItem(arena, &pubKey2Space,
+ SEC_ASN1_GET(SEC_OctetStringTemplate),
+ pubKey);
+ if (rv != SECSuccess) {
+ /* decode didn't work, just try the pubKey */
+ PORT_FreeArena(arena, PR_FALSE);
+ arena = NULL;
+ } else {
+ /* try the decoded pub key first */
+ pubKey = &pubKey2Space;
+ }
}
#endif /* NSS_DISABLE_ECC */
PORT_Assert(pubKey->data);
if (pubKey->data == NULL) {
- crv = CKR_ATTRIBUTE_VALUE_INVALID;
- goto done;
+ crv = CKR_ATTRIBUTE_VALUE_INVALID;
+ goto done;
}
keyHandle = lg_getKeyDB(sdb);
if (keyHandle == NULL) {
- crv = CKR_TOKEN_WRITE_PROTECTED;
- goto done;
+ crv = CKR_TOKEN_WRITE_PROTECTED;
+ goto done;
}
if (keyHandle->version != 3) {
- unsigned char buf[SHA1_LENGTH];
- SHA1_HashBuf(buf,pubKey->data,pubKey->len);
- PORT_Memcpy(pubKey->data,buf,sizeof(buf));
- pubKey->len = sizeof(buf);
+ unsigned char buf[SHA1_LENGTH];
+ SHA1_HashBuf(buf, pubKey->data, pubKey->len);
+ PORT_Memcpy(pubKey->data, buf, sizeof(buf));
+ pubKey->len = sizeof(buf);
}
/* make sure the associated private key already exists */
/* only works if we are logged in */
priv = nsslowkey_FindKeyByPublicKey(keyHandle, pubKey, sdb /*password*/);
#ifndef NSS_DISABLE_ECC
if (priv == NULL && pubKey == &pubKey2Space) {
- /* no match on the decoded key, match the original pubkey */
- pubKey = &pubKeySpace;
- priv = nsslowkey_FindKeyByPublicKey(keyHandle, pubKey,
- sdb /*password*/);
+ /* no match on the decoded key, match the original pubkey */
+ pubKey = &pubKeySpace;
+ priv = nsslowkey_FindKeyByPublicKey(keyHandle, pubKey,
+ sdb /*password*/);
}
#endif
if (priv == NULL) {
- /* the legacy database can only 'store' public keys which already
- * have their corresponding private keys in the database */
- crv = CKR_ATTRIBUTE_VALUE_INVALID;
- goto done;
+ /* the legacy database can only 'store' public keys which already
+ * have their corresponding private keys in the database */
+ crv = CKR_ATTRIBUTE_VALUE_INVALID;
+ goto done;
}
lg_nsslowkey_DestroyPrivateKey(priv);
crv = CKR_OK;
@@ -493,8 +491,8 @@ lg_createPublicKeyObject(SDB *sdb, CK_KEY_TYPE key_type,
done:
PORT_Free(pubKeySpace.data);
#ifndef NSS_DISABLE_ECC
- if (arena)
- PORT_FreeArena(arena, PR_FALSE);
+ if (arena)
+ PORT_FreeArena(arena, PR_FALSE);
#endif
return crv;
@@ -503,7 +501,7 @@ done:
/* make a private key from a verified object */
static NSSLOWKEYPrivateKey *
lg_mkPrivKey(SDB *sdb, const CK_ATTRIBUTE *templ, CK_ULONG count,
- CK_KEY_TYPE key_type, CK_RV *crvp)
+ CK_KEY_TYPE key_type, CK_RV *crvp)
{
NSSLOWKEYPrivateKey *privKey;
PLArenaPool *arena;
@@ -512,142 +510,162 @@ lg_mkPrivKey(SDB *sdb, const CK_ATTRIBUTE *templ, CK_ULONG count,
arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
if (arena == NULL) {
- *crvp = CKR_HOST_MEMORY;
- return NULL;
+ *crvp = CKR_HOST_MEMORY;
+ return NULL;
}
privKey = (NSSLOWKEYPrivateKey *)
- PORT_ArenaZAlloc(arena,sizeof(NSSLOWKEYPrivateKey));
- if (privKey == NULL) {
- PORT_FreeArena(arena,PR_FALSE);
- *crvp = CKR_HOST_MEMORY;
- return NULL;
+ PORT_ArenaZAlloc(arena, sizeof(NSSLOWKEYPrivateKey));
+ if (privKey == NULL) {
+ PORT_FreeArena(arena, PR_FALSE);
+ *crvp = CKR_HOST_MEMORY;
+ return NULL;
}
/* in future this would be a switch on key_type */
privKey->arena = arena;
switch (key_type) {
- case CKK_RSA:
- privKey->keyType = NSSLOWKEYRSAKey;
- crv=lg_Attribute2SSecItem(arena,CKA_MODULUS,templ,count,
- &privKey->u.rsa.modulus);
- if (crv != CKR_OK) break;
- crv=lg_Attribute2SSecItem(arena,CKA_PUBLIC_EXPONENT,templ,count,
- &privKey->u.rsa.publicExponent);
- if (crv != CKR_OK) break;
- crv=lg_PrivAttr2SSecItem(arena,CKA_PRIVATE_EXPONENT,templ,count,
- &privKey->u.rsa.privateExponent, sdb);
- if (crv != CKR_OK) break;
- crv=lg_PrivAttr2SSecItem(arena,CKA_PRIME_1,templ,count,
- &privKey->u.rsa.prime1, sdb);
- if (crv != CKR_OK) break;
- crv=lg_PrivAttr2SSecItem(arena,CKA_PRIME_2,templ,count,
- &privKey->u.rsa.prime2, sdb);
- if (crv != CKR_OK) break;
- crv=lg_PrivAttr2SSecItem(arena,CKA_EXPONENT_1,templ,count,
- &privKey->u.rsa.exponent1, sdb);
- if (crv != CKR_OK) break;
- crv=lg_PrivAttr2SSecItem(arena,CKA_EXPONENT_2,templ,count,
- &privKey->u.rsa.exponent2, sdb);
- if (crv != CKR_OK) break;
- crv=lg_PrivAttr2SSecItem(arena,CKA_COEFFICIENT,templ,count,
- &privKey->u.rsa.coefficient, sdb);
- if (crv != CKR_OK) break;
- rv = DER_SetUInteger(privKey->arena, &privKey->u.rsa.version,
- NSSLOWKEY_VERSION);
- if (rv != SECSuccess) crv = CKR_HOST_MEMORY;
- break;
-
- case CKK_DSA:
- privKey->keyType = NSSLOWKEYDSAKey;
- crv = lg_Attribute2SSecItem(arena,CKA_PRIME,templ,count,
- &privKey->u.dsa.params.prime);
- if (crv != CKR_OK) break;
- crv = lg_Attribute2SSecItem(arena,CKA_SUBPRIME,templ,count,
- &privKey->u.dsa.params.subPrime);
- if (crv != CKR_OK) break;
- crv = lg_Attribute2SSecItem(arena,CKA_BASE,templ,count,
- &privKey->u.dsa.params.base);
- if (crv != CKR_OK) break;
- crv = lg_PrivAttr2SSecItem(arena,CKA_VALUE,templ,count,
- &privKey->u.dsa.privateValue, sdb);
- if (crv != CKR_OK) break;
- if (lg_hasAttribute(CKA_NETSCAPE_DB, templ,count)) {
- crv = lg_Attribute2SSecItem(arena, CKA_NETSCAPE_DB,templ,count,
- &privKey->u.dsa.publicValue);
- /* privKey was zero'd so public value is already set to NULL, 0
- * if we don't set it explicitly */
- }
- break;
-
- case CKK_DH:
- privKey->keyType = NSSLOWKEYDHKey;
- crv = lg_Attribute2SSecItem(arena,CKA_PRIME,templ,count,
- &privKey->u.dh.prime);
- if (crv != CKR_OK) break;
- crv = lg_Attribute2SSecItem(arena,CKA_BASE,templ,count,
- &privKey->u.dh.base);
- if (crv != CKR_OK) break;
- crv = lg_PrivAttr2SSecItem(arena,CKA_VALUE,templ,count,
- &privKey->u.dh.privateValue, sdb);
- if (crv != CKR_OK) break;
- if (lg_hasAttribute(CKA_NETSCAPE_DB, templ, count)) {
- crv = lg_Attribute2SSecItem(arena, CKA_NETSCAPE_DB,templ,count,
- &privKey->u.dh.publicValue);
- /* privKey was zero'd so public value is already set to NULL, 0
- * if we don't set it explicitly */
- }
- break;
+ case CKK_RSA:
+ privKey->keyType = NSSLOWKEYRSAKey;
+ crv = lg_Attribute2SSecItem(arena, CKA_MODULUS, templ, count,
+ &privKey->u.rsa.modulus);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_Attribute2SSecItem(arena, CKA_PUBLIC_EXPONENT, templ, count,
+ &privKey->u.rsa.publicExponent);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_PRIVATE_EXPONENT, templ, count,
+ &privKey->u.rsa.privateExponent, sdb);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_PRIME_1, templ, count,
+ &privKey->u.rsa.prime1, sdb);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_PRIME_2, templ, count,
+ &privKey->u.rsa.prime2, sdb);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_EXPONENT_1, templ, count,
+ &privKey->u.rsa.exponent1, sdb);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_EXPONENT_2, templ, count,
+ &privKey->u.rsa.exponent2, sdb);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_COEFFICIENT, templ, count,
+ &privKey->u.rsa.coefficient, sdb);
+ if (crv != CKR_OK)
+ break;
+ rv = DER_SetUInteger(privKey->arena, &privKey->u.rsa.version,
+ NSSLOWKEY_VERSION);
+ if (rv != SECSuccess)
+ crv = CKR_HOST_MEMORY;
+ break;
+
+ case CKK_DSA:
+ privKey->keyType = NSSLOWKEYDSAKey;
+ crv = lg_Attribute2SSecItem(arena, CKA_PRIME, templ, count,
+ &privKey->u.dsa.params.prime);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_Attribute2SSecItem(arena, CKA_SUBPRIME, templ, count,
+ &privKey->u.dsa.params.subPrime);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_Attribute2SSecItem(arena, CKA_BASE, templ, count,
+ &privKey->u.dsa.params.base);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_VALUE, templ, count,
+ &privKey->u.dsa.privateValue, sdb);
+ if (crv != CKR_OK)
+ break;
+ if (lg_hasAttribute(CKA_NETSCAPE_DB, templ, count)) {
+ crv = lg_Attribute2SSecItem(arena, CKA_NETSCAPE_DB, templ, count,
+ &privKey->u.dsa.publicValue);
+ /* privKey was zero'd so public value is already set to NULL, 0
+ * if we don't set it explicitly */
+ }
+ break;
+
+ case CKK_DH:
+ privKey->keyType = NSSLOWKEYDHKey;
+ crv = lg_Attribute2SSecItem(arena, CKA_PRIME, templ, count,
+ &privKey->u.dh.prime);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_Attribute2SSecItem(arena, CKA_BASE, templ, count,
+ &privKey->u.dh.base);
+ if (crv != CKR_OK)
+ break;
+ crv = lg_PrivAttr2SSecItem(arena, CKA_VALUE, templ, count,
+ &privKey->u.dh.privateValue, sdb);
+ if (crv != CKR_OK)
+ break;
+ if (lg_hasAttribute(CKA_NETSCAPE_DB, templ, count)) {
+ crv = lg_Attribute2SSecItem(arena, CKA_NETSCAPE_DB, templ, count,
+ &privKey->u.dh.publicValue);
+ /* privKey was zero'd so public value is already set to NULL, 0
+ * if we don't set it explicitly */
+ }
+ break;
#ifndef NSS_DISABLE_ECC
- case CKK_EC:
- privKey->keyType = NSSLOWKEYECKey;
- crv = lg_Attribute2SSecItem(arena, CKA_EC_PARAMS,templ,count,
- &privKey->u.ec.ecParams.DEREncoding);
- if (crv != CKR_OK) break;
-
- /* Fill out the rest of the ecParams structure
- * based on the encoded params
- */
- if (LGEC_FillParams(arena, &privKey->u.ec.ecParams.DEREncoding,
- &privKey->u.ec.ecParams) != SECSuccess) {
- crv = CKR_DOMAIN_PARAMS_INVALID;
- break;
- }
- crv = lg_PrivAttr2SSecItem(arena,CKA_VALUE,templ,count,
- &privKey->u.ec.privateValue, sdb);
- if (crv != CKR_OK) break;
- if (lg_hasAttribute(CKA_NETSCAPE_DB,templ,count)) {
- crv = lg_Attribute2SSecItem(arena, CKA_NETSCAPE_DB,templ,count,
- &privKey->u.ec.publicValue);
- if (crv != CKR_OK) break;
- /* privKey was zero'd so public value is already set to NULL, 0
- * if we don't set it explicitly */
- }
- rv = DER_SetUInteger(privKey->arena, &privKey->u.ec.version,
- NSSLOWKEY_EC_PRIVATE_KEY_VERSION);
- if (rv != SECSuccess) crv = CKR_HOST_MEMORY;
- break;
+ case CKK_EC:
+ privKey->keyType = NSSLOWKEYECKey;
+ crv = lg_Attribute2SSecItem(arena, CKA_EC_PARAMS, templ, count,
+ &privKey->u.ec.ecParams.DEREncoding);
+ if (crv != CKR_OK)
+ break;
+
+ /* Fill out the rest of the ecParams structure
+ * based on the encoded params
+ */
+ if (LGEC_FillParams(arena, &privKey->u.ec.ecParams.DEREncoding,
+ &privKey->u.ec.ecParams) != SECSuccess) {
+ crv = CKR_DOMAIN_PARAMS_INVALID;
+ break;
+ }
+ crv = lg_PrivAttr2SSecItem(arena, CKA_VALUE, templ, count,
+ &privKey->u.ec.privateValue, sdb);
+ if (crv != CKR_OK)
+ break;
+ if (lg_hasAttribute(CKA_NETSCAPE_DB, templ, count)) {
+ crv = lg_Attribute2SSecItem(arena, CKA_NETSCAPE_DB, templ, count,
+ &privKey->u.ec.publicValue);
+ if (crv != CKR_OK)
+ break;
+ /* privKey was zero'd so public value is already set to NULL, 0
+ * if we don't set it explicitly */
+ }
+ rv = DER_SetUInteger(privKey->arena, &privKey->u.ec.version,
+ NSSLOWKEY_EC_PRIVATE_KEY_VERSION);
+ if (rv != SECSuccess)
+ crv = CKR_HOST_MEMORY;
+ break;
#endif /* NSS_DISABLE_ECC */
- default:
- crv = CKR_KEY_TYPE_INCONSISTENT;
- break;
+ default:
+ crv = CKR_KEY_TYPE_INCONSISTENT;
+ break;
}
*crvp = crv;
if (crv != CKR_OK) {
- PORT_FreeArena(arena,PR_FALSE);
- return NULL;
+ PORT_FreeArena(arena, PR_FALSE);
+ return NULL;
}
return privKey;
}
/*
- * check the consistancy and initialize a Private Key Object
+ * check the consistancy and initialize a Private Key Object
*/
static CK_RV
lg_createPrivateKeyObject(SDB *sdb, CK_KEY_TYPE key_type,
- CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
+ CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
{
NSSLOWKEYPrivateKey *privKey;
char *label;
@@ -657,53 +675,56 @@ lg_createPrivateKeyObject(SDB *sdb, CK_KEY_TYPE key_type,
NSSLOWKEYDBHandle *keyHandle = lg_getKeyDB(sdb);
if (keyHandle == NULL) {
- return CKR_TOKEN_WRITE_PROTECTED;
+ return CKR_TOKEN_WRITE_PROTECTED;
}
- privKey=lg_mkPrivKey(sdb, templ,count,key_type,&crv);
- if (privKey == NULL) return crv;
- label = lg_getString(CKA_LABEL,templ,count);
+ privKey = lg_mkPrivKey(sdb, templ, count, key_type, &crv);
+ if (privKey == NULL)
+ return crv;
+ label = lg_getString(CKA_LABEL, templ, count);
- crv = lg_Attribute2SSecItem(NULL,CKA_NETSCAPE_DB,templ,count,&pubKey);
+ crv = lg_Attribute2SSecItem(NULL, CKA_NETSCAPE_DB, templ, count, &pubKey);
if (crv != CKR_OK) {
- crv = CKR_TEMPLATE_INCOMPLETE;
- rv = SECFailure;
- goto fail;
+ crv = CKR_TEMPLATE_INCOMPLETE;
+ rv = SECFailure;
+ goto fail;
}
#ifdef notdef
if (keyHandle->version != 3) {
- unsigned char buf[SHA1_LENGTH];
- SHA1_HashBuf(buf,pubKey.data,pubKey.len);
- PORT_Memcpy(pubKey.data,buf,sizeof(buf));
- pubKey.len = sizeof(buf);
+ unsigned char buf[SHA1_LENGTH];
+ SHA1_HashBuf(buf, pubKey.data, pubKey.len);
+ PORT_Memcpy(pubKey.data, buf, sizeof(buf));
+ pubKey.len = sizeof(buf);
}
#endif
/* get the key type */
if (key_type == CKK_RSA) {
- rv = RSA_PrivateKeyCheck(&privKey->u.rsa);
- if (rv == SECFailure) {
- goto fail;
- }
+ rv = RSA_PrivateKeyCheck(&privKey->u.rsa);
+ if (rv == SECFailure) {
+ goto fail;
+ }
}
- rv = nsslowkey_StoreKeyByPublicKey(keyHandle, privKey, &pubKey,
- label, sdb /*->password*/);
+ rv = nsslowkey_StoreKeyByPublicKey(keyHandle, privKey, &pubKey,
+ label, sdb /*->password*/);
fail:
- if (label) PORT_Free(label);
- *handle = lg_mkHandle(sdb,&pubKey,LG_TOKEN_TYPE_PRIV);
- if (pubKey.data) PORT_Free(pubKey.data);
+ if (label)
+ PORT_Free(label);
+ *handle = lg_mkHandle(sdb, &pubKey, LG_TOKEN_TYPE_PRIV);
+ if (pubKey.data)
+ PORT_Free(pubKey.data);
lg_nsslowkey_DestroyPrivateKey(privKey);
- if (rv != SECSuccess) return crv;
+ if (rv != SECSuccess)
+ return crv;
return CKR_OK;
}
-
#define LG_KEY_MAX_RETRIES 10 /* don't hang if we are having problems with the rng */
-#define LG_KEY_ID_SIZE 18 /* don't use either SHA1 or MD5 sizes */
+#define LG_KEY_ID_SIZE 18 /* don't use either SHA1 or MD5 sizes */
/*
* Secret keys must have a CKA_ID value to be stored in the database. This code
- * will generate one if there wasn't one already.
+ * will generate one if there wasn't one already.
*/
static CK_RV
lg_GenerateSecretCKA_ID(NSSLOWKEYDBHandle *handle, SECItem *id, char *label)
@@ -714,43 +735,43 @@ lg_GenerateSecretCKA_ID(NSSLOWKEYDBHandle *handle, SECItem *id, char *label)
id->data = NULL;
if (label) {
- id->data = (unsigned char *)PORT_Strdup(label);
- if (id->data == NULL) {
- return CKR_HOST_MEMORY;
- }
- id->len = PORT_Strlen(label)+1;
- if (!nsslowkey_KeyForIDExists(handle,id)) {
- return CKR_OK;
- }
- PORT_Free(id->data);
- id->data = NULL;
- id->len = 0;
+ id->data = (unsigned char *)PORT_Strdup(label);
+ if (id->data == NULL) {
+ return CKR_HOST_MEMORY;
+ }
+ id->len = PORT_Strlen(label) + 1;
+ if (!nsslowkey_KeyForIDExists(handle, id)) {
+ return CKR_OK;
+ }
+ PORT_Free(id->data);
+ id->data = NULL;
+ id->len = 0;
}
id->data = (unsigned char *)PORT_Alloc(LG_KEY_ID_SIZE);
if (id->data == NULL) {
- return CKR_HOST_MEMORY;
+ return CKR_HOST_MEMORY;
}
id->len = LG_KEY_ID_SIZE;
retries = 0;
do {
- rv = RNG_GenerateGlobalRandomBytes(id->data,id->len);
- } while (rv == SECSuccess && nsslowkey_KeyForIDExists(handle,id) &&
- (++retries <= LG_KEY_MAX_RETRIES));
+ rv = RNG_GenerateGlobalRandomBytes(id->data, id->len);
+ } while (rv == SECSuccess && nsslowkey_KeyForIDExists(handle, id) &&
+ (++retries <= LG_KEY_MAX_RETRIES));
if ((rv != SECSuccess) || (retries > LG_KEY_MAX_RETRIES)) {
- crv = CKR_DEVICE_ERROR; /* random number generator is bad */
- PORT_Free(id->data);
- id->data = NULL;
- id->len = 0;
+ crv = CKR_DEVICE_ERROR; /* random number generator is bad */
+ PORT_Free(id->data);
+ id->data = NULL;
+ id->len = 0;
}
return crv;
}
-
-static NSSLOWKEYPrivateKey *lg_mkSecretKeyRep(const CK_ATTRIBUTE *templ,
- CK_ULONG count, CK_KEY_TYPE key_type,
- SECItem *pubkey, SDB *sdbpw)
+static NSSLOWKEYPrivateKey *
+lg_mkSecretKeyRep(const CK_ATTRIBUTE *templ,
+ CK_ULONG count, CK_KEY_TYPE key_type,
+ SECItem *pubkey, SDB *sdbpw)
{
NSSLOWKEYPrivateKey *privKey = 0;
PLArenaPool *arena = 0;
@@ -762,17 +783,23 @@ static NSSLOWKEYPrivateKey *lg_mkSecretKeyRep(const CK_ATTRIBUTE *templ,
static unsigned char derZero[1] = { 0 };
arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
- if (arena == NULL) { crv = CKR_HOST_MEMORY; goto loser; }
+ if (arena == NULL) {
+ crv = CKR_HOST_MEMORY;
+ goto loser;
+ }
privKey = (NSSLOWKEYPrivateKey *)
- PORT_ArenaZAlloc(arena,sizeof(NSSLOWKEYPrivateKey));
- if (privKey == NULL) { crv = CKR_HOST_MEMORY; goto loser; }
+ PORT_ArenaZAlloc(arena, sizeof(NSSLOWKEYPrivateKey));
+ if (privKey == NULL) {
+ crv = CKR_HOST_MEMORY;
+ goto loser;
+ }
privKey->arena = arena;
- /* Secret keys are represented in the database as "fake" RSA keys.
- * The RSA key is marked as a secret key representation by setting the
- * public exponent field to 0, which is an invalid RSA exponent.
+ /* Secret keys are represented in the database as "fake" RSA keys.
+ * The RSA key is marked as a secret key representation by setting the
+ * public exponent field to 0, which is an invalid RSA exponent.
* The other fields are set as follows:
* modulus - CKA_ID value for the secret key
* private exponent - CKA_VALUE (the key itself)
@@ -784,10 +811,10 @@ static NSSLOWKEYPrivateKey *lg_mkSecretKeyRep(const CK_ATTRIBUTE *templ,
/* The modulus is set to the key id of the symmetric key */
privKey->u.rsa.modulus.data =
- (unsigned char *) PORT_ArenaAlloc(arena, pubkey->len);
+ (unsigned char *)PORT_ArenaAlloc(arena, pubkey->len);
if (privKey->u.rsa.modulus.data == NULL) {
- crv = CKR_HOST_MEMORY;
- goto loser;
+ crv = CKR_HOST_MEMORY;
+ goto loser;
}
privKey->u.rsa.modulus.len = pubkey->len;
PORT_Memcpy(privKey->u.rsa.modulus.data, pubkey->data, pubkey->len);
@@ -798,8 +825,9 @@ static NSSLOWKEYPrivateKey *lg_mkSecretKeyRep(const CK_ATTRIBUTE *templ,
/* The private exponent is the actual key value */
crv = lg_PrivAttr2SecItem(arena, CKA_VALUE, templ, count,
- &privKey->u.rsa.privateExponent, sdbpw);
- if (crv != CKR_OK) goto loser;
+ &privKey->u.rsa.privateExponent, sdbpw);
+ if (crv != CKR_OK)
+ goto loser;
/* All other fields empty - needs testing */
privKey->u.rsa.prime1.len = sizeof derZero;
@@ -816,43 +844,47 @@ static NSSLOWKEYPrivateKey *lg_mkSecretKeyRep(const CK_ATTRIBUTE *templ,
/* Coeficient set to KEY_TYPE */
crv = lg_GetULongAttribute(CKA_KEY_TYPE, templ, count, &keyType);
- if (crv != CKR_OK) goto loser;
+ if (crv != CKR_OK)
+ goto loser;
/* on 64 bit platforms, we still want to store 32 bits of keyType (This is
* safe since the PKCS #11 defines for all types are 32 bits or less). */
- keyTypeStorage = (PRUint32) keyType;
+ keyTypeStorage = (PRUint32)keyType;
keyTypeStorage = PR_htonl(keyTypeStorage);
keyTypeItem.data = (unsigned char *)&keyTypeStorage;
- keyTypeItem.len = sizeof (keyTypeStorage);
+ keyTypeItem.len = sizeof(keyTypeStorage);
rv = SECITEM_CopyItem(arena, &privKey->u.rsa.coefficient, &keyTypeItem);
if (rv != SECSuccess) {
- crv = CKR_HOST_MEMORY;
- goto loser;
+ crv = CKR_HOST_MEMORY;
+ goto loser;
}
-
+
/* Private key version field set normally for compatibility */
- rv = DER_SetUInteger(privKey->arena,
- &privKey->u.rsa.version, NSSLOWKEY_VERSION);
- if (rv != SECSuccess) { crv = CKR_HOST_MEMORY; goto loser; }
+ rv = DER_SetUInteger(privKey->arena,
+ &privKey->u.rsa.version, NSSLOWKEY_VERSION);
+ if (rv != SECSuccess) {
+ crv = CKR_HOST_MEMORY;
+ goto loser;
+ }
loser:
if (crv != CKR_OK) {
- PORT_FreeArena(arena,PR_FALSE);
- privKey = 0;
+ PORT_FreeArena(arena, PR_FALSE);
+ privKey = 0;
}
return privKey;
}
/*
- * check the consistancy and initialize a Secret Key Object
+ * check the consistancy and initialize a Secret Key Object
*/
static CK_RV
lg_createSecretKeyObject(SDB *sdb, CK_KEY_TYPE key_type,
- CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
+ CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
{
CK_RV crv;
- NSSLOWKEYPrivateKey *privKey = NULL;
- NSSLOWKEYDBHandle *keyHandle = NULL;
+ NSSLOWKEYPrivateKey *privKey = NULL;
+ NSSLOWKEYDBHandle *keyHandle = NULL;
SECItem pubKey;
char *label = NULL;
SECStatus rv = SECSuccess;
@@ -863,54 +895,59 @@ lg_createSecretKeyObject(SDB *sdb, CK_KEY_TYPE key_type,
keyHandle = lg_getKeyDB(sdb);
if (keyHandle == NULL) {
- return CKR_TOKEN_WRITE_PROTECTED;
+ return CKR_TOKEN_WRITE_PROTECTED;
}
- label = lg_getString(CKA_LABEL,templ,count);
+ label = lg_getString(CKA_LABEL, templ, count);
- crv = lg_Attribute2SecItem(NULL,CKA_ID,templ,count,&pubKey);
- /* Should this be ID? */
- if (crv != CKR_OK) goto loser;
+ crv = lg_Attribute2SecItem(NULL, CKA_ID, templ, count, &pubKey);
+ /* Should this be ID? */
+ if (crv != CKR_OK)
+ goto loser;
/* if we don't have an ID, generate one */
if (pubKey.len == 0) {
- if (pubKey.data) {
- PORT_Free(pubKey.data);
- pubKey.data = NULL;
- }
- crv = lg_GenerateSecretCKA_ID(keyHandle, &pubKey, label);
- if (crv != CKR_OK) goto loser;
+ if (pubKey.data) {
+ PORT_Free(pubKey.data);
+ pubKey.data = NULL;
+ }
+ crv = lg_GenerateSecretCKA_ID(keyHandle, &pubKey, label);
+ if (crv != CKR_OK)
+ goto loser;
}
privKey = lg_mkSecretKeyRep(templ, count, key_type, &pubKey, sdb);
if (privKey == NULL) {
- crv = CKR_HOST_MEMORY;
- goto loser;
+ crv = CKR_HOST_MEMORY;
+ goto loser;
}
rv = nsslowkey_StoreKeyByPublicKey(keyHandle,
- privKey, &pubKey, label, sdb /*->password*/);
+ privKey, &pubKey, label, sdb /*->password*/);
if (rv != SECSuccess) {
- crv = CKR_DEVICE_ERROR;
- goto loser;
+ crv = CKR_DEVICE_ERROR;
+ goto loser;
}
*handle = lg_mkHandle(sdb, &pubKey, LG_TOKEN_TYPE_KEY);
loser:
- if (label) PORT_Free(label);
- if (privKey) lg_nsslowkey_DestroyPrivateKey(privKey);
- if (pubKey.data) PORT_Free(pubKey.data);
+ if (label)
+ PORT_Free(label);
+ if (privKey)
+ lg_nsslowkey_DestroyPrivateKey(privKey);
+ if (pubKey.data)
+ PORT_Free(pubKey.data);
return crv;
}
/*
- * check the consistancy and initialize a Key Object
+ * check the consistancy and initialize a Key Object
*/
static CK_RV
-lg_createKeyObject(SDB *sdb, CK_OBJECT_CLASS objclass,
- CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
+lg_createKeyObject(SDB *sdb, CK_OBJECT_CLASS objclass,
+ CK_OBJECT_HANDLE *handle, const CK_ATTRIBUTE *templ, CK_ULONG count)
{
CK_RV crv;
CK_KEY_TYPE key_type;
@@ -918,29 +955,29 @@ lg_createKeyObject(SDB *sdb, CK_OBJECT_CLASS objclass,
/* get the key type */
crv = lg_GetULongAttribute(CKA_KEY_TYPE, templ, count, &key_type);
if (crv != CKR_OK) {
- return crv;
+ return crv;
}
switch (objclass) {
- case CKO_PUBLIC_KEY:
- return lg_createPublicKeyObject(sdb,key_type,handle,templ,count);
- case CKO_PRIVATE_KEY:
- return lg_createPrivateKeyObject(sdb,key_type,handle,templ,count);
- case CKO_SECRET_KEY:
- return lg_createSecretKeyObject(sdb,key_type,handle,templ,count);
- default:
- break;
+ case CKO_PUBLIC_KEY:
+ return lg_createPublicKeyObject(sdb, key_type, handle, templ, count);
+ case CKO_PRIVATE_KEY:
+ return lg_createPrivateKeyObject(sdb, key_type, handle, templ, count);
+ case CKO_SECRET_KEY:
+ return lg_createSecretKeyObject(sdb, key_type, handle, templ, count);
+ default:
+ break;
}
return CKR_ATTRIBUTE_VALUE_INVALID;
}
-/*
+/*
* Parse the template and create an object stored in the DB that reflects.
* the object specified in the database.
*/
CK_RV
lg_CreateObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
- const CK_ATTRIBUTE *templ, CK_ULONG count)
+ const CK_ATTRIBUTE *templ, CK_ULONG count)
{
CK_RV crv;
CK_OBJECT_CLASS objclass;
@@ -948,34 +985,33 @@ lg_CreateObject(SDB *sdb, CK_OBJECT_HANDLE *handle,
/* get the object class */
crv = lg_GetULongAttribute(CKA_CLASS, templ, count, &objclass);
if (crv != CKR_OK) {
- return crv;
+ return crv;
}
- /* Now handle the specific object class.
+ /* Now handle the specific object class.
*/
switch (objclass) {
- case CKO_CERTIFICATE:
- crv = lg_createCertObject(sdb,handle,templ,count);
- break;
- case CKO_NSS_TRUST:
- crv = lg_createTrustObject(sdb,handle,templ,count);
- break;
- case CKO_NSS_CRL:
- crv = lg_createCrlObject(sdb,handle,templ,count);
- break;
- case CKO_NSS_SMIME:
- crv = lg_createSMimeObject(sdb,handle,templ,count);
- break;
- case CKO_PRIVATE_KEY:
- case CKO_PUBLIC_KEY:
- case CKO_SECRET_KEY:
- crv = lg_createKeyObject(sdb,objclass,handle,templ,count);
- break;
- default:
- crv = CKR_ATTRIBUTE_VALUE_INVALID;
- break;
+ case CKO_CERTIFICATE:
+ crv = lg_createCertObject(sdb, handle, templ, count);
+ break;
+ case CKO_NSS_TRUST:
+ crv = lg_createTrustObject(sdb, handle, templ, count);
+ break;
+ case CKO_NSS_CRL:
+ crv = lg_createCrlObject(sdb, handle, templ, count);
+ break;
+ case CKO_NSS_SMIME:
+ crv = lg_createSMimeObject(sdb, handle, templ, count);
+ break;
+ case CKO_PRIVATE_KEY:
+ case CKO_PUBLIC_KEY:
+ case CKO_SECRET_KEY:
+ crv = lg_createKeyObject(sdb, objclass, handle, templ, count);
+ break;
+ default:
+ crv = CKR_ATTRIBUTE_VALUE_INVALID;
+ break;
}
return crv;
}
-