mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-20 15:27:32 +09:00
nss: update nss to hg rev e5e10a46b9ad with vc2013 hackfix
This commit is contained in:
parent
ed1b356dfa
commit
dcdc5d70e0
133 changed files with 8084 additions and 2038 deletions
|
|
@ -1677,6 +1677,95 @@ PK11_MakeKEAPubKey(unsigned char *keyData, int length)
|
|||
return pubk;
|
||||
}
|
||||
|
||||
SECStatus
|
||||
SECKEY_SetPublicValue(SECKEYPrivateKey *privKey, SECItem *publicValue)
|
||||
{
|
||||
SECStatus rv;
|
||||
SECKEYPublicKey pubKey;
|
||||
PLArenaPool *arena;
|
||||
PK11SlotInfo *slot;
|
||||
CK_OBJECT_HANDLE privKeyID;
|
||||
|
||||
if (privKey == NULL || publicValue == NULL ||
|
||||
publicValue->data == NULL || publicValue->len == 0) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
pubKey.arena = NULL;
|
||||
pubKey.keyType = privKey->keyType;
|
||||
pubKey.pkcs11Slot = NULL;
|
||||
pubKey.pkcs11ID = CK_INVALID_HANDLE;
|
||||
/* can't use PORT_InitCheapArena here becase SECKEY_DestroyPublic is used
|
||||
* to free it, and it uses PORT_FreeArena which not only frees the
|
||||
* underlying arena, it also frees the allocated arena struct. */
|
||||
arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
||||
pubKey.arena = arena;
|
||||
if (arena == NULL) {
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
slot = privKey->pkcs11Slot;
|
||||
privKeyID = privKey->pkcs11ID;
|
||||
rv = SECFailure;
|
||||
switch (privKey->keyType) {
|
||||
default:
|
||||
/* error code already set to SECFailure */
|
||||
break;
|
||||
case rsaKey:
|
||||
pubKey.u.rsa.modulus = *publicValue;
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_PUBLIC_EXPONENT,
|
||||
arena, &pubKey.u.rsa.publicExponent);
|
||||
break;
|
||||
case dsaKey:
|
||||
pubKey.u.dsa.publicValue = *publicValue;
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_PRIME,
|
||||
arena, &pubKey.u.dsa.params.prime);
|
||||
if (rv != SECSuccess) {
|
||||
break;
|
||||
}
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_SUBPRIME,
|
||||
arena, &pubKey.u.dsa.params.subPrime);
|
||||
if (rv != SECSuccess) {
|
||||
break;
|
||||
}
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_BASE,
|
||||
arena, &pubKey.u.dsa.params.base);
|
||||
break;
|
||||
case dhKey:
|
||||
pubKey.u.dh.publicValue = *publicValue;
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_PRIME,
|
||||
arena, &pubKey.u.dh.prime);
|
||||
if (rv != SECSuccess) {
|
||||
break;
|
||||
}
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_BASE,
|
||||
arena, &pubKey.u.dh.base);
|
||||
break;
|
||||
case ecKey:
|
||||
pubKey.u.ec.publicValue = *publicValue;
|
||||
pubKey.u.ec.encoding = ECPoint_Undefined;
|
||||
pubKey.u.ec.size = 0;
|
||||
rv = PK11_ReadAttribute(slot, privKeyID, CKA_EC_PARAMS,
|
||||
arena, &pubKey.u.ec.DEREncodedParams);
|
||||
break;
|
||||
}
|
||||
if (rv == SECSuccess) {
|
||||
rv = PK11_ImportPublicKey(slot, &pubKey, PR_TRUE);
|
||||
}
|
||||
/* Even though pubKey is stored on the stack, we've allocated
|
||||
* some of it's data from the arena. SECKEY_DestroyPublicKey
|
||||
* destroys keys by freeing the arena, so this will clean up all
|
||||
* the data we allocated specifically for the key above. It will
|
||||
* also free any slot references which we may have picked up in
|
||||
* PK11_ImportPublicKey. It won't delete the underlying key if
|
||||
* its a Token/Permanent key (which it will be if
|
||||
* PK11_ImportPublicKey succeeds). */
|
||||
SECKEY_DestroyPublicKey(&pubKey);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: This function doesn't return a SECKEYPrivateKey struct to represent
|
||||
* the new private key object. If it were to create a session object that
|
||||
|
|
@ -1802,12 +1891,6 @@ try_faulty_3des:
|
|||
nickname, publicValue, isPerm, isPrivate,
|
||||
key_type, usage, usageCount, wincx);
|
||||
if (privKey) {
|
||||
if (privk) {
|
||||
*privk = privKey;
|
||||
} else {
|
||||
SECKEY_DestroyPrivateKey(privKey);
|
||||
}
|
||||
privKey = NULL;
|
||||
rv = SECSuccess;
|
||||
goto done;
|
||||
}
|
||||
|
|
@ -1837,6 +1920,25 @@ try_faulty_3des:
|
|||
rv = SECFailure;
|
||||
|
||||
done:
|
||||
if ((rv == SECSuccess) && isPerm) {
|
||||
/* If we are importing a token object,
|
||||
* create the corresponding public key.
|
||||
* If this fails, just continue as the target
|
||||
* token simply might not support persistant
|
||||
* public keys. Such tokens are usable, but
|
||||
* need to be authenticated before searching
|
||||
* for user certs. */
|
||||
(void)SECKEY_SetPublicValue(privKey, publicValue);
|
||||
}
|
||||
|
||||
if (privKey) {
|
||||
if (privk) {
|
||||
*privk = privKey;
|
||||
} else {
|
||||
SECKEY_DestroyPrivateKey(privKey);
|
||||
}
|
||||
privKey = NULL;
|
||||
}
|
||||
if (crypto_param != NULL) {
|
||||
SECITEM_ZfreeItem(crypto_param, PR_TRUE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -238,6 +238,8 @@ static const oidValDef curveOptList[] = {
|
|||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
{ CIPHER_NAME("SECP521R1"), SEC_OID_SECG_EC_SECP521R1,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
{ CIPHER_NAME("CURVE25519"), SEC_OID_CURVE25519,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
/* ANSI X9.62 named elliptic curves (characteristic two field) */
|
||||
{ CIPHER_NAME("C2PNB163V1"), SEC_OID_ANSIX962_EC_C2PNB163V1,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
|
|
@ -384,18 +386,26 @@ static const oidValDef kxOptList[] = {
|
|||
{ CIPHER_NAME("ECDH-RSA"), SEC_OID_TLS_ECDH_RSA, NSS_USE_ALG_IN_SSL_KX },
|
||||
};
|
||||
|
||||
static const oidValDef signOptList[] = {
|
||||
/* Signatures */
|
||||
{ CIPHER_NAME("DSA"), SEC_OID_ANSIX9_DSA_SIGNATURE,
|
||||
NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE },
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
const oidValDef *list;
|
||||
PRUint32 entries;
|
||||
const char *description;
|
||||
PRBool allowEmpty;
|
||||
} 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" },
|
||||
{ curveOptList, PR_ARRAY_SIZE(curveOptList), "ECC", PR_FALSE },
|
||||
{ hashOptList, PR_ARRAY_SIZE(hashOptList), "HASH", PR_FALSE },
|
||||
{ macOptList, PR_ARRAY_SIZE(macOptList), "MAC", PR_FALSE },
|
||||
{ cipherOptList, PR_ARRAY_SIZE(cipherOptList), "CIPHER", PR_FALSE },
|
||||
{ kxOptList, PR_ARRAY_SIZE(kxOptList), "OTHER-KX", PR_FALSE },
|
||||
{ signOptList, PR_ARRAY_SIZE(signOptList), "OTHER-SIGN", PR_TRUE },
|
||||
};
|
||||
|
||||
static const optionFreeDef sslOptList[] = {
|
||||
|
|
@ -718,7 +728,7 @@ secmod_sanityCheckCryptoPolicy(void)
|
|||
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]) {
|
||||
if (!enabledCount[i] && !algOptList->allowEmpty) {
|
||||
haveWarning = PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
|
@ -807,6 +817,10 @@ SECMOD_CreateModuleEx(const char *library, const char *moduleName,
|
|||
|
||||
mod->internal = NSSUTIL_ArgHasFlag("flags", "internal", nssc);
|
||||
mod->isFIPS = NSSUTIL_ArgHasFlag("flags", "FIPS", nssc);
|
||||
/* if the system FIPS mode is enabled, force FIPS to be on */
|
||||
if (secmod_GetSystemFIPSEnabled()) {
|
||||
mod->isFIPS = PR_TRUE;
|
||||
}
|
||||
mod->isCritical = NSSUTIL_ArgHasFlag("flags", "critical", nssc);
|
||||
slotParams = NSSUTIL_ArgGetParamValue("slotParams", nssc);
|
||||
mod->slotInfo = NSSUTIL_ArgParseSlotInfo(mod->arena, slotParams,
|
||||
|
|
|
|||
|
|
@ -95,6 +95,31 @@ SECMOD_Shutdown()
|
|||
return SECSuccess;
|
||||
}
|
||||
|
||||
int
|
||||
secmod_GetSystemFIPSEnabled(void)
|
||||
{
|
||||
#ifdef LINUX
|
||||
FILE *f;
|
||||
char d;
|
||||
size_t size;
|
||||
|
||||
f = fopen("/proc/sys/crypto/fips_enabled", "r");
|
||||
if (!f) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
size = fread(&d, 1, sizeof(d), f);
|
||||
fclose(f);
|
||||
if (size != sizeof(d)) {
|
||||
return 0;
|
||||
}
|
||||
if (d == '1') {
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* retrieve the internal module
|
||||
*/
|
||||
|
|
@ -428,7 +453,7 @@ SECMOD_DeleteInternalModule(const char *name)
|
|||
SECMODModuleList **mlpp;
|
||||
SECStatus rv = SECFailure;
|
||||
|
||||
if (pendingModule) {
|
||||
if (secmod_GetSystemFIPSEnabled() || pendingModule) {
|
||||
PORT_SetError(SEC_ERROR_MODULE_STUCK);
|
||||
return rv;
|
||||
}
|
||||
|
|
@ -963,7 +988,7 @@ SECMOD_CanDeleteInternalModule(void)
|
|||
#ifdef NSS_FIPS_DISABLED
|
||||
return PR_FALSE;
|
||||
#else
|
||||
return (PRBool)(pendingModule == NULL);
|
||||
return (PRBool)((pendingModule == NULL) && !secmod_GetSystemFIPSEnabled());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -115,6 +115,13 @@ PK11SymKey *pk11_TokenKeyGenWithFlagsAndKeyType(PK11SlotInfo *slot,
|
|||
CK_MECHANISM_TYPE pk11_GetPBECryptoMechanism(SECAlgorithmID *algid,
|
||||
SECItem **param, SECItem *pwd, PRBool faulty3DES);
|
||||
|
||||
/* Get the state of the system FIPS mode */
|
||||
/* NSS uses this to force FIPS mode if the system bit is on. Applications which
|
||||
* use the SECMOD_CanDeleteInteral() to check to see if they can switch to or
|
||||
* from FIPS mode will automatically be told that they can't swith out of FIPS
|
||||
* mode */
|
||||
int secmod_GetSystemFIPSEnabled();
|
||||
|
||||
extern void pk11sdr_Init(void);
|
||||
extern void pk11sdr_Shutdown(void);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue