Home | History | Annotate | Line # | Download | only in hchacha20
      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