Skip to content

Commit 8e838e1

Browse files
committed
distinguish between Ed25519 and X25519
Signed-off-by: Steffen Jaeckel <[email protected]>
1 parent 23e5762 commit 8e838e1

22 files changed

+98
-51
lines changed

doc/crypt.tex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7385,14 +7385,16 @@ \subsection{The PKA Union}
73857385
LTC_PKA_RSA,
73867386
LTC_PKA_DSA,
73877387
LTC_PKA_EC,
7388-
LTC_PKA_CURVE25519,
7388+
LTC_PKA_X25519,
7389+
LTC_PKA_ED25519,
73897390
LTC_PKA_DH,
73907391
};
73917392
73927393
typedef struct {
73937394
union {
73947395
#ifdef LTC_CURVE25519
7395-
curve25519_key curve25519;
7396+
curve25519_key x25519;
7397+
curve25519_key ed25519;
73967398
#endif
73977399
#ifdef LTC_MDH
73987400
dh_key dh;

src/headers/tomcrypt_pk.h

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ typedef struct {
2222

2323
/* ---- NUMBER THEORY ---- */
2424

25+
enum ltc_pka_id {
26+
LTC_PKA_UNDEF = 0,
27+
LTC_PKA_RSA,
28+
LTC_PKA_DSA,
29+
LTC_PKA_EC,
30+
LTC_PKA_X25519,
31+
LTC_PKA_ED25519,
32+
LTC_PKA_DH,
33+
};
34+
2535
enum public_key_type {
2636
/* Refers to the public key */
2737
PK_PUBLIC = 0x0000,
@@ -347,12 +357,8 @@ typedef struct {
347357
/** The key type, PK_PRIVATE or PK_PUBLIC */
348358
enum public_key_type type;
349359

350-
/** The PK-algorithm, PKA_ED25519 or PKA_X25519 */
351-
/** This was supposed to be:
352-
* enum public_key_algorithms algo;
353-
* but that enum is now in tomcrypt_private.h
354-
*/
355-
int algo;
360+
/** The PK-algorithm, LTC_PKA_ED25519 or LTC_PKA_X25519 */
361+
enum ltc_pka_id pka;
356362

357363
/** The private key */
358364
unsigned char priv[32];
@@ -511,19 +517,11 @@ int dsa_shared_secret(void *private_key, void *base,
511517
* LibTomCrypt Public Key Algorithm descriptor
512518
*/
513519

514-
enum ltc_pka_id {
515-
LTC_PKA_UNDEF = 0,
516-
LTC_PKA_RSA,
517-
LTC_PKA_DSA,
518-
LTC_PKA_EC,
519-
LTC_PKA_CURVE25519,
520-
LTC_PKA_DH,
521-
};
522-
523520
typedef struct {
524521
union {
525522
#ifdef LTC_CURVE25519
526-
curve25519_key curve25519;
523+
curve25519_key x25519;
524+
curve25519_key ed25519;
527525
#endif
528526
#ifdef LTC_MDH
529527
dh_key dh;

src/headers/tomcrypt_private.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ enum ltc_oid_id {
3232
LTC_OID_X25519,
3333
LTC_OID_ED25519,
3434
LTC_OID_DH,
35+
LTC_OID_NUM
3536
};
3637

3738
/*
@@ -324,6 +325,8 @@ int rand_bn_bits(void *N, int bits, prng_state *prng, int wprng);
324325
int rand_bn_upto(void *N, void *limit, prng_state *prng, int wprng);
325326

326327
int pk_get_oid(enum ltc_oid_id id, const char **st);
328+
int pk_get_pka_id(enum ltc_oid_id id, enum ltc_pka_id *pka);
329+
int pk_get_oid_id(enum ltc_pka_id pka, enum ltc_oid_id *oid);
327330
int pk_get_oid_from_asn1(const ltc_asn1_list *oid, enum ltc_oid_id *id);
328331
int pk_oid_str_to_num(const char *OID, unsigned long *oid, unsigned long *oidlen);
329332
int pk_oid_num_to_str(const unsigned long *oid, unsigned long oidlen, char *OID, unsigned long *outlen);

src/misc/pem/pem_pkcs.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ static int s_decode(struct get_char *g, ltc_pka_key *k, const password_ctx *pw_c
122122
break;
123123
#endif
124124
#ifdef LTC_CURVE25519
125-
case LTC_OID_ED25519:
126-
err = ed25519_import_pkcs8_asn1(alg_id, priv_key, &k->u.curve25519);
127-
k->id = LTC_PKA_CURVE25519;
128-
break;
129125
case LTC_OID_X25519:
130-
err = x25519_import_pkcs8_asn1(alg_id, priv_key, &k->u.curve25519);
131-
k->id = LTC_PKA_CURVE25519;
126+
err = x25519_import_pkcs8_asn1(alg_id, priv_key, &k->u.x25519);
127+
k->id = LTC_PKA_X25519;
128+
break;
129+
case LTC_OID_ED25519:
130+
err = ed25519_import_pkcs8_asn1(alg_id, priv_key, &k->u.ed25519);
131+
k->id = LTC_PKA_ED25519;
132132
break;
133133
#endif
134134
default:

src/misc/pem/pem_ssh.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ int ssh_decode_ed25519(const unsigned char *in, unsigned long *inlen, ltc_pka_ke
9696
goto cleanup;
9797
}
9898

99-
if ((err = ed25519_import_raw(&privkey[32], 32, PK_PRIVATE, &key->u.curve25519)) != CRYPT_OK) {
99+
if ((err = ed25519_import_raw(&privkey[32], 32, PK_PRIVATE, &key->u.ed25519)) != CRYPT_OK) {
100100
goto cleanup;
101101
}
102102

103-
key->id = LTC_PKA_CURVE25519;
103+
key->id = LTC_PKA_ED25519;
104104

105105
cleanup:
106106
zeromem(pubkey, sizeof(pubkey));

src/pk/asn1/oid/pk_get.c

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,64 @@ typedef struct {
1111
} oid_table_entry;
1212

1313
static const oid_table_entry pka_oids[] = {
14+
{ LTC_OID_UNDEF, LTC_PKA_UNDEF, NULL },
1415
{ LTC_OID_RSA, LTC_PKA_RSA, "1.2.840.113549.1.1.1" },
1516
{ LTC_OID_DSA, LTC_PKA_DSA, "1.2.840.10040.4.1" },
1617
{ LTC_OID_EC, LTC_PKA_EC, "1.2.840.10045.2.1" },
1718
{ LTC_OID_EC_PRIMEF, LTC_PKA_EC, "1.2.840.10045.1.1" },
18-
{ LTC_OID_X25519, LTC_PKA_CURVE25519, "1.3.101.110" },
19-
{ LTC_OID_ED25519, LTC_PKA_CURVE25519, "1.3.101.112" },
19+
{ LTC_OID_X25519, LTC_PKA_X25519, "1.3.101.110" },
20+
{ LTC_OID_ED25519, LTC_PKA_ED25519, "1.3.101.112" },
2021
{ LTC_OID_DH, LTC_PKA_DH, "1.2.840.113549.1.3.1" },
2122
};
2223

24+
static LTC_INLINE const oid_table_entry* s_get_entry(enum ltc_oid_id id)
25+
{
26+
if (id < LTC_OID_NUM)
27+
return &pka_oids[id];
28+
return NULL;
29+
}
30+
2331
/*
2432
Returns the OID requested.
2533
@return CRYPT_OK if valid
2634
*/
2735
int pk_get_oid(enum ltc_oid_id id, const char **st)
2836
{
29-
unsigned int i;
37+
const oid_table_entry* e = s_get_entry(id);
3038
LTC_ARGCHK(st != NULL);
31-
for (i = 0; i < sizeof(pka_oids)/sizeof(pka_oids[0]); ++i) {
32-
if (pka_oids[i].id == id) {
33-
*st = pka_oids[i].oid;
39+
if (e != NULL) {
40+
*st = e->oid;
41+
return CRYPT_OK;
42+
}
43+
return CRYPT_INVALID_ARG;
44+
}
45+
46+
/*
47+
Returns the PKA ID requested.
48+
@return CRYPT_OK if valid
49+
*/
50+
int pk_get_pka_id(enum ltc_oid_id id, enum ltc_pka_id *pka)
51+
{
52+
const oid_table_entry* e = s_get_entry(id);
53+
LTC_ARGCHK(pka != NULL);
54+
if (e != NULL) {
55+
*pka = e->pka;
56+
return CRYPT_OK;
57+
}
58+
return CRYPT_INVALID_ARG;
59+
}
60+
61+
/*
62+
Returns the OID ID requested.
63+
@return CRYPT_OK if valid
64+
*/
65+
int pk_get_oid_id(enum ltc_pka_id pka, enum ltc_oid_id *oid)
66+
{
67+
unsigned int i;
68+
LTC_ARGCHK(oid != NULL);
69+
for (i = 1; i < sizeof(pka_oids)/sizeof(pka_oids[0]); ++i) {
70+
if (pka_oids[i].pka == pka) {
71+
*oid = pka_oids[i].id;
3472
return CRYPT_OK;
3573
}
3674
}
@@ -57,7 +95,7 @@ int pk_get_oid_from_asn1(const ltc_asn1_list *oid, enum ltc_oid_id *id)
5795
return err;
5896
}
5997

60-
for (i = 0; i < sizeof(pka_oids)/sizeof(pka_oids[0]); ++i) {
98+
for (i = 1; i < sizeof(pka_oids)/sizeof(pka_oids[0]); ++i) {
6199
if (XSTRCMP(pka_oids[i].oid, tmp) == 0) {
62100
*id = pka_oids[i].id;
63101
return CRYPT_OK;

src/pk/ec25519/ec25519_export.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ int ec25519_export( unsigned char *out, unsigned long *outlen,
2525
const char* OID;
2626
unsigned long oid[16], oidlen;
2727
ltc_asn1_list alg_id[1];
28+
enum ltc_oid_id oid_id;
2829
unsigned char private_key[34];
2930
unsigned long version, private_key_len = sizeof(private_key);
3031

@@ -34,12 +35,15 @@ int ec25519_export( unsigned char *out, unsigned long *outlen,
3435

3536
std = which & PK_STD;
3637
which &= ~PK_STD;
38+
if ((err = pk_get_oid_id(key->pka, &oid_id)) != CRYPT_OK) {
39+
return err;
40+
}
3741

3842
if (which == PK_PRIVATE) {
3943
if(key->type != PK_PRIVATE) return CRYPT_PK_INVALID_TYPE;
4044

4145
if (std == PK_STD) {
42-
if ((err = pk_get_oid(key->algo, &OID)) != CRYPT_OK) {
46+
if ((err = pk_get_oid(oid_id, &OID)) != CRYPT_OK) {
4347
return err;
4448
}
4549
oidlen = sizeof(oid)/sizeof(oid[0]);
@@ -72,7 +76,7 @@ int ec25519_export( unsigned char *out, unsigned long *outlen,
7276
} else {
7377
if (std == PK_STD) {
7478
/* encode public key as SubjectPublicKeyInfo */
75-
err = x509_encode_subject_public_key_info(out, outlen, key->algo, key->pub, 32uL, LTC_ASN1_EOL, NULL, 0);
79+
err = x509_encode_subject_public_key_info(out, outlen, oid_id, key->pub, 32uL, LTC_ASN1_EOL, NULL, 0);
7680
} else {
7781
if (*outlen < sizeof(key->pub)) {
7882
err = CRYPT_BUFFER_OVERFLOW;

src/pk/ec25519/ec25519_import_pkcs8.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ int ec25519_import_pkcs8_asn1(ltc_asn1_list *alg_id, ltc_asn1_list *priv_key,
3939
if ((err = der_decode_octet_string(priv_key->data, priv_key->size, key->priv, &key_len)) == CRYPT_OK) {
4040
fp(key->pub, key->priv);
4141
key->type = PK_PRIVATE;
42-
key->algo = id;
42+
err = pk_get_pka_id(id, &key->pka);
4343
}
4444
return err;
4545
}

src/pk/ed25519/ed25519_export.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int ed25519_export( unsigned char *out, unsigned long *outlen,
2323
{
2424
LTC_ARGCHK(key != NULL);
2525

26-
if (key->algo != LTC_OID_ED25519) return CRYPT_PK_INVALID_TYPE;
26+
if (key->pka != LTC_PKA_ED25519) return CRYPT_PK_INVALID_TYPE;
2727

2828
return ec25519_export(out, outlen, which, key);
2929
}

src/pk/ed25519/ed25519_import.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ int ed25519_import(const unsigned char *in, unsigned long inlen, curve25519_key
2727
key_len = sizeof(key->pub);
2828
if ((err = x509_decode_subject_public_key_info(in, inlen, LTC_OID_ED25519, key->pub, &key_len, LTC_ASN1_EOL, NULL, 0uL)) == CRYPT_OK) {
2929
key->type = PK_PUBLIC;
30-
key->algo = LTC_OID_ED25519;
30+
key->pka = LTC_PKA_ED25519;
3131
}
3232
return err;
3333
}

src/pk/ed25519/ed25519_import_raw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ int ed25519_import_raw(const unsigned char *in, unsigned long inlen, int which,
3232
} else {
3333
return CRYPT_INVALID_ARG;
3434
}
35-
key->algo = LTC_OID_ED25519;
35+
key->pka = LTC_PKA_ED25519;
3636
key->type = which;
3737

3838
return CRYPT_OK;

src/pk/ed25519/ed25519_import_x509.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ int ed25519_import_x509(const unsigned char *in, unsigned long inlen, curve25519
3737
return err;
3838
}
3939
key->type = PK_PUBLIC;
40-
key->algo = LTC_OID_ED25519;
40+
key->pka = LTC_PKA_ED25519;
4141

4242
return err;
4343
}

src/pk/ed25519/ed25519_make_key.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ int ed25519_make_key(prng_state *prng, int wprng, curve25519_key *key)
2828
}
2929

3030
key->type = PK_PRIVATE;
31-
key->algo = LTC_OID_ED25519;
31+
key->pka = LTC_PKA_ED25519;
3232

3333
return err;
3434
}

src/pk/ed25519/ed25519_sign.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static int s_ed25519_sign(const unsigned char *msg, unsigned long msglen,
2323
LTC_ARGCHK(siglen != NULL);
2424
LTC_ARGCHK(private_key != NULL);
2525

26-
if (private_key->algo != LTC_OID_ED25519) return CRYPT_PK_INVALID_TYPE;
26+
if (private_key->pka != LTC_PKA_ED25519) return CRYPT_PK_INVALID_TYPE;
2727
if (private_key->type != PK_PRIVATE) return CRYPT_PK_INVALID_TYPE;
2828

2929
if (*siglen < 64uL) {

src/pk/ed25519/ed25519_verify.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static int s_ed25519_verify(const unsigned char *msg, unsigned long msglen,
2727
*stat = 0;
2828

2929
if (siglen != 64uL) return CRYPT_INVALID_ARG;
30-
if (public_key->algo != LTC_OID_ED25519) return CRYPT_PK_INVALID_TYPE;
30+
if (public_key->pka != LTC_PKA_ED25519) return CRYPT_PK_INVALID_TYPE;
3131

3232
mlen = msglen + siglen;
3333
if ((mlen < msglen) || (mlen < siglen)) return CRYPT_OVERFLOW;

src/pk/x25519/x25519_export.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int x25519_export( unsigned char *out, unsigned long *outlen,
2323
{
2424
LTC_ARGCHK(key != NULL);
2525

26-
if (key->algo != LTC_OID_X25519) return CRYPT_PK_INVALID_TYPE;
26+
if (key->pka != LTC_PKA_X25519) return CRYPT_PK_INVALID_TYPE;
2727

2828
return ec25519_export(out, outlen, which, key);
2929
}

src/pk/x25519/x25519_import.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ int x25519_import(const unsigned char *in, unsigned long inlen, curve25519_key *
2727
key_len = sizeof(key->pub);
2828
if ((err = x509_decode_subject_public_key_info(in, inlen, LTC_OID_X25519, key->pub, &key_len, LTC_ASN1_EOL, NULL, 0uL)) == CRYPT_OK) {
2929
key->type = PK_PUBLIC;
30-
key->algo = LTC_OID_X25519;
30+
key->pka = LTC_PKA_X25519;
3131
}
3232
return err;
3333
}

src/pk/x25519/x25519_import_raw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ int x25519_import_raw(const unsigned char *in, unsigned long inlen, int which, c
3232
} else {
3333
return CRYPT_INVALID_ARG;
3434
}
35-
key->algo = LTC_OID_X25519;
35+
key->pka = LTC_PKA_X25519;
3636
key->type = which;
3737

3838
return CRYPT_OK;

src/pk/x25519/x25519_import_x509.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ int x25519_import_x509(const unsigned char *in, unsigned long inlen, curve25519_
3737
return err;
3838
}
3939
key->type = PK_PUBLIC;
40-
key->algo = LTC_OID_X25519;
40+
key->pka = LTC_PKA_X25519;
4141

4242
return err;
4343
}

src/pk/x25519/x25519_make_key.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ int x25519_make_key(prng_state *prng, int wprng, curve25519_key *key)
3434
tweetnacl_crypto_scalarmult_base(key->pub, key->priv);
3535

3636
key->type = PK_PRIVATE;
37-
key->algo = LTC_OID_X25519;
37+
key->pka = LTC_PKA_X25519;
3838

3939
return err;
4040
}

src/pk/x25519/x25519_shared_secret.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ int x25519_shared_secret(const curve25519_key *private_key,
2626
LTC_ARGCHK(out != NULL);
2727
LTC_ARGCHK(outlen != NULL);
2828

29-
if(private_key->type != PK_PRIVATE) return CRYPT_PK_INVALID_TYPE;
29+
if (public_key->pka != LTC_PKA_X25519) return CRYPT_PK_INVALID_TYPE;
30+
if (private_key->type != PK_PRIVATE) return CRYPT_PK_INVALID_TYPE;
3031

31-
if(*outlen < 32uL) {
32+
if (*outlen < 32uL) {
3233
*outlen = 32uL;
3334
return CRYPT_BUFFER_OVERFLOW;
3435
}

tests/pem_test.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ static int s_key_cmp(ltc_pka_key *key)
6464
return ecc_key_cmp(PK_PRIVATE, &s_ecc_key_should, &key->u.ecc);
6565
#endif
6666
break;
67-
case LTC_PKA_CURVE25519:
67+
case LTC_PKA_ED25519:
68+
case LTC_PKA_X25519:
6869
case LTC_PKA_DH:
6970
return CRYPT_OK;
7071
default:

0 commit comments

Comments
 (0)