---------------------------------------------------------------------- -- Galois Package (Galois.ads) -- -- Defines funtions for point multiplication -- of Chapter 10 examples --------------------------------------------------------------------- package Galois is --P: constant Natural := 239; Logp: constant Natural := 8; R: constant Natural := 2**Logp; Exp_K: constant Natural := 17; Exp_2k: constant Natural := 50; P: constant Natural := 2; --P: constant Natural := 7; --M: constant Natural := 17; --M: constant Natural := 8; M: constant Natural := 163; --m:constant := 5; Mdiv4: constant Natural := 40; subtype Natural_Mod_P is Natural range 0 .. P-1; type Polynomial is array(0 .. M) of Natural_Mod_P; subtype hex_digit is natural range 0 .. 15; type hex_polynomial is array(0 .. Mdiv4) of hex_digit; subtype Bit is Natural range 0 .. 1; type Bit_Vector is array(0 .. Logp-1) of Bit; type carry_Vector is array(0 .. m) of Bit; subtype signed_bit is integer range -1 .. 1; --type signed_bit_vector is array(0 .. m) of signed_bit; --type signed_bit_vector is array(0 .. 2*m) of signed_bit; type signed_bit_vector is array (natural range <>) of signed_bit; -- function base_tau_conversion(k: polynomial) return signed_bit_vector; procedure base_tau_conversion(k: in polynomial; z: out signed_bit_vector; t: out natural); function Divide_By_2(X, P: in Integer) return Integer; function Divide_By_4(X, P: in Integer) return Integer; function Degree(A: Polynomial) return Natural; function Subtract(A, B: Polynomial) return Polynomial; function Invert(Y: Natural_Mod_P) return Natural_Mod_P; function Product(A: Polynomial; B: Natural_Mod_P) return Polynomial; function Shift_One(A: Polynomial) return Polynomial; function Divide_By_X(A, F: Polynomial) return Polynomial; function Add(A, B: Polynomial) return Polynomial; function Multiply_By_X(A, F: Polynomial) return Polynomial; function Product_Mod_F(A, B, F: Polynomial) return Polynomial; function Frobenius(J, I: Natural)return Natural_Mod_P; function Quotient(Num, Den: Polynomial) return Polynomial; function Remainder(Num, Den: Polynomial) return Polynomial; function Shift(A: Polynomial; T: Natural) return Polynomial; function Shift(A, F: Polynomial; T: Natural) return Polynomial; procedure Swap(A, B: in out Polynomial); procedure Swap(S, T: in out Natural); function Mp(X, Y: in Natural) return Natural; function divider_mod_binary_f(g, h, f: polynomial) return polynomial; --procedure hex_to_bin(a: in hex_polynomial; b: out polynomial); function hex_to_bin(a: hex_polynomial) return polynomial; --procedure bin_to_hex(a: in polynomial; b: out hex_polynomial); function bin_to_hex(a: polynomial) return hex_polynomial; --function point_addition_x(xP, yP, xQ, yQ, f: Polynomial) return Polynomial; --function point_addition_y(xP, yP, xQ, yQ, f: Polynomial) return Polynomial; procedure point_addition(xP, yP, xQ, yQ, f: in Polynomial; xR, yR: out Polynomial); function point_addition(xA, xB, xP, f: Polynomial) return Polynomial; --function point_doubling_x(xP, yP, f: Polynomial) return Polynomial; --function point_doubling_y(xP, yP, f: Polynomial) return Polynomial; procedure point_doubling(xP, yP, f: in Polynomial; xR, yR: out Polynomial); function point_doubling(xA, f: Polynomial) return Polynomial; function compute_y(xA, xB, xP, yP, f: polynomial) return polynomial; procedure point_multiplication(k, xP, yP, f: in Polynomial; xR, yR: out Polynomial); procedure frobenius_point_multiplication(k, xP, yP, f: in polynomial; xR, yR: out polynomial); procedure frobenius_point_multiplication_2(k, xP, yP, f: in polynomial; xR, yR: out polynomial); procedure Montgomery_point_multiplication (k, xP, yP, f: in polynomial; xR, yR: out polynomial); infinity: constant polynomial := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0); --curve point P: hex_xP: constant hex_polynomial := (2,15,14,1,3,12,0,5,3,7, 11,11,12,1,1,10,12,10,10,0, 7,13,7,9,3,13,14,4,14,6, 13,5,14,5,12,9,4,14,14,14, 8); hex_yP: constant hex_polynomial := (2,8,9,0,7,0,15,11,0,5, 13,3,8,15,15,5,8,3,2,1, 15,2,14,8,0,0,5,3,6,13, 5,3,8,12,12,13,10,10,3,13, 9); --order n of P: hex_n: constant hex_polynomial := (4,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 2,0,1,0,8,10,2,14,0,12, 12,0,13,9,9,15,8,10,5,14, 15); --n-1 hex_n_minus_1: constant hex_polynomial := (4,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 2,0,1,0,8,10,2,14,0,12, 12,0,13,9,9,15,8,10,5,14, 14); end Galois;