Quick actions

cmd+k|ctrl+k

Navigation

Languages

salsa20c

Snippet info

Language

C

Visibility

public

Author

christophe.guillon.perso

Created

2018-01-22T06:58:05Z

Updated

2018-01-22T06:58:05Z

#include <stdio.h>
#include <stdint.h>
typedef uint32_t uint32;

#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
void salsa20(uint32 out[16],uint32 in[16]) {
       int i;
       uint32 x[16];
       for (i = 0;i < 16;++i) x[i] = in[i];
       for (i = 20;i > 0;i -= 2) {
         x[ 4] ^= R(x[ 0]+x[12], 7);  x[ 8] ^= R(x[ 4]+x[ 0], 9);
         x[12] ^= R(x[ 8]+x[ 4],13);  x[ 0] ^= R(x[12]+x[ 8],18);
         x[ 9] ^= R(x[ 5]+x[ 1], 7);  x[13] ^= R(x[ 9]+x[ 5], 9);
         x[ 1] ^= R(x[13]+x[ 9],13);  x[ 5] ^= R(x[ 1]+x[13],18);
         x[14] ^= R(x[10]+x[ 6], 7);  x[ 2] ^= R(x[14]+x[10], 9);
         x[ 6] ^= R(x[ 2]+x[14],13);  x[10] ^= R(x[ 6]+x[ 2],18);
         x[ 3] ^= R(x[15]+x[11], 7);  x[ 7] ^= R(x[ 3]+x[15], 9);
         x[11] ^= R(x[ 7]+x[ 3],13);  x[15] ^= R(x[11]+x[ 7],18);
         x[ 1] ^= R(x[ 0]+x[ 3], 7);  x[ 2] ^= R(x[ 1]+x[ 0], 9);
         x[ 3] ^= R(x[ 2]+x[ 1],13);  x[ 0] ^= R(x[ 3]+x[ 2],18);
         x[ 6] ^= R(x[ 5]+x[ 4], 7);  x[ 7] ^= R(x[ 6]+x[ 5], 9);
         x[ 4] ^= R(x[ 7]+x[ 6],13);  x[ 5] ^= R(x[ 4]+x[ 7],18);
         x[11] ^= R(x[10]+x[ 9], 7);  x[ 8] ^= R(x[11]+x[10], 9);
         x[ 9] ^= R(x[ 8]+x[11],13);  x[10] ^= R(x[ 9]+x[ 8],18);
         x[12] ^= R(x[15]+x[14], 7);  x[13] ^= R(x[12]+x[15], 9);
         x[14] ^= R(x[13]+x[12],13);  x[15] ^= R(x[14]+x[13],18);
       }
       for (i = 0;i < 16;++i) out[i] = x[i] + in[i];
        
         
}

//static char *input = "e2d22467015c0ffb0adc5fac0ee88ccf8d467a7f07ab53d4efeac8da47fd833e";
static uint32 in[16] = {0, 1, 1, 2, 3, 5, 8, 13,
        21, 34, 55, 89, 144, 233, 377, 610};
static uint32 out[16];
int main(void) {
//    printf("Input len: %d, input: %s\n", strlen(input), input);
//    memcpy(in, input, strlen(input));
    salsa20(out, in);
    for(int i = 0; i < 16; i++) {
        printf("%.2x%.2x%.2x%.2x", out[i], out[i]>>8, out[i]>>16, out[i]>>24);
    }
    return 0;
}
INFO