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