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)