21#include <openssl/evp.h>
22#include <openssl/opensslv.h>
23#include <openssl/kdf.h>
24#define HAVE_OPENSSL_HKDF
41 uint8_t *key_out,
size_t key_out_len)
44 uint8_t *cp, *tmp = tor_malloc(key_in_len+1);
50 memcpy(tmp, key_in, key_in_len);
51 for (cp = key_out, i=0; cp < key_out+key_out_len;
54 if (
crypto_digest((
char*)digest, (
const char *)tmp, key_in_len+1) < 0)
56 memcpy(cp, digest, MIN(
DIGEST_LEN, key_out_len-(cp-key_out)));
63 memwipe(digest, 0,
sizeof(digest));
67#ifdef HAVE_OPENSSL_HKDF
75crypto_expand_key_material_rfc5869_sha256_openssl(
76 const uint8_t *key_in,
size_t key_in_len,
77 const uint8_t *salt_in,
size_t salt_in_len,
78 const uint8_t *info_in,
size_t info_in_len,
79 uint8_t *key_out,
size_t key_out_len)
82 EVP_PKEY_CTX *evp_pkey_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);
87 r = EVP_PKEY_derive_init(evp_pkey_ctx);
90 r = EVP_PKEY_CTX_set_hkdf_md(evp_pkey_ctx, EVP_sha256());
93 r = EVP_PKEY_CTX_set1_hkdf_salt(evp_pkey_ctx, salt_in, (
int)salt_in_len);
96 r = EVP_PKEY_CTX_set1_hkdf_key(evp_pkey_ctx, key_in, (
int)key_in_len);
99 r = EVP_PKEY_CTX_add1_hkdf_info(evp_pkey_ctx, info_in, (
int)info_in_len);
102 r = EVP_PKEY_derive(evp_pkey_ctx, key_out, &key_out_len);
105 EVP_PKEY_CTX_free(evp_pkey_ctx);
117 const uint8_t *key_in,
size_t key_in_len,
118 const uint8_t *salt_in,
size_t salt_in_len,
119 const uint8_t *info_in,
size_t info_in_len,
120 uint8_t *key_out,
size_t key_out_len)
130 (
const char*)salt_in, salt_in_len,
131 (
const char*)key_in, key_in_len);
136 memset(tmp, 0,
sizeof(tmp));
140 while (key_out_len) {
148 memcpy(tmp, info_in, info_in_len);
149 tmp[info_in_len] = i;
150 tmp_len = info_in_len + 1;
154 (
const char*)tmp, tmp_len);
156 memcpy(outp, mac, n);
177 const uint8_t *key_in,
size_t key_in_len,
178 const uint8_t *salt_in,
size_t salt_in_len,
179 const uint8_t *info_in,
size_t info_in_len,
180 uint8_t *key_out,
size_t key_out_len)
185#ifdef HAVE_OPENSSL_HKDF
186 return crypto_expand_key_material_rfc5869_sha256_openssl(key_in,
188 salt_in_len, info_in,
190 key_out, key_out_len);
194 salt_in_len, info_in,
196 key_out, key_out_len);
Macro definitions for MIN, MAX, and CLAMP.
Headers for crypto_digest.c.
void crypto_hmac_sha256(char *hmac_out, const char *key, size_t key_len, const char *msg, size_t msg_len)
int crypto_digest(char *digest, const char *m, size_t len)
int crypto_expand_key_material_TAP(const uint8_t *key_in, size_t key_in_len, uint8_t *key_out, size_t key_out_len)
static int crypto_expand_key_material_rfc5869_sha256_legacy(const uint8_t *key_in, size_t key_in_len, const uint8_t *salt_in, size_t salt_in_len, const uint8_t *info_in, size_t info_in_len, uint8_t *key_out, size_t key_out_len)
int crypto_expand_key_material_rfc5869_sha256(const uint8_t *key_in, size_t key_in_len, const uint8_t *salt_in, size_t salt_in_len, const uint8_t *info_in, size_t info_in_len, uint8_t *key_out, size_t key_out_len)
Headers for crypto_hkdf.h.
Headers for crypto_openssl_mgt.c.
void memwipe(void *mem, uint8_t byte, size_t sz)
Common functions for cryptographic routines.
Macros to manage assertions, fatal and non-fatal.