Skip to content

Instantly share code, notes, and snippets.

@fabiovila
Last active June 26, 2020 01:57
Show Gist options
  • Save fabiovila/14832d0888e83c2ba86bcb34c3609ad4 to your computer and use it in GitHub Desktop.
Save fabiovila/14832d0888e83c2ba86bcb34c3609ad4 to your computer and use it in GitHub Desktop.
PRESENT block cipher in JavaScript version converted from original https://github.com/bozhu/PRESENT-C
function present_rounds(n,r,e){var t=1,i=new Uint8Array(8),a=new Uint8Array(10),w=new Uint8Array(8),y=new Uint8Array([192,80,96,176,144,0,160,208,48,224,240,128,64,112,16,32]),A=new Uint8Array([240,177,180,229,225,160,228,241,165,244,245,224,176,181,161,164,114,51,54,103,99,34,102,115,39,118,119,98,50,55,35,38,120,57,60,109,105,40,108,121,45,124,125,104,56,61,41,44,218,155,158,207,203,138,206,219,143,222,223,202,154,159,139,142,210,147,150,199,195,130,198,211,135,214,215,194,146,151,131,134,80,17,20,69,65,0,68,81,5,84,85,64,16,21,1,4,216,153,156,205,201,136,204,217,141,220,221,200,152,157,137,140,242,179,182,231,227,162,230,243,167,246,247,226,178,183,163,166,90,27,30,79,75,10,78,91,15,94,95,74,26,31,11,14,248,185,188,237,233,168,236,249,173,252,253,232,184,189,169,172,250,187,190,239,235,170,238,251,175,254,255,234,186,191,171,174,208,145,148,197,193,128,196,209,133,212,213,192,144,149,129,132,112,49,52,101,97,32,100,113,37,116,117,96,48,53,33,36,122,59,62,111,107,42,110,123,47,126,127,106,58,63,43,46,82,19,22,71,67,2,70,83,7,86,87,66,18,23,3,6,88,25,28,77,73,8,76,89,13,92,93,72,24,29,9,12]),U=new Uint8Array([60,108,45,121,120,40,57,124,105,61,125,56,44,109,104,41,156,204,141,217,216,136,153,220,201,157,221,152,140,205,200,137,30,78,15,91,90,10,27,94,75,31,95,26,14,79,74,11,182,230,167,243,242,162,179,246,227,183,247,178,166,231,226,163,180,228,165,241,240,160,177,244,225,181,245,176,164,229,224,161,20,68,5,81,80,0,17,84,65,21,85,16,4,69,64,1,54,102,39,115,114,34,51,118,99,55,119,50,38,103,98,35,188,236,173,249,248,168,185,252,233,189,253,184,172,237,232,169,150,198,135,211,210,130,147,214,195,151,215,146,134,199,194,131,62,110,47,123,122,42,59,126,107,63,127,58,46,111,106,43,190,238,175,251,250,170,187,254,235,191,255,186,174,239,234,171,52,100,37,113,112,32,49,116,97,53,117,48,36,101,96,33,28,76,13,89,88,8,25,92,73,29,93,24,12,77,72,9,158,206,143,219,218,138,155,222,203,159,223,154,142,207,202,139,148,196,133,209,208,128,145,212,193,149,213,144,132,197,192,129,22,70,7,83,82,2,19,86,67,23,87,18,6,71,66,3]),u=new Uint8Array([15,27,75,94,30,10,78,31,90,79,95,14,11,91,26,74,39,51,99,118,54,34,102,55,114,103,119,38,35,115,50,98,135,147,195,214,150,130,198,151,210,199,215,134,131,211,146,194,173,185,233,252,188,168,236,189,248,237,253,172,169,249,184,232,45,57,105,124,60,40,108,61,120,109,125,44,41,121,56,104,5,17,65,84,20,0,68,21,80,69,85,4,1,81,16,64,141,153,201,220,156,136,204,157,216,205,221,140,137,217,152,200,47,59,107,126,62,42,110,63,122,111,127,46,43,123,58,106,165,177,225,244,180,160,228,181,240,229,245,164,161,241,176,224,143,155,203,222,158,138,206,159,218,207,223,142,139,219,154,202,175,187,235,254,190,170,238,191,250,239,255,174,171,251,186,234,13,25,73,92,28,8,76,29,88,77,93,12,9,89,24,72,7,19,67,86,22,2,70,23,82,71,87,6,3,83,18,66,167,179,227,246,182,162,230,183,242,231,247,166,163,243,178,226,37,49,97,116,52,32,100,53,112,101,117,36,33,113,48,96,133,145,193,212,148,128,196,149,208,197,213,132,129,209,144,192]),o=new Uint8Array([195,198,210,151,135,130,147,199,150,211,215,131,194,214,134,146,201,204,216,157,141,136,153,205,156,217,221,137,200,220,140,152,225,228,240,181,165,160,177,229,180,241,245,161,224,244,164,176,107,110,122,63,47,42,59,111,62,123,127,43,106,126,46,58,75,78,90,31,15,10,27,79,30,91,95,11,74,94,14,26,65,68,80,21,5,0,17,69,20,81,85,1,64,84,4,16,99,102,114,55,39,34,51,103,54,115,119,35,98,118,38,50,203,206,218,159,143,138,155,207,158,219,223,139,202,222,142,154,105,108,120,61,45,40,57,109,60,121,125,41,104,124,44,56,227,230,242,183,167,162,179,231,182,243,247,163,226,246,166,178,235,238,250,191,175,170,187,239,190,251,255,171,234,254,174,186,67,70,82,23,7,2,19,71,22,83,87,3,66,86,6,18,193,196,208,149,133,128,145,197,148,209,213,129,192,212,132,144,233,236,248,189,173,168,185,237,188,249,253,169,232,252,172,184,73,76,88,29,13,8,25,77,28,89,93,9,72,92,12,24,97,100,112,53,37,32,49,101,52,113,117,33,96,116,36,48]);for(i[0]=n[0]^r[0],i[1]=n[1]^r[1],i[2]=n[2]^r[2],i[3]=n[3]^r[3],i[4]=n[4]^r[4],i[5]=n[5]^r[5],i[6]=n[6]^r[6],i[7]=n[7]^r[7],a[9]=r[6]<<5|r[7]>>3,a[8]=r[5]<<5|r[6]>>3,a[7]=r[4]<<5|r[5]>>3,a[6]=r[3]<<5|r[4]>>3,a[5]=r[2]<<5|r[3]>>3,a[4]=r[1]<<5|r[2]>>3,a[3]=r[0]<<5|r[1]>>3,a[2]=r[9]<<5|r[0]>>3,a[1]=r[8]<<5|r[9]>>3,a[0]=r[7]<<5|r[8]>>3,a[0]=15&a[0]|y[a[0]>>4],a[7]^=t>>1,a[8]^=t<<7,w[0]=192&A[i[0]]|48&U[i[1]]|12&u[i[2]]|3&o[i[3]],w[1]=192&A[i[4]]|48&U[i[5]]|12&u[i[6]]|3&o[i[7]],w[2]=192&o[i[0]]|48&A[i[1]]|12&U[i[2]]|3&u[i[3]],w[3]=192&o[i[4]]|48&A[i[5]]|12&U[i[6]]|3&u[i[7]],w[4]=192&u[i[0]]|48&o[i[1]]|12&A[i[2]]|3&U[i[3]],w[5]=192&u[i[4]]|48&o[i[5]]|12&A[i[6]]|3&U[i[7]],w[6]=192&U[i[0]]|48&u[i[1]]|12&o[i[2]]|3&A[i[3]],w[7]=192&U[i[4]]|48&u[i[5]]|12&o[i[6]]|3&A[i[7]],t=2;t<=e;t++)i[0]=w[0]^a[0],i[1]=w[1]^a[1],i[2]=w[2]^a[2],i[3]=w[3]^a[3],i[4]=w[4]^a[4],i[5]=w[5]^a[5],i[6]=w[6]^a[6],i[7]=w[7]^a[7],w[0]=192&A[i[0]]|48&U[i[1]]|12&u[i[2]]|3&o[i[3]],w[1]=192&A[i[4]]|48&U[i[5]]|12&u[i[6]]|3&o[i[7]],w[2]=192&o[i[0]]|48&A[i[1]]|12&U[i[2]]|3&u[i[3]],w[3]=192&o[i[4]]|48&A[i[5]]|12&U[i[6]]|3&u[i[7]],w[4]=192&u[i[0]]|48&o[i[1]]|12&A[i[2]]|3&U[i[3]],w[5]=192&u[i[4]]|48&o[i[5]]|12&A[i[6]]|3&U[i[7]],w[6]=192&U[i[0]]|48&u[i[1]]|12&o[i[2]]|3&A[i[3]],w[7]=192&U[i[4]]|48&u[i[5]]|12&o[i[6]]|3&A[i[7]],a[5]^=t<<2,i[2]=a[9],i[1]=a[8],i[0]=a[7],a[9]=a[6]<<5|a[7]>>3,a[8]=a[5]<<5|a[6]>>3,a[7]=a[4]<<5|a[5]>>3,a[6]=a[3]<<5|a[4]>>3,a[5]=a[2]<<5|a[3]>>3,a[4]=a[1]<<5|a[2]>>3,a[3]=a[0]<<5|a[1]>>3,a[2]=i[2]<<5|a[0]>>3,a[1]=i[1]<<5|i[2]>>3,a[0]=i[0]<<5|i[1]>>3,a[0]=15&a[0]|y[a[0]>>4];return 31==e&&(w[0]^=a[0],w[1]^=a[1],w[2]^=a[2],w[3]^=a[3],w[4]^=a[4],w[5]^=a[5],w[6]^=a[6],w[7]^=a[7]),w}function present(n,r){return present_rounds(n,r,31)}
// Converted from https://github.com/bozhu/PRESENT-C
// Usage:
// Plain = new Uint8Array([0,1,2,3,4,5,6,7]);
// Key = new Uint8Array([0,1,2,3,4,5,6,7,8,9,10]);
// encryp = present(Plain,Key);
function present_rounds(plain, key,rounds)
{
var round_counter = 1;
var state = new Uint8Array(8);
var round_key = new Uint8Array(10);
var cipher = new Uint8Array(8);
// actually is (sbox[] << 4)
var sbox = new Uint8Array (
[0xC0, 0x50, 0x60, 0xB0, 0x90, 0x00, 0xA0, 0xD0, 0x30, 0xE0, 0xF0, 0x80, 0x40, 0x70, 0x10, 0x20]
);
// look-up tables for speeding up permutation layer
var sbox_pmt_3 = new Uint8Array ([
0xF0, 0xB1, 0xB4, 0xE5, 0xE1, 0xA0, 0xE4, 0xF1, 0xA5, 0xF4, 0xF5, 0xE0, 0xB0, 0xB5, 0xA1, 0xA4,
0x72, 0x33, 0x36, 0x67, 0x63, 0x22, 0x66, 0x73, 0x27, 0x76, 0x77, 0x62, 0x32, 0x37, 0x23, 0x26,
0x78, 0x39, 0x3C, 0x6D, 0x69, 0x28, 0x6C, 0x79, 0x2D, 0x7C, 0x7D, 0x68, 0x38, 0x3D, 0x29, 0x2C,
0xDA, 0x9B, 0x9E, 0xCF, 0xCB, 0x8A, 0xCE, 0xDB, 0x8F, 0xDE, 0xDF, 0xCA, 0x9A, 0x9F, 0x8B, 0x8E,
0xD2, 0x93, 0x96, 0xC7, 0xC3, 0x82, 0xC6, 0xD3, 0x87, 0xD6, 0xD7, 0xC2, 0x92, 0x97, 0x83, 0x86,
0x50, 0x11, 0x14, 0x45, 0x41, 0x00, 0x44, 0x51, 0x05, 0x54, 0x55, 0x40, 0x10, 0x15, 0x01, 0x04,
0xD8, 0x99, 0x9C, 0xCD, 0xC9, 0x88, 0xCC, 0xD9, 0x8D, 0xDC, 0xDD, 0xC8, 0x98, 0x9D, 0x89, 0x8C,
0xF2, 0xB3, 0xB6, 0xE7, 0xE3, 0xA2, 0xE6, 0xF3, 0xA7, 0xF6, 0xF7, 0xE2, 0xB2, 0xB7, 0xA3, 0xA6,
0x5A, 0x1B, 0x1E, 0x4F, 0x4B, 0x0A, 0x4E, 0x5B, 0x0F, 0x5E, 0x5F, 0x4A, 0x1A, 0x1F, 0x0B, 0x0E,
0xF8, 0xB9, 0xBC, 0xED, 0xE9, 0xA8, 0xEC, 0xF9, 0xAD, 0xFC, 0xFD, 0xE8, 0xB8, 0xBD, 0xA9, 0xAC,
0xFA, 0xBB, 0xBE, 0xEF, 0xEB, 0xAA, 0xEE, 0xFB, 0xAF, 0xFE, 0xFF, 0xEA, 0xBA, 0xBF, 0xAB, 0xAE,
0xD0, 0x91, 0x94, 0xC5, 0xC1, 0x80, 0xC4, 0xD1, 0x85, 0xD4, 0xD5, 0xC0, 0x90, 0x95, 0x81, 0x84,
0x70, 0x31, 0x34, 0x65, 0x61, 0x20, 0x64, 0x71, 0x25, 0x74, 0x75, 0x60, 0x30, 0x35, 0x21, 0x24,
0x7A, 0x3B, 0x3E, 0x6F, 0x6B, 0x2A, 0x6E, 0x7B, 0x2F, 0x7E, 0x7F, 0x6A, 0x3A, 0x3F, 0x2B, 0x2E,
0x52, 0x13, 0x16, 0x47, 0x43, 0x02, 0x46, 0x53, 0x07, 0x56, 0x57, 0x42, 0x12, 0x17, 0x03, 0x06,
0x58, 0x19, 0x1C, 0x4D, 0x49, 0x08, 0x4C, 0x59, 0x0D, 0x5C, 0x5D, 0x48, 0x18, 0x1D, 0x09, 0x0C]
);
var sbox_pmt_2 = new Uint8Array ([
0x3C, 0x6C, 0x2D, 0x79, 0x78, 0x28, 0x39, 0x7C, 0x69, 0x3D, 0x7D, 0x38, 0x2C, 0x6D, 0x68, 0x29,
0x9C, 0xCC, 0x8D, 0xD9, 0xD8, 0x88, 0x99, 0xDC, 0xC9, 0x9D, 0xDD, 0x98, 0x8C, 0xCD, 0xC8, 0x89,
0x1E, 0x4E, 0x0F, 0x5B, 0x5A, 0x0A, 0x1B, 0x5E, 0x4B, 0x1F, 0x5F, 0x1A, 0x0E, 0x4F, 0x4A, 0x0B,
0xB6, 0xE6, 0xA7, 0xF3, 0xF2, 0xA2, 0xB3, 0xF6, 0xE3, 0xB7, 0xF7, 0xB2, 0xA6, 0xE7, 0xE2, 0xA3,
0xB4, 0xE4, 0xA5, 0xF1, 0xF0, 0xA0, 0xB1, 0xF4, 0xE1, 0xB5, 0xF5, 0xB0, 0xA4, 0xE5, 0xE0, 0xA1,
0x14, 0x44, 0x05, 0x51, 0x50, 0x00, 0x11, 0x54, 0x41, 0x15, 0x55, 0x10, 0x04, 0x45, 0x40, 0x01,
0x36, 0x66, 0x27, 0x73, 0x72, 0x22, 0x33, 0x76, 0x63, 0x37, 0x77, 0x32, 0x26, 0x67, 0x62, 0x23,
0xBC, 0xEC, 0xAD, 0xF9, 0xF8, 0xA8, 0xB9, 0xFC, 0xE9, 0xBD, 0xFD, 0xB8, 0xAC, 0xED, 0xE8, 0xA9,
0x96, 0xC6, 0x87, 0xD3, 0xD2, 0x82, 0x93, 0xD6, 0xC3, 0x97, 0xD7, 0x92, 0x86, 0xC7, 0xC2, 0x83,
0x3E, 0x6E, 0x2F, 0x7B, 0x7A, 0x2A, 0x3B, 0x7E, 0x6B, 0x3F, 0x7F, 0x3A, 0x2E, 0x6F, 0x6A, 0x2B,
0xBE, 0xEE, 0xAF, 0xFB, 0xFA, 0xAA, 0xBB, 0xFE, 0xEB, 0xBF, 0xFF, 0xBA, 0xAE, 0xEF, 0xEA, 0xAB,
0x34, 0x64, 0x25, 0x71, 0x70, 0x20, 0x31, 0x74, 0x61, 0x35, 0x75, 0x30, 0x24, 0x65, 0x60, 0x21,
0x1C, 0x4C, 0x0D, 0x59, 0x58, 0x08, 0x19, 0x5C, 0x49, 0x1D, 0x5D, 0x18, 0x0C, 0x4D, 0x48, 0x09,
0x9E, 0xCE, 0x8F, 0xDB, 0xDA, 0x8A, 0x9B, 0xDE, 0xCB, 0x9F, 0xDF, 0x9A, 0x8E, 0xCF, 0xCA, 0x8B,
0x94, 0xC4, 0x85, 0xD1, 0xD0, 0x80, 0x91, 0xD4, 0xC1, 0x95, 0xD5, 0x90, 0x84, 0xC5, 0xC0, 0x81,
0x16, 0x46, 0x07, 0x53, 0x52, 0x02, 0x13, 0x56, 0x43, 0x17, 0x57, 0x12, 0x06, 0x47, 0x42, 0x03]
);
var sbox_pmt_1= new Uint8Array ([
0x0F, 0x1B, 0x4B, 0x5E, 0x1E, 0x0A, 0x4E, 0x1F, 0x5A, 0x4F, 0x5F, 0x0E, 0x0B, 0x5B, 0x1A, 0x4A,
0x27, 0x33, 0x63, 0x76, 0x36, 0x22, 0x66, 0x37, 0x72, 0x67, 0x77, 0x26, 0x23, 0x73, 0x32, 0x62,
0x87, 0x93, 0xC3, 0xD6, 0x96, 0x82, 0xC6, 0x97, 0xD2, 0xC7, 0xD7, 0x86, 0x83, 0xD3, 0x92, 0xC2,
0xAD, 0xB9, 0xE9, 0xFC, 0xBC, 0xA8, 0xEC, 0xBD, 0xF8, 0xED, 0xFD, 0xAC, 0xA9, 0xF9, 0xB8, 0xE8,
0x2D, 0x39, 0x69, 0x7C, 0x3C, 0x28, 0x6C, 0x3D, 0x78, 0x6D, 0x7D, 0x2C, 0x29, 0x79, 0x38, 0x68,
0x05, 0x11, 0x41, 0x54, 0x14, 0x00, 0x44, 0x15, 0x50, 0x45, 0x55, 0x04, 0x01, 0x51, 0x10, 0x40,
0x8D, 0x99, 0xC9, 0xDC, 0x9C, 0x88, 0xCC, 0x9D, 0xD8, 0xCD, 0xDD, 0x8C, 0x89, 0xD9, 0x98, 0xC8,
0x2F, 0x3B, 0x6B, 0x7E, 0x3E, 0x2A, 0x6E, 0x3F, 0x7A, 0x6F, 0x7F, 0x2E, 0x2B, 0x7B, 0x3A, 0x6A,
0xA5, 0xB1, 0xE1, 0xF4, 0xB4, 0xA0, 0xE4, 0xB5, 0xF0, 0xE5, 0xF5, 0xA4, 0xA1, 0xF1, 0xB0, 0xE0,
0x8F, 0x9B, 0xCB, 0xDE, 0x9E, 0x8A, 0xCE, 0x9F, 0xDA, 0xCF, 0xDF, 0x8E, 0x8B, 0xDB, 0x9A, 0xCA,
0xAF, 0xBB, 0xEB, 0xFE, 0xBE, 0xAA, 0xEE, 0xBF, 0xFA, 0xEF, 0xFF, 0xAE, 0xAB, 0xFB, 0xBA, 0xEA,
0x0D, 0x19, 0x49, 0x5C, 0x1C, 0x08, 0x4C, 0x1D, 0x58, 0x4D, 0x5D, 0x0C, 0x09, 0x59, 0x18, 0x48,
0x07, 0x13, 0x43, 0x56, 0x16, 0x02, 0x46, 0x17, 0x52, 0x47, 0x57, 0x06, 0x03, 0x53, 0x12, 0x42,
0xA7, 0xB3, 0xE3, 0xF6, 0xB6, 0xA2, 0xE6, 0xB7, 0xF2, 0xE7, 0xF7, 0xA6, 0xA3, 0xF3, 0xB2, 0xE2,
0x25, 0x31, 0x61, 0x74, 0x34, 0x20, 0x64, 0x35, 0x70, 0x65, 0x75, 0x24, 0x21, 0x71, 0x30, 0x60,
0x85, 0x91, 0xC1, 0xD4, 0x94, 0x80, 0xC4, 0x95, 0xD0, 0xC5, 0xD5, 0x84, 0x81, 0xD1, 0x90, 0xC0]
);
var sbox_pmt_0 = new Uint8Array ([
0xC3, 0xC6, 0xD2, 0x97, 0x87, 0x82, 0x93, 0xC7, 0x96, 0xD3, 0xD7, 0x83, 0xC2, 0xD6, 0x86, 0x92,
0xC9, 0xCC, 0xD8, 0x9D, 0x8D, 0x88, 0x99, 0xCD, 0x9C, 0xD9, 0xDD, 0x89, 0xC8, 0xDC, 0x8C, 0x98,
0xE1, 0xE4, 0xF0, 0xB5, 0xA5, 0xA0, 0xB1, 0xE5, 0xB4, 0xF1, 0xF5, 0xA1, 0xE0, 0xF4, 0xA4, 0xB0,
0x6B, 0x6E, 0x7A, 0x3F, 0x2F, 0x2A, 0x3B, 0x6F, 0x3E, 0x7B, 0x7F, 0x2B, 0x6A, 0x7E, 0x2E, 0x3A,
0x4B, 0x4E, 0x5A, 0x1F, 0x0F, 0x0A, 0x1B, 0x4F, 0x1E, 0x5B, 0x5F, 0x0B, 0x4A, 0x5E, 0x0E, 0x1A,
0x41, 0x44, 0x50, 0x15, 0x05, 0x00, 0x11, 0x45, 0x14, 0x51, 0x55, 0x01, 0x40, 0x54, 0x04, 0x10,
0x63, 0x66, 0x72, 0x37, 0x27, 0x22, 0x33, 0x67, 0x36, 0x73, 0x77, 0x23, 0x62, 0x76, 0x26, 0x32,
0xCB, 0xCE, 0xDA, 0x9F, 0x8F, 0x8A, 0x9B, 0xCF, 0x9E, 0xDB, 0xDF, 0x8B, 0xCA, 0xDE, 0x8E, 0x9A,
0x69, 0x6C, 0x78, 0x3D, 0x2D, 0x28, 0x39, 0x6D, 0x3C, 0x79, 0x7D, 0x29, 0x68, 0x7C, 0x2C, 0x38,
0xE3, 0xE6, 0xF2, 0xB7, 0xA7, 0xA2, 0xB3, 0xE7, 0xB6, 0xF3, 0xF7, 0xA3, 0xE2, 0xF6, 0xA6, 0xB2,
0xEB, 0xEE, 0xFA, 0xBF, 0xAF, 0xAA, 0xBB, 0xEF, 0xBE, 0xFB, 0xFF, 0xAB, 0xEA, 0xFE, 0xAE, 0xBA,
0x43, 0x46, 0x52, 0x17, 0x07, 0x02, 0x13, 0x47, 0x16, 0x53, 0x57, 0x03, 0x42, 0x56, 0x06, 0x12,
0xC1, 0xC4, 0xD0, 0x95, 0x85, 0x80, 0x91, 0xC5, 0x94, 0xD1, 0xD5, 0x81, 0xC0, 0xD4, 0x84, 0x90,
0xE9, 0xEC, 0xF8, 0xBD, 0xAD, 0xA8, 0xB9, 0xED, 0xBC, 0xF9, 0xFD, 0xA9, 0xE8, 0xFC, 0xAC, 0xB8,
0x49, 0x4C, 0x58, 0x1D, 0x0D, 0x08, 0x19, 0x4D, 0x1C, 0x59, 0x5D, 0x09, 0x48, 0x5C, 0x0C, 0x18,
0x61, 0x64, 0x70, 0x35, 0x25, 0x20, 0x31, 0x65, 0x34, 0x71, 0x75, 0x21, 0x60, 0x74, 0x24, 0x30]
);
// add key
state[0] = plain[0] ^ key[0];
state[1] = plain[1] ^ key[1];
state[2] = plain[2] ^ key[2];
state[3] = plain[3] ^ key[3];
state[4] = plain[4] ^ key[4];
state[5] = plain[5] ^ key[5];
state[6] = plain[6] ^ key[6];
state[7] = plain[7] ^ key[7];
// update key
round_key[9] = key[6] << 5 | key[7] >> 3;
round_key[8] = key[5] << 5 | key[6] >> 3;
round_key[7] = key[4] << 5 | key[5] >> 3;
round_key[6] = key[3] << 5 | key[4] >> 3;
round_key[5] = key[2] << 5 | key[3] >> 3;
round_key[4] = key[1] << 5 | key[2] >> 3;
round_key[3] = key[0] << 5 | key[1] >> 3;
round_key[2] = key[9] << 5 | key[0] >> 3;
round_key[1] = key[8] << 5 | key[9] >> 3;
round_key[0] = key[7] << 5 | key[8] >> 3;
round_key[0] = (round_key[0] & 0x0F) | sbox[round_key[0] >> 4];
round_key[7] ^= round_counter >> 1;
round_key[8] ^= round_counter << 7;
// substitution and permutation
cipher[0] =
(sbox_pmt_3[state[0]] & 0xC0) |
(sbox_pmt_2[state[1]] & 0x30) |
(sbox_pmt_1[state[2]] & 0x0C) |
(sbox_pmt_0[state[3]] & 0x03);
cipher[1] =
(sbox_pmt_3[state[4]] & 0xC0) |
(sbox_pmt_2[state[5]] & 0x30) |
(sbox_pmt_1[state[6]] & 0x0C) |
(sbox_pmt_0[state[7]] & 0x03);
cipher[2] =
(sbox_pmt_0[state[0]] & 0xC0) |
(sbox_pmt_3[state[1]] & 0x30) |
(sbox_pmt_2[state[2]] & 0x0C) |
(sbox_pmt_1[state[3]] & 0x03);
cipher[3] =
(sbox_pmt_0[state[4]] & 0xC0) |
(sbox_pmt_3[state[5]] & 0x30) |
(sbox_pmt_2[state[6]] & 0x0C) |
(sbox_pmt_1[state[7]] & 0x03);
cipher[4] =
(sbox_pmt_1[state[0]] & 0xC0) |
(sbox_pmt_0[state[1]] & 0x30) |
(sbox_pmt_3[state[2]] & 0x0C) |
(sbox_pmt_2[state[3]] & 0x03);
cipher[5] =
(sbox_pmt_1[state[4]] & 0xC0) |
(sbox_pmt_0[state[5]] & 0x30) |
(sbox_pmt_3[state[6]] & 0x0C) |
(sbox_pmt_2[state[7]] & 0x03);
cipher[6] =
(sbox_pmt_2[state[0]] & 0xC0) |
(sbox_pmt_1[state[1]] & 0x30) |
(sbox_pmt_0[state[2]] & 0x0C) |
(sbox_pmt_3[state[3]] & 0x03);
cipher[7] =
(sbox_pmt_2[state[4]] & 0xC0) |
(sbox_pmt_1[state[5]] & 0x30) |
(sbox_pmt_0[state[6]] & 0x0C) |
(sbox_pmt_3[state[7]] & 0x03);
for (round_counter = 2; round_counter <= rounds; round_counter++) {
state[0] = cipher[0] ^ round_key[0];
state[1] = cipher[1] ^ round_key[1];
state[2] = cipher[2] ^ round_key[2];
state[3] = cipher[3] ^ round_key[3];
state[4] = cipher[4] ^ round_key[4];
state[5] = cipher[5] ^ round_key[5];
state[6] = cipher[6] ^ round_key[6];
state[7] = cipher[7] ^ round_key[7];
cipher[0] =
(sbox_pmt_3[state[0]] & 0xC0) |
(sbox_pmt_2[state[1]] & 0x30) |
(sbox_pmt_1[state[2]] & 0x0C) |
(sbox_pmt_0[state[3]] & 0x03);
cipher[1] =
(sbox_pmt_3[state[4]] & 0xC0) |
(sbox_pmt_2[state[5]] & 0x30) |
(sbox_pmt_1[state[6]] & 0x0C) |
(sbox_pmt_0[state[7]] & 0x03);
cipher[2] =
(sbox_pmt_0[state[0]] & 0xC0) |
(sbox_pmt_3[state[1]] & 0x30) |
(sbox_pmt_2[state[2]] & 0x0C) |
(sbox_pmt_1[state[3]] & 0x03);
cipher[3] =
(sbox_pmt_0[state[4]] & 0xC0) |
(sbox_pmt_3[state[5]] & 0x30) |
(sbox_pmt_2[state[6]] & 0x0C) |
(sbox_pmt_1[state[7]] & 0x03);
cipher[4] =
(sbox_pmt_1[state[0]] & 0xC0) |
(sbox_pmt_0[state[1]] & 0x30) |
(sbox_pmt_3[state[2]] & 0x0C) |
(sbox_pmt_2[state[3]] & 0x03);
cipher[5] =
(sbox_pmt_1[state[4]] & 0xC0) |
(sbox_pmt_0[state[5]] & 0x30) |
(sbox_pmt_3[state[6]] & 0x0C) |
(sbox_pmt_2[state[7]] & 0x03);
cipher[6] =
(sbox_pmt_2[state[0]] & 0xC0) |
(sbox_pmt_1[state[1]] & 0x30) |
(sbox_pmt_0[state[2]] & 0x0C) |
(sbox_pmt_3[state[3]] & 0x03);
cipher[7] =
(sbox_pmt_2[state[4]] & 0xC0) |
(sbox_pmt_1[state[5]] & 0x30) |
(sbox_pmt_0[state[6]] & 0x0C) |
(sbox_pmt_3[state[7]] & 0x03);
round_key[5] ^= round_counter << 2; // do this first, which may be faster
// use state[] for temporary storage
state[2] = round_key[9];
state[1] = round_key[8];
state[0] = round_key[7];
round_key[9] = round_key[6] << 5 | round_key[7] >> 3;
round_key[8] = round_key[5] << 5 | round_key[6] >> 3;
round_key[7] = round_key[4] << 5 | round_key[5] >> 3;
round_key[6] = round_key[3] << 5 | round_key[4] >> 3;
round_key[5] = round_key[2] << 5 | round_key[3] >> 3;
round_key[4] = round_key[1] << 5 | round_key[2] >> 3;
round_key[3] = round_key[0] << 5 | round_key[1] >> 3;
round_key[2] = state[2] << 5 | round_key[0] >> 3;
round_key[1] = state[1] << 5 | state[2] >> 3;
round_key[0] = state[0] << 5 | state[1] >> 3;
round_key[0] = (round_key[0] & 0x0F) | sbox[round_key[0] >> 4];
}
// if round is not equal to 31, then do not perform the last adding key operation
// this can be used in constructing PRESENT based algorithm, such as MAC
if (31 == rounds) {
cipher[0] ^= round_key[0];
cipher[1] ^= round_key[1];
cipher[2] ^= round_key[2];
cipher[3] ^= round_key[3];
cipher[4] ^= round_key[4];
cipher[5] ^= round_key[5];
cipher[6] ^= round_key[6];
cipher[7] ^= round_key[7];
}
return cipher;
}
function present(plain,key) {
return present_rounds(plain,key,31);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment