25 #if defined(CRYPTO_ACORN128_AVR)
28 #define CA_0 ((uint32_t)0x00000000)
29 #define CA_1 ((uint32_t)0xFFFFFFFF)
30 #define CB_0 ((uint32_t)0x00000000)
31 #define CB_1 ((uint32_t)0xFFFFFFFF)
32 #define CA_0_BYTE ((uint8_t)0x00)
33 #define CA_1_BYTE ((uint8_t)0xFF)
34 #define CB_0_BYTE ((uint8_t)0x00)
35 #define CB_1_BYTE ((uint8_t)0xFF)
38 extern void acornPad(Acorn128State *state, uint32_t cb);
41 static uint8_t acornEncrypt8
42 (Acorn128State *state, uint8_t plaintext, uint8_t ca, uint8_t cb)
43 __attribute__((always_inline));
44 static uint8_t acornDecrypt8(Acorn128State *state, uint8_t ciphertext)
45 __attribute__((always_inline));
47 static uint8_t acornEncrypt8
48 (Acorn128State *state, uint8_t plaintext, uint8_t ca, uint8_t cb)
52 __asm__ __volatile__ (
272 :
"z"(&state->s1_l),
"r"(plaintext),
"r"((uint8_t)ca),
"r"((uint8_t)cb)
273 :
"r16",
"r17",
"r20",
"r21",
"r22",
"r23",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"memory"
278 static uint8_t acornDecrypt8(Acorn128State *state, uint8_t ciphertext)
282 __asm__ __volatile__ (
498 :
"z"(&state->s1_l),
"r"(ciphertext)
499 :
"r16",
"r17",
"r20",
"r21",
"r22",
"r23",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"memory"
504 uint32_t acornEncrypt32
505 (Acorn128State *state, uint32_t plaintext, uint32_t ca, uint32_t cb)
508 ciphertext = acornEncrypt8
509 (state, (uint8_t)plaintext, (uint8_t)ca, (uint8_t)cb);
510 ciphertext |= ((uint32_t)(acornEncrypt8
511 (state, (uint8_t)(plaintext >> 8), (uint8_t)ca, (uint8_t)cb))) << 8;
512 ciphertext |= ((uint32_t)(acornEncrypt8
513 (state, (uint8_t)(plaintext >> 16), (uint8_t)ca, (uint8_t)cb))) << 16;
514 ciphertext |= ((uint32_t)(acornEncrypt8
515 (state, (uint8_t)(plaintext >> 24), (uint8_t)ca, (uint8_t)cb))) << 24;
522 if (!state.authDone) {
523 acornPad(&state, CB_1);
527 *output++ = acornEncrypt8(&state, *input++, CA_1_BYTE, CB_0_BYTE);
535 if (!state.authDone) {
536 acornPad(&state, CB_1);
540 *output++ = acornDecrypt8(&state, *input++);
549 const uint8_t *input = (
const uint8_t *)data;
551 acornEncrypt8(&state, *input++, CA_1_BYTE, CB_1_BYTE);
void encrypt(uint8_t *output, const uint8_t *input, size_t len)
Encrypts an input buffer and writes the ciphertext to an output buffer.
void decrypt(uint8_t *output, const uint8_t *input, size_t len)
Decrypts an input buffer and writes the plaintext to an output buffer.
void addAuthData(const void *data, size_t len)
Adds extra data that will be authenticated but not encrypted.