1 2 #include <stdint.h> 3 #include <stdlib.h> 4 5 #include "crypto_core_hchacha20.h" 6 #include "private/common.h" 7 8 #define QUARTERROUND(A, B, C, D) \ 9 do { \ 10 A += B; D = ROTL32(D ^ A, 16); \ 11 C += D; B = ROTL32(B ^ C, 12); \ 12 A += B; D = ROTL32(D ^ A, 8); \ 13 C += D; B = ROTL32(B ^ C, 7); \ 14 } while(0) 15 16 int 17 crypto_core_hchacha20(unsigned char *out, const unsigned char *in, 18 const unsigned char *k, const unsigned char *c) 19 { 20 int i; 21 uint32_t x0, x1, x2, x3, x4, x5, x6, x7; 22 uint32_t x8, x9, x10, x11, x12, x13, x14, x15; 23 24 if (c == NULL) { 25 x0 = 0x61707865; 26 x1 = 0x3320646e; 27 x2 = 0x79622d32; 28 x3 = 0x6b206574; 29 } else { 30 x0 = LOAD32_LE(c + 0); 31 x1 = LOAD32_LE(c + 4); 32 x2 = LOAD32_LE(c + 8); 33 x3 = LOAD32_LE(c + 12); 34 } 35 x4 = LOAD32_LE(k + 0); 36 x5 = LOAD32_LE(k + 4); 37 x6 = LOAD32_LE(k + 8); 38 x7 = LOAD32_LE(k + 12); 39 x8 = LOAD32_LE(k + 16); 40 x9 = LOAD32_LE(k + 20); 41 x10 = LOAD32_LE(k + 24); 42 x11 = LOAD32_LE(k + 28); 43 x12 = LOAD32_LE(in + 0); 44 x13 = LOAD32_LE(in + 4); 45 x14 = LOAD32_LE(in + 8); 46 x15 = LOAD32_LE(in + 12); 47 48 for (i = 0; i < 10; i++) { 49 QUARTERROUND(x0, x4, x8, x12); 50 QUARTERROUND(x1, x5, x9, x13); 51 QUARTERROUND(x2, x6, x10, x14); 52 QUARTERROUND(x3, x7, x11, x15); 53 QUARTERROUND(x0, x5, x10, x15); 54 QUARTERROUND(x1, x6, x11, x12); 55 QUARTERROUND(x2, x7, x8, x13); 56 QUARTERROUND(x3, x4, x9, x14); 57 } 58 59 STORE32_LE(out + 0, x0); 60 STORE32_LE(out + 4, x1); 61 STORE32_LE(out + 8, x2); 62 STORE32_LE(out + 12, x3); 63 STORE32_LE(out + 16, x12); 64 STORE32_LE(out + 20, x13); 65 STORE32_LE(out + 24, x14); 66 STORE32_LE(out + 28, x15); 67 68 return 0; 69 } 70 71 size_t 72 crypto_core_hchacha20_outputbytes(void) 73 { 74 return crypto_core_hchacha20_OUTPUTBYTES; 75 } 76 77 size_t 78 crypto_core_hchacha20_inputbytes(void) 79 { 80 return crypto_core_hchacha20_INPUTBYTES; 81 } 82 83 size_t 84 crypto_core_hchacha20_keybytes(void) 85 { 86 return crypto_core_hchacha20_KEYBYTES; 87 } 88 89 size_t 90 crypto_core_hchacha20_constbytes(void) 91 { 92 return crypto_core_hchacha20_CONSTBYTES; 93 } 94