Skip to content

Commit dac7aed

Browse files
committed
Fix Edwards and Montgomery "field_length"
The Edwards and Montgomery "field_lenigth" were modified with 255 changed to 256 and 448 changed 456 The field_length in bits, and is usd to caculate number of bytes. The BYTES4BITS(255) returns 32 as does BTYES4BITS(256) so the 25519 curves have been working. But BYTES4BITS(448) returns 56, but 57 is needed so BYTES4BITS(456) returns 57 as required in the RFCs. On branch ED448-X448-fix Changes to be committed: modified: src/libopensc/pkcs15-pubkey.c modified: src/pkcs11/framework-pkcs15.c modified: src/tools/pkcs11-tool.c modified: src/tools/pkcs15-init.c
1 parent 52bc91c commit dac7aed

File tree

4 files changed

+32
-32
lines changed

4 files changed

+32
-32
lines changed

src/libopensc/pkcs15-pubkey.c

+8-8
Original file line numberDiff line numberDiff line change
@@ -1524,17 +1524,17 @@ static struct ec_curve_info {
15241524

15251525
/* OpenPGP extensions by Yubikey and GNUK are not defined in RFCs but we know the oid written to card */
15261526

1527-
{"edwards25519", "1.3.6.1.4.1.11591.15.1", {(u8 *)"\x06\x09\x2B\x06\x01\x04\x01\xDA\x47\x0F\x01", 11}, 255, SC_ALGORITHM_EDDSA},
1528-
{"curve25519", "1.3.6.1.4.1.3029.1.5.1", {(u8 *)"\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x05\x01", 12}, 255, SC_ALGORITHM_XEDDSA},
1527+
{"edwards25519", "1.3.6.1.4.1.11591.15.1", {(u8 *)"\x06\x09\x2B\x06\x01\x04\x01\xDA\x47\x0F\x01", 11}, 256, SC_ALGORITHM_EDDSA},
1528+
{"curve25519", "1.3.6.1.4.1.3029.1.5.1", {(u8 *)"\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x05\x01", 12}, 256, SC_ALGORITHM_XEDDSA},
15291529

15301530
/* RFC 8410 defined curves */
1531-
{"X25519", "1.3.101.110", {(u8 *)"\x06\x03\x2b\x65\x6e", 5}, 255, SC_ALGORITHM_XEDDSA},
1532-
{"X448", "1.3.101.111", {(u8 *)"\x06\x03\x2b\x65\x6f", 5}, 448, SC_ALGORITHM_XEDDSA},
1533-
{"Ed25519", "1.3.101.112", {(u8 *)"\x06\x03\x2b\x65\x70", 5}, 255, SC_ALGORITHM_EDDSA},
1534-
{"Ed448", "1.3.101.113", {(u8 *)"\x06\x03\x2b\x65\x71", 5}, 448, SC_ALGORITHM_EDDSA},
1531+
{"X25519", "1.3.101.110", {(u8 *)"\x06\x03\x2b\x65\x6e", 5}, 256, SC_ALGORITHM_XEDDSA},
1532+
{"X448", "1.3.101.111", {(u8 *)"\x06\x03\x2b\x65\x6f", 5}, 456, SC_ALGORITHM_XEDDSA},
1533+
{"Ed25519", "1.3.101.112", {(u8 *)"\x06\x03\x2b\x65\x70", 5}, 256, SC_ALGORITHM_EDDSA},
1534+
{"Ed448", "1.3.101.113", {(u8 *)"\x06\x03\x2b\x65\x71", 5}, 456, SC_ALGORITHM_EDDSA},
15351535
/* GnuPG openpgp curves as used in gnupg-card are equivalent to RFC8410 OIDs */
1536-
{"cv25519", "1.3.101.110", {(u8 *)"\x06\x03\x2b\x65\x6e", 5}, 255, SC_ALGORITHM_XEDDSA},
1537-
{"ed25519", "1.3.101.112", {(u8 *)"\x06\x03\x2b\x65\x70", 5}, 255, SC_ALGORITHM_EDDSA},
1536+
{"cv25519", "1.3.101.110", {(u8 *)"\x06\x03\x2b\x65\x6e", 5}, 256, SC_ALGORITHM_XEDDSA},
1537+
{"ed25519", "1.3.101.112", {(u8 *)"\x06\x03\x2b\x65\x70", 5}, 256, SC_ALGORITHM_EDDSA},
15381538

15391539
{NULL, NULL, {NULL, 0}, 0, 0}, /* Do not touch this */
15401540
};

src/pkcs11/framework-pkcs15.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -2866,17 +2866,17 @@ pkcs15_create_public_key(struct sc_pkcs11_slot *slot, struct sc_profile *profile
28662866
}
28672867

28682868
if (key_type == CKK_EC_EDWARDS) {
2869-
if (ec->ecpointQ.len == BYTES4BITS(255))
2869+
if (ec->ecpointQ.len == BYTES4BITS(256))
28702870
ec->params.id = oid_ED25519;
2871-
else if (ec->ecpointQ.len == BYTES4BITS(448))
2871+
else if (ec->ecpointQ.len == BYTES4BITS(456))
28722872
ec->params.id = oid_ED448;
28732873
else
28742874
return CKR_ATTRIBUTE_VALUE_INVALID;
28752875

28762876
} else if (key_type == CKK_EC_MONTGOMERY) {
2877-
if (ec->ecpointQ.len == BYTES4BITS(255))
2877+
if (ec->ecpointQ.len == BYTES4BITS(256))
28782878
ec->params.id = oid_X25519;
2879-
else if (ec->ecpointQ.len == BYTES4BITS(448))
2879+
else if (ec->ecpointQ.len == BYTES4BITS(456))
28802880
ec->params.id = oid_X448;
28812881
else
28822882
return CKR_ATTRIBUTE_VALUE_INVALID;

src/tools/pkcs11-tool.c

+13-13
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,19 @@ static struct ec_curve_info {
154154
/* Some of the following may not yet be supported by the OpenSC module, but may be by other modules */
155155
/* OpenPGP extensions by Yubikey and GNUK are not defined in RFCs, so pass by printable string */
156156
/* See PKCS#11 3.0 2.3.7 */
157-
{"edwards25519", "1.3.6.1.4.1.11591.15.1", (unsigned char*)"\x13\x0c\x65\x64\x77\x61\x72\x64\x73\x32\x35\x35\x31\x39", 14, 255, CKM_EC_EDWARDS_KEY_PAIR_GEN}, /* send by curve name */
158-
{"curve25519", "1.3.6.1.4.1.3029.1.5.1", (unsigned char*)"\x13\x0a\x63\x75\x72\x76\x65\x32\x35\x35\x31\x39", 12, 255, CKM_EC_MONTGOMERY_KEY_PAIR_GEN}, /* send by curve name */
157+
{"edwards25519", "1.3.6.1.4.1.11591.15.1", (unsigned char*)"\x13\x0c\x65\x64\x77\x61\x72\x64\x73\x32\x35\x35\x31\x39", 14, 256, CKM_EC_EDWARDS_KEY_PAIR_GEN}, /* send by curve name */
158+
{"curve25519", "1.3.6.1.4.1.3029.1.5.1", (unsigned char*)"\x13\x0a\x63\x75\x72\x76\x65\x32\x35\x35\x31\x39", 12, 256, CKM_EC_MONTGOMERY_KEY_PAIR_GEN}, /* send by curve name */
159159

160160
/* RFC8410, EDWARDS and MONTGOMERY curves are used by GnuPG and also by OpenSSL */
161161

162-
{"X25519", "1.3.101.110", (unsigned char*)"\x06\x03\x2b\x65\x6e", 5, 255, CKM_EC_MONTGOMERY_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
163-
{"X448", "1.3.101.111", (unsigned char*)"\x06\x03\x2b\x65\x6f", 5, 448, CKM_EC_MONTGOMERY_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
162+
{"X25519", "1.3.101.110", (unsigned char*)"\x06\x03\x2b\x65\x6e", 5, 256, CKM_EC_MONTGOMERY_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
163+
{"X448", "1.3.101.111", (unsigned char*)"\x06\x03\x2b\x65\x6f", 5, 456, CKM_EC_MONTGOMERY_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
164164
{"Ed25519", "1.3.101.112", (unsigned char*)"\x06\x03\x2b\x65\x70", 5, 255, CKM_EC_EDWARDS_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
165-
{"Ed448", "1.3.101.113", (unsigned char*)"\x06\x03\x2b\x65\x71", 5, 448, CKM_EC_EDWARDS_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
165+
{"Ed448", "1.3.101.113", (unsigned char*)"\x06\x03\x2b\x65\x71", 5, 456, CKM_EC_EDWARDS_KEY_PAIR_GEN}, /* RFC 4810 send by OID */
166166

167167
/* GnuPG openpgp curves as used in gnupg-card are equivalent to RFC8410 OIDs */
168-
{"cv25519", "1.3.101.110", (unsigned char*)"\x06\x03\x2b\x65\x6e", 5, 255, CKM_EC_MONTGOMERY_KEY_PAIR_GEN},
169-
{"ed25519", "1.3.101.112", (unsigned char*)"\x06\x03\x2b\x65\x70", 5, 255, CKM_EC_EDWARDS_KEY_PAIR_GEN},
168+
{"cv25519", "1.3.101.110", (unsigned char*)"\x06\x03\x2b\x65\x6e", 5, 256, CKM_EC_MONTGOMERY_KEY_PAIR_GEN},
169+
{"ed25519", "1.3.101.112", (unsigned char*)"\x06\x03\x2b\x65\x70", 5, 256, CKM_EC_EDWARDS_KEY_PAIR_GEN},
170170
/* OpenSC card-openpgp.c will map these to what is need on the card */
171171

172172
{NULL, NULL, NULL, 0, 0, 0},
@@ -2452,7 +2452,7 @@ static void sign_data(CK_SLOT_ID slot, CK_SESSION_HANDLE session,
24522452
}
24532453

24542454
/* Ed448: need the params defined but default to false */
2455-
if (curve->size == 448) {
2455+
if (curve->size == 456) {
24562456
mech.pParameter = &eddsa_params;
24572457
mech.ulParameterLen = (CK_ULONG)sizeof(eddsa_params);
24582458
}
@@ -2607,7 +2607,7 @@ static void verify_signature(CK_SLOT_ID slot, CK_SESSION_HANDLE session,
26072607
}
26082608

26092609
/* Ed448: need the params defined but default to false */
2610-
if (curve->size == 448) {
2610+
if (curve->size == 456) {
26112611
mech.pParameter = &eddsa_params;
26122612
mech.ulParameterLen = (CK_ULONG)sizeof(eddsa_params);
26132613
}
@@ -6589,18 +6589,18 @@ static int read_object(CK_SESSION_HANDLE session)
65896589
}
65906590
}
65916591

6592-
if (type == CKK_EC_EDWARDS && os->length == BYTES4BITS(255))
6592+
if (type == CKK_EC_EDWARDS && os->length == BYTES4BITS(256))
65936593
raw_pk = EVP_PKEY_ED25519;
65946594
#if defined(EVP_PKEY_ED448)
6595-
else if (type == CKK_EC_EDWARDS && os->length == BYTES4BITS(448))
6595+
else if (type == CKK_EC_EDWARDS && os->length == BYTES4BITS(456))
65966596
raw_pk = EVP_PKEY_ED448;
65976597
#endif /* EVP_PKEY_ED448 */
65986598
#if defined(EVP_PKEY_X25519)
6599-
else if (type == CKK_EC_MONTGOMERY && os->length == BYTES4BITS(255))
6599+
else if (type == CKK_EC_MONTGOMERY && os->length == BYTES4BITS(256))
66006600
raw_pk = EVP_PKEY_X25519;
66016601
#endif /*EVP_PKEY_X25519 */
66026602
#if defined(EVP_PKEY_X448)
6603-
else if (type == CKK_EC_MONTGOMERY && os->length == BYTES4BITS(448))
6603+
else if (type == CKK_EC_MONTGOMERY && os->length == BYTES4BITS(456))
66046604
raw_pk = EVP_PKEY_X448;
66056605
#endif /* EVP_PKEY_X448 */
66066606
else

src/tools/pkcs15-init.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -730,15 +730,15 @@ static const struct alg_spec alg_types_asym[] = {
730730
{ "gost2001", SC_ALGORITHM_GOSTR3410, SC_PKCS15_GOSTR3410_KEYSIZE },
731731
{ "ec", SC_ALGORITHM_EC, 0 }, /* keybits derived from curve */
732732
/* RFC 8410 */
733-
{ "Ed25519", SC_ALGORITHM_EDDSA, 255 }, /* RFC 8410 and gunpg */
734-
{ "Ed448", SC_ALGORITHM_EDDSA, 448 },
735-
{ "X25519", SC_ALGORITHM_XEDDSA, 255 },
736-
{ "X448", SC_ALGORITHM_XEDDSA, 448 },
733+
{ "Ed25519", SC_ALGORITHM_EDDSA, 256 }, /* RFC 8410 and gunpg */
734+
{ "Ed448", SC_ALGORITHM_EDDSA, 456 },
735+
{ "X25519", SC_ALGORITHM_XEDDSA, 256 },
736+
{ "X448", SC_ALGORITHM_XEDDSA, 456 },
737737
/* used by Yubikey and GNUK */
738-
{ "edwards25519", SC_ALGORITHM_EDDSA, 255 },
739-
{ "curve25519", SC_ALGORITHM_XEDDSA, 255 },
738+
{ "edwards25519", SC_ALGORITHM_EDDSA, 256 },
739+
{ "curve25519", SC_ALGORITHM_XEDDSA, 256 },
740740
/* gnupg */
741-
{ "cv25519", SC_ALGORITHM_XEDDSA, 255 },
741+
{ "cv25519", SC_ALGORITHM_XEDDSA, 256 },
742742

743743
{ NULL, -1, 0 }
744744
};

0 commit comments

Comments
 (0)