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