mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-24 09:27:31 +09:00
Update NSS to 3.41
This commit is contained in:
parent
d5f6e64f43
commit
5f0986e66f
540 changed files with 49568 additions and 10631 deletions
|
|
@ -13,7 +13,7 @@
|
|||
#include "pkcs11t.h"
|
||||
#include "pk11func.h"
|
||||
#include "cert.h"
|
||||
#include "key.h"
|
||||
#include "keyhi.h"
|
||||
#include "keyi.h"
|
||||
#include "secitem.h"
|
||||
#include "secasn1.h"
|
||||
|
|
@ -804,30 +804,12 @@ PK11_MakePrivKey(PK11SlotInfo *slot, KeyType keyType,
|
|||
/* don't know? look it up */
|
||||
if (keyType == nullKey) {
|
||||
CK_KEY_TYPE pk11Type = CKK_RSA;
|
||||
SECItem info;
|
||||
|
||||
pk11Type = PK11_ReadULongAttribute(slot, privID, CKA_KEY_TYPE);
|
||||
isTemp = (PRBool)!PK11_HasAttributeSet(slot, privID, CKA_TOKEN, PR_FALSE);
|
||||
switch (pk11Type) {
|
||||
case CKK_RSA:
|
||||
keyType = rsaKey;
|
||||
/* determine RSA key type from the CKA_PUBLIC_KEY_INFO if present */
|
||||
rv = PK11_ReadAttribute(slot, privID, CKA_PUBLIC_KEY_INFO, NULL, &info);
|
||||
if (rv == SECSuccess) {
|
||||
CERTSubjectPublicKeyInfo *spki;
|
||||
|
||||
spki = SECKEY_DecodeDERSubjectPublicKeyInfo(&info);
|
||||
if (spki) {
|
||||
SECOidTag tag;
|
||||
|
||||
tag = SECOID_GetAlgorithmTag(&spki->algorithm);
|
||||
if (tag == SEC_OID_PKCS1_RSA_PSS_SIGNATURE)
|
||||
keyType = rsaPssKey;
|
||||
SECKEY_DestroySubjectPublicKeyInfo(spki);
|
||||
}
|
||||
SECITEM_FreeItem(&info, PR_FALSE);
|
||||
}
|
||||
|
||||
break;
|
||||
case CKK_DSA:
|
||||
keyType = dsaKey;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
#include "cert.h"
|
||||
#include "certi.h"
|
||||
#include "secitem.h"
|
||||
#include "key.h"
|
||||
#include "keyhi.h"
|
||||
#include "secoid.h"
|
||||
#include "pkcs7t.h"
|
||||
#include "cmsreclist.h"
|
||||
|
|
@ -741,7 +741,7 @@ find_certs_from_nickname(const char *nickname, void *wincx)
|
|||
char *delimit = NULL;
|
||||
char *tokenName;
|
||||
|
||||
if (!strncmp(nickname, "pkcs11:", strlen("pkcs11:"))) {
|
||||
if (!PORT_Strncasecmp(nickname, "pkcs11:", strlen("pkcs11:"))) {
|
||||
certs = find_certs_from_uri(nickname, wincx);
|
||||
if (certs)
|
||||
return certs;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
#include "pkcs11.h"
|
||||
#include "pk11func.h"
|
||||
#include "secitem.h"
|
||||
#include "key.h"
|
||||
#include "keyhi.h"
|
||||
#include "secasn1.h"
|
||||
#include "sechash.h"
|
||||
#include "cert.h"
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
#include "pkcs11.h"
|
||||
#include "pkcs11t.h"
|
||||
#include "pk11func.h"
|
||||
#include "key.h"
|
||||
#include "keyhi.h"
|
||||
#include "secitem.h"
|
||||
#include "secerr.h"
|
||||
#include "sslerr.h"
|
||||
|
|
|
|||
|
|
@ -109,6 +109,7 @@ secmod_NewModule(void)
|
|||
*other flags are set */
|
||||
#define SECMOD_FLAG_MODULE_DB_SKIP_FIRST 0x02
|
||||
#define SECMOD_FLAG_MODULE_DB_DEFAULT_MODDB 0x04
|
||||
#define SECMOD_FLAG_MODULE_DB_POLICY_ONLY 0x08
|
||||
|
||||
/* private flags for internal (field in SECMODModule). */
|
||||
/* The meaing of these flags is as follows:
|
||||
|
|
@ -193,7 +194,7 @@ typedef struct {
|
|||
* This table should be merged with the SECOID table.
|
||||
*/
|
||||
#define CIPHER_NAME(x) x, (sizeof(x) - 1)
|
||||
static const oidValDef algOptList[] = {
|
||||
static const oidValDef curveOptList[] = {
|
||||
/* Curves */
|
||||
{ CIPHER_NAME("PRIME192V1"), SEC_OID_ANSIX962_EC_PRIME192V1,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
|
|
@ -315,7 +316,9 @@ static const oidValDef algOptList[] = {
|
|||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
{ CIPHER_NAME("SECT571R1"), SEC_OID_SECG_EC_SECT571R1,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
};
|
||||
|
||||
static const oidValDef hashOptList[] = {
|
||||
/* Hashes */
|
||||
{ CIPHER_NAME("MD2"), SEC_OID_MD2,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
|
|
@ -333,7 +336,9 @@ static const oidValDef algOptList[] = {
|
|||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
{ CIPHER_NAME("SHA512"), SEC_OID_SHA512,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
};
|
||||
|
||||
static const oidValDef macOptList[] = {
|
||||
/* MACs */
|
||||
{ CIPHER_NAME("HMAC-SHA1"), SEC_OID_HMAC_SHA1, NSS_USE_ALG_IN_SSL },
|
||||
{ CIPHER_NAME("HMAC-SHA224"), SEC_OID_HMAC_SHA224, NSS_USE_ALG_IN_SSL },
|
||||
|
|
@ -341,7 +346,9 @@ static const oidValDef algOptList[] = {
|
|||
{ CIPHER_NAME("HMAC-SHA384"), SEC_OID_HMAC_SHA384, NSS_USE_ALG_IN_SSL },
|
||||
{ CIPHER_NAME("HMAC-SHA512"), SEC_OID_HMAC_SHA512, NSS_USE_ALG_IN_SSL },
|
||||
{ CIPHER_NAME("HMAC-MD5"), SEC_OID_HMAC_MD5, NSS_USE_ALG_IN_SSL },
|
||||
};
|
||||
|
||||
static const oidValDef cipherOptList[] = {
|
||||
/* Ciphers */
|
||||
{ CIPHER_NAME("AES128-CBC"), SEC_OID_AES_128_CBC, NSS_USE_ALG_IN_SSL },
|
||||
{ CIPHER_NAME("AES192-CBC"), SEC_OID_AES_192_CBC, NSS_USE_ALG_IN_SSL },
|
||||
|
|
@ -361,7 +368,9 @@ static const oidValDef algOptList[] = {
|
|||
{ CIPHER_NAME("RC2"), SEC_OID_RC2_CBC, NSS_USE_ALG_IN_SSL },
|
||||
{ CIPHER_NAME("RC4"), SEC_OID_RC4, NSS_USE_ALG_IN_SSL },
|
||||
{ CIPHER_NAME("IDEA"), SEC_OID_IDEA_CBC, NSS_USE_ALG_IN_SSL },
|
||||
};
|
||||
|
||||
static const oidValDef kxOptList[] = {
|
||||
/* Key exchange */
|
||||
{ CIPHER_NAME("RSA"), SEC_OID_TLS_RSA, NSS_USE_ALG_IN_SSL_KX },
|
||||
{ CIPHER_NAME("RSA-EXPORT"), SEC_OID_TLS_RSA_EXPORT, NSS_USE_ALG_IN_SSL_KX },
|
||||
|
|
@ -375,6 +384,20 @@ static const oidValDef algOptList[] = {
|
|||
{ CIPHER_NAME("ECDH-RSA"), SEC_OID_TLS_ECDH_RSA, NSS_USE_ALG_IN_SSL_KX },
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
const oidValDef *list;
|
||||
PRUint32 entries;
|
||||
const char *description;
|
||||
} algListsDef;
|
||||
|
||||
static const algListsDef algOptLists[] = {
|
||||
{ curveOptList, PR_ARRAY_SIZE(curveOptList), "ECC" },
|
||||
{ hashOptList, PR_ARRAY_SIZE(hashOptList), "HASH" },
|
||||
{ macOptList, PR_ARRAY_SIZE(macOptList), "MAC" },
|
||||
{ cipherOptList, PR_ARRAY_SIZE(cipherOptList), "CIPHER" },
|
||||
{ kxOptList, PR_ARRAY_SIZE(kxOptList), "OTHER-KX" },
|
||||
};
|
||||
|
||||
static const optionFreeDef sslOptList[] = {
|
||||
/* Versions */
|
||||
{ CIPHER_NAME("SSL2.0"), 0x002 },
|
||||
|
|
@ -401,7 +424,7 @@ static const optionFreeDef freeOptList[] = {
|
|||
{ CIPHER_NAME("TLS-VERSION-MAX"), NSS_TLS_VERSION_MAX_POLICY },
|
||||
/* constraints on DTLS Protocols */
|
||||
{ CIPHER_NAME("DTLS-VERSION-MIN"), NSS_DTLS_VERSION_MIN_POLICY },
|
||||
{ CIPHER_NAME("DTLS-VERSION-MAX"), NSS_DTLS_VERSION_MIN_POLICY }
|
||||
{ CIPHER_NAME("DTLS-VERSION-MAX"), NSS_DTLS_VERSION_MAX_POLICY }
|
||||
};
|
||||
|
||||
static const policyFlagDef policyFlagList[] = {
|
||||
|
|
@ -446,7 +469,8 @@ secmod_ArgGetSubValue(const char *cipher, char sep1, char sep2,
|
|||
}
|
||||
|
||||
static PRUint32
|
||||
secmod_parsePolicyValue(const char *policyFlags, int policyLength)
|
||||
secmod_parsePolicyValue(const char *policyFlags, int policyLength,
|
||||
PRBool printPolicyFeedback)
|
||||
{
|
||||
const char *flag, *currentString;
|
||||
PRUint32 flags = 0;
|
||||
|
|
@ -455,6 +479,7 @@ secmod_parsePolicyValue(const char *policyFlags, int policyLength)
|
|||
for (currentString = policyFlags; currentString &&
|
||||
currentString < policyFlags + policyLength;) {
|
||||
int length;
|
||||
PRBool unknown = PR_TRUE;
|
||||
flag = secmod_ArgGetSubValue(currentString, ',', ':', &length,
|
||||
¤tString);
|
||||
if (length == 0) {
|
||||
|
|
@ -466,41 +491,49 @@ secmod_parsePolicyValue(const char *policyFlags, int policyLength)
|
|||
if ((policy->name_size == length) &&
|
||||
PORT_Strncasecmp(policy->name, flag, name_size) == 0) {
|
||||
flags |= policy->flag;
|
||||
unknown = PR_FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (unknown && printPolicyFeedback) {
|
||||
PR_SetEnv("NSS_POLICY_FAIL=1");
|
||||
fprintf(stderr, "NSS-POLICY-FAIL %.*s: unknown value: %.*s\n",
|
||||
policyLength, policyFlags, length, flag);
|
||||
}
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
/* allow symbolic names for values. The only ones currently defines or
|
||||
* SSL protocol versions. */
|
||||
static PRInt32
|
||||
secmod_getPolicyOptValue(const char *policyValue, int policyValueLength)
|
||||
static SECStatus
|
||||
secmod_getPolicyOptValue(const char *policyValue, int policyValueLength,
|
||||
PRInt32 *result)
|
||||
{
|
||||
PRInt32 val = atoi(policyValue);
|
||||
int i;
|
||||
|
||||
if ((val != 0) || (*policyValue == '0')) {
|
||||
return val;
|
||||
*result = val;
|
||||
return SECSuccess;
|
||||
}
|
||||
for (i = 0; i < PR_ARRAY_SIZE(sslOptList); i++) {
|
||||
if (policyValueLength == sslOptList[i].name_size &&
|
||||
PORT_Strncasecmp(sslOptList[i].name, policyValue,
|
||||
sslOptList[i].name_size) == 0) {
|
||||
val = sslOptList[i].option;
|
||||
break;
|
||||
*result = sslOptList[i].option;
|
||||
return SECSuccess;
|
||||
}
|
||||
}
|
||||
return val;
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
secmod_applyCryptoPolicy(const char *policyString,
|
||||
PRBool allow)
|
||||
secmod_applyCryptoPolicy(const char *policyString, PRBool allow,
|
||||
PRBool printPolicyFeedback)
|
||||
{
|
||||
const char *cipher, *currentString;
|
||||
unsigned i;
|
||||
unsigned i, j;
|
||||
SECStatus rv = SECSuccess;
|
||||
PRBool unknown;
|
||||
|
||||
|
|
@ -525,56 +558,63 @@ secmod_applyCryptoPolicy(const char *policyString,
|
|||
/* disable or enable all options by default */
|
||||
PRUint32 value = 0;
|
||||
if (newValue) {
|
||||
value = secmod_parsePolicyValue(&cipher[3] + 1, length - 3 - 1);
|
||||
value = secmod_parsePolicyValue(&cipher[3] + 1, length - 3 - 1, printPolicyFeedback);
|
||||
}
|
||||
for (i = 0; i < PR_ARRAY_SIZE(algOptList); i++) {
|
||||
PRUint32 enable, disable;
|
||||
if (!newValue) {
|
||||
value = algOptList[i].val;
|
||||
for (i = 0; i < PR_ARRAY_SIZE(algOptLists); i++) {
|
||||
const algListsDef *algOptList = &algOptLists[i];
|
||||
for (j = 0; j < algOptList->entries; j++) {
|
||||
PRUint32 enable, disable;
|
||||
if (!newValue) {
|
||||
value = algOptList->list[j].val;
|
||||
}
|
||||
if (allow) {
|
||||
enable = value;
|
||||
disable = 0;
|
||||
} else {
|
||||
enable = 0;
|
||||
disable = value;
|
||||
}
|
||||
NSS_SetAlgorithmPolicy(algOptList->list[j].oid, enable, disable);
|
||||
}
|
||||
if (allow) {
|
||||
enable = value;
|
||||
disable = 0;
|
||||
} else {
|
||||
enable = 0;
|
||||
disable = value;
|
||||
}
|
||||
NSS_SetAlgorithmPolicy(algOptList[i].oid, enable, disable);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < PR_ARRAY_SIZE(algOptList); i++) {
|
||||
const oidValDef *algOpt = &algOptList[i];
|
||||
unsigned name_size = algOpt->name_size;
|
||||
PRBool newOption = PR_FALSE;
|
||||
for (i = 0; i < PR_ARRAY_SIZE(algOptLists); i++) {
|
||||
const algListsDef *algOptList = &algOptLists[i];
|
||||
for (j = 0; j < algOptList->entries; j++) {
|
||||
const oidValDef *algOpt = &algOptList->list[j];
|
||||
unsigned name_size = algOpt->name_size;
|
||||
PRBool newOption = PR_FALSE;
|
||||
|
||||
if ((length >= name_size) && (cipher[name_size] == '/')) {
|
||||
newOption = PR_TRUE;
|
||||
}
|
||||
if ((newOption || algOpt->name_size == length) &&
|
||||
PORT_Strncasecmp(algOpt->name, cipher, name_size) == 0) {
|
||||
PRUint32 value = algOpt->val;
|
||||
PRUint32 enable, disable;
|
||||
if (newOption) {
|
||||
value = secmod_parsePolicyValue(&cipher[name_size] + 1,
|
||||
length - name_size - 1);
|
||||
if ((length >= name_size) && (cipher[name_size] == '/')) {
|
||||
newOption = PR_TRUE;
|
||||
}
|
||||
if (allow) {
|
||||
enable = value;
|
||||
disable = 0;
|
||||
} else {
|
||||
enable = 0;
|
||||
disable = value;
|
||||
if ((newOption || algOpt->name_size == length) &&
|
||||
PORT_Strncasecmp(algOpt->name, cipher, name_size) == 0) {
|
||||
PRUint32 value = algOpt->val;
|
||||
PRUint32 enable, disable;
|
||||
if (newOption) {
|
||||
value = secmod_parsePolicyValue(&cipher[name_size] + 1,
|
||||
length - name_size - 1,
|
||||
printPolicyFeedback);
|
||||
}
|
||||
if (allow) {
|
||||
enable = value;
|
||||
disable = 0;
|
||||
} else {
|
||||
enable = 0;
|
||||
disable = value;
|
||||
}
|
||||
rv = NSS_SetAlgorithmPolicy(algOpt->oid, enable, disable);
|
||||
if (rv != SECSuccess) {
|
||||
/* could not enable option */
|
||||
/* NSS_SetAlgorithPolicy should have set the error code */
|
||||
return SECFailure;
|
||||
}
|
||||
unknown = PR_FALSE;
|
||||
break;
|
||||
}
|
||||
rv = NSS_SetAlgorithmPolicy(algOpt->oid, enable, disable);
|
||||
if (rv != SECSuccess) {
|
||||
/* could not enable option */
|
||||
/* NSS_SetAlgorithPolicy should have set the error code */
|
||||
return SECFailure;
|
||||
}
|
||||
unknown = PR_FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!unknown) {
|
||||
|
|
@ -587,9 +627,19 @@ secmod_applyCryptoPolicy(const char *policyString,
|
|||
|
||||
if ((length > name_size) && cipher[name_size] == '=' &&
|
||||
PORT_Strncasecmp(freeOpt->name, cipher, name_size) == 0) {
|
||||
PRInt32 val = secmod_getPolicyOptValue(&cipher[name_size + 1],
|
||||
length - name_size - 1);
|
||||
|
||||
PRInt32 val;
|
||||
const char *policyValue = &cipher[name_size + 1];
|
||||
int policyValueLength = length - name_size - 1;
|
||||
rv = secmod_getPolicyOptValue(policyValue, policyValueLength,
|
||||
&val);
|
||||
if (rv != SECSuccess) {
|
||||
if (printPolicyFeedback) {
|
||||
PR_SetEnv("NSS_POLICY_FAIL=1");
|
||||
fprintf(stderr, "NSS-POLICY-FAIL %.*s: unknown value: %.*s\n",
|
||||
length, cipher, policyValueLength, policyValue);
|
||||
}
|
||||
return SECFailure;
|
||||
}
|
||||
rv = NSS_OptionSet(freeOpt->option, val);
|
||||
if (rv != SECSuccess) {
|
||||
/* could not enable option */
|
||||
|
|
@ -602,12 +652,83 @@ secmod_applyCryptoPolicy(const char *policyString,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (unknown && printPolicyFeedback) {
|
||||
PR_SetEnv("NSS_POLICY_FAIL=1");
|
||||
fprintf(stderr, "NSS-POLICY-FAIL %s: unknown identifier: %.*s\n",
|
||||
allow ? "allow" : "disallow", length, cipher);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void
|
||||
secmod_sanityCheckCryptoPolicy(void)
|
||||
{
|
||||
unsigned i, j;
|
||||
SECStatus rv = SECSuccess;
|
||||
unsigned num_kx_enabled = 0;
|
||||
unsigned num_ssl_enabled = 0;
|
||||
unsigned num_sig_enabled = 0;
|
||||
unsigned enabledCount[PR_ARRAY_SIZE(algOptLists)];
|
||||
const char *sWarn = "WARN";
|
||||
const char *sInfo = "INFO";
|
||||
PRBool haveWarning = PR_FALSE;
|
||||
|
||||
for (i = 0; i < PR_ARRAY_SIZE(algOptLists); i++) {
|
||||
const algListsDef *algOptList = &algOptLists[i];
|
||||
enabledCount[i] = 0;
|
||||
for (j = 0; j < algOptList->entries; j++) {
|
||||
const oidValDef *algOpt = &algOptList->list[j];
|
||||
PRUint32 value;
|
||||
PRBool anyEnabled = PR_FALSE;
|
||||
rv = NSS_GetAlgorithmPolicy(algOpt->oid, &value);
|
||||
if (rv != SECSuccess) {
|
||||
PR_SetEnv("NSS_POLICY_FAIL=1");
|
||||
fprintf(stderr, "NSS-POLICY-FAIL: internal failure with NSS_GetAlgorithmPolicy at %u\n", i);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((algOpt->val & NSS_USE_ALG_IN_SSL_KX) && (value & NSS_USE_ALG_IN_SSL_KX)) {
|
||||
++num_kx_enabled;
|
||||
anyEnabled = PR_TRUE;
|
||||
fprintf(stderr, "NSS-POLICY-INFO: %s is enabled for KX\n", algOpt->name);
|
||||
}
|
||||
if ((algOpt->val & NSS_USE_ALG_IN_SSL) && (value & NSS_USE_ALG_IN_SSL)) {
|
||||
++num_ssl_enabled;
|
||||
anyEnabled = PR_TRUE;
|
||||
fprintf(stderr, "NSS-POLICY-INFO: %s is enabled for SSL\n", algOpt->name);
|
||||
}
|
||||
if ((algOpt->val & NSS_USE_ALG_IN_CERT_SIGNATURE) && (value & NSS_USE_ALG_IN_CERT_SIGNATURE)) {
|
||||
++num_sig_enabled;
|
||||
anyEnabled = PR_TRUE;
|
||||
fprintf(stderr, "NSS-POLICY-INFO: %s is enabled for CERT-SIGNATURE\n", algOpt->name);
|
||||
}
|
||||
if (anyEnabled) {
|
||||
++enabledCount[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "NSS-POLICY-%s: NUMBER-OF-SSL-ALG-KX: %u\n", num_kx_enabled ? sInfo : sWarn, num_kx_enabled);
|
||||
fprintf(stderr, "NSS-POLICY-%s: NUMBER-OF-SSL-ALG: %u\n", num_ssl_enabled ? sInfo : sWarn, num_ssl_enabled);
|
||||
fprintf(stderr, "NSS-POLICY-%s: NUMBER-OF-CERT-SIG: %u\n", num_sig_enabled ? sInfo : sWarn, num_sig_enabled);
|
||||
if (!num_kx_enabled || !num_ssl_enabled || !num_sig_enabled) {
|
||||
haveWarning = PR_TRUE;
|
||||
}
|
||||
for (i = 0; i < PR_ARRAY_SIZE(algOptLists); i++) {
|
||||
const algListsDef *algOptList = &algOptLists[i];
|
||||
fprintf(stderr, "NSS-POLICY-%s: NUMBER-OF-%s: %u\n", enabledCount[i] ? sInfo : sWarn, algOptList->description, enabledCount[i]);
|
||||
if (!enabledCount[i]) {
|
||||
haveWarning = PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (haveWarning) {
|
||||
PR_SetEnv("NSS_POLICY_WARN=1");
|
||||
}
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
secmod_parseCryptoPolicy(const char *policyConfig)
|
||||
secmod_parseCryptoPolicy(const char *policyConfig, PRBool printPolicyFeedback)
|
||||
{
|
||||
char *disallow, *allow;
|
||||
SECStatus rv;
|
||||
|
|
@ -622,16 +743,26 @@ secmod_parseCryptoPolicy(const char *policyConfig)
|
|||
return rv;
|
||||
}
|
||||
disallow = NSSUTIL_ArgGetParamValue("disallow", policyConfig);
|
||||
rv = secmod_applyCryptoPolicy(disallow, PR_FALSE);
|
||||
rv = secmod_applyCryptoPolicy(disallow, PR_FALSE, printPolicyFeedback);
|
||||
if (disallow)
|
||||
PORT_Free(disallow);
|
||||
if (rv != SECSuccess) {
|
||||
return rv;
|
||||
}
|
||||
allow = NSSUTIL_ArgGetParamValue("allow", policyConfig);
|
||||
rv = secmod_applyCryptoPolicy(allow, PR_TRUE);
|
||||
rv = secmod_applyCryptoPolicy(allow, PR_TRUE, printPolicyFeedback);
|
||||
if (allow)
|
||||
PORT_Free(allow);
|
||||
if (rv != SECSuccess) {
|
||||
return rv;
|
||||
}
|
||||
if (printPolicyFeedback) {
|
||||
/* This helps to distinguish configurations that don't contain any
|
||||
* policy config= statement. */
|
||||
PR_SetEnv("NSS_POLICY_LOADED=1");
|
||||
fprintf(stderr, "NSS-POLICY-INFO: LOADED-SUCCESSFULLY\n");
|
||||
secmod_sanityCheckCryptoPolicy();
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
@ -648,11 +779,16 @@ SECMOD_CreateModuleEx(const char *library, const char *moduleName,
|
|||
char *slotParams, *ciphers;
|
||||
/* pk11pars.h still does not have const char * interfaces */
|
||||
char *nssc = (char *)nss;
|
||||
PRBool printPolicyFeedback = NSSUTIL_ArgHasFlag("flags", "printPolicyFeedback", nssc);
|
||||
|
||||
rv = secmod_parseCryptoPolicy(config);
|
||||
rv = secmod_parseCryptoPolicy(config, printPolicyFeedback);
|
||||
|
||||
/* do not load the module if policy parsing fails */
|
||||
if (rv != SECSuccess) {
|
||||
if (printPolicyFeedback) {
|
||||
PR_SetEnv("NSS_POLICY_FAIL=1");
|
||||
fprintf(stderr, "NSS-POLICY-FAIL: policy config parsing failed, not loading module %s\n", moduleName);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -703,6 +839,9 @@ SECMOD_CreateModuleEx(const char *library, const char *moduleName,
|
|||
if (NSSUTIL_ArgHasFlag("flags", "defaultModDB", nssc)) {
|
||||
flags |= SECMOD_FLAG_MODULE_DB_DEFAULT_MODDB;
|
||||
}
|
||||
if (NSSUTIL_ArgHasFlag("flags", "policyOnly", nssc)) {
|
||||
flags |= SECMOD_FLAG_MODULE_DB_POLICY_ONLY;
|
||||
}
|
||||
/* additional moduleDB flags could be added here in the future */
|
||||
mod->isModuleDB = (PRBool)flags;
|
||||
}
|
||||
|
|
@ -742,6 +881,14 @@ SECMOD_GetDefaultModDBFlag(SECMODModule *mod)
|
|||
return (flags & SECMOD_FLAG_MODULE_DB_DEFAULT_MODDB) ? PR_TRUE : PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
secmod_PolicyOnly(SECMODModule *mod)
|
||||
{
|
||||
char flags = (char)mod->isModuleDB;
|
||||
|
||||
return (flags & SECMOD_FLAG_MODULE_DB_POLICY_ONLY) ? PR_TRUE : PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
secmod_IsInternalKeySlot(SECMODModule *mod)
|
||||
{
|
||||
|
|
@ -1635,6 +1782,7 @@ SECMOD_LoadModule(char *modulespec, SECMODModule *parent, PRBool recurse)
|
|||
SECMODModule *module = NULL;
|
||||
SECMODModule *oldModule = NULL;
|
||||
SECStatus rv;
|
||||
PRBool forwardPolicyFeedback = PR_FALSE;
|
||||
|
||||
/* initialize the underlying module structures */
|
||||
SECMOD_Init();
|
||||
|
|
@ -1647,6 +1795,7 @@ SECMOD_LoadModule(char *modulespec, SECMODModule *parent, PRBool recurse)
|
|||
}
|
||||
|
||||
module = SECMOD_CreateModuleEx(library, moduleName, parameters, nss, config);
|
||||
forwardPolicyFeedback = NSSUTIL_ArgHasFlag("flags", "printPolicyFeedback", nss);
|
||||
if (library)
|
||||
PORT_Free(library);
|
||||
if (moduleName)
|
||||
|
|
@ -1660,6 +1809,12 @@ SECMOD_LoadModule(char *modulespec, SECMODModule *parent, PRBool recurse)
|
|||
if (!module) {
|
||||
goto loser;
|
||||
}
|
||||
|
||||
/* a policy only stanza doesn't actually get 'loaded'. policy has already
|
||||
* been parsed as a side effect of the CreateModuleEx call */
|
||||
if (secmod_PolicyOnly(module)) {
|
||||
return module;
|
||||
}
|
||||
if (parent) {
|
||||
module->parent = SECMOD_ReferenceModule(parent);
|
||||
if (module->internal && secmod_IsInternalKeySlot(parent)) {
|
||||
|
|
@ -1703,7 +1858,15 @@ SECMOD_LoadModule(char *modulespec, SECMODModule *parent, PRBool recurse)
|
|||
rv = SECFailure;
|
||||
break;
|
||||
}
|
||||
child = SECMOD_LoadModule(*index, module, PR_TRUE);
|
||||
if (!forwardPolicyFeedback) {
|
||||
child = SECMOD_LoadModule(*index, module, PR_TRUE);
|
||||
} else {
|
||||
/* Add printPolicyFeedback to the nss flags */
|
||||
char *specWithForwards =
|
||||
NSSUTIL_AddNSSFlagToModuleSpec(*index, "printPolicyFeedback");
|
||||
child = SECMOD_LoadModule(specWithForwards, module, PR_TRUE);
|
||||
PORT_Free(specWithForwards);
|
||||
}
|
||||
if (!child)
|
||||
break;
|
||||
if (child->isCritical && !child->loaded) {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
#include "pkcs11.h"
|
||||
#include "pk11func.h"
|
||||
#include "secitem.h"
|
||||
#include "key.h"
|
||||
#include "keyhi.h"
|
||||
|
||||
typedef struct SEC_PKCS5PBEParameterStr SEC_PKCS5PBEParameter;
|
||||
struct SEC_PKCS5PBEParameterStr {
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
#include "pkcs11.h"
|
||||
#include "pk11func.h"
|
||||
#include "secitem.h"
|
||||
#include "key.h"
|
||||
#include "keyhi.h"
|
||||
#include "secoid.h"
|
||||
#include "secasn1.h"
|
||||
#include "secerr.h"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#include "seccomon.h"
|
||||
#include "secoidt.h"
|
||||
#include "secdert.h"
|
||||
#include "keyt.h"
|
||||
#include "keythi.h"
|
||||
#include "certt.h"
|
||||
#include "pkcs11t.h"
|
||||
#include "secmodt.h"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#include "seccomon.h"
|
||||
#include "secoidt.h"
|
||||
#include "secdert.h"
|
||||
#include "keyt.h"
|
||||
#include "keythi.h"
|
||||
#include "certt.h"
|
||||
#include "pkcs11t.h"
|
||||
#include "secmodt.h"
|
||||
|
|
|
|||
|
|
@ -607,12 +607,32 @@ PK11_FindSlotsByNames(const char *dllName, const char *slotName,
|
|||
return slotList;
|
||||
}
|
||||
|
||||
PK11SlotInfo *
|
||||
PK11_FindSlotByName(const char *name)
|
||||
typedef PRBool (*PK11SlotMatchFunc)(PK11SlotInfo *slot, const void *arg);
|
||||
|
||||
static PRBool
|
||||
pk11_MatchSlotByTokenName(PK11SlotInfo *slot, const void *arg)
|
||||
{
|
||||
return PORT_Strcmp(slot->token_name, arg) == 0;
|
||||
}
|
||||
|
||||
static PRBool
|
||||
pk11_MatchSlotBySerial(PK11SlotInfo *slot, const void *arg)
|
||||
{
|
||||
return PORT_Memcmp(slot->serial, arg, sizeof(slot->serial)) == 0;
|
||||
}
|
||||
|
||||
static PRBool
|
||||
pk11_MatchSlotByTokenURI(PK11SlotInfo *slot, const void *arg)
|
||||
{
|
||||
return pk11_MatchUriTokenInfo(slot, (PK11URI *)arg);
|
||||
}
|
||||
|
||||
static PK11SlotInfo *
|
||||
pk11_FindSlot(const void *arg, PK11SlotMatchFunc func)
|
||||
{
|
||||
SECMODListLock *moduleLock = SECMOD_GetDefaultModuleListLock();
|
||||
SECMODModuleList *mlp;
|
||||
SECMODModuleList *modules;
|
||||
SECMODListLock *moduleLock = SECMOD_GetDefaultModuleListLock();
|
||||
int i;
|
||||
PK11SlotInfo *slot = NULL;
|
||||
|
||||
|
|
@ -620,10 +640,6 @@ PK11_FindSlotByName(const char *name)
|
|||
PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
||||
return slot;
|
||||
}
|
||||
if ((name == NULL) || (*name == 0)) {
|
||||
return PK11_GetInternalKeySlot();
|
||||
}
|
||||
|
||||
/* work through all the slots */
|
||||
SECMOD_GetReadLock(moduleLock);
|
||||
modules = SECMOD_GetDefaultModuleList();
|
||||
|
|
@ -631,7 +647,7 @@ PK11_FindSlotByName(const char *name)
|
|||
for (i = 0; i < mlp->module->slotCount; i++) {
|
||||
PK11SlotInfo *tmpSlot = mlp->module->slots[i];
|
||||
if (PK11_IsPresent(tmpSlot)) {
|
||||
if (PORT_Strcmp(tmpSlot->token_name, name) == 0) {
|
||||
if (func(tmpSlot, arg)) {
|
||||
slot = PK11_ReferenceSlot(tmpSlot);
|
||||
break;
|
||||
}
|
||||
|
|
@ -649,43 +665,41 @@ PK11_FindSlotByName(const char *name)
|
|||
return slot;
|
||||
}
|
||||
|
||||
static PK11SlotInfo *
|
||||
pk11_FindSlotByTokenURI(const char *uriString)
|
||||
{
|
||||
PK11SlotInfo *slot = NULL;
|
||||
PK11URI *uri;
|
||||
|
||||
uri = PK11URI_ParseURI(uriString);
|
||||
if (!uri) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return slot;
|
||||
}
|
||||
|
||||
slot = pk11_FindSlot(uri, pk11_MatchSlotByTokenURI);
|
||||
PK11URI_DestroyURI(uri);
|
||||
return slot;
|
||||
}
|
||||
|
||||
PK11SlotInfo *
|
||||
PK11_FindSlotByName(const char *name)
|
||||
{
|
||||
if ((name == NULL) || (*name == 0)) {
|
||||
return PK11_GetInternalKeySlot();
|
||||
}
|
||||
|
||||
if (!PORT_Strncasecmp(name, "pkcs11:", strlen("pkcs11:"))) {
|
||||
return pk11_FindSlotByTokenURI(name);
|
||||
}
|
||||
|
||||
return pk11_FindSlot(name, pk11_MatchSlotByTokenName);
|
||||
}
|
||||
|
||||
PK11SlotInfo *
|
||||
PK11_FindSlotBySerial(char *serial)
|
||||
{
|
||||
SECMODModuleList *mlp;
|
||||
SECMODModuleList *modules;
|
||||
SECMODListLock *moduleLock = SECMOD_GetDefaultModuleListLock();
|
||||
int i;
|
||||
PK11SlotInfo *slot = NULL;
|
||||
|
||||
if (!moduleLock) {
|
||||
PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
||||
return slot;
|
||||
}
|
||||
/* work through all the slots */
|
||||
SECMOD_GetReadLock(moduleLock);
|
||||
modules = SECMOD_GetDefaultModuleList();
|
||||
for (mlp = modules; mlp != NULL; mlp = mlp->next) {
|
||||
for (i = 0; i < mlp->module->slotCount; i++) {
|
||||
PK11SlotInfo *tmpSlot = mlp->module->slots[i];
|
||||
if (PK11_IsPresent(tmpSlot)) {
|
||||
if (PORT_Memcmp(tmpSlot->serial, serial,
|
||||
sizeof(tmpSlot->serial)) == 0) {
|
||||
slot = PK11_ReferenceSlot(tmpSlot);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (slot != NULL)
|
||||
break;
|
||||
}
|
||||
SECMOD_ReleaseReadLock(moduleLock);
|
||||
|
||||
if (slot == NULL) {
|
||||
PORT_SetError(SEC_ERROR_NO_TOKEN);
|
||||
}
|
||||
|
||||
return slot;
|
||||
return pk11_FindSlot(serial, pk11_MatchSlotBySerial);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
#include "secdert.h"
|
||||
#include "certt.h"
|
||||
#include "secmodt.h"
|
||||
#include "keyt.h"
|
||||
#include "keythi.h"
|
||||
|
||||
SEC_BEGIN_PROTOS
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue