mirror of
https://github.com/GaloisInc/cryptol.git
synced 2024-12-17 13:01:31 +03:00
76 lines
2.2 KiB
Plaintext
76 lines
2.2 KiB
Plaintext
/* Source:
|
|
Alexander Semenov
|
|
Institute for System Dynamics and Control Theory
|
|
Russian Academy of Sciences
|
|
*/
|
|
|
|
Bivium_stream : [93] -> [84] -> [inf]
|
|
Bivium_stream R1 R2 = stream
|
|
where
|
|
(stream, ra, rb) = shift_regs R1 R2
|
|
|
|
type N = 200
|
|
Bivium : ([93], [84]) -> [N]Bit
|
|
Bivium (reg1, reg2) = keystream
|
|
where
|
|
keystream = take`{N} (Bivium_stream reg1 reg2)
|
|
|
|
|
|
shift : {d} (fin d, d >=1) => [d] -> Bit -> [d]
|
|
shift fill bit = fills
|
|
where
|
|
fills = [bit]#(drop`{1} (fill >> 1))
|
|
|
|
|
|
shift_regs : {d,e} (fin d, fin e, d >=1, e >=1) => [d] -> [e] -> ([inf],[inf][d],[inf][e])
|
|
shift_regs r1 r2 = (stream, regA, regB)
|
|
where
|
|
s1 = [(f1 @ 65) ^ (f1 @ 92) | f1 <- regA]
|
|
s2 = [(f2 @ 68) ^ (f2 @ 83) | f2 <- regB]
|
|
|
|
stream = s1 ^ s2
|
|
t1 = [(f1 @ 65) ^ ((f1 @ 90) && (f1 @ 91)) ^ (f1 @ 92) ^ (f2 @ 77) |
|
|
f2 <- regB |
|
|
f1 <- regA ]
|
|
t2 = [(f2 @ 68) ^ ((f2 @ 81) && (f2 @ 82)) ^ (f2 @ 83) ^ (f1 @ 68) |
|
|
f1 <- regA |
|
|
f2 <- regB ]
|
|
|
|
regA = [r1] # [shift f b| f <- regA | b <- t2]
|
|
regB = [r2] # [shift f b| f <- regB | b <- t1]
|
|
|
|
Bivium_alt : ([93], [84]) -> [N]Bit
|
|
Bivium_alt (r1, r2) = take`{N} (s1 ^ s2)
|
|
where
|
|
a_65 = drop`{27} a_92
|
|
a_68 = drop`{24} a_92
|
|
a_90 = drop`{2} a_92
|
|
a_91 = drop`{1} a_92
|
|
a_92 = reverse r1 # t2
|
|
|
|
b_68 = drop`{15} b_83
|
|
b_77 = drop`{6} b_83
|
|
b_81 = drop`{2} b_83
|
|
b_82 = drop`{1} b_83
|
|
b_83 = reverse r2 # t1
|
|
|
|
s1 = a_65 ^ a_92
|
|
s2 = b_68 ^ b_83
|
|
|
|
t1 = s1 ^ (a_90 && a_91) ^ b_77
|
|
t2 = s2 ^ (b_81 && b_82) ^ a_68
|
|
|
|
/*************************************************************/
|
|
|
|
iv1 = 0b111110000000101010100100010001000000101010100001011111111111111100100100111111111011111111111
|
|
iv2 = 0b000000000000000000001000000000000000000001000000000000000000001000000000000000000001
|
|
|
|
test_keystream = 0b01000010000100000101110001100011111101110101110111111110100001111111100110101001000010101100100010000100001100011100000010001001100101101001011101110100000001011010001101000011001000110011111010100110
|
|
|
|
|
|
suffix = 0b000000001000000000000000000001
|
|
property Bivium_correct = (Bivium(iv1, iv2)) == test_keystream
|
|
property Bivium_search (x, y) = (Bivium(x, y)) == test_keystream
|
|
property Bivium_search_with_suffix (x, y) = (Bivium(x, y#suffix)) == test_keystream
|
|
property Bivium_alt_equivalent r = Bivium_alt r == Bivium r
|