Skip to content

Instantly share code, notes, and snippets.

@Laksen
Created November 10, 2019 19:36
Show Gist options
  • Save Laksen/a9cc0a81b4f2943f7df49233f26ee530 to your computer and use it in GitHub Desktop.
Save Laksen/a9cc0a81b4f2943f7df49233f26ee530 to your computer and use it in GitHub Desktop.
void bm64_baseisa(const uint64_t in[64], uint64_t out[64])
{
for (int i2 = 0; i2 < 64; i2 += 8) // in[] rows, word index
for (int j = 0; j < 8; j++) // in[] columns, bit index
{
int j_shift = j*8;
uint64_t res = 0;
for (int i=0; i<8; i++)
res |= ((in[i2+i] >> j_shift) & 0xFF) << (i*8);
out[j + i2] = res;
}
}
void bm64_baseisa2(const uint64_t in[64], uint64_t out[64])
{
for (int i2 = 0; i2 < 64; i2 += 8) // in[] rows, word index
for (int j = 0; j < 8; j++) // in[] columns, bit index
{
int j_shift = j*8;
uint64_t res = 0;
res |= ((in[i2+0] >> j_shift) & 0xFF);
res |= ((in[i2+1] >> j_shift) & 0xFF) << 8;
res |= ((in[i2+2] >> j_shift) & 0xFF) << 16;
res |= ((in[i2+3] >> j_shift) & 0xFF) << 24;
res |= ((in[i2+4] >> j_shift) & 0xFF) << 32;
res |= ((in[i2+5] >> j_shift) & 0xFF) << 40;
res |= ((in[i2+6] >> j_shift) & 0xFF) << 48;
res |= ((in[i2+7] >> j_shift) & 0xFF) << 56;
out[j + i2] = res;
}
}
void bm64t_baseisa(const uint64_t in[64], uint64_t out[64])
{
for (int j = 0; j < 64; j++)
{
uint64_t res = 0;
for (int i = 0; i < 64; i++)
res |= ((in[i] >> j) & 1) << i;
out[j] = res;
}
}
void bm64t_baseisa2(const uint64_t in[64], uint64_t out[64])
{
for (int j = 0; j < 64; j+=8)
{
uint64_t res0 = 0;
uint64_t res1 = 0;
uint64_t res2 = 0;
uint64_t res3 = 0;
uint64_t res4 = 0;
uint64_t res5 = 0;
uint64_t res6 = 0;
uint64_t res7 = 0;
for (int i = 0; i < 64; i++)
{
uint64_t in_tmp = in[i];
res0 |= ((in_tmp >> (j+0)) & 1) << i;
res1 |= ((in_tmp >> (j+1)) & 1) << i;
res2 |= ((in_tmp >> (j+2)) & 1) << i;
res3 |= ((in_tmp >> (j+3)) & 1) << i;
res4 |= ((in_tmp >> (j+4)) & 1) << i;
res5 |= ((in_tmp >> (j+5)) & 1) << i;
res6 |= ((in_tmp >> (j+6)) & 1) << i;
res7 |= ((in_tmp >> (j+7)) & 1) << i;
}
out[j+0] = res0;
out[j+1] = res1;
out[j+2] = res2;
out[j+3] = res3;
out[j+4] = res4;
out[j+5] = res5;
out[j+6] = res6;
out[j+7] = res7;
}
}
static uint64_t hxor(uint64_t inp)
{
inp ^= (inp>>32);
inp ^= (inp>>16);
inp ^= (inp>>8);
inp ^= (inp>>4);
inp ^= (inp>>2);
inp ^= (inp>>1);
return inp;
}
void bm64m_baseisa(const uint64_t in1[64], const uint64_t in2[8], uint64_t out[8])
{
for (int j = 0; j < 8; j++) // in2[] columns, word index
{
uint64_t res = 0;
uint64_t in_j = in2[j];
for (int i = 0; i < 64; i++) // in1[] rows, word index
res |= (hxor(in1[i] & in_j) & 1) << i;
out[j] = res;
}
}
void bm64m_baseisa2(const uint64_t in1[64], const uint64_t in2[8], uint64_t out[8])
{
uint64_t res0 = 0;
uint64_t res1 = 0;
uint64_t res2 = 0;
uint64_t res3 = 0;
uint64_t res4 = 0;
uint64_t res5 = 0;
uint64_t res6 = 0;
uint64_t res7 = 0;
uint64_t in20 = in2[0];
uint64_t in21 = in2[1];
uint64_t in22 = in2[2];
uint64_t in23 = in2[3];
uint64_t in24 = in2[4];
uint64_t in25 = in2[5];
uint64_t in26 = in2[6];
uint64_t in27 = in2[7];
for (int i = 0; i < 64; i++) // in1[] rows, word index
{
uint64_t in_i = in1[i];
res0 |= (hxor(in_i & in20) & 1) << i;
res1 |= (hxor(in_i & in21) & 1) << i;
res2 |= (hxor(in_i & in22) & 1) << i;
res3 |= (hxor(in_i & in23) & 1) << i;
res4 |= (hxor(in_i & in24) & 1) << i;
res5 |= (hxor(in_i & in25) & 1) << i;
res6 |= (hxor(in_i & in26) & 1) << i;
res7 |= (hxor(in_i & in27) & 1) << i;
}
out[0] = res0;
out[1] = res1;
out[2] = res2;
out[3] = res3;
out[4] = res4;
out[5] = res5;
out[6] = res6;
out[7] = res7;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment