52 #define HMAC_UPDATE_SEED(Context,Seed,Length) \
53 if (Seed) dtls_hmac_update(Context, (Seed), (Length))
102 memb_init(&handshake_storage);
103 memb_init(&security_storage);
107 return memb_alloc(&handshake_storage);
111 memb_free(&handshake_storage, handshake);
115 return memb_alloc(&security_storage);
119 memb_free(&security_storage, security);
129 dtls_crit(
"can not allocate a handshake struct\n");
133 memset(handshake, 0,
sizeof(*handshake));
137 dtls_debug(
"DTLSv12: initialize HASH_SHA256\n");
161 dtls_crit(
"can not allocate a security struct\n");
165 memset(security, 0,
sizeof(*security));
184 const unsigned char *key,
size_t keylen,
185 const unsigned char *label,
size_t labellen,
186 const unsigned char *random1,
size_t random1len,
187 const unsigned char *random2,
size_t random2len,
188 unsigned char *buf,
size_t buflen) {
211 while (len + dlen < buflen) {
222 memcpy(buf, tmp, dlen);
239 memcpy(buf, tmp, buflen - len);
250 const unsigned char *label,
size_t labellen,
251 const unsigned char *random1,
size_t random1len,
252 const unsigned char *random2,
size_t random2len,
253 unsigned char *buf,
size_t buflen) {
256 memset(buf, 0, buflen);
267 const unsigned char *record,
268 const unsigned char *packet,
size_t length,
269 unsigned char *buf) {
285 unsigned char *nounce,
286 const unsigned char *aad,
size_t la) {
301 size_t srclen,
unsigned char *buf,
302 unsigned char *nounce,
303 const unsigned char *aad,
size_t la) {
319 unsigned char *result,
size_t result_len) {
320 unsigned char *p = result;
322 if (result_len < (2 * (
sizeof(
uint16) + keylen))) {
329 memset(p, 0, keylen);
332 memcpy(p, result,
sizeof(
uint16));
335 memcpy(p, key, keylen);
337 return 2 * (
sizeof(
uint16) + keylen);
346 for (i = (key_size /
sizeof(uint32_t)) - 1; i >= 0 ; i--) {
353 unsigned char *result) {
356 for (i = (key_size /
sizeof(uint32_t)) - 1; i >= 0 ; i--) {
363 unsigned char *buf) {
365 unsigned char *buf_orig = buf;
368 for (i = (key_size /
sizeof(uint32_t)) - 1; i >= 0 ; i--) {
372 if (first && key[i] & 0x80000000) {
377 }
else if (first && !(key[i] & 0xFF800000)) {
378 buf[0] = (key[i] >> 16) & 0xff;
379 buf[1] = (key[i] >> 8) & 0xff;
380 buf[2] = key[i] & 0xff;
382 }
else if (first && !(key[i] & 0xFFFF8000)) {
383 buf[0] = (key[i] >> 8) & 0xff;
384 buf[1] = key[i] & 0xff;
386 }
else if (first && !(key[i] & 0xFFFFFF80)) {
387 buf[0] = key[i] & 0xff;
395 return buf - buf_orig;
399 unsigned char *pub_key_x,
400 unsigned char *pub_key_y,
402 unsigned char *result,
407 uint32_t result_x[8];
408 uint32_t result_y[8];
410 if (result_len < key_size) {
418 ecc_ecdh(pub_x, pub_y, priv, result_x, result_y);
426 unsigned char *pub_key_x,
427 unsigned char *pub_key_y,
434 dtls_prng((
unsigned char *)priv, key_size);
435 }
while (!ecc_is_valid_key(priv));
437 ecc_gen_pub_key(priv, pub_x, pub_y);
447 const unsigned char *sign_hash,
size_t sign_hash_size,
448 uint32_t point_r[9], uint32_t point_s[9]) {
457 dtls_prng((
unsigned char *)rand, key_size);
458 ret = ecc_ecdsa_sign(priv, hash, rand, point_r, point_s);
464 const unsigned char *client_random,
size_t client_random_size,
465 const unsigned char *server_random,
size_t server_random_size,
466 const unsigned char *keyx_params,
size_t keyx_params_size,
467 uint32_t point_r[9], uint32_t point_s[9]) {
478 sizeof(sha256hash), point_r, point_s);
484 const unsigned char *pub_key_y,
size_t key_size,
485 const unsigned char *sign_hash,
size_t sign_hash_size,
486 unsigned char *result_r,
unsigned char *result_s) {
499 return ecc_ecdsa_validate(pub_x, pub_y, hash, point_r, point_s);
504 const unsigned char *pub_key_y,
size_t key_size,
505 const unsigned char *client_random,
size_t client_random_size,
506 const unsigned char *server_random,
size_t server_random_size,
507 const unsigned char *keyx_params,
size_t keyx_params_size,
508 unsigned char *result_r,
unsigned char *result_s) {
519 sizeof(sha256hash), result_r, result_s);
526 unsigned char *nounce,
527 unsigned char *key,
size_t keylen,
528 const unsigned char *aad,
size_t la)
533 ret = rijndael_set_key_enc_only(&ctx->
data.
ctx, key, 8 * keylen);
541 memmove(buf, src, length);
552 unsigned char *nounce,
553 unsigned char *key,
size_t keylen,
554 const unsigned char *aad,
size_t la)
559 ret = rijndael_set_key_enc_only(&ctx->
data.
ctx, key, 8 * keylen);
567 memmove(buf, src, length);
static void dtls_cipher_context_release(void)
static dtls_handshake_parameters_t * dtls_handshake_malloc()
void dtls_handshake_free(dtls_handshake_parameters_t *handshake)
static uint32_t dtls_uint32_to_int(const unsigned char *field)
static pthread_mutex_t cipher_context_mutex
void dtls_hmac_update(dtls_hmac_context_t *ctx, const unsigned char *input, size_t ilen)
int dtls_ecdh_pre_master_secret(unsigned char *priv_key, unsigned char *pub_key_x, unsigned char *pub_key_y, size_t key_size, unsigned char *result, size_t result_len)
int dtls_psk_pre_master_secret(unsigned char *key, size_t keylen, unsigned char *result, size_t result_len)
long int dtls_ccm_decrypt_message(rijndael_ctx *ctx, size_t M, size_t L, unsigned char nonce[DTLS_CCM_BLOCKSIZE], unsigned char *msg, size_t lm, const unsigned char *aad, size_t la)
size_t dtls_p_hash(dtls_hashfunc_t h, const unsigned char *key, size_t keylen, const unsigned char *label, size_t labellen, const unsigned char *random1, size_t random1len, const unsigned char *random2, size_t random2len, unsigned char *buf, size_t buflen)
int dtls_encrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, unsigned char *key, size_t keylen, const unsigned char *aad, size_t la)
void dtls_hmac_free(dtls_hmac_context_t *ctx)
void dtls_ecdsa_create_sig_hash(const unsigned char *priv_key, size_t key_size, const unsigned char *sign_hash, size_t sign_hash_size, uint32_t point_r[9], uint32_t point_s[9])
void dtls_ecdsa_generate_key(unsigned char *priv_key, unsigned char *pub_key_x, unsigned char *pub_key_y, size_t key_size)
int dtls_ec_key_from_uint32_asn1(const uint32_t *key, size_t key_size, unsigned char *buf)
int dtls_ecdsa_verify_sig(const unsigned char *pub_key_x, const unsigned char *pub_key_y, size_t key_size, const unsigned char *client_random, size_t client_random_size, const unsigned char *server_random, size_t server_random_size, const unsigned char *keyx_params, size_t keyx_params_size, unsigned char *result_r, unsigned char *result_s)
static void dtls_ec_key_from_uint32(const uint32_t *key, size_t key_size, unsigned char *result)
#define DTLS_HMAC_DIGEST_SIZE
static void dtls_handshake_dealloc(dtls_handshake_parameters_t *handshake)
long int dtls_ccm_encrypt_message(rijndael_ctx *ctx, size_t M, size_t L, unsigned char nonce[DTLS_CCM_BLOCKSIZE], unsigned char *msg, size_t lm, const unsigned char *aad, size_t la)
static size_t dtls_ccm_encrypt(aes128_ccm_t *ccm_ctx, const unsigned char *src, size_t srclen, unsigned char *buf, unsigned char *nounce, const unsigned char *aad, size_t la)
dtls_handshake_parameters_t * dtls_handshake_new()
void dtls_hmac_init(dtls_hmac_context_t *ctx, const unsigned char *key, size_t klen)
dtls_hmac_context_t * dtls_hmac_new(const unsigned char *key, size_t klen)
static void dtls_hash_init(dtls_hash_t ctx)
static size_t dtls_ccm_decrypt(aes128_ccm_t *ccm_ctx, const unsigned char *src, size_t srclen, unsigned char *buf, unsigned char *nounce, const unsigned char *aad, size_t la)
static int dtls_int_to_uint16(unsigned char *field, uint16_t value)
static void dtls_hash_update(dtls_hash_t ctx, const unsigned char *input, size_t len)
High level DTLS API and visible structures.
int dtls_hmac_finalize(dtls_hmac_context_t *ctx, unsigned char *result)
void dtls_ecdsa_create_sig(const unsigned char *priv_key, size_t key_size, const unsigned char *client_random, size_t client_random_size, const unsigned char *server_random, size_t server_random_size, const unsigned char *keyx_params, size_t keyx_params_size, uint32_t point_r[9], uint32_t point_s[9])
static dtls_security_parameters_t * dtls_security_malloc()
int dtls_ecdsa_verify_sig_hash(const unsigned char *pub_key_x, const unsigned char *pub_key_y, size_t key_size, const unsigned char *sign_hash, size_t sign_hash_size, unsigned char *result_r, unsigned char *result_s)
static struct dtls_cipher_context_t cipher_context
dtls_compression_t compression
static void dtls_security_dealloc(dtls_security_parameters_t *security)
void dtls_security_free(dtls_security_parameters_t *security)
static int dtls_int_to_uint32(unsigned char *field, uint32_t value)
#define HMAC_UPDATE_SEED(Context, Seed, Length)
#define DTLS_CCM_NONCE_SIZE
dtls_security_parameters_t * dtls_security_new()
static struct dtls_cipher_context_t * dtls_cipher_context_get(void)
static int dtls_prng(unsigned char *buf, size_t len)
static size_t dtls_hash_finalize(unsigned char *buf, dtls_hash_t ctx)
void netq_delete_all(list_t queue)
size_t dtls_prf(const unsigned char *key, size_t keylen, const unsigned char *label, size_t labellen, const unsigned char *random1, size_t random1len, const unsigned char *random2, size_t random2len, unsigned char *buf, size_t buflen)
void dtls_mac(dtls_hmac_context_t *hmac_ctx, const unsigned char *record, const unsigned char *packet, size_t length, unsigned char *buf)
int dtls_decrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, unsigned char *key, size_t keylen, const unsigned char *aad, size_t la)
static void dtls_ec_key_to_uint32(const unsigned char *key, size_t key_size, uint32_t *result)