Skip to content

Instantly share code, notes, and snippets.

@dchest
Created November 21, 2012 17:58
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dchest/4126510 to your computer and use it in GitHub Desktop.
Save dchest/4126510 to your computer and use it in GitHub Desktop.
// Note: this is for scrypt implementation, which doesn't use diagonal constants,
// so the order of loading from x is different than in normal Salsa20 implementation.
function salsa20_8(x) {
var j0 = (x[ 0] & 0xff) | ((x[ 1] & 0xff)<<8) | ((x[ 2] & 0xff)<<16) | ((x[ 3] & 0xff)<<24);
var j1 = (x[ 4] & 0xff) | ((x[ 5] & 0xff)<<8) | ((x[ 6] & 0xff)<<16) | ((x[ 7] & 0xff)<<24);
var j2 = (x[ 8] & 0xff) | ((x[ 9] & 0xff)<<8) | ((x[10] & 0xff)<<16) | ((x[11] & 0xff)<<24);
var j3 = (x[12] & 0xff) | ((x[13] & 0xff)<<8) | ((x[14] & 0xff)<<16) | ((x[15] & 0xff)<<24);
var j4 = (x[16] & 0xff) | ((x[17] & 0xff)<<8) | ((x[18] & 0xff)<<16) | ((x[19] & 0xff)<<24);
var j5 = (x[20] & 0xff) | ((x[21] & 0xff)<<8) | ((x[22] & 0xff)<<16) | ((x[23] & 0xff)<<24);
var j6 = (x[24] & 0xff) | ((x[25] & 0xff)<<8) | ((x[26] & 0xff)<<16) | ((x[27] & 0xff)<<24);
var j7 = (x[28] & 0xff) | ((x[29] & 0xff)<<8) | ((x[30] & 0xff)<<16) | ((x[31] & 0xff)<<24);
var j8 = (x[32] & 0xff) | ((x[33] & 0xff)<<8) | ((x[34] & 0xff)<<16) | ((x[35] & 0xff)<<24);
var j9 = (x[36] & 0xff) | ((x[37] & 0xff)<<8) | ((x[38] & 0xff)<<16) | ((x[39] & 0xff)<<24);
var j10 = (x[40] & 0xff) | ((x[41] & 0xff)<<8) | ((x[42] & 0xff)<<16) | ((x[43] & 0xff)<<24);
var j11 = (x[44] & 0xff) | ((x[45] & 0xff)<<8) | ((x[46] & 0xff)<<16) | ((x[47] & 0xff)<<24);
var j12 = (x[48] & 0xff) | ((x[49] & 0xff)<<8) | ((x[50] & 0xff)<<16) | ((x[51] & 0xff)<<24);
var j13 = (x[52] & 0xff) | ((x[53] & 0xff)<<8) | ((x[54] & 0xff)<<16) | ((x[55] & 0xff)<<24);
var j14 = (x[56] & 0xff) | ((x[57] & 0xff)<<8) | ((x[58] & 0xff)<<16) | ((x[59] & 0xff)<<24);
var j15 = (x[60] & 0xff) | ((x[61] & 0xff)<<8) | ((x[62] & 0xff)<<16) | ((x[63] & 0xff)<<24);
var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15;
var u;
for (var i = 0; i < 8; i += 2) {
u = x0 + x12;
x4 ^= (u<<7) | (u>>>(32-7));
u = x4 + x0;
x8 ^= (u<<9) | (u>>>(32-9));
u = x8 + x4;
x12 ^= (u<<13) | (u>>>(32-13));
u = x12 + x8;
x0 ^= (u<<18) | (u>>>(32-18));
u = x5 + x1;
x9 ^= (u<<7) | (u>>>(32-7));
u = x9 + x5;
x13 ^= (u<<9) | (u>>>(32-9));
u = x13 + x9;
x1 ^= (u<<13) | (u>>>(32-13));
u = x1 + x13;
x5 ^= (u<<18) | (u>>>(32-18));
u = x10 + x6;
x14 ^= (u<<7) | (u>>>(32-7));
u = x14 + x10;
x2 ^= (u<<9) | (u>>>(32-9));
u = x2 + x14;
x6 ^= (u<<13) | (u>>>(32-13));
u = x6 + x2;
x10 ^= (u<<18) | (u>>>(32-18));
u = x15 + x11;
x3 ^= (u<<7) | (u>>>(32-7));
u = x3 + x15;
x7 ^= (u<<9) | (u>>>(32-9));
u = x7 + x3;
x11 ^= (u<<13) | (u>>>(32-13));
u = x11 + x7;
x15 ^= (u<<18) | (u>>>(32-18));
u = x0 + x3;
x1 ^= (u<<7) | (u>>>(32-7));
u = x1 + x0;
x2 ^= (u<<9) | (u>>>(32-9));
u = x2 + x1;
x3 ^= (u<<13) | (u>>>(32-13));
u = x3 + x2;
x0 ^= (u<<18) | (u>>>(32-18));
u = x5 + x4;
x6 ^= (u<<7) | (u>>>(32-7));
u = x6 + x5;
x7 ^= (u<<9) | (u>>>(32-9));
u = x7 + x6;
x4 ^= (u<<13) | (u>>>(32-13));
u = x4 + x7;
x5 ^= (u<<18) | (u>>>(32-18));
u = x10 + x9;
x11 ^= (u<<7) | (u>>>(32-7));
u = x11 + x10;
x8 ^= (u<<9) | (u>>>(32-9));
u = x8 + x11;
x9 ^= (u<<13) | (u>>>(32-13));
u = x9 + x8;
x10 ^= (u<<18) | (u>>>(32-18));
u = x15 + x14;
x12 ^= (u<<7) | (u>>>(32-7));
u = x12 + x15;
x13 ^= (u<<9) | (u>>>(32-9));
u = x13 + x12;
x14 ^= (u<<13) | (u>>>(32-13));
u = x14 + x13;
x15 ^= (u<<18) | (u>>>(32-18));
}
x0 += j0;
x1 += j1;
x2 += j2;
x3 += j3;
x4 += j4;
x5 += j5;
x6 += j6;
x7 += j7;
x8 += j8;
x9 += j9;
x10 += j10;
x11 += j11;
x12 += j12;
x13 += j13;
x14 += j14;
x15 += j15;
x[ 0] = ( x0 >>> 0) & 0xff; x[ 1] = ( x0 >>> 8) & 0xff;
x[ 2] = ( x0 >>> 16) & 0xff; x[ 3] = ( x0 >>> 24) & 0xff;
x[ 4] = ( x1 >>> 0) & 0xff; x[ 5] = ( x1 >>> 8) & 0xff;
x[ 6] = ( x1 >>> 16) & 0xff; x[ 7] = ( x1 >>> 24) & 0xff;
x[ 8] = ( x2 >>> 0) & 0xff; x[ 9] = ( x2 >>> 8) & 0xff;
x[10] = ( x2 >>> 16) & 0xff; x[11] = ( x2 >>> 24) & 0xff;
x[12] = ( x3 >>> 0) & 0xff; x[13] = ( x3 >>> 8) & 0xff;
x[14] = ( x3 >>> 16) & 0xff; x[15] = ( x3 >>> 24) & 0xff;
x[16] = ( x4 >>> 0) & 0xff; x[17] = ( x4 >>> 8) & 0xff;
x[18] = ( x4 >>> 16) & 0xff; x[19] = ( x4 >>> 24) & 0xff;
x[20] = ( x5 >>> 0) & 0xff; x[21] = ( x5 >>> 8) & 0xff;
x[22] = ( x5 >>> 16) & 0xff; x[23] = ( x5 >>> 24) & 0xff;
x[24] = ( x6 >>> 0) & 0xff; x[25] = ( x6 >>> 8) & 0xff;
x[26] = ( x6 >>> 16) & 0xff; x[27] = ( x6 >>> 24) & 0xff;
x[28] = ( x7 >>> 0) & 0xff; x[29] = ( x7 >>> 8) & 0xff;
x[30] = ( x7 >>> 16) & 0xff; x[31] = ( x7 >>> 24) & 0xff;
x[32] = ( x8 >>> 0) & 0xff; x[33] = ( x8 >>> 8) & 0xff;
x[34] = ( x8 >>> 16) & 0xff; x[35] = ( x8 >>> 24) & 0xff;
x[36] = ( x9 >>> 0) & 0xff; x[37] = ( x9 >>> 8) & 0xff;
x[38] = ( x9 >>> 16) & 0xff; x[39] = ( x9 >>> 24) & 0xff;
x[40] = (x10 >>> 0) & 0xff; x[41] = (x10 >>> 8) & 0xff;
x[42] = (x10 >>> 16) & 0xff; x[43] = (x10 >>> 24) & 0xff;
x[44] = (x11 >>> 0) & 0xff; x[45] = (x11 >>> 8) & 0xff;
x[46] = (x11 >>> 16) & 0xff; x[47] = (x11 >>> 24) & 0xff;
x[48] = (x12 >>> 0) & 0xff; x[49] = (x12 >>> 8) & 0xff;
x[50] = (x12 >>> 16) & 0xff; x[51] = (x12 >>> 24) & 0xff;
x[52] = (x13 >>> 0) & 0xff; x[53] = (x13 >>> 8) & 0xff;
x[54] = (x13 >>> 16) & 0xff; x[55] = (x13 >>> 24) & 0xff;
x[56] = (x14 >>> 0) & 0xff; x[57] = (x14 >>> 8) & 0xff;
x[58] = (x14 >>> 16) & 0xff; x[59] = (x14 >>> 24) & 0xff;
x[60] = (x15 >>> 0) & 0xff; x[61] = (x15 >>> 8) & 0xff;
x[62] = (x15 >>> 16) & 0xff; x[63] = (x15 >>> 24) & 0xff;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment