Skip to content

Commit 5e59a9d

Browse files
committed
distinguish between Ed25519 and X25519
Signed-off-by: Steffen Jaeckel <[email protected]>
1 parent bcb5890 commit 5e59a9d

22 files changed

+98
-51
lines changed

doc/crypt.tex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7366,14 +7366,16 @@ \subsection{The PKA Union}
73667366
LTC_PKA_RSA,
73677367
LTC_PKA_DSA,
73687368
LTC_PKA_EC,
7369-
LTC_PKA_CURVE25519,
7369+
LTC_PKA_X25519,
7370+
LTC_PKA_ED25519,
73707371
LTC_PKA_DH,
73717372
};
73727373
73737374
typedef struct {
73747375
union {
73757376
#ifdef LTC_CURVE25519
7376-
curve25519_key curve25519;
7377+
curve25519_key x25519;
7378+
curve25519_key ed25519;
73777379
#endif
73787380
#ifdef LTC_MDH
73797381
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];
@@ -493,19 +499,11 @@ int dsa_shared_secret(void *private_key, void *base,
493499
* LibTomCrypt Public Key Algorithm descriptor
494500
*/
495501

496-
enum ltc_pka_id {
497-
LTC_PKA_UNDEF = 0,
498-
LTC_PKA_RSA,
499-
LTC_PKA_DSA,
500-
LTC_PKA_EC,
501-
LTC_PKA_CURVE25519,
502-
LTC_PKA_DH,
503-
};
504-
505502
typedef struct {
506503
union {
507504
#ifdef LTC_CURVE25519
508-
curve25519_key curve25519;
505+
curve25519_key x25519;
506+
curve25519_key ed25519;
509507
#endif
510508
#ifdef LTC_MDH
511509
dh_key dh;

src/headers/tomcrypt_private.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ enum ltc_oid_id {
2424
LTC_OID_X25519,
2525
LTC_OID_ED25519,
2626
LTC_OID_DH,
27+
LTC_OID_NUM
2728
};
2829

2930
/*
@@ -316,6 +317,8 @@ int rand_bn_bits(void *N, int bits, prng_state *prng, int wprng);
316317
int rand_bn_upto(void *N, void *limit, prng_state *prng, int wprng);
317318

318319
int pk_get_oid(enum ltc_oid_id id, const char **st);
320+
int pk_get_pka_id(enum ltc_oid_id id, enum ltc_pka_id *pka);
321+
int pk_get_oid_id(enum ltc_pka_id pka, enum ltc_oid_id *oid);
319322
int pk_get_oid_from_asn1(const ltc_asn1_list *oid, enum ltc_oid_id *id);
320323
int pk_oid_str_to_num(const char *OID, unsigned long *oid, unsigned long *oidlen);
321324
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
}

0 commit comments

Comments
 (0)