/* * Secure eXtended Message Passing framework * Secure eXtended Transport layer implementation: (libsxt) * - very similar to SSH2/TLS * - using already proven and tested crypto algos * - better than TLS for message passing * * PublicPrivateKeyPairs operation API * * (c) Alexander Vdolainen 2016 * * libsxmp is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * libsxmp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see ."; * */ #ifndef __SXT_SXTKEY_H__ #define __SXT_SXTKEY_H__ /* some taken code , copyright left in the header */ #define ED25519_PK_LEN 32 #define ED25519_SK_LEN 64 #define ED25519_SIG_LEN 64 typedef uint8_t ed25519_pubkey[ED25519_PK_LEN]; typedef uint8_t ed25519_privkey[ED25519_SK_LEN]; typedef uint8_t ed25519_signature[ED25519_SIG_LEN]; /* flags */ #define SXT_PPKP_PRIVATE (1 << 2) #define SXT_PPKP_PUBLIC (1 << 1) #define SXT_PPKP_IHASH (1 << 1) #define SXT_PPKP_ENCRYPT (1 << 2) /* magic values */ #define PPKP_MAGIC "0xbeef0101" /* here the supported types in SXT */ #define PPKP_ED25519 0xa typedef struct sxtkey_type { uint8_t type; uint8_t flags; ed25519_pubkey *pubkey; ed25519_privkey *privkey; uint64_t hash; void *priv; } sxtkey_t; typedef struct sxtsignature_type { uint8_t type; ed25519_signature *sig; } sxtsignature_t; /* API */ /* allocate a key */ sxtkey_t *sxt_key_alloc(void); /* burn i.e. zero all stuff within key structure to be * hidden in core dump */ void sxt_key_burn(sxtkey_t *); /* free sxt key structure */ void sxt_key_free(sxtkey_t *); /* generate a keypair, depends on type and optional parameter given * the last one leaved for stable API, current ed25519 keys doesn't * need them */ int sxt_key_generate(sxtkey_t *, int , int ); /* generic functions useful to deal with keys */ /* get 8bit ID from key name */ uint8_t sxt_key_type_fname(const char *); /* return 0 if key isn't public, 1 otherwise */ int sxt_key_public(const sxtkey_t *); /* return 0 if key isn't private, 1 otherwise */ int sxt_key_private(const sxtkey_t *); /* export key API */ /** this function will pack the private key to sxt key container and * write it to the file. * @key - private key * @file - file name to write * NOTE: the following parameters required in case if you want to encrypt the key * with passkey (password) * @passkey - plaintext passkey * or * @ask_passkey with: * @@pkbuf - passkey buffer (allocated) * @@length - length of pkbuf * @@confirm - if not nil - function should force passkey confirmation * @@priv - some custom pointer to the some custom data * @priv - the data coming to ask_passkey function */ int sxt_key_export_priv_file(const sxtkey_t *key, const char *file, const char *passkey, int (*ask_passkey)(char *pkbuf, size_t length, int confirm, void *priv), void *priv); /* export a public key to a given file */ int sxt_key_export_public_file(const sxtkey_t *key, const char *file); /* key custom hash ops */ /* assign a 64bit hash, 0 mean there are no hash */ int sxt_key_assign_hash(sxtkey_t *, uint64_t); /* get a 64bit hash from a key */ uint64_t sxt_key_hash(const sxtkey_t *); #endif /* __SXT_SXTKEY_H__ */