15cfeca
diff --git a/lib/freebl/blapit.h b/lib/freebl/blapit.h
15cfeca
--- a/lib/freebl/blapit.h
15cfeca
+++ b/lib/freebl/blapit.h
15cfeca
@@ -387,17 +387,18 @@ typedef struct DHPrivateKeyStr DHPrivate
15cfeca
 */
15cfeca
 
15cfeca
 /*
15cfeca
 ** The ECParams data structures can encode elliptic curve
15cfeca
 ** parameters for both GFp and GF2m curves.
15cfeca
 */
15cfeca
 
15cfeca
 typedef enum { ec_params_explicit,
15cfeca
-               ec_params_named
15cfeca
+               ec_params_named,
15cfeca
+               ec_params_edwards_named
15cfeca
 } ECParamsType;
15cfeca
 
15cfeca
 typedef enum { ec_field_GFp = 1,
15cfeca
                ec_field_GF2m,
15cfeca
                ec_field_plain
15cfeca
 } ECFieldType;
15cfeca
 
15cfeca
 struct ECFieldIDStr {
15cfeca
diff --git a/lib/freebl/ecdecode.c b/lib/freebl/ecdecode.c
15cfeca
--- a/lib/freebl/ecdecode.c
15cfeca
+++ b/lib/freebl/ecdecode.c
15cfeca
@@ -171,16 +171,17 @@ EC_FillParams(PLArenaPool *arena, const 
15cfeca
              * (the NIST P-521 curve)
15cfeca
              */
15cfeca
             CHECK_SEC_OK(gf_populate_params_bytes(ECCurve_SECG_PRIME_521R1,
15cfeca
                                                   ec_field_GFp, params));
15cfeca
             break;
15cfeca
 
15cfeca
         case SEC_OID_CURVE25519:
15cfeca
             /* Populate params for Curve25519 */
15cfeca
+            params->type = ec_params_edwards_named;
15cfeca
             CHECK_SEC_OK(gf_populate_params_bytes(ECCurve25519,
15cfeca
                                                   ec_field_plain,
15cfeca
                                                   params));
15cfeca
             break;
15cfeca
 
15cfeca
         default:
15cfeca
             break;
15cfeca
     };
15cfeca
diff --git a/lib/softoken/pkcs11.c b/lib/softoken/pkcs11.c
15cfeca
--- a/lib/softoken/pkcs11.c
15cfeca
+++ b/lib/softoken/pkcs11.c
15cfeca
@@ -1921,17 +1921,17 @@ sftk_GetPubKey(SFTKObject *object, CK_KE
15cfeca
                 /* special note: We can't just use the first byte to distinguish
15cfeca
                  * between EC_POINT_FORM_UNCOMPRESSED and SEC_ASN1_OCTET_STRING.
15cfeca
                  * Both are 0x04. */
15cfeca
 
15cfeca
                 /* Handle the non-DER encoded case.
15cfeca
                  * Some curves are always pressumed to be non-DER.
15cfeca
                  */
15cfeca
                 if (pubKey->u.ec.publicValue.len == keyLen &&
15cfeca
-                    (pubKey->u.ec.ecParams.fieldID.type == ec_field_plain ||
15cfeca
+                    (pubKey->u.ec.ecParams.type == ec_params_edwards_named ||
15cfeca
                      pubKey->u.ec.publicValue.data[0] == EC_POINT_FORM_UNCOMPRESSED)) {
15cfeca
                     break; /* key was not DER encoded, no need to unwrap */
15cfeca
                 }
15cfeca
 
15cfeca
                 /* handle the encoded case */
15cfeca
                 if ((pubKey->u.ec.publicValue.data[0] == SEC_ASN1_OCTET_STRING) &&
15cfeca
                     pubKey->u.ec.publicValue.len > keyLen) {
15cfeca
                     SECItem publicValue;
15cfeca
@@ -1941,17 +1941,17 @@ sftk_GetPubKey(SFTKObject *object, CK_KE
15cfeca
                                                 SEC_ASN1_GET(SEC_OctetStringTemplate),
15cfeca
                                                 &pubKey->u.ec.publicValue);
15cfeca
                     /* nope, didn't decode correctly */
15cfeca
                     if ((rv != SECSuccess) || (publicValue.len != keyLen)) {
15cfeca
                         crv = CKR_ATTRIBUTE_VALUE_INVALID;
15cfeca
                         break;
15cfeca
                     }
15cfeca
                     /* we don't handle compressed points except in the case of ECCurve25519 */
15cfeca
-                    if ((pubKey->u.ec.ecParams.fieldID.type != ec_field_plain) &&
15cfeca
+                    if ((pubKey->u.ec.ecParams.type != ec_params_edwards_named) &&
15cfeca
                         (publicValue.data[0] != EC_POINT_FORM_UNCOMPRESSED)) {
15cfeca
                         crv = CKR_ATTRIBUTE_VALUE_INVALID;
15cfeca
                         break;
15cfeca
                     }
15cfeca
                     /* replace our previous with the decoded key */
15cfeca
                     pubKey->u.ec.publicValue = publicValue;
15cfeca
                     break;
15cfeca
                 }
15cfeca
diff --git a/lib/softoken/pkcs11c.c b/lib/softoken/pkcs11c.c
15cfeca
--- a/lib/softoken/pkcs11c.c
15cfeca
+++ b/lib/softoken/pkcs11c.c
15cfeca
@@ -5655,17 +5655,17 @@ NSC_GenerateKeyPair(CK_SESSION_HANDLE hS
15cfeca
                     sftk_fatalError = PR_TRUE;
15cfeca
                 }
15cfeca
                 PORT_FreeArena(ecParams->arena, PR_TRUE);
15cfeca
                 crv = sftk_MapCryptError(PORT_GetError());
15cfeca
                 break;
15cfeca
             }
15cfeca
 
15cfeca
             if (PR_GetEnvSecure("NSS_USE_DECODED_CKA_EC_POINT") ||
15cfeca
-                ecParams->fieldID.type == ec_field_plain) {
15cfeca
+                ecParams->type == ec_params_edwards_named) {
15cfeca
                 PORT_FreeArena(ecParams->arena, PR_TRUE);
15cfeca
                 crv = sftk_AddAttributeType(publicKey, CKA_EC_POINT,
15cfeca
                                             sftk_item_expand(&ecPriv->publicValue));
15cfeca
             } else {
15cfeca
                 PORT_FreeArena(ecParams->arena, PR_TRUE);
15cfeca
                 SECItem *pubValue = SEC_ASN1EncodeItem(NULL, NULL,
15cfeca
                                                        &ecPriv->publicValue,
15cfeca
                                                        SEC_ASN1_GET(SEC_OctetStringTemplate));