static ACVP_RESULT acvp_kdf135_ssh_init_tc(ACVP_CTX *ctx, ACVP_KDF135_SSH_TC *stc, unsigned int tc_id, ACVP_CIPHER alg_id, ACVP_HASH_ALG sha_type, unsigned int e_key_len, unsigned int i_key_len, unsigned int iv_len, unsigned int hash_len, const char *shared_secret_k, const char *hash_h, const char *session_id) { unsigned int shared_secret_len = 0; unsigned int session_id_len = 0; ACVP_RESULT rv; memzero_s(stc, sizeof(ACVP_KDF135_SSH_TC)); // Get the byte lengths shared_secret_len = strnlen_s(shared_secret_k, ACVP_KDF135_SSH_STR_IN_MAX) / 2; session_id_len = strnlen_s(session_id, ACVP_KDF135_SSH_STR_IN_MAX) / 2; stc->shared_secret_k = calloc(shared_secret_len, sizeof(unsigned char)); if (!stc->shared_secret_k) { return ACVP_MALLOC_FAIL; } stc->hash_h = calloc(hash_len, sizeof(unsigned char)); if (!stc->hash_h) { return ACVP_MALLOC_FAIL; } stc->session_id = calloc(session_id_len, sizeof(unsigned char)); if (!stc->session_id) { return ACVP_MALLOC_FAIL; } // Convert from hex string to binary rv = acvp_hexstr_to_bin(shared_secret_k, (unsigned char *)stc->shared_secret_k, shared_secret_len, NULL); if (rv != ACVP_SUCCESS) return rv; rv = acvp_hexstr_to_bin(hash_h, (unsigned char *)stc->hash_h, hash_len, NULL); if (rv != ACVP_SUCCESS) return rv; rv = acvp_hexstr_to_bin(session_id, (unsigned char *)stc->session_id, session_id_len, NULL); if (rv != ACVP_SUCCESS) return rv; // Allocate answer buffers stc->cs_init_iv = calloc(ACVP_KDF135_SSH_IV_MAX, sizeof(unsigned char)); if (!stc->cs_init_iv) { return ACVP_MALLOC_FAIL; } stc->sc_init_iv = calloc(ACVP_KDF135_SSH_IV_MAX, sizeof(unsigned char)); if (!stc->sc_init_iv) { return ACVP_MALLOC_FAIL; } stc->cs_encrypt_key = calloc(ACVP_KDF135_SSH_EKEY_MAX, sizeof(unsigned char)); if (!stc->cs_encrypt_key) { return ACVP_MALLOC_FAIL; } stc->sc_encrypt_key = calloc(ACVP_KDF135_SSH_EKEY_MAX, sizeof(unsigned char)); if (!stc->sc_encrypt_key) { return ACVP_MALLOC_FAIL; } stc->cs_integrity_key = calloc(ACVP_KDF135_SSH_IKEY_MAX, sizeof(unsigned char)); if (!stc->cs_integrity_key) { return ACVP_MALLOC_FAIL; } stc->sc_integrity_key = calloc(ACVP_KDF135_SSH_IKEY_MAX, sizeof(unsigned char)); if (!stc->sc_integrity_key) { return ACVP_MALLOC_FAIL; } stc->tc_id = tc_id; stc->cipher = alg_id; stc->sha_type = sha_type; stc->e_key_len = e_key_len; stc->i_key_len = i_key_len; stc->iv_len = iv_len; stc->shared_secret_len = shared_secret_len; stc->hash_len = hash_len; stc->session_id_len = session_id_len; return ACVP_SUCCESS; }
static ACVP_RESULT acvp_kdf135_srtp_init_tc(ACVP_CTX *ctx, ACVP_KDF135_SRTP_TC *stc, unsigned int tc_id, int aes_keylen, char *kdr, char *master_key, char *master_salt, char *index, char *srtcp_index) { ACVP_RESULT rv = ACVP_SUCCESS; memzero_s(stc, sizeof(ACVP_KDF135_SRTP_TC)); if (!kdr || !master_key || !master_salt || !index || !srtcp_index) { ACVP_LOG_ERR("Missing parameters - initalize KDF SRTP test case"); return ACVP_INVALID_ARG; } stc->tc_id = tc_id; stc->aes_keylen = aes_keylen; stc->kdr = calloc(ACVP_KDF135_SRTP_KDR_STR_MAX, sizeof(char)); if (!stc->kdr) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(kdr, stc->kdr, ACVP_KDF135_SRTP_KDR_STR_MAX, &(stc->kdr_len)); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (kdr)"); return rv; } stc->master_key = calloc(ACVP_KDF135_SRTP_MASTER_MAX, sizeof(char)); if (!stc->master_key) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(master_key, (unsigned char *)stc->master_key, ACVP_KDF135_SRTP_MASTER_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (master_key)"); return rv; } stc->master_salt = calloc(ACVP_KDF135_SRTP_MASTER_MAX, sizeof(char)); if (!stc->master_salt) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(master_salt, (unsigned char *)stc->master_salt, ACVP_KDF135_SRTP_MASTER_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (master_salt)"); return rv; } stc->index = calloc(ACVP_KDF135_SRTP_INDEX_MAX, sizeof(char)); if (!stc->index) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(index, (unsigned char *)stc->index, ACVP_KDF135_SRTP_INDEX_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (index)"); return rv; } stc->srtcp_index = calloc(ACVP_KDF135_SRTP_INDEX_MAX, sizeof(char)); if (!stc->srtcp_index) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(srtcp_index, (unsigned char *)stc->srtcp_index, ACVP_KDF135_SRTP_INDEX_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (srtcp_index)"); return rv; } stc->srtp_ka = calloc(ACVP_KDF135_SRTP_OUTPUT_MAX, sizeof(char)); if (!stc->srtp_ka) { return ACVP_MALLOC_FAIL; } stc->srtp_ke = calloc(ACVP_KDF135_SRTP_OUTPUT_MAX, sizeof(char)); if (!stc->srtp_ke) { return ACVP_MALLOC_FAIL; } stc->srtp_ks = calloc(ACVP_KDF135_SRTP_OUTPUT_MAX, sizeof(char)); if (!stc->srtp_ks) { return ACVP_MALLOC_FAIL; } stc->srtcp_ka = calloc(ACVP_KDF135_SRTP_OUTPUT_MAX, sizeof(char)); if (!stc->srtcp_ka) { return ACVP_MALLOC_FAIL; } stc->srtcp_ke = calloc(ACVP_KDF135_SRTP_OUTPUT_MAX, sizeof(char)); if (!stc->srtcp_ke) { return ACVP_MALLOC_FAIL; } stc->srtcp_ks = calloc(ACVP_KDF135_SRTP_OUTPUT_MAX, sizeof(char)); if (!stc->srtcp_ks) { return ACVP_MALLOC_FAIL; } return ACVP_SUCCESS; }
static ACVP_RESULT acvp_kdf135_ikev1_init_tc(ACVP_CTX *ctx, ACVP_KDF135_IKEV1_TC *stc, unsigned int tc_id, ACVP_HASH_ALG hash_alg, ACVP_KDF135_IKEV1_AUTH_METHOD auth_method, int init_nonce_len, int resp_nonce_len, int dh_secret_len, int psk_len, char *init_nonce, char *resp_nonce, char *init_ckey, char *resp_ckey, char *gxy, char *psk) { ACVP_RESULT rv = ACVP_SUCCESS; memzero_s(stc, sizeof(ACVP_KDF135_IKEV1_TC)); stc->tc_id = tc_id; stc->hash_alg = hash_alg; stc->auth_method = auth_method; stc->init_nonce_len = ACVP_BIT2BYTE(init_nonce_len); stc->resp_nonce_len = ACVP_BIT2BYTE(resp_nonce_len); stc->dh_secret_len = ACVP_BIT2BYTE(dh_secret_len); stc->psk_len = ACVP_BIT2BYTE(psk_len); stc->init_nonce = calloc(ACVP_KDF135_IKEV1_INIT_NONCE_BYTE_MAX, sizeof(unsigned char)); if (!stc->init_nonce) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(init_nonce, stc->init_nonce, ACVP_KDF135_IKEV1_INIT_NONCE_BYTE_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (init_nonce)"); return rv; } stc->resp_nonce = calloc(ACVP_KDF135_IKEV1_RESP_NONCE_BYTE_MAX, sizeof(unsigned char)); if (!stc->resp_nonce) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(resp_nonce, stc->resp_nonce, ACVP_KDF135_IKEV1_RESP_NONCE_BYTE_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (resp_nonce)"); return rv; } stc->init_ckey = calloc(ACVP_KDF135_IKEV1_COOKIE_BYTE_MAX, sizeof(unsigned char)); if (!stc->init_ckey) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(init_ckey, stc->init_ckey, ACVP_KDF135_IKEV1_COOKIE_BYTE_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (init_ckey)"); return rv; } stc->resp_ckey = calloc(ACVP_KDF135_IKEV1_COOKIE_BYTE_MAX, sizeof(unsigned char)); if (!stc->resp_ckey) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(resp_ckey, stc->resp_ckey, ACVP_KDF135_IKEV1_COOKIE_BYTE_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (resp_ckey)"); return rv; } stc->gxy = calloc(ACVP_KDF135_IKEV1_DH_SHARED_SECRET_BYTE_MAX, sizeof(unsigned char)); if (!stc->gxy) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(gxy, stc->gxy, ACVP_KDF135_IKEV1_DH_SHARED_SECRET_BYTE_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (gxy)"); return rv; } if (psk != NULL) { /* Only for PSK authentication method */ stc->psk = calloc(ACVP_KDF135_IKEV1_PSK_BYTE_MAX, sizeof(unsigned char)); if (!stc->psk) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(psk, stc->psk, ACVP_KDF135_IKEV1_PSK_BYTE_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex conversion failure (psk)"); return rv; } } stc->s_key_id = calloc(ACVP_KDF135_IKEV1_SKEY_BYTE_MAX, sizeof(unsigned char)); if (!stc->s_key_id) { return ACVP_MALLOC_FAIL; } stc->s_key_id_a = calloc(ACVP_KDF135_IKEV1_SKEY_BYTE_MAX, sizeof(unsigned char)); if (!stc->s_key_id_a) { return ACVP_MALLOC_FAIL; } stc->s_key_id_d = calloc(ACVP_KDF135_IKEV1_SKEY_BYTE_MAX, sizeof(unsigned char)); if (!stc->s_key_id_d) { return ACVP_MALLOC_FAIL; } stc->s_key_id_e = calloc(ACVP_KDF135_IKEV1_SKEY_BYTE_MAX, sizeof(unsigned char)); if (!stc->s_key_id_e) { return ACVP_MALLOC_FAIL; } return rv; }
static ACVP_RESULT acvp_cmac_init_tc(ACVP_CTX *ctx, ACVP_CMAC_TC *stc, unsigned int tc_id, char *msg, unsigned int msg_len, unsigned int key_len, char *key, char *key2, char *key3, int direction_verify, char *mac, unsigned int mac_len, ACVP_CIPHER alg_id) { ACVP_RESULT rv; if (!ctx) { return ACVP_NO_CTX; } if (alg_id != ACVP_CMAC_TDES && alg_id != ACVP_CMAC_AES) { return ACVP_INVALID_ARG; } if (!msg || !stc || !tc_id || !key) { return ACVP_INVALID_ARG; } if (alg_id == ACVP_CMAC_TDES && (!key2 || !key3)) { return ACVP_INVALID_ARG; } if (direction_verify) { if (!mac_len || !mac) { return ACVP_INVALID_ARG; } } memzero_s(stc, sizeof(ACVP_CMAC_TC)); stc->msg = calloc(1, ACVP_CMAC_MSGLEN_MAX_STR); if (!stc->msg) { return ACVP_MALLOC_FAIL; } stc->mac = calloc(ACVP_CMAC_MACLEN_MAX, sizeof(char)); if (!stc->mac) { return ACVP_MALLOC_FAIL; } stc->key = calloc(1, ACVP_CMAC_KEY_MAX); if (!stc->key) { return ACVP_MALLOC_FAIL; } stc->mac_len = mac_len; if (direction_verify) { rv = acvp_hexstr_to_bin(mac, stc->mac, ACVP_CMAC_MACLEN_MAX, (int *)&(stc->mac_len)); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex converstion failure (mac)"); return rv; } } stc->key2 = calloc(1, ACVP_CMAC_KEY_MAX); if (!stc->key2) { return ACVP_MALLOC_FAIL; } stc->key3 = calloc(1, ACVP_CMAC_KEY_MAX); if (!stc->key3) { return ACVP_MALLOC_FAIL; } rv = acvp_hexstr_to_bin(msg, stc->msg, ACVP_CMAC_MSGLEN_MAX_STR, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex converstion failure (msg)"); return rv; } if (alg_id == ACVP_CMAC_AES) { rv = acvp_hexstr_to_bin(key, stc->key, ACVP_CMAC_KEY_MAX, (int *)&(stc->key_len)); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex converstion failure (key)"); return rv; } } else if (alg_id == ACVP_CMAC_TDES) { rv = acvp_hexstr_to_bin(key, stc->key, ACVP_CMAC_KEY_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex converstion failure (key1)"); return rv; } rv = acvp_hexstr_to_bin(key2, stc->key2, ACVP_CMAC_KEY_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex converstion failure (key2)"); return rv; } rv = acvp_hexstr_to_bin(key3, stc->key3, ACVP_CMAC_KEY_MAX, NULL); if (rv != ACVP_SUCCESS) { ACVP_LOG_ERR("Hex converstion failure (key3)"); return rv; } } if (direction_verify) { stc->verify = 1; } stc->tc_id = tc_id; stc->msg_len = msg_len; stc->cipher = alg_id; return ACVP_SUCCESS; }