aboutsummaryrefslogtreecommitdiffstats
path: root/lib/crypto/c_src/eddsa.c
blob: 5e9853f8e5307997e031a3af66213d9658a43d78 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "eddsa.h"

#ifdef HAVE_EDDSA
int get_eddsa_key(ErlNifEnv* env, int public, ERL_NIF_TERM key, EVP_PKEY **pkey)
{
    /* key=[K] */
    ERL_NIF_TERM head, tail, tail2, algo;
    ErlNifBinary bin;
    int type;

    if (!enif_get_list_cell(env, key, &head, &tail)
	|| !enif_inspect_binary(env, head, &bin)
        || !enif_get_list_cell(env, tail, &algo, &tail2)
        || !enif_is_empty_list(env, tail2)) {
	return 0;
    }
    if (algo == atom_ed25519) type = EVP_PKEY_ED25519;
    else if (algo == atom_ed448) type = EVP_PKEY_ED448;
    else
        return 0;

    if (public)
        *pkey = EVP_PKEY_new_raw_public_key(type, NULL, bin.data, bin.size);
    else 
        *pkey = EVP_PKEY_new_raw_private_key(type, NULL, bin.data, bin.size);

    if (!pkey)
        return 0;
    return 1;
}
#endif