This commit introduces various 'dummy' OIDs to pass parameters
from the NSS to the SSL module.
---
 lib/nss/nssinit.c       |   1 +
 lib/pk11wrap/pk11pars.c | 327 +++++++++++++++++++++++++++++++++++++++++++++++-
 lib/ssl/ssl3con.c       | 198 +++++++++++++++++++++--------
 lib/ssl/sslimpl.h       |   5 +
 lib/ssl/sslinit.c       |   3 +-
 lib/util/secoid.c       |  82 +++++++++++-
 lib/util/secoidt.h      |  40 ++++++
 7 files changed, 596 insertions(+), 60 deletions(-)

diff --git a/lib/nss/nssinit.c b/lib/nss/nssinit.c
index 6218a7e..76f4e67 100644
--- a/lib/nss/nssinit.c
+++ b/lib/nss/nssinit.c
@@ -633,6 +633,7 @@ nss_Init(const char *configdir, const char *certPrefix, 
const char *keyPrefix,
        passwordRequired = pk11_password_required;
     }
 
+
     /* Skip the module init if we are already initted and we are trying
      * to init with noCertDB and noModDB */
     if (!(isReallyInitted && noCertDB && noModDB)) {
diff --git a/lib/pk11wrap/pk11pars.c b/lib/pk11wrap/pk11pars.c
index 40ac790..438996c 100644
--- a/lib/pk11wrap/pk11pars.c
+++ b/lib/pk11wrap/pk11pars.c
@@ -7,6 +7,7 @@
  */
 
 #include <ctype.h>
+#include <assert.h>
 #include "pkcs11.h"
 #include "seccomon.h"
 #include "secmod.h"
@@ -14,6 +15,7 @@
 #include "secmodti.h"
 #include "pki3hack.h"
 #include "secerr.h"
+#include "nss.h"
    
 #include "utilpars.h" 
 
@@ -137,6 +139,310 @@ SECMOD_CreateModule(const char *library, const char 
*moduleName,
     return SECMOD_CreateModuleEx(library, moduleName, parameters, nss, NULL);
 }
 
+/* NSS config options format:
+ *
+ * The specified ciphersuites will be enabled, but an application
+ * may enable more:
+ * config=curve1:curve2:hash1:hash2:rsa-1024...
+ *
+ * Only the specified hashes and curves will be enabled:
+ * config=sha1:sha256:secp256r1:secp384r1
+ *
+ * Only the specified hashes and curves will be enabled, and
+ *  RSA keys of 2048 or more will be accepted, and DH key exchange
+ *  with 1024-bit primes or more:
+ * config=sha1:sha256:secp256r1:secp384r1:min-rsa=2048:min-dh=1024
+ *
+ * A policy that enables the AES ciphersuites and the SECP256/384 curves:
+ * 
config=aes128-cbc:aes128-gcm:TLS1.0:TLS1.2:TLS1.1:HMAC-SHA1:SHA1:SHA256:SHA384:RSA:ECDHE-RSA:SECP256R1:SECP384R1
+ *
+ */
+
+typedef struct {
+    const char *name;
+    SECOidTag oid;
+    PRUint32 val;
+} oidValDef;
+
+typedef struct {
+    const char *name;
+    unsigned name_size;
+    PRInt32 option;
+} optionFreeDef;
+
+#define STR(x) x,(sizeof(x)-1)
+static const oidValDef algOptList[] = {
+    /* Curves */
+    {"PRIME192V1", SEC_OID_ANSIX962_EC_PRIME192V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"PRIME192V2", SEC_OID_ANSIX962_EC_PRIME192V2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"PRIME192V3", SEC_OID_ANSIX962_EC_PRIME192V3,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"PRIME239V1", SEC_OID_ANSIX962_EC_PRIME239V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"PRIME239V2", SEC_OID_ANSIX962_EC_PRIME239V2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"PRIME239V3", SEC_OID_ANSIX962_EC_PRIME239V3,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"PRIME256V1", SEC_OID_ANSIX962_EC_PRIME256V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP112R1", SEC_OID_SECG_EC_SECP112R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP112R2", SEC_OID_SECG_EC_SECP112R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP128R1", SEC_OID_SECG_EC_SECP128R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP128R2", SEC_OID_SECG_EC_SECP128R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP160K1", SEC_OID_SECG_EC_SECP160K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP160R1", SEC_OID_SECG_EC_SECP160R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP160R2", SEC_OID_SECG_EC_SECP160R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP192K1", SEC_OID_SECG_EC_SECP192K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP192R1", SEC_OID_ANSIX962_EC_PRIME192V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP224K1", SEC_OID_SECG_EC_SECP224K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP256K1", SEC_OID_SECG_EC_SECP256K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP256R1", SEC_OID_ANSIX962_EC_PRIME256V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP384R1", SEC_OID_SECG_EC_SECP384R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECP521R1", SEC_OID_SECG_EC_SECP521R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    /* ANSI X9.62 named elliptic curves (characteristic two field) */
+    {"C2PNB163V1", SEC_OID_ANSIX962_EC_C2PNB163V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB163V2", SEC_OID_ANSIX962_EC_C2PNB163V2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB163V3", SEC_OID_ANSIX962_EC_C2PNB163V3,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB176V1", SEC_OID_ANSIX962_EC_C2PNB176V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB191V1", SEC_OID_ANSIX962_EC_C2TNB191V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB191V2", SEC_OID_ANSIX962_EC_C2TNB191V2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB191V3", SEC_OID_ANSIX962_EC_C2TNB191V3,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2ONB191V4", SEC_OID_ANSIX962_EC_C2ONB191V4,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2ONB191V5", SEC_OID_ANSIX962_EC_C2ONB191V5,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB208W1", SEC_OID_ANSIX962_EC_C2PNB208W1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB239V1", SEC_OID_ANSIX962_EC_C2TNB239V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB239V2", SEC_OID_ANSIX962_EC_C2TNB239V2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB239V3", SEC_OID_ANSIX962_EC_C2TNB239V3,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2ONB239V4", SEC_OID_ANSIX962_EC_C2ONB239V4,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2ONB239V5", SEC_OID_ANSIX962_EC_C2ONB239V5,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB272W1", SEC_OID_ANSIX962_EC_C2PNB272W1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB304W1", SEC_OID_ANSIX962_EC_C2PNB304W1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB359V1", SEC_OID_ANSIX962_EC_C2TNB359V1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2PNB368W1", SEC_OID_ANSIX962_EC_C2PNB368W1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"C2TNB431R1", SEC_OID_ANSIX962_EC_C2TNB431R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    /* SECG named elliptic curves (characteristic two field) */
+    {"SECT113R1", SEC_OID_SECG_EC_SECT113R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT131R1", SEC_OID_SECG_EC_SECT113R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT131R1", SEC_OID_SECG_EC_SECT131R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT131R2", SEC_OID_SECG_EC_SECT131R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT163K1", SEC_OID_SECG_EC_SECT163K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT163R1", SEC_OID_SECG_EC_SECT163R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT163R2", SEC_OID_SECG_EC_SECT163R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT193R1", SEC_OID_SECG_EC_SECT193R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT193R2", SEC_OID_SECG_EC_SECT193R2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT233K1", SEC_OID_SECG_EC_SECT233K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT233R1", SEC_OID_SECG_EC_SECT233R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT239K1", SEC_OID_SECG_EC_SECT239K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT283K1", SEC_OID_SECG_EC_SECT283K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT283R1", SEC_OID_SECG_EC_SECT283R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT409K1", SEC_OID_SECG_EC_SECT409K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT409R1", SEC_OID_SECG_EC_SECT409R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT571K1", SEC_OID_SECG_EC_SECT571K1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SECT571R1", SEC_OID_SECG_EC_SECT571R1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+
+    /* Hashes */
+    {"MD2", SEC_OID_MD2,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"MD4", SEC_OID_MD4,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"MD5", SEC_OID_MD5,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SHA1", SEC_OID_SHA1,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SHA224", SEC_OID_SHA224,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SHA256", SEC_OID_SHA256,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SHA384", SEC_OID_SHA384,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+    {"SHA512", SEC_OID_SHA512,
+     NSS_USE_ALG_IN_SSL_KX | NSS_USE_ALG_IN_CERT_SIGNATURE},
+
+    /* MACs */
+    {"HMAC-SHA1", SEC_OID_HMAC_SHA1, NSS_USE_ALG_IN_SSL},
+    {"HMAC-SHA224", SEC_OID_HMAC_SHA224, NSS_USE_ALG_IN_SSL},
+    {"HMAC-SHA256", SEC_OID_HMAC_SHA256, NSS_USE_ALG_IN_SSL},
+    {"HMAC-SHA384", SEC_OID_HMAC_SHA384, NSS_USE_ALG_IN_SSL},
+    {"HMAC-SHA512", SEC_OID_HMAC_SHA512, NSS_USE_ALG_IN_SSL},
+    {"HMAC-MD5", SEC_OID_HMAC_MD5, NSS_USE_ALG_IN_SSL},
+
+    /* Ciphers */
+    {"AES128-CBC", SEC_OID_AES_128_CBC, NSS_USE_ALG_IN_SSL},
+    {"AES192-CBC", SEC_OID_AES_192_CBC, NSS_USE_ALG_IN_SSL},
+    {"AES256-CBC", SEC_OID_AES_256_CBC, NSS_USE_ALG_IN_SSL},
+    {"AES128-GCM", SEC_OID_AES_128_GCM, NSS_USE_ALG_IN_SSL},
+    {"AES192-GCM", SEC_OID_AES_192_GCM, NSS_USE_ALG_IN_SSL},
+    {"AES256-GCM", SEC_OID_AES_256_GCM, NSS_USE_ALG_IN_SSL},
+    {"CAMELLIA128-CBC", SEC_OID_CAMELLIA_128_CBC, NSS_USE_ALG_IN_SSL},
+    {"CAMELLIA192-CBC", SEC_OID_CAMELLIA_192_CBC, NSS_USE_ALG_IN_SSL},
+    {"CAMELLIA256-CBC", SEC_OID_CAMELLIA_256_CBC, NSS_USE_ALG_IN_SSL},
+    {"SEED-CBC", SEC_OID_SEED_CBC, NSS_USE_ALG_IN_SSL},
+    {"DES-EDE3-CBC", SEC_OID_DES_EDE3_CBC, NSS_USE_ALG_IN_SSL},
+    {"DES-40-CBC", SEC_OID_DES_40_CBC, NSS_USE_ALG_IN_SSL},
+    {"DES-CBC", SEC_OID_DES_CBC, NSS_USE_ALG_IN_SSL},
+    {"NULL-CIPHER", SEC_OID_NULL_CIPHER, NSS_USE_ALG_IN_SSL},
+    {"RC2", SEC_OID_RC2_CBC, NSS_USE_ALG_IN_SSL},
+    {"RC4", SEC_OID_RC4, NSS_USE_ALG_IN_SSL},
+    {"IDEA", SEC_OID_IDEA_CBC, NSS_USE_ALG_IN_SSL},
+
+    /* Key exchange */
+    {"RSA", SEC_OID_TLS_RSA, NSS_USE_ALG_IN_SSL_KX},
+    {"RSA-EXPORT", SEC_OID_TLS_RSA_EXPORT, NSS_USE_ALG_IN_SSL_KX},
+    {"DHE-RSA", SEC_OID_TLS_DHE_RSA, NSS_USE_ALG_IN_SSL_KX},
+    {"DHE-DSS", SEC_OID_TLS_DHE_DSS, NSS_USE_ALG_IN_SSL_KX},
+    {"DH-RSA", SEC_OID_TLS_DH_RSA, NSS_USE_ALG_IN_SSL_KX},
+    {"DH-DSS", SEC_OID_TLS_DH_DSS, NSS_USE_ALG_IN_SSL_KX},
+    {"ECDHE-ECDSA", SEC_OID_TLS_ECDHE_ECDSA, NSS_USE_ALG_IN_SSL_KX},
+    {"ECDHE-RSA", SEC_OID_TLS_ECDHE_RSA, NSS_USE_ALG_IN_SSL_KX},
+    {"ECDH-ECDSA", SEC_OID_TLS_ECDH_ECDSA, NSS_USE_ALG_IN_SSL_KX},
+    {"ECDH-RSA", SEC_OID_TLS_ECDH_RSA, NSS_USE_ALG_IN_SSL_KX},
+
+    /* Versions */
+    {"SSL2.0", SEC_OID_SSL_V2_0, NSS_USE_ALG_IN_SSL_KX},
+    {"SSL3.0", SEC_OID_SSL_V3_0, NSS_USE_ALG_IN_SSL_KX},
+    {"TLS1.0", SEC_OID_TLS_V1_0, NSS_USE_ALG_IN_SSL_KX},
+    {"TLS1.1", SEC_OID_TLS_V1_1, NSS_USE_ALG_IN_SSL_KX},
+    {"TLS1.2", SEC_OID_TLS_V1_2, NSS_USE_ALG_IN_SSL_KX},
+    {"DTLS1.0", SEC_OID_DTLS_V1_0, NSS_USE_ALG_IN_SSL_KX},
+    {"DTLS1.2", SEC_OID_DTLS_V1_2, NSS_USE_ALG_IN_SSL_KX},
+};
+
+static const optionFreeDef freeOptList[] = {
+
+    /* Restrictions for RSA keys */
+    {STR("MIN-RSA"), NSS_RSA_MIN_KEY_SIZE},
+    {STR("MIN-DH"),  NSS_DH_MIN_KEY_SIZE},
+    {STR("MIN-DSA"), NSS_DSA_MIN_KEY_SIZE},
+};
+
+static SECStatus applyCryptoPolicy(char *policy)
+{
+    char *s, *sp, *p;
+    unsigned i;
+    SECStatus rv;
+    unsigned unknown;
+
+    if (policy == NULL) {
+        return SECSuccess;      /* do nothing */
+    }
+
+    p = policy;
+
+    /* disable all options by default */
+    for (i = 0; i < PR_ARRAY_SIZE(algOptList); i++) {
+        NSS_SetAlgorithmPolicy(algOptList[i].oid, 0, algOptList[i].val);
+    }
+
+    NSS_SetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, NSS_USE_POLICY_IN_SSL, 0);
+
+    do {
+        s = strtok_r(p, ":", &sp);
+        p = NULL;
+
+        if (s != NULL) {
+            unknown = 1;
+
+            for (i = 0; i < PR_ARRAY_SIZE(algOptList); i++) {
+                if (strcasecmp(algOptList[i].name, s) == 0) {
+                    rv = NSS_SetAlgorithmPolicy(algOptList[i].oid,
+                                                algOptList[i].val, 0);
+                    if (rv != SECSuccess) {
+                        /* could not enable option */
+                        rv = SECFailure;
+                        goto cleanup;
+                    }
+                    unknown = 0;
+                    break;
+                }
+            }
+
+            if (unknown != 0) {
+                for (i = 0; i < PR_ARRAY_SIZE(freeOptList); i++) {
+                   if (strncasecmp(freeOptList[i].name, s, 
freeOptList[i].name_size) == 0 &&
+                       s[freeOptList[i].name_size] == '=') {
+                       PRInt32 val = atoi(&s[freeOptList[i].name_size+1]);
+                       assert(val != 0);
+
+                        rv = NSS_OptionSet(freeOptList[i].option, val);
+                       if (rv != SECSuccess) {
+                            /* could not enable option */
+                            rv = SECFailure;
+                            goto cleanup;
+                        }
+                        unknown = 0;
+                        break;
+                   }
+                }
+            }
+
+            if (unknown != 0) {
+                fprintf(stderr, "error in term '%s'\n", s);
+                rv = SECFailure;
+                goto cleanup;
+            }
+        }
+    } while (s != NULL);
+
+  cleanup:
+    /*NSS cannot recover*/
+    rv = SECSuccess;
+    return rv;
+}
+
 /*
  * for 3.4 we continue to use the old SECMODModule structure
  */
@@ -145,10 +451,25 @@ SECMOD_CreateModuleEx(const char *library, const char 
*moduleName,
                                const char *parameters, const char *nss,
                                const char *config)
 {
-    SECMODModule *mod = secmod_NewModule();
+    SECMODModule *mod;
+    SECStatus rv;
     char *slotParams,*ciphers;
     /* pk11pars.h still does not have const char * interfaces */
     char *nssc = (char *)nss;
+    char *configc = NULL;
+
+    if (config) {
+        configc = PORT_Strdup(config); /* no const */
+    }
+    rv = applyCryptoPolicy(configc);
+    if (configc) PORT_Free(configc);
+
+    /* do not load the module if policy parsing fails */
+    if (rv != SECSuccess) {
+        return NULL;
+    }
+
+    mod = secmod_NewModule();
     if (mod == NULL) return NULL;
 
     mod->commonName = PORT_ArenaStrdup(mod->arena,moduleName ? moduleName : 
"");
@@ -159,9 +480,7 @@ SECMOD_CreateModuleEx(const char *library, const char 
*moduleName,
     if (parameters) {
        mod->libraryParams = PORT_ArenaStrdup(mod->arena,parameters);
     }
-    if (config) {
-       /* XXX: Apply configuration */
-    }
+
     mod->internal   = NSSUTIL_ArgHasFlag("flags","internal",nssc);
     mod->isFIPS     = NSSUTIL_ArgHasFlag("flags","FIPS",nssc);
     mod->isCritical = NSSUTIL_ArgHasFlag("flags","critical",nssc);
diff --git a/lib/ssl/ssl3con.c b/lib/ssl/ssl3con.c
index 5d9265c..918a037 100644
--- a/lib/ssl/ssl3con.c
+++ b/lib/ssl/ssl3con.c
@@ -256,56 +256,56 @@ static SSL3Statistics ssl3stats;
 
 /* indexed by SSL3BulkCipher */
 static const ssl3BulkCipherDef bulk_cipher_defs[] = {
-    /*                                       |--------- Lengths --------| */
-    /* cipher             calg               k  s  type         i  b  t  n */
-    /*                                       e  e               v  l  a  o */
-    /*                                       y  c               |  o  g  n */
-    /*                                       |  r               |  c  |  c */
-    /*                                       |  e               |  k  |  e */
-    /*                                       |  t               |  |  |  | */
-    {cipher_null,         calg_null,         0, 0, type_stream, 0, 0, 0, 0},
-    {cipher_rc4,          calg_rc4,         16,16, type_stream, 0, 0, 0, 0},
-    {cipher_rc4_40,       calg_rc4,         16, 5, type_stream, 0, 0, 0, 0},
-    {cipher_rc4_56,       calg_rc4,         16, 7, type_stream, 0, 0, 0, 0},
-    {cipher_rc2,          calg_rc2,         16,16, type_block,  8, 8, 0, 0},
-    {cipher_rc2_40,       calg_rc2,         16, 5, type_block,  8, 8, 0, 0},
-    {cipher_des,          calg_des,          8, 8, type_block,  8, 8, 0, 0},
-    {cipher_3des,         calg_3des,        24,24, type_block,  8, 8, 0, 0},
-    {cipher_des40,        calg_des,          8, 5, type_block,  8, 8, 0, 0},
-    {cipher_idea,         calg_idea,        16,16, type_block,  8, 8, 0, 0},
-    {cipher_aes_128,      calg_aes,         16,16, type_block, 16,16, 0, 0},
-    {cipher_aes_256,      calg_aes,         32,32, type_block, 16,16, 0, 0},
-    {cipher_camellia_128, calg_camellia,    16,16, type_block, 16,16, 0, 0},
-    {cipher_camellia_256, calg_camellia,    32,32, type_block, 16,16, 0, 0},
-    {cipher_seed,         calg_seed,        16,16, type_block, 16,16, 0, 0},
-    {cipher_aes_128_gcm,  calg_aes_gcm,     16,16, type_aead,   4, 0,16, 8},
-    {cipher_missing,      calg_null,         0, 0, type_stream, 0, 0, 0, 0},
+    /*                                       |--------- Lengths --------|    */
+    /* cipher             calg               k  s  type         i  b  t  n    
*/
+    /*                                       e  e               v  l  a  o  o 
*/
+    /*                                       y  c               |  o  g  n  i 
*/
+    /*                                       |  r               |  c  |  c  d 
*/
+    /*                                       |  e               |  k  |  e  | 
*/
+    /*                                       |  t               |  |  |  |  | 
*/
+    {cipher_null,         calg_null,         0, 0, type_stream, 0, 0, 0, 0, 
SEC_OID_NULL_CIPHER},
+    {cipher_rc4,          calg_rc4,         16,16, type_stream, 0, 0, 0, 0, 
SEC_OID_RC4},
+    {cipher_rc4_40,       calg_rc4,         16, 5, type_stream, 0, 0, 0, 0, 
SEC_OID_RC4_40},
+    {cipher_rc4_56,       calg_rc4,         16, 7, type_stream, 0, 0, 0, 0, 
SEC_OID_RC4_56},
+    {cipher_rc2,          calg_rc2,         16,16, type_block,  8, 8, 0, 0, 
SEC_OID_RC2_CBC},
+    {cipher_rc2_40,       calg_rc2,         16, 5, type_block,  8, 8, 0, 0, 
SEC_OID_RC2_40_CBC},
+    {cipher_des,          calg_des,          8, 8, type_block,  8, 8, 0, 0, 
SEC_OID_DES_CBC},
+    {cipher_3des,         calg_3des,        24,24, type_block,  8, 8, 0, 0, 
SEC_OID_DES_EDE3_CBC},
+    {cipher_des40,        calg_des,          8, 5, type_block,  8, 8, 0, 0, 
SEC_OID_DES_40_CBC},
+    {cipher_idea,         calg_idea,        16,16, type_block,  8, 8, 0, 0, 
SEC_OID_IDEA_CBC},
+    {cipher_aes_128,      calg_aes,         16,16, type_block, 16,16, 0, 0, 
SEC_OID_AES_128_CBC},
+    {cipher_aes_256,      calg_aes,         32,32, type_block, 16,16, 0, 0, 
SEC_OID_AES_256_CBC},
+    {cipher_camellia_128, calg_camellia,    16,16, type_block, 16,16, 0, 0, 
SEC_OID_CAMELLIA_128_CBC},
+    {cipher_camellia_256, calg_camellia,    32,32, type_block, 16,16, 0, 0, 
SEC_OID_CAMELLIA_256_CBC},
+    {cipher_seed,         calg_seed,        16,16, type_block, 16,16, 0, 0, 
SEC_OID_SEED_CBC},
+    {cipher_aes_128_gcm,  calg_aes_gcm,     16,16, type_aead,   4, 0,16, 8, 
SEC_OID_AES_128_GCM},
+    {cipher_missing,      calg_null,         0, 0, type_stream, 0, 0, 0, 0, 0},
 };
 
 static const ssl3KEADef kea_defs[] = 
 { /* indexed by SSL3KeyExchangeAlgorithm */
-    /* kea              exchKeyType signKeyType is_limited limit  tls_keygen */
-    {kea_null,           kt_null,     sign_null, PR_FALSE,   0, PR_FALSE},
-    {kea_rsa,            kt_rsa,      sign_rsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_rsa_export,     kt_rsa,      sign_rsa,  PR_TRUE,  512, PR_FALSE},
-    {kea_rsa_export_1024,kt_rsa,      sign_rsa,  PR_TRUE, 1024, PR_FALSE},
-    {kea_dh_dss,         kt_dh,       sign_dsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_dh_dss_export,  kt_dh,       sign_dsa,  PR_TRUE,  512, PR_FALSE},
-    {kea_dh_rsa,         kt_dh,       sign_rsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_dh_rsa_export,  kt_dh,       sign_rsa,  PR_TRUE,  512, PR_FALSE},
-    {kea_dhe_dss,        kt_dh,       sign_dsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_dhe_dss_export, kt_dh,       sign_dsa,  PR_TRUE,  512, PR_FALSE},
-    {kea_dhe_rsa,        kt_dh,       sign_rsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_dhe_rsa_export, kt_dh,       sign_rsa,  PR_TRUE,  512, PR_FALSE},
-    {kea_dh_anon,        kt_dh,       sign_null, PR_FALSE,   0, PR_FALSE},
-    {kea_dh_anon_export, kt_dh,       sign_null, PR_TRUE,  512, PR_FALSE},
-    {kea_rsa_fips,       kt_rsa,      sign_rsa,  PR_FALSE,   0, PR_TRUE },
+    /* kea              exchKeyType signKeyType is_limited limit  tls_keygen  
oid*/
+    {kea_null,           kt_null,     sign_null, PR_FALSE,   0, PR_FALSE, 0},
+    {kea_rsa,            kt_rsa,      sign_rsa,  PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_RSA},
+    {kea_rsa_export,     kt_rsa,      sign_rsa,  PR_TRUE,  512, PR_FALSE, 
SEC_OID_TLS_RSA_EXPORT},
+    {kea_rsa_export_1024,kt_rsa,      sign_rsa,  PR_TRUE, 1024, PR_FALSE, 
SEC_OID_TLS_RSA_EXPORT},
+    {kea_dh_dss,         kt_dh,       sign_dsa,  PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_DH_DSS},
+    {kea_dh_dss_export,  kt_dh,       sign_dsa,  PR_TRUE,  512, PR_FALSE, 
SEC_OID_TLS_DH_DSS},
+    {kea_dh_rsa,         kt_dh,       sign_rsa,  PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_DH_RSA},
+    {kea_dh_rsa_export,  kt_dh,       sign_rsa,  PR_TRUE,  512, PR_FALSE, 
SEC_OID_TLS_DH_RSA},
+    {kea_dhe_dss,        kt_dh,       sign_dsa,  PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_DHE_DSS},
+    {kea_dhe_dss_export, kt_dh,       sign_dsa,  PR_TRUE,  512, PR_FALSE, 
SEC_OID_TLS_DHE_DSS},
+    {kea_dhe_rsa,        kt_dh,       sign_rsa,  PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_DHE_RSA},
+    {kea_dhe_rsa_export, kt_dh,       sign_rsa,  PR_TRUE,  512, PR_FALSE, 
SEC_OID_TLS_DHE_RSA},
+    {kea_dh_anon,        kt_dh,       sign_null, PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_DH_ANON},
+    {kea_dh_anon_export, kt_dh,       sign_null, PR_TRUE,  512, PR_FALSE, 
SEC_OID_TLS_DH_ANON},
+    {kea_rsa_fips,       kt_rsa,      sign_rsa,  PR_FALSE,   0, PR_TRUE,  
SEC_OID_TLS_RSA},
 #ifndef NSS_DISABLE_ECC
-    {kea_ecdh_ecdsa,     kt_ecdh,     sign_ecdsa,  PR_FALSE, 0, PR_FALSE},
-    {kea_ecdhe_ecdsa,    kt_ecdh,     sign_ecdsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_ecdh_rsa,       kt_ecdh,     sign_rsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_ecdhe_rsa,      kt_ecdh,     sign_rsa,  PR_FALSE,   0, PR_FALSE},
-    {kea_ecdh_anon,      kt_ecdh,     sign_null,  PR_FALSE,   0, PR_FALSE},
+    {kea_ecdh_ecdsa,     kt_ecdh,     sign_ecdsa,  PR_FALSE, 0, PR_FALSE,   
SEC_OID_TLS_ECDH_ECDSA},
+    {kea_ecdhe_ecdsa,    kt_ecdh,     sign_ecdsa,  PR_FALSE,   0, PR_FALSE, 
SEC_OID_TLS_ECDHE_ECDSA},
+    {kea_ecdh_rsa,       kt_ecdh,     sign_rsa,  PR_FALSE,   0, PR_FALSE,   
SEC_OID_TLS_ECDH_RSA},
+    {kea_ecdhe_rsa,      kt_ecdh,     sign_rsa,  PR_FALSE,   0, PR_FALSE,   
SEC_OID_TLS_ECDHE_RSA},
+    {kea_ecdh_anon,      kt_ecdh,     sign_null,  PR_FALSE,   0, PR_FALSE,  
SEC_OID_TLS_ECDH_ANON},
 #endif /* NSS_DISABLE_ECC */
 };
 
@@ -483,13 +483,13 @@ static const SSLCipher2Mech alg2Mech[] = {
 static const ssl3MACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */
     /* pad_size is only used for SSL 3.0 MAC. See RFC 6101 Sec. 5.2.3.1. */
     /* mac      mmech       pad_size  mac_size                       */
-    { mac_null, mmech_invalid,    0,  0          },
-    { mac_md5,  mmech_md5,       48,  MD5_LENGTH },
-    { mac_sha,  mmech_sha,       40,  SHA1_LENGTH},
-    {hmac_md5,  mmech_md5_hmac,   0,  MD5_LENGTH },
-    {hmac_sha,  mmech_sha_hmac,   0,  SHA1_LENGTH},
-    {hmac_sha256, mmech_sha256_hmac, 0, SHA256_LENGTH},
-    { mac_aead, mmech_invalid,    0,  0          },
+    { mac_null, mmech_invalid,    0,  0         ,  0},
+    { mac_md5,  mmech_md5,       48,  MD5_LENGTH,  SEC_OID_HMAC_MD5 },
+    { mac_sha,  mmech_sha,       40,  SHA1_LENGTH, SEC_OID_HMAC_SHA1},
+    {hmac_md5,  mmech_md5_hmac,   0,  MD5_LENGTH,  SEC_OID_HMAC_MD5},
+    {hmac_sha,  mmech_sha_hmac,   0,  SHA1_LENGTH, SEC_OID_HMAC_SHA1},
+    {hmac_sha256, mmech_sha256_hmac, 0, SHA256_LENGTH, SEC_OID_HMAC_SHA256},
+    { mac_aead, mmech_invalid,    0,  0, 0 },
 };
 
 /* indexed by SSL3BulkCipher */
@@ -12089,4 +12089,98 @@ ssl3_DestroySSL3Info(sslSocket *ss)
     SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
 }
 
+typedef struct {
+    SSL3ProtocolVersion num;
+    SSLProtocolVariant variant;
+} rangeDef;
+
+static const rangeDef rangeList[] = {
+    {SSL_LIBRARY_VERSION_2, ssl_variant_stream},
+    {SSL_LIBRARY_VERSION_3_0, ssl_variant_stream},
+    {SSL_LIBRARY_VERSION_TLS_1_0, ssl_variant_stream},
+    {SSL_LIBRARY_VERSION_TLS_1_1, ssl_variant_stream},
+    {SSL_LIBRARY_VERSION_TLS_1_2, ssl_variant_stream},
+    {SSL_LIBRARY_VERSION_TLS_1_1, ssl_variant_datagram},
+    {SSL_LIBRARY_VERSION_TLS_1_2, ssl_variant_datagram},
+};
+
+SECStatus SSL_applyNSSPolicy(void)
+ {
+    unsigned i;
+    SECStatus rv;
+    PRUint32 policy = 0;
+    SSLVersionRange range;
+    SSLProtocolVariant variant;
+    const ssl3CipherSuiteDef *suite;
+
+    NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policy);
+    if (!(policy & NSS_USE_POLICY_IN_SSL)) {
+        return SECSuccess;      /* do nothing */
+    }
+
+    /* disable every ciphersuite */
+    for (i = 0; i < PR_ARRAY_SIZE(cipher_suite_defs); ++i) {
+        SSL_CipherPrefSetDefault(cipher_suite_defs[i].cipher_suite, PR_FALSE);
+
+        suite = &cipher_suite_defs[i];
+
+        rv = NSS_GetAlgorithmPolicy(kea_defs[suite->key_exchange_alg].oid, 
&policy);
+        if (rv != SECSuccess || !(policy & NSS_USE_ALG_IN_SSL_KX)) {
+               SSL_CipherPolicySet(cipher_suite_defs[i].cipher_suite, 
SSL_NOT_ALLOWED);
+               continue;
+       }
+
+        rv = 
NSS_GetAlgorithmPolicy(bulk_cipher_defs[suite->bulk_cipher_alg].oid, &policy);
+        if (rv != SECSuccess || !(policy & NSS_USE_ALG_IN_SSL)) {
+               SSL_CipherPolicySet(cipher_suite_defs[i].cipher_suite, 
SSL_NOT_ALLOWED);
+               continue;
+       }
+
+       if (bulk_cipher_defs[suite->bulk_cipher_alg].type != type_aead) {
+               rv = NSS_GetAlgorithmPolicy(mac_defs[suite->mac_alg].oid, 
&policy);
+               if (rv != SECSuccess || !(policy & NSS_USE_ALG_IN_SSL)) {
+                       SSL_CipherPolicySet(cipher_suite_defs[i].cipher_suite, 
SSL_NOT_ALLOWED);
+                       continue;
+               }
+       }
+
+       /*fprintf(stderr, "enabling: %.4x\n", 
cipher_suite_defs[i].cipher_suite);*/
+        rv = SSL_CipherPrefSetDefault(cipher_suite_defs[i].cipher_suite, 
PR_TRUE);
+        if (rv != SECSuccess) {
+             /* could not apply ciphersuite! */
+         }
+    }
+
+    for (variant = ssl_variant_stream; variant <= ssl_variant_datagram; 
variant++) {
+        range.min = 0;
+       for (i = 0; i < PR_ARRAY_SIZE(rangeList); i++) {
+            if (rangeList[i].variant != variant)
+               continue;
+            rv = NSS_GetAlgorithmPolicy(rangeList[i].num, &policy);
+            if (rv == SECSuccess && (policy & NSS_USE_ALG_IN_SSL_KX)) {
+               range.min = rangeList[i].num;
+               variant = rangeList[i].variant;
+               break;
+            }
+        }
+
+        if (range.min != 0) {
+            range.max = range.min;
+            for (i = PR_ARRAY_SIZE(rangeList)-1; i>=0; i--) {
+                if (rangeList[i].variant != variant)
+                    continue;
+
+                rv = NSS_GetAlgorithmPolicy(rangeList[i].num, &policy);
+                if (rv == SECSuccess && (policy & NSS_USE_ALG_IN_SSL_KX)) {
+                    range.max = rangeList[i].num;
+                    break;
+                }
+            }
+            SSL_VersionRangeSetDefault(variant, &range);
+        }
+    }
+
+    return SECSuccess;
+}
+
 /* End of ssl3con.c */
diff --git a/lib/ssl/sslimpl.h b/lib/ssl/sslimpl.h
index af3c191..ae69f04 100644
--- a/lib/ssl/sslimpl.h
+++ b/lib/ssl/sslimpl.h
@@ -726,6 +726,7 @@ typedef struct {
     PRBool                   is_limited;
     int                      key_size_limit;
     PRBool                   tls_keygen;
+    SECOidTag                oid;
 } ssl3KEADef;
 
 /*
@@ -741,6 +742,7 @@ struct ssl3BulkCipherDefStr {
     int             block_size;
     int             tag_size;  /* authentication tag size for AEAD ciphers. */
     int             explicit_nonce_size;               /* for AEAD ciphers. */
+    SECOidTag       oid;
 };
 
 /*
@@ -751,6 +753,7 @@ struct ssl3MACDefStr {
     CK_MECHANISM_TYPE mmech;
     int              pad_size;
     int              mac_size;
+    SECOidTag        oid;
 };
 
 typedef enum {
@@ -1900,6 +1903,8 @@ SECStatus SSL_DisableDefaultExportCipherSuites(void);
 SECStatus SSL_DisableExportCipherSuites(PRFileDesc * fd);
 PRBool    SSL_IsExportCipherSuite(PRUint16 cipherSuite);
 
+SECStatus SSL_applyNSSPolicy(void);
+
 extern SECStatus
 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec,
                             const char *label, unsigned int labelLen,
diff --git a/lib/ssl/sslinit.c b/lib/ssl/sslinit.c
index bb9df25..4a9b70e 100644
--- a/lib/ssl/sslinit.c
+++ b/lib/ssl/sslinit.c
@@ -11,6 +11,7 @@
 #include "secerr.h"
 #include "ssl.h"
 #include "sslimpl.h"
+#include "sslproto.h"
 
 static int ssl_inited = 0;
 
@@ -26,8 +27,8 @@ ssl_Init(void)
 #ifdef DEBUG
         ssl3_CheckCipherSuiteOrderConsistency();
 #endif
-
        ssl_inited = 1;
+       SSL_applyNSSPolicy();
     }
     return SECSuccess;
 }
diff --git a/lib/util/secoid.c b/lib/util/secoid.c
index 9f121be..4f76803 100644
--- a/lib/util/secoid.c
+++ b/lib/util/secoid.c
@@ -169,6 +169,11 @@ const char __nss_util_sccsid[] = "@(#)NSS " 
NSSUTIL_VERSION _DEBUG_STRING
 #define CAMELLIA_ENCRYPT_OID MITSUBISHI_ALG,1
 #define CAMELLIA_WRAP_OID    MITSUBISHI_ALG,3
 
+/* For IDEA: 1.3.6.1.4.1.188.7.1.1
+ */
+#define ASCOM_OID 0x2b,0x6,0x1,0x4,0x1,0xbc
+#define ASCOM_IDEA_ALG ASCOM_OID,0x7,0x1,0x1
+
 /* for SEED : iso(1) member-body(2) korea(410)
  *    kisa(200004) algorithm(1)
  */
@@ -465,6 +470,10 @@ CONST_OID netscapeSMimeKEA[]                       = { 
NETSCAPE_ALGS, 0x01 };
 CONST_OID skipjackCBC[]                        = { MISSI, 0x04 };
 CONST_OID dhPublicKey[]                        = { ANSI_X942_ALGORITHM, 0x1 };
 
+CONST_OID idea_CBC[]                           = { ASCOM_IDEA_ALG, 2 };
+CONST_OID aes128_GCM[]                                 = { AES, 0x6 };
+CONST_OID aes192_GCM[]                                 = { AES, 0x1a };
+CONST_OID aes256_GCM[]                                 = { AES, 0x23 };
 CONST_OID aes128_ECB[]                                 = { AES, 1 };
 CONST_OID aes128_CBC[]                                 = { AES, 2 };
 #ifdef DEFINE_ALL_AES_CIPHERS
@@ -588,8 +597,10 @@ CONST_OID evIncorporationCountry[]      = { 
EV_NAME_ATTRIBUTE, 3 };
 #define OI(x) { siDEROID, (unsigned char *)x, sizeof x }
 #ifndef SECOID_NO_STRINGS
 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, desc, mech, ext }
+#define ODE(tag,desc,mech,ext) { { siDEROID, NULL, 0 }, tag, desc, mech, ext }
 #else
 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, 0, mech, ext }
+#define ODE(tag,desc,mech,ext) { { siDEROID, NULL, 0 }, tag, 0, mech, ext }
 #endif
 
 #if defined(NSS_ALLOW_UNSUPPORTED_CRITICAL)
@@ -1648,7 +1659,71 @@ const static SECOidData oids[SEC_OID_TOTAL] = {
         "Microsoft Trust List Signing",
        CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
     OD( x520Name, SEC_OID_AVA_NAME,
-       "X520 Name",    CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION )
+       "X520 Name",    CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+
+
+    OD( aes128_GCM, SEC_OID_AES_128_GCM,
+       "AES-128-GCM", CKM_AES_GCM, INVALID_CERT_EXTENSION ),
+    OD( aes192_GCM, SEC_OID_AES_192_GCM,
+       "AES-192-GCM", CKM_AES_GCM, INVALID_CERT_EXTENSION ),
+    OD( aes256_GCM, SEC_OID_AES_256_GCM,
+       "AES-256-GCM", CKM_AES_GCM, INVALID_CERT_EXTENSION ),
+    OD( idea_CBC, SEC_OID_IDEA_CBC,
+       "IDEA_CBC", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+
+    ODE( SEC_OID_RC2_40_CBC,
+       "RC2-40-CBC", CKM_RC2_CBC, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_DES_40_CBC,
+       "DES-40-CBC", CKM_RC2_CBC, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_RC4_40,
+       "RC4-40", CKM_RC4, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_RC4_56,
+       "RC4-56", CKM_RC4, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_NULL_CIPHER,
+       "NULL cipher", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_HMAC_MD5,
+       "HMAC-MD5", CKM_MD5_HMAC, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_RSA,
+       "TLS RSA key exchange", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_DHE_RSA,
+       "TLS DHE-RSA key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_DHE_DSS,
+       "TLS DHE-DSS key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_DH_RSA,
+       "TLS DH-RSA key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_DH_DSS,
+       "TLS DH-DSS key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_DH_ANON,
+       "TLS DH-ANON key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_ECDHE_ECDSA,
+       "TLS ECDHE-ECDSA key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_ECDHE_RSA,
+       "TLS ECDHE-RSA key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_ECDH_ECDSA,
+       "TLS ECDH-ECDSA key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_ECDH_RSA,
+       "TLS ECDH-RSA key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_ECDH_ANON,
+       "TLS ECDH-ANON key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_RSA_EXPORT,
+       "TLS RSA-EXPORT key exchange", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_SSL_V2_0,
+       "SSL 2.0 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_SSL_V3_0,
+       "SSL 3.0 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_V1_0,
+       "TLS 1.0 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_V1_1,
+       "TLS 1.1 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_TLS_V1_2,
+       "TLS 1.2 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_DTLS_V1_0,
+       "DTLS 1.0 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_DTLS_V1_2,
+       "DTLS 1.2 protocol", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION ),
+    ODE( SEC_OID_APPLY_SSL_POLICY,
+       "Apply SSL policy (pseudo-OID)", CKM_INVALID_MECHANISM, 
INVALID_CERT_EXTENSION ),
+
 };
 
 /* PRIVATE EXTENDED SECOID Table
@@ -1881,6 +1956,7 @@ secoid_HashNumber(const void *key)
     return (PLHashNumber) key;
 }
 
+#define DEF_FLAGS 
(NSS_USE_ALG_IN_CERT_SIGNATURE|NSS_USE_ALG_IN_SSL_KX|NSS_USE_ALG_IN_SSL_KX)
 static void
 handleHashAlgSupport(char * envVal)
 {
@@ -1896,14 +1972,14 @@ handleHashAlgSupport(char * envVal)
                *nextArg++ = '\0';
            }
        }
-       notEnable = (*arg == '-') ? 
(NSS_USE_ALG_IN_CERT_SIGNATURE|NSS_USE_ALG_IN_SSL_KX) : 0;
+       notEnable = (*arg == '-') ? (DEF_FLAGS) : 0;
        if ((*arg == '+' || *arg == '-') && *++arg) { 
            int i;
 
            for (i = 1; i < SEC_OID_TOTAL; i++) {
                if (oids[i].desc && strstr(arg, oids[i].desc)) {
                     xOids[i].notPolicyFlags = notEnable |
-                   (xOids[i].notPolicyFlags & 
~(NSS_USE_ALG_IN_CERT_SIGNATURE|NSS_USE_ALG_IN_SSL_KX));
+                   (xOids[i].notPolicyFlags & ~(DEF_FLAGS));
                }
            }
        }
diff --git a/lib/util/secoidt.h b/lib/util/secoidt.h
index 747450e..3772643 100644
--- a/lib/util/secoidt.h
+++ b/lib/util/secoidt.h
@@ -443,6 +443,44 @@ typedef enum {
     /* The 'name' attribute type in X.520 */
     SEC_OID_AVA_NAME                        = 317,
 
+
+    SEC_OID_AES_128_GCM                            = 318,
+    SEC_OID_AES_192_GCM                    = 319,
+    SEC_OID_AES_256_GCM                    = 320,
+    SEC_OID_IDEA_CBC                       = 321,
+
+    /* pseudo - OIDs */
+
+    SEC_OID_RC2_40_CBC                             = 322,
+    SEC_OID_DES_40_CBC                             = 323,
+    SEC_OID_RC4_40                         = 324,
+    SEC_OID_RC4_56                         = 325,
+    SEC_OID_NULL_CIPHER                     = 326,
+
+    SEC_OID_HMAC_MD5                        = 327,
+
+    SEC_OID_TLS_RSA                         = 328,
+    SEC_OID_TLS_DHE_RSA                     = 329,
+    SEC_OID_TLS_DHE_DSS                     = 330,
+    SEC_OID_TLS_DH_RSA                      = 331,
+    SEC_OID_TLS_DH_DSS                      = 332,
+    SEC_OID_TLS_DH_ANON                     = 333,
+    SEC_OID_TLS_ECDHE_ECDSA                 = 334,
+    SEC_OID_TLS_ECDHE_RSA                   = 335,
+    SEC_OID_TLS_ECDH_ECDSA                  = 336,
+    SEC_OID_TLS_ECDH_RSA                    = 337,
+    SEC_OID_TLS_ECDH_ANON                   = 338,
+    SEC_OID_TLS_RSA_EXPORT                  = 339,
+
+    SEC_OID_SSL_V2_0                  = 340,
+    SEC_OID_SSL_V3_0                  = 341,
+    SEC_OID_TLS_V1_0                  = 342,
+    SEC_OID_TLS_V1_1                  = 343,
+    SEC_OID_TLS_V1_2                  = 344,
+    SEC_OID_DTLS_V1_0                  = 345,
+    SEC_OID_DTLS_V1_2                  = 346,
+    SEC_OID_APPLY_SSL_POLICY           = 347,
+
     SEC_OID_TOTAL
 } SECOidTag;
 
@@ -477,6 +515,8 @@ struct SECOidDataStr {
 #define NSS_USE_ALG_IN_CERT_SIGNATURE  0x00000001  /* CRLs and OCSP, too */
 #define NSS_USE_ALG_IN_CMS_SIGNATURE   0x00000002  /* used in S/MIME */
 #define NSS_USE_ALG_IN_SSL_KX          0x00000004  /* used in SSL key exchange 
*/
+#define NSS_USE_ALG_IN_SSL             0x00000008  /* used in SSL record 
protocol */
+#define NSS_USE_POLICY_IN_SSL          0x00000010  /* enable policy in SSL 
protocol */
 #define NSS_USE_ALG_RESERVED           0xfffffffc  /* may be used in future */
 
 /* Code MUST NOT SET or CLEAR reserved bits, and must NOT depend on them
-- 
1.9.0


-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to