1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3
4 #include "tomcrypt_private.h"
5
6 #ifdef LTC_MECC
7
ecc_set_key(const unsigned char * in,unsigned long inlen,int type,ecc_key * key)8 int ecc_set_key(const unsigned char *in, unsigned long inlen, int type, ecc_key *key)
9 {
10 int err;
11 void *prime, *a, *b;
12
13 LTC_ARGCHK(key != NULL);
14 LTC_ARGCHK(in != NULL);
15 LTC_ARGCHK(inlen > 0);
16
17 prime = key->dp.prime;
18 a = key->dp.A;
19 b = key->dp.B;
20
21 if (type == PK_PRIVATE) {
22 /* load private key */
23 if ((err = mp_read_unsigned_bin(key->k, (unsigned char *)in, inlen)) != CRYPT_OK) {
24 goto error;
25 }
26 if (mp_iszero(key->k) || (mp_cmp(key->k, key->dp.order) != LTC_MP_LT)) {
27 err = CRYPT_INVALID_PACKET;
28 goto error;
29 }
30 /* compute public key */
31 if ((err = ltc_mp.ecc_ptmul(key->k, &key->dp.base, &key->pubkey, a, prime, 1)) != CRYPT_OK) { goto error; }
32 }
33 else if (type == PK_PUBLIC) {
34 /* load public key */
35 if ((err = ltc_ecc_import_point(in, inlen, prime, a, b, key->pubkey.x, key->pubkey.y)) != CRYPT_OK) { goto error; }
36 if ((err = mp_set(key->pubkey.z, 1)) != CRYPT_OK) { goto error; }
37 }
38 else {
39 err = CRYPT_INVALID_PACKET;
40 goto error;
41 }
42
43 /* point on the curve + other checks */
44 if ((err = ltc_ecc_verify_key(key)) != CRYPT_OK) {
45 goto error;
46 }
47
48 key->type = type;
49 return CRYPT_OK;
50
51 error:
52 ecc_free(key);
53 return err;
54 }
55
56 #endif
57