42 #define HMAC_UPDATE_SEED(Context,Seed,Length) \ 43 if (Seed) dtls_hmac_update(Context, (Seed), (Length)) 92 memb_init(&handshake_storage);
93 memb_init(&security_storage);
97 return memb_alloc(&handshake_storage);
101 memb_free(&handshake_storage, handshake);
105 return memb_alloc(&security_storage);
109 memb_free(&security_storage, security);
119 dtls_crit(
"can not allocate a handshake struct\n");
123 memset(handshake, 0,
sizeof(*handshake));
127 dtls_debug(
"DTLSv12: initialize HASH_SHA256\n");
151 dtls_crit(
"can not allocate a security struct\n");
155 memset(security, 0,
sizeof(*security));
174 const unsigned char *key,
size_t keylen,
175 const unsigned char *label,
size_t labellen,
176 const unsigned char *random1,
size_t random1len,
177 const unsigned char *random2,
size_t random2len,
178 unsigned char *buf,
size_t buflen) {
202 while (len + dlen < buflen) {
213 memcpy(buf, tmp, dlen);
230 memcpy(buf, tmp, buflen - len);
241 const unsigned char *label,
size_t labellen,
242 const unsigned char *random1,
size_t random1len,
243 const unsigned char *random2,
size_t random2len,
244 unsigned char *buf,
size_t buflen) {
247 memset(buf, 0, buflen);
258 const unsigned char *record,
259 const unsigned char *packet,
size_t length,
260 unsigned char *buf) {
276 unsigned char *nounce,
277 const unsigned char *aad,
size_t la) {
293 size_t srclen,
unsigned char *buf,
294 unsigned char *nounce,
295 const unsigned char *aad,
size_t la) {
312 unsigned char *result,
size_t result_len) {
313 unsigned char *p = result;
315 if (result_len < (2 * (
sizeof(
uint16) + keylen))) {
322 memset(p, 0, keylen);
325 memcpy(p, result,
sizeof(
uint16));
328 memcpy(p, key, keylen);
330 return 2 * (
sizeof(
uint16) + keylen);
339 for (i = (key_size /
sizeof(
uint32_t)) - 1; i >= 0 ; i--) {
346 unsigned char *result) {
349 for (i = (key_size /
sizeof(
uint32_t)) - 1; i >= 0 ; i--) {
356 unsigned char *buf) {
358 unsigned char *buf_orig = buf;
361 for (i = (key_size /
sizeof(
uint32_t)) - 1; i >= 0 ; i--) {
365 if (first && key[i] & 0x80000000) {
370 }
else if (first && !(key[i] & 0xFF800000)) {
371 buf[0] = (key[i] >> 16) & 0xff;
372 buf[1] = (key[i] >> 8) & 0xff;
373 buf[2] = key[i] & 0xff;
375 }
else if (first && !(key[i] & 0xFFFF8000)) {
376 buf[0] = (key[i] >> 8) & 0xff;
377 buf[1] = key[i] & 0xff;
379 }
else if (first && !(key[i] & 0xFFFFFF80)) {
380 buf[0] = key[i] & 0xff;
388 return buf - buf_orig;
392 unsigned char *pub_key_x,
393 unsigned char *pub_key_y,
395 unsigned char *result,
403 if (result_len < key_size) {
411 ecc_ecdh(pub_x, pub_y, priv, result_x, result_y);
419 unsigned char *pub_key_x,
420 unsigned char *pub_key_y,
427 dtls_prng((
unsigned char *)priv, key_size);
428 }
while (!ecc_is_valid_key(priv));
430 ecc_gen_pub_key(priv, pub_x, pub_y);
440 const unsigned char *sign_hash,
size_t sign_hash_size,
450 dtls_prng((
unsigned char *)rand, key_size);
451 ret = ecc_ecdsa_sign(priv, hash, rand, point_r, point_s);
457 const unsigned char *client_random,
size_t client_random_size,
458 const unsigned char *server_random,
size_t server_random_size,
459 const unsigned char *keyx_params,
size_t keyx_params_size,
471 sizeof(sha256hash), point_r, point_s);
477 const unsigned char *pub_key_y,
size_t key_size,
478 const unsigned char *sign_hash,
size_t sign_hash_size,
479 unsigned char *result_r,
unsigned char *result_s) {
492 return ecc_ecdsa_validate(pub_x, pub_y, hash, point_r, point_s);
497 const unsigned char *pub_key_y,
size_t key_size,
498 const unsigned char *client_random,
size_t client_random_size,
499 const unsigned char *server_random,
size_t server_random_size,
500 const unsigned char *keyx_params,
size_t keyx_params_size,
501 unsigned char *result_r,
unsigned char *result_s) {
512 sizeof(sha256hash), result_r, result_s);
519 unsigned char *nounce,
520 unsigned char *key,
size_t keylen,
521 const unsigned char *aad,
size_t la)
526 ret = rijndael_set_key_enc_only(&ctx->
data.
ctx, key, 8 * keylen);
534 memmove(buf, src, length);
545 unsigned char *nounce,
546 unsigned char *key,
size_t keylen,
547 const unsigned char *aad,
size_t la)
552 ret = rijndael_set_key_enc_only(&ctx->
data.
ctx, key, 8 * keylen);
560 memmove(buf, src, length);
static void dtls_cipher_context_release(void)
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])
static dtls_handshake_parameters_t * dtls_handshake_malloc(void)
dtls_sha256_ctx dtls_hash_ctx
void netq_delete_all(netq_t **queue)
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)
struct netq_t * reorder_queue
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)
dtls_security_parameters_t * dtls_security_new(void)
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])
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)
static dtls_security_parameters_t * dtls_security_malloc(void)
#define HMAC_UPDATE_SEED(Context, Seed, Length)
#define DTLS_CCM_NONCE_SIZE
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)
dtls_handshake_parameters_t * dtls_handshake_new(void)
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)