/* 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