cipher_t * aead_key_init(int method, const char *pass, const char *key) { if (method < AES128GCM || method >= AEAD_CIPHER_NUM) { LOGE("aead_key_init(): Illegal method"); return NULL; } cipher_t *cipher = (cipher_t *)ss_malloc(sizeof(cipher_t)); memset(cipher, 0, sizeof(cipher_t)); // Initialize sodium for random generator if (sodium_init() == -1) { FATAL("Failed to initialize sodium"); } if (method >= CHACHA20POLY1305IETF) { cipher_kt_t *cipher_info = (cipher_kt_t *)ss_malloc(sizeof(cipher_kt_t)); cipher->info = cipher_info; cipher->info->base = NULL; cipher->info->key_bitlen = supported_aead_ciphers_key_size[method] * 8; cipher->info->iv_size = supported_aead_ciphers_nonce_size[method]; } else { cipher->info = (cipher_kt_t *)aead_get_cipher_type(method); } if (cipher->info == NULL && cipher->key_len == 0) { LOGE("Cipher %s not found in crypto library", supported_aead_ciphers[method]); FATAL("Cannot initialize cipher"); } if (key != NULL) cipher->key_len = crypto_parse_key(key, cipher->key, supported_aead_ciphers_key_size[method]); else cipher->key_len = crypto_derive_key(pass, cipher->key, supported_aead_ciphers_key_size[method]); if (cipher->key_len == 0) { FATAL("Cannot generate key and nonce"); } cipher->nonce_len = supported_aead_ciphers_nonce_size[method]; cipher->tag_len = supported_aead_ciphers_tag_size[method]; cipher->method = method; return cipher; }
cipher_t * stream_key_init(int method, const char *pass, const char *key) { if (method <= TABLE || method >= STREAM_CIPHER_NUM) { LOGE("cipher->key_init(): Illegal method"); return NULL; } cipher_t *cipher = (cipher_t *)ss_malloc(sizeof(cipher_t)); memset(cipher, 0, sizeof(cipher_t)); if (method == SALSA20 || method == CHACHA20 || method == CHACHA20IETF) { cipher_kt_t *cipher_info = (cipher_kt_t *)ss_malloc(sizeof(cipher_kt_t)); cipher->info = cipher_info; cipher->info->base = NULL; cipher->info->key_bitlen = supported_stream_ciphers_key_size[method] * 8; cipher->info->iv_size = supported_stream_ciphers_nonce_size[method]; } else { cipher->info = (cipher_kt_t *)stream_get_cipher_type(method); } if (cipher->info == NULL && cipher->key_len == 0) { LOGE("Cipher %s not found in crypto library", supported_stream_ciphers[method]); FATAL("Cannot initialize cipher"); } if (key != NULL) cipher->key_len = crypto_parse_key(key, cipher->key, cipher_key_size(cipher)); else cipher->key_len = crypto_derive_key(pass, cipher->key, cipher_key_size(cipher)); if (cipher->key_len == 0) { FATAL("Cannot generate key and NONCE"); } if (method == RC4_MD5) { cipher->nonce_len = 16; } else { cipher->nonce_len = cipher_nonce_size(cipher); } cipher->method = method; return cipher; }