int complete_auth_fields(uint8_t key_id, const char *key, void *packet, size_t pckt_len, void *auth_data_pos) { const mbedtls_md_info_t *md_info; mbedtls_md_type_t md_type; size_t auth_data_len; switch (key_id) { case HMAC_SHA_1_96: md_type = MBEDTLS_MD_SHA1; auth_data_len = SHA1_AUTH_DATA_LEN; break; default: OOR_LOG(LDBG_2, "complete_auth_fields: HMAC unknown key type: %d", (int)key_id); return(BAD); } md_info = mbedtls_md_info_from_type(md_type); memset(auth_data_pos,0,auth_data_len); if (mbedtls_md_hmac(md_info, (const unsigned char *)key, strlen(key), (const unsigned char *)packet, pckt_len, (unsigned char *)auth_data_pos) != 0){ OOR_LOG(LDBG_2, "complete_auth_fields: Error using mbedtls"); return (BAD); } return (GOOD); }
int ss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity) { ssize_t blen = buf->len; uint16_t chunk_len = htons((uint16_t)blen); uint8_t hash[ONETIMEAUTH_BYTES * 2]; uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)]; uint32_t c = htonl(*counter); brealloc(buf, AUTH_BYTES + blen, capacity); memcpy(key, ctx->evp.iv, enc_iv_len); memcpy(key + enc_iv_len, &c, sizeof(uint32_t)); #if defined(USE_CRYPTO_OPENSSL) HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash, NULL); #elif defined(USE_CRYPTO_MBEDTLS) mbedtls_md_hmac(mbedtls_md_info_from_type( MBEDTLS_MD_SHA1), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash); #else sha1_hmac(key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash); #endif memmove(buf->array + AUTH_BYTES, buf->array, blen); memcpy(buf->array + CLEN_BYTES, hash, ONETIMEAUTH_BYTES); memcpy(buf->array, &chunk_len, CLEN_BYTES); *counter = *counter + 1; buf->len = blen + AUTH_BYTES; return 0; }
int ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity) { uint8_t hash[ONETIMEAUTH_BYTES * 2]; uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; memcpy(auth_key, iv, enc_iv_len); memcpy(auth_key + enc_iv_len, enc_key, enc_key_len); brealloc(buf, ONETIMEAUTH_BYTES + buf->len, capacity); #if defined(USE_CRYPTO_OPENSSL) HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash, NULL); #elif defined(USE_CRYPTO_MBEDTLS) mbedtls_md_hmac(mbedtls_md_info_from_type( MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash); #else sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash); #endif memcpy(buf->array + buf->len, hash, ONETIMEAUTH_BYTES); buf->len += ONETIMEAUTH_BYTES; return 0; }
int ss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity) { int i, j, k; ssize_t blen = buf->len; uint32_t cidx = chunk->idx; brealloc(chunk->buf, chunk->len + blen, capacity); brealloc(buf, chunk->len + blen, capacity); for (i = 0, j = 0, k = 0; i < blen; i++) { chunk->buf->array[cidx++] = buf->array[k++]; if (cidx == CLEN_BYTES) { uint16_t clen = ntohs(*((uint16_t *)chunk->buf->array)); brealloc(chunk->buf, clen + AUTH_BYTES, capacity); chunk->len = clen; } if (cidx == chunk->len + AUTH_BYTES) { // Compare hash uint8_t hash[ONETIMEAUTH_BYTES * 2]; uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)]; uint32_t c = htonl(chunk->counter); memcpy(key, ctx->evp.iv, enc_iv_len); memcpy(key + enc_iv_len, &c, sizeof(uint32_t)); #if defined(USE_CRYPTO_OPENSSL) HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash, NULL); #elif defined(USE_CRYPTO_MBEDTLS) mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash); #else sha1_hmac(key, enc_iv_len + sizeof(uint32_t), (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash); #endif if (safe_memcmp(hash, chunk->buf->array + CLEN_BYTES, ONETIMEAUTH_BYTES) != 0) { return 0; } // Copy chunk back to buffer memmove(buf->array + j + chunk->len, buf->array + k, blen - i - 1); memcpy(buf->array + j, chunk->buf->array + AUTH_BYTES, chunk->len); // Reset the base offset j += chunk->len; k = j; cidx = 0; chunk->counter++; } } buf->len = j; chunk->idx = cidx; return 1; }
void calculate_ciphertext_hmac(const unsigned char *ciphertext, const unsigned char *hmac_key, unsigned char *hmac) { #ifdef USE_MBEDTLS mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), hmac_key, 40, ciphertext, 128, hmac); #else sha1_hmac(hmac_key, 40, ciphertext, 128, hmac); #endif }
int check_auth_field(uint8_t key_id, const char *key, void *packet, size_t pckt_len, void *auth_data_pos) { size_t auth_data_len; uint8_t* auth_data_copy; const mbedtls_md_info_t *md_info; mbedtls_md_type_t md_type; switch (key_id) { case HMAC_SHA_1_96: md_type = MBEDTLS_MD_SHA1; auth_data_len = SHA1_AUTH_DATA_LEN; break; default: OOR_LOG(LDBG_2, "complete_auth_fields: HMAC unknown key type: %d", (int)key_id); return(BAD); } auth_data_copy = (uint8_t *) xmalloc(auth_data_len*sizeof(uint8_t)); if (auth_data_copy == NULL) { OOR_LOG(LERR, "check_sha1_hmac: malloc() failed"); return(ERR_MALLOC); } /* Copy the data to another location and put 0's on the auth data field of the packet */ memcpy(auth_data_copy,auth_data_pos,auth_data_len); memset(auth_data_pos,0,auth_data_len); md_info = mbedtls_md_info_from_type(md_type); if (mbedtls_md_hmac(md_info, (const unsigned char *)key, strlen(key), (const unsigned char *)packet, pckt_len, (unsigned char *)auth_data_pos) != 0){ OOR_LOG(LDBG_2, "check_auth_field: Error using mbedtls"); return (BAD); } if ((strncmp((char *)auth_data_pos, (char *)auth_data_copy, auth_data_len)) == 0) { free(auth_data_copy); return(GOOD); } else { free(auth_data_copy); return(BAD); } }
int ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len) { uint8_t hash[ONETIMEAUTH_BYTES * 2]; #if defined(USE_CRYPTO_OPENSSL) HMAC(EVP_sha1(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL); #elif defined(USE_CRYPTO_MBEDTLS) mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash); #else sha1_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash); #endif memcpy(auth, hash, ONETIMEAUTH_BYTES); return 0; }
int ss_onetimeauth_verify(buffer_t *buf, uint8_t *iv) { uint8_t hash[ONETIMEAUTH_BYTES * 2]; uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; memcpy(auth_key, iv, enc_iv_len); memcpy(auth_key + enc_iv_len, enc_key, enc_key_len); size_t len = buf->len - ONETIMEAUTH_BYTES; #if defined(USE_CRYPTO_OPENSSL) HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash, NULL); #elif defined(USE_CRYPTO_MBEDTLS) mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash); #else sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash); #endif return safe_memcmp(buf->array + len, hash, ONETIMEAUTH_BYTES); }
int ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv) { uint8_t hash[ONETIMEAUTH_BYTES * 2]; uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; memcpy(auth_key, iv, enc_iv_len); memcpy(auth_key + enc_iv_len, enc_key, enc_key_len); #if defined(USE_CRYPTO_OPENSSL) HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL); #elif defined(USE_CRYPTO_MBEDTLS) mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash); #else ss_sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash); #endif memcpy(auth, hash, ONETIMEAUTH_BYTES); return 0; }