3 | import Crypto.Curve.XCurves
10 | interface ECDHCyclicGroup (0 a : Type) where
13 | diffie_hellman : Scalar -> Element -> Maybe (List Bits8)
14 | generate_key_pair : MonadRandom m => m (Scalar,Element)
16 | deserialize_pk : List Bits8 -> Maybe Element
17 | serialize_pk : Element -> List Bits8
20 | deserialize_then_dh : ECDHCyclicGroup dh => Scalar {a=dh} -> List Bits8 -> Maybe (List Bits8)
21 | deserialize_then_dh sk pk = (deserialize_pk {a=dh} pk) >>= (diffie_hellman sk)
24 | data X25519_DH : Type where
27 | ECDHCyclicGroup X25519_DH where
28 | Scalar = Vect 32 Bits8
29 | Element = Vect 32 Bits8
30 | diffie_hellman sk pk = map toList (XCurves.mul x25519 sk pk)
31 | generate_key_pair = do
32 | sk <- random_bytes 32
33 | let Just pk = derive_public_key x25519 sk
34 | | Nothing => generate_key_pair {a=X25519_DH}
36 | deserialize_pk content = exactLength 32 $
fromList content
37 | serialize_pk = toList
40 | data X448_DH : Type where
43 | ECDHCyclicGroup X448_DH where
44 | Scalar = Vect 56 Bits8
45 | Element = Vect 56 Bits8
46 | diffie_hellman sk pk = map toList (XCurves.mul x448 sk pk)
47 | generate_key_pair = do
48 | sk <- random_bytes 56
49 | let Just pk = derive_public_key x448 sk
50 | | Nothing => generate_key_pair {a=X448_DH}
52 | deserialize_pk content = exactLength 56 $
fromList content
53 | serialize_pk = toList
56 | {p : _} -> Point p => ECDHCyclicGroup p where
59 | diffie_hellman sk pk =
60 | let (x, _) = to_affine $
mul sk pk
61 | bytes = divCeilNZ (bits {p=p}) 8 SIsNonZero
62 | in Just $
toList $
integer_to_be bytes x
63 | generate_key_pair = do
64 | sk <- uniform_random' 2 (order {p=p} - 1)
65 | let pk = mul sk $
generator {p=p}
67 | deserialize_pk = decode {p=p}
68 | serialize_pk = encode {p=p}