mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-09 16:57:30 +09:00
Issue #1338 - Part 2: Update NSS to 3.48-RTM
This commit is contained in:
parent
1a92143e68
commit
c57cac24e8
885 changed files with 1650639 additions and 59530 deletions
|
|
@ -27,6 +27,7 @@ include $(CORE_DEPTH)/coreconf/config.mk
|
|||
#######################################################################
|
||||
|
||||
include config.mk
|
||||
include ../platlibs.mk
|
||||
|
||||
#######################################################################
|
||||
# (5) Execute "global" rules. (OPTIONAL) #
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
#include "secutil.h"
|
||||
#include "secoid.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __sun
|
||||
extern int fprintf(FILE *strm, const char *format, ... /* args */);
|
||||
extern int fflush(FILE *stream);
|
||||
|
|
@ -509,7 +511,7 @@ prettyPrintItem(FILE *out, const unsigned char *data, const unsigned char *end,
|
|||
/*
|
||||
* Just quit now if slen more bytes puts us off the end.
|
||||
*/
|
||||
if ((data + slen) > end) {
|
||||
if (data > end || slen > (end - data)) {
|
||||
PORT_SetError(SEC_ERROR_BAD_DER);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,8 @@
|
|||
],
|
||||
'target_defaults': {
|
||||
'defines': [
|
||||
'NSPR20'
|
||||
'NSPR20',
|
||||
'NSS_USE_STATIC_LIBS'
|
||||
]
|
||||
},
|
||||
'variables': {
|
||||
|
|
|
|||
|
|
@ -37,3 +37,5 @@ CSRCS = basicutil.c \
|
|||
endif
|
||||
|
||||
NO_MD_RELEASE = 1
|
||||
|
||||
USE_STATIC_LIBS = 1
|
||||
|
|
|
|||
|
|
@ -333,6 +333,8 @@ const Constant _consts[] = {
|
|||
mkEntry(CKM_SHA512, Mechanism),
|
||||
mkEntry(CKM_SHA512_HMAC_GENERAL, Mechanism),
|
||||
mkEntry(CKM_SHA512_HMAC, Mechanism),
|
||||
mkEntry(CKM_AES_CMAC, Mechanism),
|
||||
mkEntry(CKM_AES_CMAC_GENERAL, Mechanism),
|
||||
mkEntry(CKM_CAST_KEY_GEN, Mechanism),
|
||||
mkEntry(CKM_CAST_ECB, Mechanism),
|
||||
mkEntry(CKM_CAST_CBC, Mechanism),
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ SEC_GetPassword(FILE *input, FILE *output, char *prompt,
|
|||
int infd = fileno(input);
|
||||
int isTTY = isatty(infd);
|
||||
#endif
|
||||
char phrase[200] = { '\0' }; /* ensure EOF doesn't return junk */
|
||||
char phrase[500] = { '\0' }; /* ensure EOF doesn't return junk */
|
||||
|
||||
for (;;) {
|
||||
/* Prompt for password */
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include <stdarg.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef XP_UNIX
|
||||
#include <unistd.h>
|
||||
|
|
@ -1107,36 +1108,33 @@ typedef struct secuPBEParamsStr {
|
|||
SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate)
|
||||
|
||||
/* SECOID_PKCS5_PBKDF2 */
|
||||
const SEC_ASN1Template secuKDF2Params[] =
|
||||
{
|
||||
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(secuPBEParams) },
|
||||
{ SEC_ASN1_OCTET_STRING, offsetof(secuPBEParams, salt) },
|
||||
{ SEC_ASN1_INTEGER, offsetof(secuPBEParams, iterationCount) },
|
||||
{ SEC_ASN1_INTEGER, offsetof(secuPBEParams, keyLength) },
|
||||
{ SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(secuPBEParams, kdfAlg),
|
||||
SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
||||
{ 0 }
|
||||
};
|
||||
const SEC_ASN1Template secuKDF2Params[] = {
|
||||
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(secuPBEParams) },
|
||||
{ SEC_ASN1_OCTET_STRING, offsetof(secuPBEParams, salt) },
|
||||
{ SEC_ASN1_INTEGER, offsetof(secuPBEParams, iterationCount) },
|
||||
{ SEC_ASN1_INTEGER, offsetof(secuPBEParams, keyLength) },
|
||||
{ SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(secuPBEParams, kdfAlg),
|
||||
SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
/* PKCS5v1 & PKCS12 */
|
||||
const SEC_ASN1Template secuPBEParamsTemp[] =
|
||||
{
|
||||
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(secuPBEParams) },
|
||||
{ SEC_ASN1_OCTET_STRING, offsetof(secuPBEParams, salt) },
|
||||
{ SEC_ASN1_INTEGER, offsetof(secuPBEParams, iterationCount) },
|
||||
{ 0 }
|
||||
};
|
||||
const SEC_ASN1Template secuPBEParamsTemp[] = {
|
||||
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(secuPBEParams) },
|
||||
{ SEC_ASN1_OCTET_STRING, offsetof(secuPBEParams, salt) },
|
||||
{ SEC_ASN1_INTEGER, offsetof(secuPBEParams, iterationCount) },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
/* SEC_OID_PKCS5_PBES2, SEC_OID_PKCS5_PBMAC1 */
|
||||
const SEC_ASN1Template secuPBEV2Params[] =
|
||||
{
|
||||
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(secuPBEParams) },
|
||||
{ SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(secuPBEParams, kdfAlg),
|
||||
SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
||||
{ SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(secuPBEParams, cipherAlg),
|
||||
SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
||||
{ 0 }
|
||||
};
|
||||
const SEC_ASN1Template secuPBEV2Params[] = {
|
||||
{ SEC_ASN1_SEQUENCE, 0, NULL, sizeof(secuPBEParams) },
|
||||
{ SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(secuPBEParams, kdfAlg),
|
||||
SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
||||
{ SEC_ASN1_INLINE | SEC_ASN1_XTRN, offsetof(secuPBEParams, cipherAlg),
|
||||
SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
void
|
||||
secu_PrintRSAPSSParams(FILE *out, SECItem *value, char *m, int level)
|
||||
|
|
@ -2299,8 +2297,9 @@ SECU_PrintCertAttributes(FILE *out, CERTAttribute **attrs, char *m, int level)
|
|||
return rv;
|
||||
}
|
||||
|
||||
int /* sometimes a PRErrorCode, other times a SECStatus. Sigh. */
|
||||
SECU_PrintCertificateRequest(FILE *out, SECItem *der, char *m, int level)
|
||||
/* sometimes a PRErrorCode, other times a SECStatus. Sigh. */
|
||||
int
|
||||
SECU_PrintCertificateRequest(FILE *out, SECItem *der, char *m, int level)
|
||||
{
|
||||
PLArenaPool *arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
||||
CERTCertificateRequest *cr;
|
||||
|
|
@ -3250,6 +3249,26 @@ SEC_PrintCertificateAndTrust(CERTCertificate *cert,
|
|||
"Certificate Trust Flags", 1);
|
||||
}
|
||||
|
||||
/* The distrust fields are hard-coded in nssckbi and read-only.
|
||||
* If verifying some cert, with vfychain, for instance, the certificate may
|
||||
* not have a defined slot if not imported. */
|
||||
if (cert->slot != NULL && cert->distrust != NULL) {
|
||||
const unsigned int kDistrustFieldSize = 13;
|
||||
fprintf(stdout, "\n");
|
||||
SECU_Indent(stdout, 1);
|
||||
fprintf(stdout, "%s:\n", "Certificate Distrust Dates");
|
||||
if (cert->distrust->serverDistrustAfter.len == kDistrustFieldSize) {
|
||||
SECU_PrintTimeChoice(stdout,
|
||||
&cert->distrust->serverDistrustAfter,
|
||||
"Server Distrust After", 2);
|
||||
}
|
||||
if (cert->distrust->emailDistrustAfter.len == kDistrustFieldSize) {
|
||||
SECU_PrintTimeChoice(stdout,
|
||||
&cert->distrust->emailDistrustAfter,
|
||||
"E-mail Distrust After", 2);
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
return (SECSuccess);
|
||||
|
|
@ -3979,3 +3998,164 @@ done:
|
|||
*enabledSigSchemes = schemes;
|
||||
return SECSuccess;
|
||||
}
|
||||
|
||||
/* Parse the exporter spec in the form: LABEL[:OUTPUT-LENGTH[:CONTEXT]] */
|
||||
static SECStatus
|
||||
parseExporter(const char *arg,
|
||||
secuExporter *exporter)
|
||||
{
|
||||
SECStatus rv = SECSuccess;
|
||||
|
||||
char *str = PORT_Strdup(arg);
|
||||
if (!str) {
|
||||
rv = SECFailure;
|
||||
goto done;
|
||||
}
|
||||
|
||||
char *labelEnd = strchr(str, ':');
|
||||
if (labelEnd) {
|
||||
*labelEnd = '\0';
|
||||
labelEnd++;
|
||||
|
||||
/* To extract CONTEXT, first skip OUTPUT-LENGTH */
|
||||
char *outputEnd = strchr(labelEnd, ':');
|
||||
if (outputEnd) {
|
||||
*outputEnd = '\0';
|
||||
outputEnd++;
|
||||
|
||||
exporter->hasContext = PR_TRUE;
|
||||
exporter->context.data = (unsigned char *)PORT_Strdup(outputEnd);
|
||||
exporter->context.len = strlen(outputEnd);
|
||||
if (PORT_Strncasecmp((char *)exporter->context.data, "0x", 2) == 0) {
|
||||
rv = SECU_SECItemHexStringToBinary(&exporter->context);
|
||||
if (rv != SECSuccess) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (labelEnd && *labelEnd != '\0') {
|
||||
long int outputLength = strtol(labelEnd, NULL, 10);
|
||||
if (!(outputLength > 0 && outputLength <= UINT_MAX)) {
|
||||
PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
||||
rv = SECFailure;
|
||||
goto done;
|
||||
}
|
||||
exporter->outputLength = outputLength;
|
||||
} else {
|
||||
exporter->outputLength = 20;
|
||||
}
|
||||
|
||||
char *label = PORT_Strdup(str);
|
||||
exporter->label.data = (unsigned char *)label;
|
||||
exporter->label.len = strlen(label);
|
||||
if (PORT_Strncasecmp((char *)exporter->label.data, "0x", 2) == 0) {
|
||||
rv = SECU_SECItemHexStringToBinary(&exporter->label);
|
||||
if (rv != SECSuccess) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
PORT_Free(str);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
SECStatus
|
||||
parseExporters(const char *arg,
|
||||
const secuExporter **enabledExporters,
|
||||
unsigned int *enabledExporterCount)
|
||||
{
|
||||
secuExporter *exporters;
|
||||
unsigned int numValues = 0;
|
||||
unsigned int count = 0;
|
||||
|
||||
if (countItems(arg, &numValues) != SECSuccess) {
|
||||
return SECFailure;
|
||||
}
|
||||
exporters = PORT_ZNewArray(secuExporter, numValues);
|
||||
if (!exporters) {
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
/* Get exporter definitions. */
|
||||
char *str = PORT_Strdup(arg);
|
||||
if (!str) {
|
||||
goto done;
|
||||
}
|
||||
char *p = strtok(str, ",");
|
||||
while (p) {
|
||||
SECStatus rv = parseExporter(p, &exporters[count++]);
|
||||
if (rv != SECSuccess) {
|
||||
count = 0;
|
||||
goto done;
|
||||
}
|
||||
p = strtok(NULL, ",");
|
||||
}
|
||||
|
||||
done:
|
||||
PORT_Free(str);
|
||||
if (!count) {
|
||||
PORT_Free(exporters);
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
*enabledExporterCount = count;
|
||||
*enabledExporters = exporters;
|
||||
return SECSuccess;
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
exportKeyingMaterial(PRFileDesc *fd, const secuExporter *exporter)
|
||||
{
|
||||
SECStatus rv = SECSuccess;
|
||||
unsigned char *out = PORT_Alloc(exporter->outputLength);
|
||||
|
||||
if (!out) {
|
||||
fprintf(stderr, "Unable to allocate buffer for keying material\n");
|
||||
return SECFailure;
|
||||
}
|
||||
rv = SSL_ExportKeyingMaterial(fd,
|
||||
(char *)exporter->label.data,
|
||||
exporter->label.len,
|
||||
exporter->hasContext,
|
||||
exporter->context.data,
|
||||
exporter->context.len,
|
||||
out,
|
||||
exporter->outputLength);
|
||||
if (rv != SECSuccess) {
|
||||
goto done;
|
||||
}
|
||||
fprintf(stdout, "Exported Keying Material:\n");
|
||||
secu_PrintRawString(stdout, (SECItem *)&exporter->label, "Label", 1);
|
||||
if (exporter->hasContext) {
|
||||
SECU_PrintAsHex(stdout, &exporter->context, "Context", 1);
|
||||
}
|
||||
SECU_Indent(stdout, 1);
|
||||
fprintf(stdout, "Length: %u\n", exporter->outputLength);
|
||||
SECItem temp = { siBuffer, out, exporter->outputLength };
|
||||
SECU_PrintAsHex(stdout, &temp, "Keying Material", 1);
|
||||
|
||||
done:
|
||||
PORT_Free(out);
|
||||
return rv;
|
||||
}
|
||||
|
||||
SECStatus
|
||||
exportKeyingMaterials(PRFileDesc *fd,
|
||||
const secuExporter *exporters,
|
||||
unsigned int exporterCount)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < exporterCount; i++) {
|
||||
SECStatus rv = exportKeyingMaterial(fd, &exporters[i]);
|
||||
if (rv != SECSuccess) {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
return SECSuccess;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -409,6 +409,20 @@ SECStatus parseGroupList(const char *arg, SSLNamedGroup **enabledGroups,
|
|||
SECStatus parseSigSchemeList(const char *arg,
|
||||
const SSLSignatureScheme **enabledSigSchemes,
|
||||
unsigned int *enabledSigSchemeCount);
|
||||
typedef struct {
|
||||
SECItem label;
|
||||
PRBool hasContext;
|
||||
SECItem context;
|
||||
unsigned int outputLength;
|
||||
} secuExporter;
|
||||
|
||||
SECStatus parseExporters(const char *arg,
|
||||
const secuExporter **enabledExporters,
|
||||
unsigned int *enabledExporterCount);
|
||||
|
||||
SECStatus exportKeyingMaterials(PRFileDesc *fd,
|
||||
const secuExporter *exporters,
|
||||
unsigned int exporterCount);
|
||||
|
||||
/*
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue