27 #ifndef _DTLS_CRYPTO_H_
28 #define _DTLS_CRYPTO_H_
35 #include "aes/rijndael.h"
44 #define DTLS_MAC_KEY_LENGTH 0
45 #define DTLS_KEY_LENGTH 16
46 #define DTLS_BLK_LENGTH 16
47 #define DTLS_MAC_LENGTH DTLS_HMAC_DIGEST_SIZE
48 #define DTLS_IV_LENGTH 4
55 #define MAX_KEYBLOCK_LENGTH \
56 (2 * DTLS_MAC_KEY_LENGTH + 2 * DTLS_KEY_LENGTH + 2 * DTLS_IV_LENGTH)
59 #define DTLS_MASTER_SECRET_LENGTH 48
60 #define DTLS_RANDOM_LENGTH 32
89 #define DTLS_PSK_MAX_CLIENT_IDENTITY_LEN 32
92 #define DTLS_PSK_MAX_KEY_LEN 32
129 unsigned int do_client_auth:1;
143 #define dtls_kb_client_mac_secret(Param, Role) ((Param)->key_block)
144 #define dtls_kb_server_mac_secret(Param, Role) \
145 (dtls_kb_client_mac_secret(Param, Role) + DTLS_MAC_KEY_LENGTH)
146 #define dtls_kb_remote_mac_secret(Param, Role) \
147 ((Role) == DTLS_SERVER \
148 ? dtls_kb_client_mac_secret(Param, Role) \
149 : dtls_kb_server_mac_secret(Param, Role))
150 #define dtls_kb_local_mac_secret(Param, Role) \
151 ((Role) == DTLS_CLIENT \
152 ? dtls_kb_client_mac_secret(Param, Role) \
153 : dtls_kb_server_mac_secret(Param, Role))
154 #define dtls_kb_mac_secret_size(Param, Role) DTLS_MAC_KEY_LENGTH
155 #define dtls_kb_client_write_key(Param, Role) \
156 (dtls_kb_server_mac_secret(Param, Role) + DTLS_MAC_KEY_LENGTH)
157 #define dtls_kb_server_write_key(Param, Role) \
158 (dtls_kb_client_write_key(Param, Role) + DTLS_KEY_LENGTH)
159 #define dtls_kb_remote_write_key(Param, Role) \
160 ((Role) == DTLS_SERVER \
161 ? dtls_kb_client_write_key(Param, Role) \
162 : dtls_kb_server_write_key(Param, Role))
163 #define dtls_kb_local_write_key(Param, Role) \
164 ((Role) == DTLS_CLIENT \
165 ? dtls_kb_client_write_key(Param, Role) \
166 : dtls_kb_server_write_key(Param, Role))
167 #define dtls_kb_key_size(Param, Role) DTLS_KEY_LENGTH
168 #define dtls_kb_client_iv(Param, Role) \
169 (dtls_kb_server_write_key(Param, Role) + DTLS_KEY_LENGTH)
170 #define dtls_kb_server_iv(Param, Role) \
171 (dtls_kb_client_iv(Param, Role) + DTLS_IV_LENGTH)
172 #define dtls_kb_remote_iv(Param, Role) \
173 ((Role) == DTLS_SERVER \
174 ? dtls_kb_client_iv(Param, Role) \
175 : dtls_kb_server_iv(Param, Role))
176 #define dtls_kb_local_iv(Param, Role) \
177 ((Role) == DTLS_CLIENT \
178 ? dtls_kb_client_iv(Param, Role) \
179 : dtls_kb_server_iv(Param, Role))
180 #define dtls_kb_iv_size(Param, Role) DTLS_IV_LENGTH
182 #define dtls_kb_size(Param, Role) \
183 (2 * (dtls_kb_mac_secret_size(Param, Role) + \
184 dtls_kb_key_size(Param, Role) + dtls_kb_iv_size(Param, Role)))
187 #define dtls_kb_digest_size(Param, Role) DTLS_MAC_LENGTH
206 const unsigned char *key,
size_t keylen,
207 const unsigned char *label,
size_t labellen,
208 const unsigned char *random1,
size_t random1len,
209 const unsigned char *random2,
size_t random2len,
210 unsigned char *buf,
size_t buflen);
217 size_t dtls_prf(
const unsigned char *key,
size_t keylen,
218 const unsigned char *label,
size_t labellen,
219 const unsigned char *random1,
size_t random1len,
220 const unsigned char *random2,
size_t random2len,
221 unsigned char *buf,
size_t buflen);
240 const unsigned char *record,
241 const unsigned char *packet,
size_t length,
264 int dtls_encrypt(
const unsigned char *src,
size_t length,
266 unsigned char *nounce,
267 unsigned char *key,
size_t keylen,
268 const unsigned char *aad,
size_t aad_length);
288 int dtls_decrypt(
const unsigned char *src,
size_t length,
290 unsigned char *nounce,
291 unsigned char *key,
size_t keylen,
292 const unsigned char *a_data,
size_t a_data_length);
307 unsigned char *result,
size_t result_len);
309 #define DTLS_EC_KEY_SIZE 32
312 unsigned char *pub_key_x,
313 unsigned char *pub_key_y,
315 unsigned char *result,
319 unsigned char *pub_key_x,
320 unsigned char *pub_key_y,
324 const unsigned char *sign_hash,
size_t sign_hash_size,
325 uint32_t point_r[9], uint32_t point_s[9]);
328 const unsigned char *client_random,
size_t client_random_size,
329 const unsigned char *server_random,
size_t server_random_size,
330 const unsigned char *keyx_params,
size_t keyx_params_size,
331 uint32_t point_r[9], uint32_t point_s[9]);
334 const unsigned char *pub_key_y,
size_t key_size,
335 const unsigned char *sign_hash,
size_t sign_hash_size,
336 unsigned char *result_r,
unsigned char *result_s);
339 const unsigned char *pub_key_y,
size_t key_size,
340 const unsigned char *client_random,
size_t client_random_size,
341 const unsigned char *server_random,
size_t server_random_size,
342 const unsigned char *keyx_params,
size_t keyx_params_size,
343 unsigned char *result_r,
unsigned char *result_s);
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)
void dtls_security_free(dtls_security_parameters_t *security)
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)
Wrappers for list structures and functions.
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 aad_length)
void dtls_mac(dtls_hmac_context_t *hmac_ctx, const unsigned char *record, const unsigned char *packet, size_t length, unsigned char *buf)
dtls_handshake_parameters_t * dtls_handshake_new()
int dtls_psk_pre_master_secret(unsigned char *key, size_t keylen, unsigned char *result, size_t result_len)
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_decrypt(const unsigned char *src, size_t length, unsigned char *buf, unsigned char *nounce, unsigned char *key, size_t keylen, const unsigned char *a_data, size_t a_data_length)
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)
#define DTLS_PSK_MAX_CLIENT_IDENTITY_LEN
#define MAX_KEYBLOCK_LENGTH
void dtls_handshake_free(dtls_handshake_parameters_t *handshake)
#define DTLS_RANDOM_LENGTH
dtls_compression_t compression
dtls_compression_t compression
#define DTLS_MASTER_SECRET_LENGTH
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)
state information for DTLS FSM
int dtls_ec_key_from_uint32_asn1(const uint32_t *key, size_t key_size, unsigned char *buf)
#define LIST_STRUCT(name)
dtls_security_parameters_t * dtls_security_new()
struct dtls_cipher_context_t dtls_cipher_context_t
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)
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])