static void aes_gctr(void *aes, const u8 *icb, const u8 *x, size_t xlen, u8 *y) { size_t i, n, last; u8 cb[AES_BLOCK_SIZE], tmp[AES_BLOCK_SIZE]; const u8 *xpos = x; u8 *ypos = y; if (xlen == 0) return; n = xlen / 16; os_memcpy(cb, icb, AES_BLOCK_SIZE); /* Full blocks */ for (i = 0; i < n; i++) { aes_encrypt(aes, cb, ypos); xor_block(ypos, xpos); xpos += AES_BLOCK_SIZE; ypos += AES_BLOCK_SIZE; inc32(cb); } last = x + xlen - xpos; if (last) { /* Last, partial block */ aes_encrypt(aes, cb, tmp); for (i = 0; i < last; i++) *ypos++ = *xpos++ ^ tmp[i]; } }
static void aes_gcm_gctr(void *aes, const u8 *J0, const u8 *in, size_t len, u8 *out) { u8 J0inc[AES_BLOCK_SIZE]; if (len == 0) return; os_memcpy(J0inc, J0, AES_BLOCK_SIZE); inc32(J0inc); aes_gctr(aes, J0inc, in, len, out); }
static void aes_gcm_gctr(void *aes, const aes_uchar *J0, const aes_uchar *in, size_t len, aes_uchar *out) { aes_uchar J0inc[AES_BLOCK_SIZE]; if (len == 0) return; memcpy(J0inc, J0, AES_BLOCK_SIZE); inc32(J0inc); aes_gctr(aes, J0inc, in, len, out); }