Skip to content

Commit

Permalink
Bug 1603628 Update NSS to handle PKCS #11 v3.0 r=daiki r=mhoye
Browse files Browse the repository at this point in the history
https://phabricator.services.mozilla.com/D63241

This patch implements the first phase: updating the headers.

lib/util/pkcs11.h
lib/util/pkcs11f.h
lib/util/pkcs11t.h

Were updated using the released OASIS PKCS #11 v3.0 header files.
lib/util/pkcs11n.h was updated to finally deprecate all uses of CK?_NETSCAPE_?.

A new define as added: NSS_PKCS11_2_0_COMPAT. If it's defined, the small
semantic changes (including the removal of deprecated defines) between the
NSS PKCS #11 v2 header file and the new PKCS #11 v3 are reverted in favor of
the PKCS #11 v2 definitions. This include the removal of CK?_NETSCAPE_? in
favor of CK?_NSS_?.

One notable change was caused by an inconsistancy between the spec and the
released headers in PKCS #11 v2.40. CK_GCM_PARAMS had an extra field in
the header that was not in the spec. OASIS considers the header file to be
normative, so PKCS #11 v3.0 resolved the issue in favor of the header file
definition. NSS had the spec definition, so now there are 2 defines for this
structure:

CK_NSS_GCM_PARAMS - the old nss define. Still used internally in freebl.
CK_GCM_PARAMS_V3 - the new define.
CK_GCM_PARAMS - no longer referenced in NSS itself. It's defined as
CK_GCM_PARAMS_V3 if NSS_PKCS11_2_0_COMPAT is *not* defined, and it's defined as
CKM_NSS_GCM_PARAMS if NSS_PKCS11_2_0_COMPAT is defined.

Softoken has been updated to accept either CK_NSS_GCM_PARAMS or
CK_GCM_PARAMS_V3. In a future patch NSS will be updated to use
CK_GCM_PARAMS_V3 and fall back to CK_NSS_GMC_PARAMS.

One other semantic difference between the 3.0 version of pkcs11f.h and the
version here: In the oasis version of the header, you must define
CK_PKCS11_2_0_ONLY to get just the PKCS #11 v2 defines. In our version you
must define CK_PKCS11_3 to get the PCKS #11 v3 defines.

Most of this patch is to handle changing the deprecated defines that have been
removed in PCKS #11 v3 from NSS.

Differential Revision: https://phabricator.services.mozilla.com/D63241
  • Loading branch information
rjrelyea committed Feb 18, 2020
1 parent 2165ef8 commit ba93119
Show file tree
Hide file tree
Showing 54 changed files with 1,993 additions and 979 deletions.
2 changes: 1 addition & 1 deletion cmd/bltest/blapitest.c
Expand Up @@ -1481,7 +1481,7 @@ bltest_aes_init(bltestCipherInfo *cipherInfo, PRBool encrypt)
unsigned char *params;
int len;
CK_AES_CTR_PARAMS ctrParams;
CK_GCM_PARAMS gcmParams;
CK_NSS_GCM_PARAMS gcmParams;

params = aesp->iv.buf.data;
switch (cipherInfo->mode) {
Expand Down
2 changes: 1 addition & 1 deletion cmd/fipstest/fipstest.c
Expand Up @@ -1027,7 +1027,7 @@ aes_gcm(char *reqfn, int encrypt)
unsigned int tagbits;
unsigned int taglen = 0;
unsigned int ivlen;
CK_GCM_PARAMS params;
CK_NSS_GCM_PARAMS params;
SECStatus rv;

aesreq = fopen(reqfn, "r");
Expand Down
28 changes: 13 additions & 15 deletions cmd/lib/pk11table.c
Expand Up @@ -102,7 +102,7 @@ const Constant _consts[] = {
mkEntry(CKF_WRAP, MechanismFlags),
mkEntry(CKF_UNWRAP, MechanismFlags),
mkEntry(CKF_DERIVE, MechanismFlags),
mkEntry(CKF_EC_FP, MechanismFlags),
mkEntry(CKF_EC_F_P, MechanismFlags),
mkEntry(CKF_EC_F_2M, MechanismFlags),
mkEntry(CKF_EC_ECPARAMETERS, MechanismFlags),
mkEntry(CKF_EC_NAMEDCURVE, MechanismFlags),
Expand All @@ -128,7 +128,6 @@ const Constant _consts[] = {
mkEntry(CKO_SECRET_KEY, Object),
mkEntry(CKO_HW_FEATURE, Object),
mkEntry(CKO_DOMAIN_PARAMETERS, Object),
mkEntry(CKO_KG_PARAMETERS, Object),
mkEntry(CKO_NSS_CRL, Object),
mkEntry(CKO_NSS_SMIME, Object),
mkEntry(CKO_NSS_TRUST, Object),
Expand Down Expand Up @@ -255,8 +254,8 @@ const Constant _consts[] = {
mkEntry2(CKA_TRUST_TIME_STAMPING, Attribute, Trust),
mkEntry2(CKA_CERT_SHA1_HASH, Attribute, None),
mkEntry2(CKA_CERT_MD5_HASH, Attribute, None),
mkEntry2(CKA_NETSCAPE_DB, Attribute, None),
mkEntry2(CKA_NETSCAPE_TRUST, Attribute, Trust),
mkEntry2(CKA_NSS_DB, Attribute, None),
mkEntry2(CKA_NSS_TRUST, Attribute, Trust),

mkEntry(CKM_RSA_PKCS, Mechanism),
mkEntry(CKM_RSA_9796, Mechanism),
Expand Down Expand Up @@ -473,16 +472,16 @@ const Constant _consts[] = {
mkEntry(CKM_DH_PKCS_PARAMETER_GEN, Mechanism),
mkEntry(CKM_NSS_AES_KEY_WRAP, Mechanism),
mkEntry(CKM_NSS_AES_KEY_WRAP_PAD, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_DES_CBC, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_SHA1_HMAC_KEY_GEN, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_MD5_HMAC_KEY_GEN, Mechanism),
mkEntry(CKM_NETSCAPE_PBE_MD2_HMAC_KEY_GEN, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_DES_CBC, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_40_BIT_RC4, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_128_BIT_RC4, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC, Mechanism),
mkEntry(CKM_NSS_PBE_SHA1_HMAC_KEY_GEN, Mechanism),
mkEntry(CKM_NSS_PBE_MD5_HMAC_KEY_GEN, Mechanism),
mkEntry(CKM_NSS_PBE_MD2_HMAC_KEY_GEN, Mechanism),
mkEntry(CKM_TLS_PRF_GENERAL, Mechanism),
mkEntry(CKM_NSS_TLS_PRF_GENERAL_SHA256, Mechanism),

Expand Down Expand Up @@ -520,7 +519,6 @@ const Constant _consts[] = {
mkEntry(CKR_KEY_FUNCTION_NOT_PERMITTED, Result),
mkEntry(CKR_KEY_NOT_WRAPPABLE, Result),
mkEntry(CKR_KEY_UNEXTRACTABLE, Result),
mkEntry(CKR_KEY_PARAMS_INVALID, Result),
mkEntry(CKR_MECHANISM_INVALID, Result),
mkEntry(CKR_MECHANISM_PARAM_INVALID, Result),
mkEntry(CKR_OBJECT_HANDLE_INVALID, Result),
Expand Down
4 changes: 2 additions & 2 deletions cmd/pk11gcmtest/pk11gcmtest.c
Expand Up @@ -45,7 +45,7 @@ aes_encrypt_buf(
SECItem key_item;
PK11SlotInfo *slot = NULL;
PK11SymKey *symKey = NULL;
CK_GCM_PARAMS gcm_params;
CK_NSS_GCM_PARAMS gcm_params;
SECItem param;

/* Import key into NSS. */
Expand Down Expand Up @@ -102,7 +102,7 @@ aes_decrypt_buf(
SECItem key_item;
PK11SlotInfo *slot = NULL;
PK11SymKey *symKey = NULL;
CK_GCM_PARAMS gcm_params;
CK_NSS_GCM_PARAMS gcm_params;
SECItem param;

if (inputlen + tagsize > sizeof(concatenated)) {
Expand Down
4 changes: 2 additions & 2 deletions cmd/shlibsign/shlibsign.c
Expand Up @@ -483,8 +483,8 @@ static const tuple_str errStrings[] = {
{ CKR_MUTEX_NOT_LOCKED, "CKR_MUTEX_NOT_LOCKED " },
{ CKR_FUNCTION_REJECTED, "CKR_FUNCTION_REJECTED " },
{ CKR_VENDOR_DEFINED, "CKR_VENDOR_DEFINED " },
{ 0xCE534351, "CKR_NETSCAPE_CERTDB_FAILED " },
{ 0xCE534352, "CKR_NETSCAPE_KEYDB_FAILED " }
{ 0xCE534351, "CKR_NSS_CERTDB_FAILED " },
{ 0xCE534352, "CKR_NSS_KEYDB_FAILED " }

};

Expand Down
4 changes: 2 additions & 2 deletions gtests/pk11_gtest/pk11_aes_gcm_unittest.cc
Expand Up @@ -35,7 +35,7 @@ class Pkcs11AesGcmTest : public ::testing::TestWithParam<AesGcmKatValue> {
}

// Prepare AEAD params.
CK_GCM_PARAMS gcm_params;
CK_NSS_GCM_PARAMS gcm_params;
gcm_params.pIv = iv.data();
gcm_params.ulIvLen = iv.size();
gcm_params.pAAD = aad.data();
Expand Down Expand Up @@ -124,7 +124,7 @@ class Pkcs11AesGcmTest : public ::testing::TestWithParam<AesGcmKatValue> {
std::vector<uint8_t> aad(0);

// Prepare AEAD params.
CK_GCM_PARAMS gcm_params;
CK_NSS_GCM_PARAMS gcm_params;
gcm_params.pIv = iv.data();
gcm_params.ulIvLen = iv.size();
gcm_params.pAAD = aad.data();
Expand Down
18 changes: 9 additions & 9 deletions gtests/pk11_gtest/pk11_cbc_unittest.cc
Expand Up @@ -256,8 +256,8 @@ TEST_F(Pkcs11CbcPadTest, FailEncryptShortParam) {
unsigned int encrypted_len = 0;
size_t input_len = AES_BLOCK_SIZE;

// CK_GCM_PARAMS is the largest param struct used across AES modes
uint8_t param_buf[sizeof(CK_GCM_PARAMS)];
// CK_NSS_GCM_PARAMS is the largest param struct used across AES modes
uint8_t param_buf[sizeof(CK_NSS_GCM_PARAMS)];
SECItem param = {siBuffer, param_buf, sizeof(param_buf)};
SECItem key_item = {siBuffer, const_cast<uint8_t*>(kKeyData), 16};

Expand All @@ -281,18 +281,18 @@ TEST_F(Pkcs11CbcPadTest, FailEncryptShortParam) {
sizeof(encrypted), kInput, input_len);
EXPECT_EQ(SECSuccess, rv);

// GCM should have a CK_GCM_PARAMS
param.len = sizeof(CK_GCM_PARAMS) - 1;
// GCM should have a CK_NSS_GCM_PARAMS
param.len = sizeof(CK_NSS_GCM_PARAMS) - 1;
rv = PK11_Encrypt(key.get(), CKM_AES_GCM, &param, encrypted, &encrypted_len,
sizeof(encrypted), kInput, input_len);
EXPECT_EQ(SECFailure, rv);

param.len++;
reinterpret_cast<CK_GCM_PARAMS*>(param.data)->pIv = param_buf;
reinterpret_cast<CK_GCM_PARAMS*>(param.data)->ulIvLen = 12;
reinterpret_cast<CK_GCM_PARAMS*>(param.data)->pAAD = nullptr;
reinterpret_cast<CK_GCM_PARAMS*>(param.data)->ulAADLen = 0;
reinterpret_cast<CK_GCM_PARAMS*>(param.data)->ulTagBits = 128;
reinterpret_cast<CK_NSS_GCM_PARAMS*>(param.data)->pIv = param_buf;
reinterpret_cast<CK_NSS_GCM_PARAMS*>(param.data)->ulIvLen = 12;
reinterpret_cast<CK_NSS_GCM_PARAMS*>(param.data)->pAAD = nullptr;
reinterpret_cast<CK_NSS_GCM_PARAMS*>(param.data)->ulAADLen = 0;
reinterpret_cast<CK_NSS_GCM_PARAMS*>(param.data)->ulTagBits = 128;
rv = PK11_Encrypt(key.get(), CKM_AES_GCM, &param, encrypted, &encrypted_len,
sizeof(encrypted), kInput, input_len);
EXPECT_EQ(SECSuccess, rv);
Expand Down
2 changes: 1 addition & 1 deletion lib/certdb/crl.c
Expand Up @@ -1405,7 +1405,7 @@ TokenCRLStillExists(CERTSignedCrl* crl)
if (SECITEM_CompareItem(oldSubject, &subject) != SECEqual) {
xstatus = PR_FALSE;
}
if (CKO_NETSCAPE_CRL != crl_class) {
if (CKO_NSS_CRL != crl_class) {
xstatus = PR_FALSE;
}
} else {
Expand Down
18 changes: 9 additions & 9 deletions lib/ckfw/dbm/db.c
Expand Up @@ -392,19 +392,19 @@ nss_dbm_db_swap_type(
return type_byte;
case CKA_MODIFIABLE:
return type_byte;
case CKA_NETSCAPE_URL:
case CKA_NSS_URL:
return type_opaque;
case CKA_NETSCAPE_EMAIL:
case CKA_NSS_EMAIL:
return type_opaque;
case CKA_NETSCAPE_SMIME_INFO:
case CKA_NSS_SMIME_INFO:
return type_opaque;
case CKA_NETSCAPE_SMIME_TIMESTAMP:
case CKA_NSS_SMIME_TIMESTAMP:
return type_opaque;
case CKA_NETSCAPE_PKCS8_SALT:
case CKA_NSS_PKCS8_SALT:
return type_opaque;
case CKA_NETSCAPE_PASSWORD_CHECK:
case CKA_NSS_PASSWORD_CHECK:
return type_opaque;
case CKA_NETSCAPE_EXPIRES:
case CKA_NSS_EXPIRES:
return type_opaque;
case CKA_TRUST_DIGITAL_SIGNATURE:
return type_long;
Expand Down Expand Up @@ -436,9 +436,9 @@ nss_dbm_db_swap_type(
return type_long;
case CKA_TRUST_TIME_STAMPING:
return type_long;
case CKA_NETSCAPE_DB:
case CKA_NSS_DB:
return type_opaque;
case CKA_NETSCAPE_TRUST:
case CKA_NSS_TRUST:
return type_opaque;
default:
return type_opaque;
Expand Down
10 changes: 5 additions & 5 deletions lib/dev/devslot.c
Expand Up @@ -189,11 +189,11 @@ nssSlot_IsTokenPresent(
if (session) {
nssSession_EnterMonitor(session);
/* token is not present */
if (session->handle != CK_INVALID_SESSION) {
if (session->handle != CK_INVALID_HANDLE) {
/* session is valid, close and invalidate it */
CKAPI(epv)
->C_CloseSession(session->handle);
session->handle = CK_INVALID_SESSION;
session->handle = CK_INVALID_HANDLE;
}
nssSession_ExitMonitor(session);
}
Expand All @@ -215,17 +215,17 @@ nssSlot_IsTokenPresent(
if (session) {
PRBool tokenRemoved;
nssSession_EnterMonitor(session);
if (session->handle != CK_INVALID_SESSION) {
if (session->handle != CK_INVALID_HANDLE) {
CK_SESSION_INFO sessionInfo;
ckrv = CKAPI(epv)->C_GetSessionInfo(session->handle, &sessionInfo);
if (ckrv != CKR_OK) {
/* session is screwy, close and invalidate it */
CKAPI(epv)
->C_CloseSession(session->handle);
session->handle = CK_INVALID_SESSION;
session->handle = CK_INVALID_HANDLE;
}
}
tokenRemoved = (session->handle == CK_INVALID_SESSION);
tokenRemoved = (session->handle == CK_INVALID_HANDLE);
nssSession_ExitMonitor(session);
/* token not removed, finished */
if (!tokenRemoved) {
Expand Down
16 changes: 8 additions & 8 deletions lib/dev/devtoken.c
Expand Up @@ -260,7 +260,7 @@ find_objects(
nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
ckrv = CKR_SESSION_HANDLE_INVALID;
goto loser;
}
Expand Down Expand Up @@ -1124,7 +1124,7 @@ nssToken_FindTrustForCertificate(
nssCryptokiObject *object = NULL, **objects;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return object;
}
Expand Down Expand Up @@ -1206,7 +1206,7 @@ nssToken_FindCRLsBySubject(
nssSession *session = sessionOpt ? sessionOpt : token->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return objects;
}
Expand Down Expand Up @@ -1262,7 +1262,7 @@ nssToken_Digest(
nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return rvItem;
}
Expand Down Expand Up @@ -1328,7 +1328,7 @@ nssToken_BeginDigest(
nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return PR_FAILURE;
}
Expand All @@ -1350,7 +1350,7 @@ nssToken_ContinueDigest(
nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return PR_FAILURE;
}
Expand Down Expand Up @@ -1378,7 +1378,7 @@ nssToken_FinishDigest(
nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return NULL;
}
Expand Down Expand Up @@ -1457,7 +1457,7 @@ nssToken_TraverseCertificates(
nssSession *session = (sessionOpt) ? sessionOpt : token->defaultSession;

/* Don't ask the module to use an invalid session handle. */
if (!session || session->handle == CK_INVALID_SESSION) {
if (!session || session->handle == CK_INVALID_HANDLE) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
return PR_FAILURE;
}
Expand Down
22 changes: 11 additions & 11 deletions lib/dev/devutil.c
Expand Up @@ -284,10 +284,10 @@ nssTokenObjectCache_HaveObjectClass(
case CKO_CERTIFICATE:
haveIt = cache->doObjectType[cachedCerts];
break;
case CKO_NETSCAPE_TRUST:
case CKO_NSS_TRUST:
haveIt = cache->doObjectType[cachedTrust];
break;
case CKO_NETSCAPE_CRL:
case CKO_NSS_CRL:
haveIt = cache->doObjectType[cachedCRLs];
break;
default:
Expand Down Expand Up @@ -472,7 +472,7 @@ create_cert(
CKA_ISSUER,
CKA_SERIAL_NUMBER,
CKA_SUBJECT,
CKA_NETSCAPE_EMAIL
CKA_NSS_EMAIL
};
static const PRUint32 numCertAttr = sizeof(certAttr) / sizeof(certAttr[0]);
return create_object(object, certAttr, numCertAttr, status);
Expand Down Expand Up @@ -511,8 +511,8 @@ create_crl(
CKA_LABEL,
CKA_VALUE,
CKA_SUBJECT,
CKA_NETSCAPE_KRL,
CKA_NETSCAPE_URL
CKA_NSS_KRL,
CKA_NSS_URL
};
static const PRUint32 numCRLAttr = sizeof(crlAttr) / sizeof(crlAttr[0]);
return create_object(object, crlAttr, numCRLAttr, status);
Expand Down Expand Up @@ -716,10 +716,10 @@ nssTokenObjectCache_FindObjectsByTemplate(
case CKO_CERTIFICATE:
objectType = cachedCerts;
break;
case CKO_NETSCAPE_TRUST:
case CKO_NSS_TRUST:
objectType = cachedTrust;
break;
case CKO_NETSCAPE_CRL:
case CKO_NSS_CRL:
objectType = cachedCRLs;
break;
default:
Expand Down Expand Up @@ -784,10 +784,10 @@ nssTokenObjectCache_GetObjectAttributes(
case CKO_CERTIFICATE:
objectType = cachedCerts;
break;
case CKO_NETSCAPE_TRUST:
case CKO_NSS_TRUST:
objectType = cachedTrust;
break;
case CKO_NETSCAPE_CRL:
case CKO_NSS_CRL:
objectType = cachedCRLs;
break;
default:
Expand Down Expand Up @@ -877,10 +877,10 @@ nssTokenObjectCache_ImportObject(
case CKO_CERTIFICATE:
objectType = cachedCerts;
break;
case CKO_NETSCAPE_TRUST:
case CKO_NSS_TRUST:
objectType = cachedTrust;
break;
case CKO_NETSCAPE_CRL:
case CKO_NSS_CRL:
objectType = cachedCRLs;
break;
default:
Expand Down

0 comments on commit ba93119

Please sign in to comment.