nixfiles/libs/aes/lib/serde.nix
Sebastian Walz 9f7b02e1cd
Tohu vaBohu
2023-04-03 14:38:02 +02:00

101 lines
3.2 KiB
Nix

{ ... }:
let
inherit(builtins) bitAnd bitOr bitXor elemAt foldl' genList;
splitInteger
= value:
let
value0 = if value >= 0 then value else -value;
value1 = value0 / 256;
value2 = value1 / 256;
value3 = value2 / 256;
value4 = value3 / 256;
value5 = value4 / 256;
value6 = value5 / 256;
value7 = value6 / 256;
in
{
sign = value < 0;
byte0 = bitAnd value0 255;
byte1 = bitAnd value1 255;
byte2 = bitAnd value2 255;
byte3 = bitAnd value3 255;
byte4 = bitAnd value4 255;
byte5 = bitAnd value5 255;
byte6 = bitAnd value6 255;
byte7 = bitAnd value7 255;
word0 = bitAnd value0 65535;
word1 = bitAnd value2 65535;
word2 = bitAnd value4 65535;
word3 = bitAnd value6 65535;
dword0 = bitAnd value0 4294967295;
dword1 = bitAnd value4 4294967295;
};
in
{
unpackWord
= value:
{ inherit(splitInteger value) byte0 byte1; };
unpackDWord
= value:
{ inherit(splitInteger value) byte0 byte1 byte2 byte3; };
unpackQWord
= value:
{ inherit(splitInteger value) byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7; };
packWord
= {
byte0 ? 0,
byte1 ? 0,
}:
assert byte0 >= 0 && byte0 < 255;
assert byte1 >= 0 && byte1 < 255;
byte0 + byte1 * 256;
packDWord
= {
byte0 ? 0,
byte1 ? 0,
byte2 ? 0,
byte3 ? 0,
}:
assert byte0 >= 0 && byte0 < 255;
assert byte1 >= 0 && byte1 < 255;
assert byte2 >= 0 && byte2 < 255;
assert byte3 >= 0 && byte3 < 255;
fold'
(result: byte: result * 256 + byte)
byte3
[ byte2 byte1 byte0 ];
packQWord
= {
byte0 ? 0,
byte1 ? 0,
byte2 ? 0,
byte3 ? 0,
byte4 ? 0,
byte5 ? 0,
byte6 ? 0,
byte7 ? 0,
}:
assert byte0 >= 0 && byte0 < 255;
assert byte1 >= 0 && byte1 < 255;
assert byte2 >= 0 && byte2 < 255;
assert byte3 >= 0 && byte3 < 255;
assert byte4 >= 0 && byte4 < 255;
assert byte5 >= 0 && byte5 < 255;
assert byte6 >= 0 && byte6 < 255;
assert byte7 >= 0 && byte7 < 255;
fold'
(result: byte: result * 256 + byte)
byte7
[ byte6 byte5 byte4 byte3 byte2 byte1 byte0 ];
}