Main step of GOST 28147-89: Difference between revisions

Updated D entry
(Updated D entry)
(Updated D entry)
Line 124:
{{trans|C}}
{{trans|Go}}
<lang d>/// Rotate uint left.
<lang d>alias SBox = immutable ubyte[16][8]; // A 2D array of nibbles.
uint rol(in uint x, in uint nBits) @safe pure nothrow {
return (x << ynBits) | (x >> (32 - ynBits));
}
 
alias Nibble = ubyte; // 4 bits used.
<lang d>alias SBox = immutable ubyteNibble[16][8]; // A 2D array of nibbles.
 
private bool _validateSBox(in SBox data) @safe pure nothrow {
foreach (const ref row; data)
foreach (immutable ub; row)
if (ub >= 16) // Verify it's a nibble.
return false;
Line 134 ⟶ 140:
}
 
struct GOST(sBoxess...) if (s.length == 1 && s[0]._validateSBox) {
private static generate(ubyte k)() @safe pure nothrow {
if (sBoxes.length == 1 && _validateSBox(sBoxes[0])) {
//return iota(k87.length)
private static immutable ubyte[256] k87, k65, k43, k21;
// k21[i] .map!(i=> ((s[10][k][i >> 4] << 4) & 0xFF) | s[0][k - 1][i & 0xF];)
private uint[2] buffer;
// .array;
 
uint[k87.length] result; // ubytes[...] should suffice.
@safe nothrow static this() {
aliasforeach s(immutable =i, sBoxes[0]ref item; result)
k87[i]item = ((s[70][k][i >> 4] << 4) & 0xFF) | s[60][k - 1][i & 0xF];
 
foreachreturn (immutable iresult; 0 .. k87.length) {
// Given validateSBox, the & 0xFF aren't necessary.
k87[i] = ((s[7][i >> 4] << 4) & 0xFF) | s[6][i & 0xF];
k65[i] = ((s[5][i >> 4] << 4) & 0xFF) | s[4][i & 0xF];
k43[i] = ((s[3][i >> 4] << 4) & 0xFF) | s[2][i & 0xF];
k21[i] = ((s[1][i >> 4] << 4) & 0xFF) | s[0][i & 0xF];
}
}
 
private static uint[2] rol(in uint x, in uint y) pure nothrow {buffer;
private static immutable ubyte[256] k87, k65,= k43generate!7, k21;
return (x << y) | (x >> (32 - y));
k65 = generate!5,
}
k43 = generate!3,
k21 = generate!1;
 
// Endianess problems?