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)