1 // SPDX-License-Identifier: BSD-2-Clause
2 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3  *
4  * LibTomCrypt is a library that provides various cryptographic
5  * algorithms in a highly modular and flexible manner.
6  *
7  * The library is free for all purposes without any express
8  * guarantee it works.
9  */
10 
11 #include "tomcrypt_private.h"
12 
13 #ifdef LTC_MECC
14 
ecc_set_curve(const ltc_ecc_curve * cu,ecc_key * key)15 int ecc_set_curve(const ltc_ecc_curve *cu, ecc_key *key)
16 {
17    int err;
18 
19    LTC_ARGCHK(key != NULL);
20    LTC_ARGCHK(cu != NULL);
21 
22    if ((err = mp_init_multi(&key->dp.prime, &key->dp.order, &key->dp.A, &key->dp.B,
23                             &key->dp.base.x, &key->dp.base.y, &key->dp.base.z,
24                             &key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k,
25                             NULL)) != CRYPT_OK) {
26       return err;
27    }
28 
29    /* A, B, order, prime, Gx, Gy */
30    if ((err = mp_read_radix(key->dp.prime, cu->prime, 16)) != CRYPT_OK) { goto error; }
31    if ((err = mp_read_radix(key->dp.order, cu->order, 16)) != CRYPT_OK) { goto error; }
32    if ((err = mp_read_radix(key->dp.A, cu->A, 16)) != CRYPT_OK)         { goto error; }
33    if ((err = mp_read_radix(key->dp.B, cu->B, 16)) != CRYPT_OK)         { goto error; }
34    if ((err = mp_read_radix(key->dp.base.x, cu->Gx, 16)) != CRYPT_OK)   { goto error; }
35    if ((err = mp_read_radix(key->dp.base.y, cu->Gy, 16)) != CRYPT_OK)   { goto error; }
36    if ((err = mp_set(key->dp.base.z, 1)) != CRYPT_OK)                   { goto error; }
37    /* cofactor & size */
38    key->dp.cofactor = cu->cofactor;
39    key->dp.size = mp_unsigned_bin_size(key->dp.prime);
40    /* OID string >> unsigned long oid[16] + oidlen */
41    key->dp.oidlen = 16;
42    if ((err = pk_oid_str_to_num(cu->OID, key->dp.oid, &key->dp.oidlen)) != CRYPT_OK) { goto error; }
43    /* success */
44    return CRYPT_OK;
45 
46 error:
47    ecc_free(key);
48    return err;
49 }
50 
ecc_set_curve_by_size(int size,ecc_key * key)51 int ecc_set_curve_by_size(int size, ecc_key *key)
52 {
53    const ltc_ecc_curve *cu = NULL;
54    int err = CRYPT_ERROR;
55 
56    /* for compatibility with libtomcrypt-1.17 the sizes below must match the specific curves */
57    if (size <= 14) {
58       err = ecc_find_curve("SECP112R1", &cu);
59    }
60    else if (size <= 16) {
61       err = ecc_find_curve("SECP128R1", &cu);
62    }
63    else if (size <= 20) {
64       err = ecc_find_curve("SECP160R1", &cu);
65    }
66    else if (size <= 24) {
67       err = ecc_find_curve("SECP192R1", &cu);
68    }
69    else if (size <= 28) {
70       err = ecc_find_curve("SECP224R1", &cu);
71    }
72    else if (size <= 32) {
73       err = ecc_find_curve("SECP256R1", &cu);
74    }
75    else if (size <= 48) {
76       err = ecc_find_curve("SECP384R1", &cu);
77    }
78    else if (size <= 66) {
79       err = ecc_find_curve("SECP521R1", &cu);
80    }
81 
82    if (err == CRYPT_OK && cu != NULL) return ecc_set_curve(cu, key);
83 
84    return CRYPT_INVALID_ARG;
85 }
86 
87 #endif
88 
89 /* ref:         $Format:%D$ */
90 /* git commit:  $Format:%H$ */
91 /* commit time: $Format:%ai$ */
92