37 #define CCM_FLAGS(A,M,L) (((A > 0) << 6) | (((M - 2)/2) << 3) | (L - 1))
39 #define MASK_L(_L) ((1 << 8 * _L) - 1)
41 #define SET_COUNTER(A,L,cnt,C) { \
43 memset((A) + DTLS_CCM_BLOCKSIZE - (L), 0, (L)); \
44 (C) = (cnt) & MASK_L(L); \
45 for (i = DTLS_CCM_BLOCKSIZE - 1; (C) && (i > (L)); --i, (C) >>= 8) \
46 (A)[i] |= (C) & 0xFF; \
55 unsigned char *result) {
61 memcpy(result + 1, nonce, DTLS_CCM_BLOCKSIZE - L);
63 for (i=0; i < L; i++) {
64 result[15-i] = lm & 0xff;
86 unsigned char X[DTLS_CCM_BLOCKSIZE]) {
89 rijndael_encrypt(ctx, B, X);
91 memset(B, 0, DTLS_CCM_BLOCKSIZE);
100 }
else if (la <= UINT32_MAX) {
122 i =
min(DTLS_CCM_BLOCKSIZE - j, la);
123 memcpy(B + j, msg, i);
127 memxor(B, X, DTLS_CCM_BLOCKSIZE);
129 rijndael_encrypt(ctx, B, X);
131 while (la > DTLS_CCM_BLOCKSIZE) {
133 B[i] = X[i] ^ *msg++;
136 rijndael_encrypt(ctx, B, X);
140 memset(B, 0, DTLS_CCM_BLOCKSIZE);
142 memxor(B, X, DTLS_CCM_BLOCKSIZE);
144 rijndael_encrypt(ctx, B, X);
149 encrypt(rijndael_ctx *ctx,
size_t L,
unsigned long counter,
150 unsigned char *msg,
size_t len,
152 unsigned char S[DTLS_CCM_BLOCKSIZE]) {
154 static unsigned long counter_tmp;
157 rijndael_encrypt(ctx, A, S);
163 unsigned char *msg,
size_t len,
165 unsigned char X[DTLS_CCM_BLOCKSIZE]) {
168 for (i = 0; i < len; ++i)
169 B[i] = X[i] ^ msg[i];
171 rijndael_encrypt(ctx, B, X);
178 unsigned char *msg,
size_t lm,
179 const unsigned char *aad,
size_t la) {
181 unsigned long counter_tmp;
182 unsigned long counter = 1;
191 block0(M, L, la, lm, nonce, B);
198 memcpy(A + 1, nonce, DTLS_CCM_BLOCKSIZE - L);
200 while (lm >= DTLS_CCM_BLOCKSIZE) {
202 mac(ctx, msg, DTLS_CCM_BLOCKSIZE, B, X);
205 encrypt(ctx, L, counter, msg, DTLS_CCM_BLOCKSIZE, A, S);
219 memcpy(B + lm, X + lm, DTLS_CCM_BLOCKSIZE - lm);
220 mac(ctx, msg, lm, B, X);
223 encrypt(ctx, L, counter, msg, lm, A, S);
231 rijndael_encrypt(ctx, A, S);
233 for (i = 0; i < M; ++i)
234 *msg++ = X[i] ^ S[i];
242 unsigned char *msg,
size_t lm,
243 const unsigned char *aad,
size_t la) {
246 unsigned long counter_tmp;
247 unsigned long counter = 1;
261 block0(M, L, la, lm, nonce, B);
268 memcpy(A + 1, nonce, DTLS_CCM_BLOCKSIZE - L);
270 while (lm >= DTLS_CCM_BLOCKSIZE) {
272 encrypt(ctx, L, counter, msg, DTLS_CCM_BLOCKSIZE, A, S);
275 mac(ctx, msg, DTLS_CCM_BLOCKSIZE, B, X);
285 encrypt(ctx, L, counter, msg, lm, A, S);
292 memcpy(B + lm, X + lm, DTLS_CCM_BLOCKSIZE - lm);
293 mac(ctx, msg, lm, B, X);
301 rijndael_encrypt(ctx, A, S);
static void block0(size_t M, size_t L, size_t la, size_t lm, unsigned char nonce[DTLS_CCM_BLOCKSIZE], unsigned char *result)
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)
static void memxor(unsigned char *x, const unsigned char *y, size_t n)
static void encrypt(rijndael_ctx *ctx, size_t L, unsigned long counter, unsigned char *msg, size_t len, unsigned char A[DTLS_CCM_BLOCKSIZE], unsigned char S[DTLS_CCM_BLOCKSIZE])
#define CCM_FLAGS(A, M, L)
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 int dtls_int_to_uint64(unsigned char *field, uint64_t value)
static int dtls_int_to_uint16(unsigned char *field, uint16_t value)
static void add_auth_data(rijndael_ctx *ctx, const unsigned char *msg, size_t la, unsigned char B[DTLS_CCM_BLOCKSIZE], unsigned char X[DTLS_CCM_BLOCKSIZE])
static int dtls_int_to_uint32(unsigned char *field, uint32_t value)
static void mac(rijndael_ctx *ctx, unsigned char *msg, size_t len, unsigned char B[DTLS_CCM_BLOCKSIZE], unsigned char X[DTLS_CCM_BLOCKSIZE])
#define DTLS_CCM_BLOCKSIZE
static int equals(unsigned char *a, unsigned char *b, size_t len)
#define SET_COUNTER(A, L, cnt, C)