{-# OPTIONS_HADDOCK prune #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE UnboxedSums #-}
{-# LANGUAGE ViewPatterns #-}
module Crypto.Curve.Secp256k1 (
_CURVE_Q
, _CURVE_P
, remQ
, modQ
, Pub
, derive_pub
, derive_pub'
, _CURVE_G
, _CURVE_ZERO
, parse_int256
, parse_point
, parse_sig
, serialize_point
, ecdh
, sign_schnorr
, verify_schnorr
, ECDSA(..)
, SigType(..)
, sign_ecdsa
, sign_ecdsa_unrestricted
, verify_ecdsa
, verify_ecdsa_unrestricted
, Context
, precompute
, sign_schnorr'
, verify_schnorr'
, sign_ecdsa'
, sign_ecdsa_unrestricted'
, verify_ecdsa'
, verify_ecdsa_unrestricted'
, neg
, add
, double
, mul
, mul_unsafe
, mul_wnaf
, Affine(..)
, Projective(..)
, affine
, projective
, valid
, _sign_ecdsa_no_hash
, _sign_ecdsa_no_hash'
) where
import Control.Monad (when)
import Control.Monad.ST
import qualified Crypto.DRBG.HMAC as DRBG
import qualified Crypto.Hash.SHA256 as SHA256
import Data.Bits ((.|.))
import qualified Data.Bits as B
import qualified Data.ByteString as BS
import qualified Data.ByteString.Unsafe as BU
import qualified Data.Primitive.Array as A
import Data.STRef
import Data.Word (Word8, Word64)
import GHC.Generics
import GHC.Natural
import qualified GHC.Num.Integer as I
fi :: (Integral a, Num b) => a -> b
fi :: forall a b. (Integral a, Num b) => a -> b
fi = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE fi #-}
modexp :: Integer -> Natural -> Natural -> Integer
modexp :: Integer -> Natural -> Natural -> Integer
modexp Integer
b (Natural -> Integer
forall a b. (Integral a, Num b) => a -> b
fi -> Integer
e) Natural
m = case Integer -> Integer -> Natural -> (# Natural | () #)
I.integerPowMod# Integer
b Integer
e Natural
m of
(# Natural -> Integer
forall a b. (Integral a, Num b) => a -> b
fi -> Integer
n | #) -> Integer
n
(# | ()
_ #) -> [Char] -> Integer
forall a. HasCallStack => [Char] -> a
error [Char]
"negative power impossible"
{-# INLINE modexp #-}
modinv :: Integer -> Natural -> Maybe Integer
modinv :: Integer -> Natural -> Maybe Integer
modinv Integer
a Natural
m = case Integer -> Natural -> (# Natural | () #)
I.integerRecipMod# Integer
a Natural
m of
(# Natural -> Integer
forall a b. (Integral a, Num b) => a -> b
fi -> Integer
n | #) -> Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer) -> Integer -> Maybe Integer
forall a b. (a -> b) -> a -> b
$! Integer
n
(# | ()
_ #) -> Maybe Integer
forall a. Maybe a
Nothing
{-# INLINE modinv #-}
xor :: BS.ByteString -> BS.ByteString -> BS.ByteString
xor :: ByteString -> ByteString -> ByteString
xor = (Word8 -> Word8 -> Word8) -> ByteString -> ByteString -> ByteString
BS.packZipWith Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
B.xor
roll :: BS.ByteString -> Integer
roll :: ByteString -> Integer
roll = (Integer -> Word8 -> Integer) -> Integer -> ByteString -> Integer
forall a. (a -> Word8 -> a) -> a -> ByteString -> a
BS.foldl' Integer -> Word8 -> Integer
forall {a}. Integral a => Integer -> a -> Integer
alg Integer
0 where
alg :: Integer -> a -> Integer
alg !Integer
a (a -> Integer
forall a b. (Integral a, Num b) => a -> b
fi -> !Integer
b) = (Integer
a Integer -> Word -> Integer
`I.integerShiftL` Word
8) Integer -> Integer -> Integer
`I.integerOr` Integer
b
roll32 :: BS.ByteString -> Integer
roll32 :: ByteString -> Integer
roll32 ByteString
bs = Word64 -> Word64 -> Word64 -> Word64 -> Int -> Integer
forall {t} {t} {t} {t} {a}.
(Integral t, Integral t, Integral t, Integral t, Bits a, Bits t,
Bits t, Bits t, Bits t, Num a) =>
t -> t -> t -> t -> Int -> a
go (Word64
0 :: Word64) (Word64
0 :: Word64) (Word64
0 :: Word64) (Word64
0 :: Word64) Int
0 where
go :: t -> t -> t -> t -> Int -> a
go !t
acc0 !t
acc1 !t
acc2 !t
acc3 !Int
j
| Int
j Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
32 =
(t -> a
forall a b. (Integral a, Num b) => a -> b
fi t
acc0 a -> Int -> a
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
192)
a -> a -> a
forall a. Bits a => a -> a -> a
.|. (t -> a
forall a b. (Integral a, Num b) => a -> b
fi t
acc1 a -> Int -> a
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
128)
a -> a -> a
forall a. Bits a => a -> a -> a
.|. (t -> a
forall a b. (Integral a, Num b) => a -> b
fi t
acc2 a -> Int -> a
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
64)
a -> a -> a
forall a. Bits a => a -> a -> a
.|. t -> a
forall a b. (Integral a, Num b) => a -> b
fi t
acc3
| Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
8 =
let b :: t
b = Word8 -> t
forall a b. (Integral a, Num b) => a -> b
fi (ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
j)
in t -> t -> t -> t -> Int -> a
go ((t
acc0 t -> Int -> t
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
8) t -> t -> t
forall a. Bits a => a -> a -> a
.|. t
b) t
acc1 t
acc2 t
acc3 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
16 =
let b :: t
b = Word8 -> t
forall a b. (Integral a, Num b) => a -> b
fi (ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
j)
in t -> t -> t -> t -> Int -> a
go t
acc0 ((t
acc1 t -> Int -> t
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
8) t -> t -> t
forall a. Bits a => a -> a -> a
.|. t
b) t
acc2 t
acc3 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
24 =
let b :: t
b = Word8 -> t
forall a b. (Integral a, Num b) => a -> b
fi (ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
j)
in t -> t -> t -> t -> Int -> a
go t
acc0 t
acc1 ((t
acc2 t -> Int -> t
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
8) t -> t -> t
forall a. Bits a => a -> a -> a
.|. t
b) t
acc3 (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Bool
otherwise =
let b :: t
b = Word8 -> t
forall a b. (Integral a, Num b) => a -> b
fi (ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
j)
in t -> t -> t -> t -> Int -> a
go t
acc0 t
acc1 t
acc2 ((t
acc3 t -> Int -> t
forall a. Bits a => a -> Int -> a
`B.unsafeShiftL` Int
8) t -> t -> t
forall a. Bits a => a -> a -> a
.|. t
b) (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE roll32 #-}
unroll :: Integer -> BS.ByteString
unroll :: Integer -> ByteString
unroll Integer
i = case Integer
i of
Integer
0 -> Word8 -> ByteString
BS.singleton Word8
0
Integer
_ -> ByteString -> ByteString
BS.reverse (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ (Integer -> Maybe (Word8, Integer)) -> Integer -> ByteString
forall a. (a -> Maybe (Word8, a)) -> a -> ByteString
BS.unfoldr Integer -> Maybe (Word8, Integer)
forall {a}. Num a => Integer -> Maybe (a, Integer)
step Integer
i
where
step :: Integer -> Maybe (a, Integer)
step Integer
0 = Maybe (a, Integer)
forall a. Maybe a
Nothing
step Integer
m = (a, Integer) -> Maybe (a, Integer)
forall a. a -> Maybe a
Just (Integer -> a
forall a b. (Integral a, Num b) => a -> b
fi Integer
m, Integer
m Integer -> Word -> Integer
`I.integerShiftR` Word
8)
unroll32 :: Integer -> BS.ByteString
unroll32 :: Integer -> ByteString
unroll32 (Integer -> ByteString
unroll -> ByteString
u)
| Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
32 = Int -> Word8 -> ByteString
BS.replicate (Int
32 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
l) Word8
0 ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
u
| Bool
otherwise = ByteString
u
where
l :: Int
l = ByteString -> Int
BS.length ByteString
u
lift :: Integer -> Maybe Affine
lift :: Integer -> Maybe Affine
lift Integer
x
| Bool -> Bool
not (Integer -> Bool
fe Integer
x) = Maybe Affine
forall a. Maybe a
Nothing
| Bool
otherwise =
let c :: Integer
c = Integer -> Integer
remP (Integer -> Natural -> Natural -> Integer
modexp Integer
x Natural
3 (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
_CURVE_P) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
7)
e :: Integer
e = (Integer
_CURVE_P Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1) Integer -> Integer -> Integer
`I.integerQuot` Integer
4
y :: Integer
y = Integer -> Natural -> Natural -> Integer
modexp Integer
c (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
e) (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
_CURVE_P)
y_p :: Integer
y_p | Integer -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
B.testBit Integer
y Int
0 = Integer
_CURVE_P Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
y
| Bool
otherwise = Integer
y
in if Integer
c Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer -> Natural -> Natural -> Integer
modexp Integer
y Natural
2 (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
_CURVE_P)
then Maybe Affine
forall a. Maybe a
Nothing
else Affine -> Maybe Affine
forall a. a -> Maybe a
Just (Affine -> Maybe Affine) -> Affine -> Maybe Affine
forall a b. (a -> b) -> a -> b
$! Integer -> Integer -> Affine
Affine Integer
x Integer
y_p
data Affine = Affine !Integer !Integer
deriving stock (Int -> Affine -> ShowS
[Affine] -> ShowS
Affine -> [Char]
(Int -> Affine -> ShowS)
-> (Affine -> [Char]) -> ([Affine] -> ShowS) -> Show Affine
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Affine -> ShowS
showsPrec :: Int -> Affine -> ShowS
$cshow :: Affine -> [Char]
show :: Affine -> [Char]
$cshowList :: [Affine] -> ShowS
showList :: [Affine] -> ShowS
Show, (forall x. Affine -> Rep Affine x)
-> (forall x. Rep Affine x -> Affine) -> Generic Affine
forall x. Rep Affine x -> Affine
forall x. Affine -> Rep Affine x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Affine -> Rep Affine x
from :: forall x. Affine -> Rep Affine x
$cto :: forall x. Rep Affine x -> Affine
to :: forall x. Rep Affine x -> Affine
Generic)
instance Eq Affine where
Affine Integer
x1 Integer
y1 == :: Affine -> Affine -> Bool
== Affine Integer
x2 Integer
y2 =
Integer -> Integer
modP Integer
x1 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer -> Integer
modP Integer
x2 Bool -> Bool -> Bool
&& Integer -> Integer
modP Integer
y1 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer -> Integer
modP Integer
y2
data Projective = Projective {
Projective -> Integer
px :: !Integer
, Projective -> Integer
py :: !Integer
, Projective -> Integer
pz :: !Integer
}
deriving stock (Int -> Projective -> ShowS
[Projective] -> ShowS
Projective -> [Char]
(Int -> Projective -> ShowS)
-> (Projective -> [Char])
-> ([Projective] -> ShowS)
-> Show Projective
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Projective -> ShowS
showsPrec :: Int -> Projective -> ShowS
$cshow :: Projective -> [Char]
show :: Projective -> [Char]
$cshowList :: [Projective] -> ShowS
showList :: [Projective] -> ShowS
Show, (forall x. Projective -> Rep Projective x)
-> (forall x. Rep Projective x -> Projective) -> Generic Projective
forall x. Rep Projective x -> Projective
forall x. Projective -> Rep Projective x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Projective -> Rep Projective x
from :: forall x. Projective -> Rep Projective x
$cto :: forall x. Rep Projective x -> Projective
to :: forall x. Rep Projective x -> Projective
Generic)
instance Eq Projective where
Projective Integer
ax Integer
ay Integer
az == :: Projective -> Projective -> Bool
== Projective Integer
bx Integer
by Integer
bz =
let x1z2 :: Integer
x1z2 = Integer -> Integer
modP (Integer
ax Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
bz)
x2z1 :: Integer
x2z1 = Integer -> Integer
modP (Integer
bx Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
az)
y1z2 :: Integer
y1z2 = Integer -> Integer
modP (Integer
ay Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
bz)
y2z1 :: Integer
y2z1 = Integer -> Integer
modP (Integer
by Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
az)
in Integer
x1z2 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
x2z1 Bool -> Bool -> Bool
&& Integer
y1z2 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
y2z1
type Pub = Projective
affine :: Projective -> Affine
affine :: Projective -> Affine
affine p :: Projective
p@(Projective Integer
x Integer
y Integer
z)
| Projective
p Projective -> Projective -> Bool
forall a. Eq a => a -> a -> Bool
== Projective
_CURVE_ZERO = Integer -> Integer -> Affine
Affine Integer
0 Integer
0
| Integer
z Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
1 = Integer -> Integer -> Affine
Affine Integer
x Integer
y
| Bool
otherwise = case Integer -> Natural -> Maybe Integer
modinv Integer
z (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
_CURVE_P) of
Maybe Integer
Nothing -> [Char] -> Affine
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (affine): impossible point"
Just Integer
iz -> Integer -> Integer -> Affine
Affine (Integer -> Integer
modP (Integer
x Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
iz)) (Integer -> Integer
modP (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
iz))
projective :: Affine -> Projective
projective :: Affine -> Projective
projective (Affine Integer
x Integer
y)
| Integer
x Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0 Bool -> Bool -> Bool
&& Integer
y Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0 = Projective
_CURVE_ZERO
| Bool
otherwise = Integer -> Integer -> Integer -> Projective
Projective Integer
x Integer
y Integer
1
valid :: Projective -> Bool
valid :: Projective -> Bool
valid Projective
p = case Projective -> Affine
affine Projective
p of
Affine Integer
x Integer
y
| Bool -> Bool
not (Integer -> Bool
fe Integer
x) Bool -> Bool -> Bool
|| Bool -> Bool
not (Integer -> Bool
fe Integer
y) -> Bool
False
| Integer -> Integer
modP (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
y) Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer -> Integer
weierstrass Integer
x -> Bool
False
| Bool
otherwise -> Bool
True
_CURVE_P :: Integer
_CURVE_P :: Integer
_CURVE_P = Integer
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
_CURVE_Q :: Integer
_CURVE_Q :: Integer
_CURVE_Q = Integer
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
_CURVE_Q_BITS :: Int
_CURVE_Q_BITS :: Int
_CURVE_Q_BITS = Int
256
_CURVE_Q_BYTES :: Int
_CURVE_Q_BYTES :: Int
_CURVE_Q_BYTES = Int
32
_CURVE_A :: Integer
_CURVE_A :: Integer
_CURVE_A = Integer
0
_CURVE_B :: Integer
_CURVE_B :: Integer
_CURVE_B = Integer
7
_CURVE_G :: Projective
_CURVE_G :: Projective
_CURVE_G = Integer -> Integer -> Integer -> Projective
Projective Integer
x Integer
y Integer
1 where
x :: Integer
x = Integer
0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
y :: Integer
y = Integer
0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
_CURVE_ZERO :: Projective
_CURVE_ZERO :: Projective
_CURVE_ZERO = Integer -> Integer -> Integer -> Projective
Projective Integer
0 Integer
1 Integer
0
_ZERO :: Projective
_ZERO :: Projective
_ZERO = Integer -> Integer -> Integer -> Projective
Projective Integer
0 Integer
1 Integer
0
{-# DEPRECATED _ZERO "use _CURVE_ZERO instead" #-}
weierstrass :: Integer -> Integer
weierstrass :: Integer -> Integer
weierstrass Integer
x = Integer -> Integer
remP (Integer -> Integer
remP (Integer
x Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
x) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
x Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
_CURVE_B)
{-# INLINE weierstrass #-}
modP :: Integer -> Integer
modP :: Integer -> Integer
modP Integer
a = Integer -> Integer -> Integer
I.integerMod Integer
a Integer
_CURVE_P
{-# INLINE modP #-}
remP :: Integer -> Integer
remP :: Integer -> Integer
remP Integer
a = Integer -> Integer -> Integer
I.integerRem Integer
a Integer
_CURVE_P
{-# INLINE remP #-}
modQ :: Integer -> Integer
modQ :: Integer -> Integer
modQ Integer
a = Integer -> Integer -> Integer
I.integerMod Integer
a Integer
_CURVE_Q
{-# INLINE modQ #-}
remQ :: Integer -> Integer
remQ :: Integer -> Integer
remQ Integer
a = Integer -> Integer -> Integer
I.integerRem Integer
a Integer
_CURVE_Q
{-# INLINE remQ #-}
fe :: Integer -> Bool
fe :: Integer -> Bool
fe Integer
n = Integer
0 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
n Bool -> Bool -> Bool
&& Integer
n Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
_CURVE_P
{-# INLINE fe #-}
ge :: Integer -> Bool
ge :: Integer -> Bool
ge Integer
n = Integer
0 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
n Bool -> Bool -> Bool
&& Integer
n Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
_CURVE_Q
{-# INLINE ge #-}
modsqrtP :: Integer -> Maybe Integer
modsqrtP :: Integer -> Maybe Integer
modsqrtP Integer
n = (forall s. ST s (Maybe Integer)) -> Maybe Integer
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Maybe Integer)) -> Maybe Integer)
-> (forall s. ST s (Maybe Integer)) -> Maybe Integer
forall a b. (a -> b) -> a -> b
$ do
STRef s Integer
r <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
1
STRef s Integer
num <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
n
STRef s Integer
e <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef ((Integer
_CURVE_P Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1) Integer -> Integer -> Integer
`I.integerQuot` Integer
4)
let loop :: ST s ()
loop = do
Integer
ev <- STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
e
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Integer
ev Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
0) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Integer -> Word -> Bool
I.integerTestBit Integer
ev Word
0) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$ do
Integer
numv <- STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
num
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
r (\Integer
rv -> Integer -> Integer
remP (Integer
rv Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
numv))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
num (\Integer
numv -> Integer -> Integer
remP (Integer
numv Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
numv))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
e (Integer -> Word -> Integer
`I.integerShiftR` Word
1)
ST s ()
loop
ST s ()
loop
Integer
rv <- STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
r
Maybe Integer -> ST s (Maybe Integer)
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Integer -> ST s (Maybe Integer))
-> Maybe Integer -> ST s (Maybe Integer)
forall a b. (a -> b) -> a -> b
$
if Integer -> Integer
remP (Integer
rv Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
rv) Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
n
then Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer) -> Integer -> Maybe Integer
forall a b. (a -> b) -> a -> b
$! Integer
rv
else Maybe Integer
forall a. Maybe a
Nothing
neg :: Projective -> Projective
neg :: Projective -> Projective
neg (Projective Integer
x Integer
y Integer
z) = Integer -> Integer -> Integer -> Projective
Projective Integer
x (Integer -> Integer
modP (Integer -> Integer
forall a. Num a => a -> a
negate Integer
y)) Integer
z
add :: Projective -> Projective -> Projective
add :: Projective -> Projective -> Projective
add Projective
p q :: Projective
q@(Projective Integer
_ Integer
_ Integer
z)
| Projective
p Projective -> Projective -> Bool
forall a. Eq a => a -> a -> Bool
== Projective
q = Projective -> Projective
double Projective
p
| Integer
z Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
1 = Projective -> Projective -> Projective
add_mixed Projective
p Projective
q
| Bool
otherwise = Projective -> Projective -> Projective
add_proj Projective
p Projective
q
add_proj :: Projective -> Projective -> Projective
add_proj :: Projective -> Projective -> Projective
add_proj (Projective Integer
x1 Integer
y1 Integer
z1) (Projective Integer
x2 Integer
y2 Integer
z2) = (forall s. ST s Projective) -> Projective
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s Projective) -> Projective)
-> (forall s. ST s Projective) -> Projective
forall a b. (a -> b) -> a -> b
$ do
STRef s Integer
x3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
STRef s Integer
y3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
STRef s Integer
z3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
let b3 :: Integer
b3 = Integer -> Integer
remP (Integer
_CURVE_B Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
3)
STRef s Integer
t0 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
x1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
x2))
STRef s Integer
t1 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
y1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
y2))
STRef s Integer
t2 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
z1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
z2))
STRef s Integer
t3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
x1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
y1))
STRef s Integer
t4 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
x2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
y2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t3 (\Integer
r3 -> Integer -> Integer
modP (Integer
r3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r4))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t4 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t3 (\Integer
r3 -> Integer -> Integer
modP (Integer
r3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
r4))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t4 (Integer -> Integer
modP (Integer
y1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
z1))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
y2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
z2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rx3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t4 (\Integer
r4 -> Integer -> Integer
modP (Integer
r4 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
rx3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rx3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t4 (\Integer
r4 -> Integer -> Integer
modP (Integer
r4 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
rx3))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
x1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
z1))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
y3 (Integer -> Integer
modP (Integer
x2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
z2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
y3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
ry3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
x3 (\Integer
rx3 -> Integer -> Integer
modP (Integer
rx3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
y3 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rx3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
rx3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rx3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef STRef s Integer
t0 (\Integer
r0 -> Integer -> Integer
modP (Integer
rx3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t2 (\Integer
r2 -> Integer -> Integer
modP (Integer
b3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
z3 (Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t1 (\Integer
r1 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
r2))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
b3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
y3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
ry3 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r4 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r3 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t2 (Integer -> Integer
modP (Integer
r3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
x3 (\Integer
rx3 -> Integer -> Integer
modP (Integer
r2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
rx3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
ry3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r0))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
z3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rz3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t1 (\Integer
r1 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
rz3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t0 (\Integer
r0 -> Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
rz3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r4))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
rz3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
Integer -> Integer -> Integer -> Projective
Projective (Integer -> Integer -> Integer -> Projective)
-> ST s Integer -> ST s (Integer -> Integer -> Projective)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s (Integer -> Integer -> Projective)
-> ST s Integer -> ST s (Integer -> Projective)
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
y3 ST s (Integer -> Projective) -> ST s Integer -> ST s Projective
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
z3
add_mixed :: Projective -> Projective -> Projective
add_mixed :: Projective -> Projective -> Projective
add_mixed (Projective Integer
x1 Integer
y1 Integer
z1) (Projective Integer
x2 Integer
y2 Integer
z2)
| Integer
z2 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer
1 = [Char] -> Projective
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1: internal error"
| Bool
otherwise = (forall s. ST s Projective) -> Projective
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s Projective) -> Projective)
-> (forall s. ST s Projective) -> Projective
forall a b. (a -> b) -> a -> b
$ do
STRef s Integer
x3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
STRef s Integer
y3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
STRef s Integer
z3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
let b3 :: Integer
b3 = Integer -> Integer
remP (Integer
_CURVE_B Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
3)
STRef s Integer
t0 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
x1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
x2))
STRef s Integer
t1 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
y1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
y2))
STRef s Integer
t3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
x2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
y2))
STRef s Integer
t4 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
x1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
y1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t3 (\Integer
r3 -> Integer -> Integer
modP (Integer
r3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r4))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t4 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t3 (\Integer
r3 -> Integer -> Integer
modP (Integer
r3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
r4))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t4 (Integer -> Integer
modP (Integer
y2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
z1))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t4 (\Integer
r4 -> Integer -> Integer
modP (Integer
r4 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
y1))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
y3 (Integer -> Integer
modP (Integer
x2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
z1))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
ry3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
x1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rx3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t0 (\Integer
r0 -> Integer -> Integer
modP (Integer
rx3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
STRef s Integer
t2 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
b3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
z1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
z3 (Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t1 (\Integer
r1 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
r2))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
b3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
y3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
ry3 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r4 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r3 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t2 (Integer -> Integer
modP (Integer
r3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r1))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
x3 (\Integer
rx3 -> Integer -> Integer
modP (Integer
r2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
rx3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
ry3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r0))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
z3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rz3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t1 (\Integer
r1 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
rz3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t0 (\Integer
r0 -> Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t4 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r4 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
rz3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r4))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
rz3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
Integer -> Integer -> Integer -> Projective
Projective (Integer -> Integer -> Integer -> Projective)
-> ST s Integer -> ST s (Integer -> Integer -> Projective)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s (Integer -> Integer -> Projective)
-> ST s Integer -> ST s (Integer -> Projective)
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
y3 ST s (Integer -> Projective) -> ST s Integer -> ST s Projective
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
z3
double :: Projective -> Projective
double :: Projective -> Projective
double (Projective Integer
x Integer
y Integer
z) = (forall s. ST s Projective) -> Projective
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s Projective) -> Projective)
-> (forall s. ST s Projective) -> Projective
forall a b. (a -> b) -> a -> b
$ do
STRef s Integer
x3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
STRef s Integer
y3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
STRef s Integer
z3 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef Integer
0
let b3 :: Integer
b3 = Integer -> Integer
remP (Integer
_CURVE_B Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
3)
STRef s Integer
t0 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
y))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
z3 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r0))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
rz3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
rz3))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
rz3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
rz3))
STRef s Integer
t1 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
z))
STRef s Integer
t2 <- Integer -> ST s (STRef s Integer)
forall a s. a -> ST s (STRef s a)
newSTRef (Integer -> Integer
modP (Integer
z Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
z))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef STRef s Integer
t2 (\Integer
r2 -> Integer -> Integer
modP (Integer
b3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
z3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rz3 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
rz3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
y3 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
z3 (\Integer
rz3 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
rz3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t1 (Integer -> Integer
modP (Integer
r2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t2 (\Integer
r2 -> Integer -> Integer
modP (Integer
r1 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t2 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r2 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
t0 (\Integer
r0 -> Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
r2))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
ry3))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
rx3 ->
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
y3 (\Integer
ry3 -> Integer -> Integer
modP (Integer
rx3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
ry3))
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
t1 (Integer -> Integer
modP (Integer
x Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
y))
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t0 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r0 ->
STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
t1 ST s Integer -> (Integer -> ST s ()) -> ST s ()
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Integer
r1 ->
STRef s Integer -> Integer -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s Integer
x3 (Integer -> Integer
modP (Integer
r0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r1))
STRef s Integer -> (Integer -> Integer) -> ST s ()
forall s a. STRef s a -> (a -> a) -> ST s ()
modifySTRef' STRef s Integer
x3 (\Integer
rx3 -> Integer -> Integer
modP (Integer
rx3 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
rx3))
Integer -> Integer -> Integer -> Projective
Projective (Integer -> Integer -> Integer -> Projective)
-> ST s Integer -> ST s (Integer -> Integer -> Projective)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
x3 ST s (Integer -> Integer -> Projective)
-> ST s Integer -> ST s (Integer -> Projective)
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
y3 ST s (Integer -> Projective) -> ST s Integer -> ST s Projective
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> STRef s Integer -> ST s Integer
forall s a. STRef s a -> ST s a
readSTRef STRef s Integer
z3
mul :: Projective -> Integer -> Projective
mul :: Projective -> Integer -> Projective
mul Projective
p Integer
_SECRET
| Bool -> Bool
not (Integer -> Bool
ge Integer
_SECRET) = [Char] -> Projective
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (mul): scalar not in group"
| Bool
otherwise = Int
-> Projective -> Projective -> Projective -> Integer -> Projective
loop (Int
0 :: Int) Projective
_CURVE_ZERO Projective
_CURVE_G Projective
p Integer
_SECRET
where
loop :: Int
-> Projective -> Projective -> Projective -> Integer -> Projective
loop !Int
j !Projective
acc !Projective
f !Projective
d !Integer
m
| Int
j Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
_CURVE_Q_BITS = Projective
acc
| Bool
otherwise =
let nd :: Projective
nd = Projective -> Projective
double Projective
d
nm :: Integer
nm = Integer -> Word -> Integer
I.integerShiftR Integer
m Word
1
in if Integer -> Word -> Bool
I.integerTestBit Integer
m Word
0
then Int
-> Projective -> Projective -> Projective -> Integer -> Projective
loop (Int -> Int
forall a. Enum a => a -> a
succ Int
j) (Projective -> Projective -> Projective
add Projective
acc Projective
d) Projective
f Projective
nd Integer
nm
else Int
-> Projective -> Projective -> Projective -> Integer -> Projective
loop (Int -> Int
forall a. Enum a => a -> a
succ Int
j) Projective
acc (Projective -> Projective -> Projective
add Projective
f Projective
d) Projective
nd Integer
nm
{-# INLINE mul #-}
mul_unsafe :: Projective -> Integer -> Projective
mul_unsafe :: Projective -> Integer -> Projective
mul_unsafe Projective
p Integer
n
| Integer
n Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0 = Projective
_CURVE_ZERO
| Bool -> Bool
not (Integer -> Bool
ge Integer
n) =
[Char] -> Projective
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (mul_unsafe): scalar not in group"
| Bool
otherwise = Projective -> Projective -> Integer -> Projective
loop Projective
_CURVE_ZERO Projective
p Integer
n
where
loop :: Projective -> Projective -> Integer -> Projective
loop !Projective
r !Projective
d Integer
m
| Integer
m Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<= Integer
0 = Projective
r
| Bool
otherwise =
let nd :: Projective
nd = Projective -> Projective
double Projective
d
nm :: Integer
nm = Integer -> Word -> Integer
I.integerShiftR Integer
m Word
1
nr :: Projective
nr = if Integer -> Word -> Bool
I.integerTestBit Integer
m Word
0 then Projective -> Projective -> Projective
add Projective
r Projective
d else Projective
r
in Projective -> Projective -> Integer -> Projective
loop Projective
nr Projective
nd Integer
nm
data Context = Context {
Context -> Int
ctxW :: {-# UNPACK #-} !Int
, Context -> Array Projective
ctxArray :: !(A.Array Projective)
} deriving (Context -> Context -> Bool
(Context -> Context -> Bool)
-> (Context -> Context -> Bool) -> Eq Context
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Context -> Context -> Bool
== :: Context -> Context -> Bool
$c/= :: Context -> Context -> Bool
/= :: Context -> Context -> Bool
Eq, (forall x. Context -> Rep Context x)
-> (forall x. Rep Context x -> Context) -> Generic Context
forall x. Rep Context x -> Context
forall x. Context -> Rep Context x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Context -> Rep Context x
from :: forall x. Context -> Rep Context x
$cto :: forall x. Rep Context x -> Context
to :: forall x. Rep Context x -> Context
Generic)
instance Show Context where
show :: Context -> [Char]
show Context {} = [Char]
"<secp256k1 context>"
precompute :: Context
precompute :: Context
precompute = Int -> Context
_precompute Int
8
data Pair a b = Pair !a !b
_precompute :: Int -> Context
_precompute :: Int -> Context
_precompute Int
ctxW = Context {Int
Array Projective
ctxW :: Int
ctxArray :: Array Projective
ctxW :: Int
ctxArray :: Array Projective
..} where
ctxArray :: Array Projective
ctxArray = Int -> [Projective] -> Array Projective
forall a. Int -> [a] -> Array a
A.arrayFromListN Int
size ([Projective] -> Projective -> Int -> [Projective]
loop_w [Projective]
forall a. Monoid a => a
mempty Projective
_CURVE_G Int
0)
capJ :: Int
capJ = (Int
2 :: Int) Int -> Int -> Int
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
ctxW Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
ws :: Int
ws = Int
256 Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
ctxW Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
size :: Int
size = Int
ws Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
capJ
loop_w :: [Projective] -> Projective -> Int -> [Projective]
loop_w ![Projective]
acc !Projective
p !Int
w
| Int
w Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
ws = [Projective] -> [Projective]
forall a. [a] -> [a]
reverse [Projective]
acc
| Bool
otherwise =
let b :: Projective
b = Projective
p
!(Pair [Projective]
nacc Projective
nb) = Projective
-> [Projective]
-> Projective
-> Int
-> Pair [Projective] Projective
loop_j Projective
p (Projective
b Projective -> [Projective] -> [Projective]
forall a. a -> [a] -> [a]
: [Projective]
acc) Projective
b Int
1
np :: Projective
np = Projective -> Projective
double Projective
nb
in [Projective] -> Projective -> Int -> [Projective]
loop_w [Projective]
nacc Projective
np (Int -> Int
forall a. Enum a => a -> a
succ Int
w)
loop_j :: Projective
-> [Projective]
-> Projective
-> Int
-> Pair [Projective] Projective
loop_j !Projective
p ![Projective]
acc !Projective
b !Int
j
| Int
j Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
capJ = [Projective] -> Projective -> Pair [Projective] Projective
forall a b. a -> b -> Pair a b
Pair [Projective]
acc Projective
b
| Bool
otherwise =
let nb :: Projective
nb = Projective -> Projective -> Projective
add Projective
b Projective
p
in Projective
-> [Projective]
-> Projective
-> Int
-> Pair [Projective] Projective
loop_j Projective
p (Projective
nb Projective -> [Projective] -> [Projective]
forall a. a -> [a] -> [a]
: [Projective]
acc) Projective
nb (Int -> Int
forall a. Enum a => a -> a
succ Int
j)
mul_wnaf :: Context -> Integer -> Projective
mul_wnaf :: Context -> Integer -> Projective
mul_wnaf Context {Int
Array Projective
ctxW :: Context -> Int
ctxArray :: Context -> Array Projective
ctxW :: Int
ctxArray :: Array Projective
..} Integer
_SECRET =
Int -> Projective -> Projective -> Integer -> Projective
loop Int
0 Projective
_CURVE_ZERO Projective
_CURVE_G Integer
_SECRET
where
wins :: Int
wins = Int
256 Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
ctxW Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
wsize :: Integer
wsize = Integer
2 Integer -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
ctxW Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
mask :: Integer
mask = Integer
2 Integer -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
ctxW Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
1
mnum :: Integer
mnum = Integer
2 Integer -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
ctxW
loop :: Int -> Projective -> Projective -> Integer -> Projective
loop !Int
w !Projective
acc !Projective
f !Integer
n
| Int
w Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
wins = Projective
acc
| Bool
otherwise =
let !off0 :: Int
off0 = Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
* Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fi Integer
wsize
!b0 :: Integer
b0 = Integer
n Integer -> Integer -> Integer
`I.integerAnd` Integer
mask
!n0 :: Integer
n0 = Integer
n Integer -> Word -> Integer
`I.integerShiftR` Int -> Word
forall a b. (Integral a, Num b) => a -> b
fi Int
ctxW
!(Pair Integer
b1 Integer
n1) | Integer
b0 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
wsize = Integer -> Integer -> Pair Integer Integer
forall a b. a -> b -> Pair a b
Pair (Integer
b0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
mnum) (Integer
n0 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1)
| Bool
otherwise = Integer -> Integer -> Pair Integer Integer
forall a b. a -> b -> Pair a b
Pair Integer
b0 Integer
n0
!c0 :: Bool
c0 = Int -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
B.testBit Int
w Int
0
!c1 :: Bool
c1 = Integer
b1 Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
0
!off1 :: Int
off1 = Int
off0 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fi (Integer -> Integer
forall a. Num a => a -> a
abs Integer
b1) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
in if Integer
b1 Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0
then let !pr :: Projective
pr = Array Projective -> Int -> Projective
forall a. Array a -> Int -> a
A.indexArray Array Projective
ctxArray Int
off0
!pt :: Projective
pt | Bool
c0 = Projective -> Projective
neg Projective
pr
| Bool
otherwise = Projective
pr
in Int -> Projective -> Projective -> Integer -> Projective
loop (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Projective
acc (Projective -> Projective -> Projective
add Projective
f Projective
pt) Integer
n1
else let !pr :: Projective
pr = Array Projective -> Int -> Projective
forall a. Array a -> Int -> a
A.indexArray Array Projective
ctxArray Int
off1
!pt :: Projective
pt | Bool
c1 = Projective -> Projective
neg Projective
pr
| Bool
otherwise = Projective
pr
in Int -> Projective -> Projective -> Integer -> Projective
loop (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Projective -> Projective -> Projective
add Projective
acc Projective
pt) Projective
f Integer
n1
{-# INLINE mul_wnaf #-}
derive_pub :: Integer -> Pub
derive_pub :: Integer -> Projective
derive_pub Integer
_SECRET
| Bool -> Bool
not (Integer -> Bool
ge Integer
_SECRET) =
[Char] -> Projective
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (derive_pub): invalid secret key"
| Bool
otherwise =
Projective -> Integer -> Projective
mul Projective
_CURVE_G Integer
_SECRET
{-# NOINLINE derive_pub #-}
derive_pub' :: Context -> Integer -> Pub
derive_pub' :: Context -> Integer -> Projective
derive_pub' Context
tex Integer
_SECRET
| Bool -> Bool
not (Integer -> Bool
ge Integer
_SECRET) =
[Char] -> Projective
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (derive_pub): invalid secret key"
| Bool
otherwise =
Context -> Integer -> Projective
mul_wnaf Context
tex Integer
_SECRET
{-# NOINLINE derive_pub' #-}
parse_int256 :: BS.ByteString -> Integer
parse_int256 :: ByteString -> Integer
parse_int256 ByteString
bs
| ByteString -> Int
BS.length ByteString
bs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
32 =
[Char] -> Integer
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (parse_int256): requires exactly 32-byte input"
| Bool
otherwise = ByteString -> Integer
roll32 ByteString
bs
parse_point :: BS.ByteString -> Maybe Projective
parse_point :: ByteString -> Maybe Projective
parse_point ByteString
bs
| Int
len Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
32 = ByteString -> Maybe Projective
_parse_bip0340 ByteString
bs
| Int
len Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
33 = Word8 -> ByteString -> Maybe Projective
_parse_compressed Word8
h ByteString
t
| Int
len Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
65 = Word8 -> ByteString -> Maybe Projective
_parse_uncompressed Word8
h ByteString
t
| Bool
otherwise = Maybe Projective
forall a. Maybe a
Nothing
where
len :: Int
len = ByteString -> Int
BS.length ByteString
bs
h :: Word8
h = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
0
t :: ByteString
t = Int -> ByteString -> ByteString
BS.drop Int
1 ByteString
bs
_parse_bip0340 :: BS.ByteString -> Maybe Projective
_parse_bip0340 :: ByteString -> Maybe Projective
_parse_bip0340 = (Affine -> Projective) -> Maybe Affine -> Maybe Projective
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Affine -> Projective
projective (Maybe Affine -> Maybe Projective)
-> (ByteString -> Maybe Affine) -> ByteString -> Maybe Projective
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Maybe Affine
lift (Integer -> Maybe Affine)
-> (ByteString -> Integer) -> ByteString -> Maybe Affine
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Integer
roll32
_parse_compressed :: Word8 -> BS.ByteString -> Maybe Projective
_parse_compressed :: Word8 -> ByteString -> Maybe Projective
_parse_compressed Word8
h (ByteString -> Integer
roll32 -> Integer
x)
| Word8
h Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x02 Bool -> Bool -> Bool
&& Word8
h Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x03 = Maybe Projective
forall a. Maybe a
Nothing
| Bool -> Bool
not (Integer -> Bool
fe Integer
x) = Maybe Projective
forall a. Maybe a
Nothing
| Bool
otherwise = do
Integer
y <- Integer -> Maybe Integer
modsqrtP (Integer -> Integer
weierstrass Integer
x)
let yodd :: Bool
yodd = Integer -> Word -> Bool
I.integerTestBit Integer
y Word
0
hodd :: Bool
hodd = Word8 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
B.testBit Word8
h Int
0
Projective -> Maybe Projective
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Projective -> Maybe Projective) -> Projective -> Maybe Projective
forall a b. (a -> b) -> a -> b
$!
if Bool
hodd Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
yodd
then Integer -> Integer -> Integer -> Projective
Projective Integer
x (Integer -> Integer
modP (Integer -> Integer
forall a. Num a => a -> a
negate Integer
y)) Integer
1
else Integer -> Integer -> Integer -> Projective
Projective Integer
x Integer
y Integer
1
_parse_uncompressed :: Word8 -> BS.ByteString -> Maybe Projective
_parse_uncompressed :: Word8 -> ByteString -> Maybe Projective
_parse_uncompressed Word8
h (Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
_CURVE_Q_BYTES -> (ByteString -> Integer
roll32 -> Integer
x, ByteString -> Integer
roll32 -> Integer
y))
| Word8
h Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x04 = Maybe Projective
forall a. Maybe a
Nothing
| Bool
otherwise =
let p :: Projective
p = Integer -> Integer -> Integer -> Projective
Projective Integer
x Integer
y Integer
1
in if Projective -> Bool
valid Projective
p
then Projective -> Maybe Projective
forall a. a -> Maybe a
Just (Projective -> Maybe Projective) -> Projective -> Maybe Projective
forall a b. (a -> b) -> a -> b
$! Projective
p
else Maybe Projective
forall a. Maybe a
Nothing
parse_sig :: BS.ByteString -> Maybe ECDSA
parse_sig :: ByteString -> Maybe ECDSA
parse_sig ByteString
bs
| ByteString -> Int
BS.length ByteString
bs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
64 = Maybe ECDSA
forall a. Maybe a
Nothing
| Bool
otherwise = ECDSA -> Maybe ECDSA
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ECDSA -> Maybe ECDSA) -> ECDSA -> Maybe ECDSA
forall a b. (a -> b) -> a -> b
$
let (ByteString -> Integer
roll -> Integer
r, ByteString -> Integer
roll -> Integer
s) = Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
32 ByteString
bs
in Integer -> Integer -> ECDSA
ECDSA Integer
r Integer
s
serialize_point :: Projective -> BS.ByteString
serialize_point :: Projective -> ByteString
serialize_point (Projective -> Affine
affine -> Affine Integer
x Integer
y) = Word8 -> ByteString -> ByteString
BS.cons Word8
b (Integer -> ByteString
unroll32 Integer
x) where
b :: Word8
b | Integer -> Word -> Bool
I.integerTestBit Integer
y Word
0 = Word8
0x03
| Bool
otherwise = Word8
0x02
sign_schnorr
:: Integer
-> BS.ByteString
-> BS.ByteString
-> BS.ByteString
sign_schnorr :: Integer -> ByteString -> ByteString -> ByteString
sign_schnorr = (Integer -> Projective)
-> Integer -> ByteString -> ByteString -> ByteString
_sign_schnorr (Projective -> Integer -> Projective
mul Projective
_CURVE_G)
sign_schnorr'
:: Context
-> Integer
-> BS.ByteString
-> BS.ByteString
-> BS.ByteString
sign_schnorr' :: Context -> Integer -> ByteString -> ByteString -> ByteString
sign_schnorr' Context
tex = (Integer -> Projective)
-> Integer -> ByteString -> ByteString -> ByteString
_sign_schnorr (Context -> Integer -> Projective
mul_wnaf Context
tex)
_sign_schnorr
:: (Integer -> Projective)
-> Integer
-> BS.ByteString
-> BS.ByteString
-> BS.ByteString
_sign_schnorr :: (Integer -> Projective)
-> Integer -> ByteString -> ByteString -> ByteString
_sign_schnorr Integer -> Projective
_mul Integer
_SECRET ByteString
m ByteString
a
| Bool -> Bool
not (Integer -> Bool
ge Integer
_SECRET) = [Char] -> ByteString
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (sign_schnorr): invalid secret key"
| Bool
otherwise =
let p_proj :: Projective
p_proj = Integer -> Projective
_mul Integer
_SECRET
Affine Integer
x_p Integer
y_p = Projective -> Affine
affine Projective
p_proj
d :: Integer
d | Integer -> Word -> Bool
I.integerTestBit Integer
y_p Word
0 = Integer
_CURVE_Q Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
_SECRET
| Bool
otherwise = Integer
_SECRET
bytes_d :: ByteString
bytes_d = Integer -> ByteString
unroll32 Integer
d
h_a :: ByteString
h_a = ByteString -> ByteString
hash_aux ByteString
a
t :: ByteString
t = ByteString -> ByteString -> ByteString
xor ByteString
bytes_d ByteString
h_a
bytes_p :: ByteString
bytes_p = Integer -> ByteString
unroll32 Integer
x_p
rand :: ByteString
rand = ByteString -> ByteString
hash_nonce (ByteString
t ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
bytes_p ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
m)
k' :: Integer
k' = Integer -> Integer
modQ (ByteString -> Integer
roll32 ByteString
rand)
in if Integer
k' Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0
then [Char] -> ByteString
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (sign_schnorr): invalid k"
else
let Affine Integer
x_r Integer
y_r = Projective -> Affine
affine (Integer -> Projective
_mul Integer
k')
k :: Integer
k | Integer -> Word -> Bool
I.integerTestBit Integer
y_r Word
0 = Integer
_CURVE_Q Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
k'
| Bool
otherwise = Integer
k'
bytes_r :: ByteString
bytes_r = Integer -> ByteString
unroll32 Integer
x_r
e :: Integer
e = Integer -> Integer
modQ (Integer -> Integer)
-> (ByteString -> Integer) -> ByteString -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Integer
roll32 (ByteString -> Integer)
-> (ByteString -> ByteString) -> ByteString -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
hash_challenge
(ByteString -> Integer) -> ByteString -> Integer
forall a b. (a -> b) -> a -> b
$ ByteString
bytes_r ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
bytes_p ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
m
bytes_ked :: ByteString
bytes_ked = Integer -> ByteString
unroll32 (Integer -> Integer
modQ (Integer
k Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
e Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
d))
sig :: ByteString
sig = ByteString
bytes_r ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
bytes_ked
in if ByteString -> Projective -> ByteString -> Bool
verify_schnorr ByteString
m Projective
p_proj ByteString
sig
then ByteString
sig
else [Char] -> ByteString
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (sign_schnorr): invalid signature"
{-# INLINE _sign_schnorr #-}
verify_schnorr
:: BS.ByteString
-> Pub
-> BS.ByteString
-> Bool
verify_schnorr :: ByteString -> Projective -> ByteString -> Bool
verify_schnorr = (Integer -> Projective)
-> ByteString -> Projective -> ByteString -> Bool
_verify_schnorr (Projective -> Integer -> Projective
mul_unsafe Projective
_CURVE_G)
verify_schnorr'
:: Context
-> BS.ByteString
-> Pub
-> BS.ByteString
-> Bool
verify_schnorr' :: Context -> ByteString -> Projective -> ByteString -> Bool
verify_schnorr' Context
tex = (Integer -> Projective)
-> ByteString -> Projective -> ByteString -> Bool
_verify_schnorr (Context -> Integer -> Projective
mul_wnaf Context
tex)
_verify_schnorr
:: (Integer -> Projective)
-> BS.ByteString
-> Pub
-> BS.ByteString
-> Bool
_verify_schnorr :: (Integer -> Projective)
-> ByteString -> Projective -> ByteString -> Bool
_verify_schnorr Integer -> Projective
_mul ByteString
m (Projective -> Affine
affine -> Affine Integer
x_p Integer
_) ByteString
sig
| ByteString -> Int
BS.length ByteString
sig Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
64 = Bool
False
| Bool
otherwise = case Integer -> Maybe Affine
lift Integer
x_p of
Maybe Affine
Nothing -> Bool
False
Just capP :: Affine
capP@(Affine Integer
x_P Integer
_) ->
let (ByteString -> Integer
roll32 -> Integer
r, ByteString -> Integer
roll32 -> Integer
s) = Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
32 ByteString
sig
in if Integer
r Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
_CURVE_P Bool -> Bool -> Bool
|| Integer
s Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
_CURVE_Q
then Bool
False
else let e :: Integer
e = Integer -> Integer
modQ (Integer -> Integer)
-> (ByteString -> Integer) -> ByteString -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Integer
roll32 (ByteString -> Integer) -> ByteString -> Integer
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
hash_challenge
(Integer -> ByteString
unroll32 Integer
r ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> Integer -> ByteString
unroll32 Integer
x_P ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
m)
dif :: Projective
dif = Projective -> Projective -> Projective
add (Integer -> Projective
_mul Integer
s)
(Projective -> Projective
neg (Projective -> Integer -> Projective
mul_unsafe (Affine -> Projective
projective Affine
capP) Integer
e))
in if Projective
dif Projective -> Projective -> Bool
forall a. Eq a => a -> a -> Bool
== Projective
_CURVE_ZERO
then Bool
False
else let Affine Integer
x_R Integer
y_R = Projective -> Affine
affine Projective
dif
in Bool -> Bool
not (Integer -> Word -> Bool
I.integerTestBit Integer
y_R Word
0 Bool -> Bool -> Bool
|| Integer
x_R Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer
r)
{-# INLINE _verify_schnorr #-}
hash_aux :: BS.ByteString -> BS.ByteString
hash_aux :: ByteString -> ByteString
hash_aux ByteString
x = ByteString -> ByteString
SHA256.hash (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
ByteString
"\241\239N^\192c\202\218m\148\202\250\157\152~\160i&X9\236\193\US\151-w\165.\216\193\204\144\241\239N^\192c\202\218m\148\202\250\157\152~\160i&X9\236\193\US\151-w\165.\216\193\204\144" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
x
{-# INLINE hash_aux #-}
hash_nonce :: BS.ByteString -> BS.ByteString
hash_nonce :: ByteString -> ByteString
hash_nonce ByteString
x = ByteString -> ByteString
SHA256.hash (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
ByteString
"\aIw4\167\155\203\&5[\155\140}\ETXO\DC2\FS\244\&4\215>\247-\218\EM\135\NULa\251R\191\235/\aIw4\167\155\203\&5[\155\140}\ETXO\DC2\FS\244\&4\215>\247-\218\EM\135\NULa\251R\191\235/" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
x
{-# INLINE hash_nonce #-}
hash_challenge :: BS.ByteString -> BS.ByteString
hash_challenge :: ByteString -> ByteString
hash_challenge ByteString
x = ByteString -> ByteString
SHA256.hash (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
ByteString
"{\181-z\159\239X2>\177\191z@}\179\130\210\243\242\216\ESC\177\"OI\254Q\143mH\211|{\181-z\159\239X2>\177\191z@}\179\130\210\243\242\216\ESC\177\"OI\254Q\143mH\211|" ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
x
{-# INLINE hash_challenge #-}
bits2int :: BS.ByteString -> Integer
bits2int :: ByteString -> Integer
bits2int ByteString
bs =
let (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fi -> Word
blen) = ByteString -> Int
BS.length ByteString
bs Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8
(Int -> Word
forall a b. (Integral a, Num b) => a -> b
fi -> Word
qlen) = Int
_CURVE_Q_BITS
del :: Word
del = Word
blen Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
qlen
in if Word
del Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
> Word
0
then ByteString -> Integer
roll ByteString
bs Integer -> Word -> Integer
`I.integerShiftR` Word
del
else ByteString -> Integer
roll ByteString
bs
int2octets :: Integer -> BS.ByteString
int2octets :: Integer -> ByteString
int2octets Integer
i = ByteString -> ByteString
pad (Integer -> ByteString
unroll Integer
i) where
pad :: ByteString -> ByteString
pad ByteString
bs
| ByteString -> Int
BS.length ByteString
bs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
_CURVE_Q_BYTES = ByteString -> ByteString
pad (Word8 -> ByteString -> ByteString
BS.cons Word8
0 ByteString
bs)
| Bool
otherwise = ByteString
bs
bits2octets :: BS.ByteString -> BS.ByteString
bits2octets :: ByteString -> ByteString
bits2octets ByteString
bs =
let z1 :: Integer
z1 = ByteString -> Integer
bits2int ByteString
bs
z2 :: Integer
z2 = Integer -> Integer
modQ Integer
z1
in Integer -> ByteString
int2octets Integer
z2
data ECDSA = ECDSA {
ECDSA -> Integer
ecdsa_r :: !Integer
, ECDSA -> Integer
ecdsa_s :: !Integer
}
deriving (ECDSA -> ECDSA -> Bool
(ECDSA -> ECDSA -> Bool) -> (ECDSA -> ECDSA -> Bool) -> Eq ECDSA
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ECDSA -> ECDSA -> Bool
== :: ECDSA -> ECDSA -> Bool
$c/= :: ECDSA -> ECDSA -> Bool
/= :: ECDSA -> ECDSA -> Bool
Eq, (forall x. ECDSA -> Rep ECDSA x)
-> (forall x. Rep ECDSA x -> ECDSA) -> Generic ECDSA
forall x. Rep ECDSA x -> ECDSA
forall x. ECDSA -> Rep ECDSA x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ECDSA -> Rep ECDSA x
from :: forall x. ECDSA -> Rep ECDSA x
$cto :: forall x. Rep ECDSA x -> ECDSA
to :: forall x. Rep ECDSA x -> ECDSA
Generic)
instance Show ECDSA where
show :: ECDSA -> [Char]
show ECDSA
_ = [Char]
"<ecdsa signature>"
data SigType =
LowS
| Unrestricted
deriving Int -> SigType -> ShowS
[SigType] -> ShowS
SigType -> [Char]
(Int -> SigType -> ShowS)
-> (SigType -> [Char]) -> ([SigType] -> ShowS) -> Show SigType
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SigType -> ShowS
showsPrec :: Int -> SigType -> ShowS
$cshow :: SigType -> [Char]
show :: SigType -> [Char]
$cshowList :: [SigType] -> ShowS
showList :: [SigType] -> ShowS
Show
data HashFlag =
Hash
| NoHash
deriving Int -> HashFlag -> ShowS
[HashFlag] -> ShowS
HashFlag -> [Char]
(Int -> HashFlag -> ShowS)
-> (HashFlag -> [Char]) -> ([HashFlag] -> ShowS) -> Show HashFlag
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HashFlag -> ShowS
showsPrec :: Int -> HashFlag -> ShowS
$cshow :: HashFlag -> [Char]
show :: HashFlag -> [Char]
$cshowList :: [HashFlag] -> ShowS
showList :: [HashFlag] -> ShowS
Show
sign_ecdsa
:: Integer
-> BS.ByteString
-> ECDSA
sign_ecdsa :: Integer -> ByteString -> ECDSA
sign_ecdsa = (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa (Projective -> Integer -> Projective
mul Projective
_CURVE_G) SigType
LowS HashFlag
Hash
sign_ecdsa'
:: Context
-> Integer
-> BS.ByteString
-> ECDSA
sign_ecdsa' :: Context -> Integer -> ByteString -> ECDSA
sign_ecdsa' Context
tex = (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa (Context -> Integer -> Projective
mul_wnaf Context
tex) SigType
LowS HashFlag
Hash
sign_ecdsa_unrestricted
:: Integer
-> BS.ByteString
-> ECDSA
sign_ecdsa_unrestricted :: Integer -> ByteString -> ECDSA
sign_ecdsa_unrestricted = (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa (Projective -> Integer -> Projective
mul Projective
_CURVE_G) SigType
Unrestricted HashFlag
Hash
sign_ecdsa_unrestricted'
:: Context
-> Integer
-> BS.ByteString
-> ECDSA
sign_ecdsa_unrestricted' :: Context -> Integer -> ByteString -> ECDSA
sign_ecdsa_unrestricted' Context
tex = (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa (Context -> Integer -> Projective
mul_wnaf Context
tex) SigType
Unrestricted HashFlag
Hash
_sign_ecdsa_no_hash
:: Integer
-> BS.ByteString
-> ECDSA
_sign_ecdsa_no_hash :: Integer -> ByteString -> ECDSA
_sign_ecdsa_no_hash = (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa (Projective -> Integer -> Projective
mul Projective
_CURVE_G) SigType
LowS HashFlag
NoHash
_sign_ecdsa_no_hash'
:: Context
-> Integer
-> BS.ByteString
-> ECDSA
_sign_ecdsa_no_hash' :: Context -> Integer -> ByteString -> ECDSA
_sign_ecdsa_no_hash' Context
tex = (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa (Context -> Integer -> Projective
mul_wnaf Context
tex) SigType
LowS HashFlag
NoHash
_sign_ecdsa
:: (Integer -> Projective)
-> SigType
-> HashFlag
-> Integer
-> BS.ByteString
-> ECDSA
_sign_ecdsa :: (Integer -> Projective)
-> SigType -> HashFlag -> Integer -> ByteString -> ECDSA
_sign_ecdsa Integer -> Projective
_mul SigType
ty HashFlag
hf Integer
_SECRET ByteString
m
| Bool -> Bool
not (Integer -> Bool
ge Integer
_SECRET) = [Char] -> ECDSA
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (sign_ecdsa): invalid secret key"
| Bool
otherwise = (forall s. ST s ECDSA) -> ECDSA
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s ECDSA) -> ECDSA)
-> (forall s. ST s ECDSA) -> ECDSA
forall a b. (a -> b) -> a -> b
$ do
let entropy :: ByteString
entropy = Integer -> ByteString
int2octets Integer
_SECRET
nonce :: ByteString
nonce = ByteString -> ByteString
bits2octets ByteString
h
DRBG s
drbg <- (ByteString -> ByteString -> ByteString)
-> ByteString
-> ByteString
-> ByteString
-> ST s (DRBG (PrimState (ST s)))
forall (m :: * -> *).
PrimMonad m =>
(ByteString -> ByteString -> ByteString)
-> ByteString -> ByteString -> ByteString -> m (DRBG (PrimState m))
DRBG.new ByteString -> ByteString -> ByteString
SHA256.hmac ByteString
entropy ByteString
nonce ByteString
forall a. Monoid a => a
mempty
DRBG s -> ST s ECDSA
forall {s}. DRBG s -> ST s ECDSA
sign_loop DRBG s
drbg
where
h :: ByteString
h = case HashFlag
hf of
HashFlag
Hash -> ByteString -> ByteString
SHA256.hash ByteString
m
HashFlag
NoHash -> ByteString
m
h_modQ :: Integer
h_modQ = Integer -> Integer
remQ (ByteString -> Integer
bits2int ByteString
h)
sign_loop :: DRBG s -> ST s ECDSA
sign_loop DRBG s
g = do
Integer
k <- DRBG s -> ST s Integer
forall s. DRBG s -> ST s Integer
gen_k DRBG s
g
let kg :: Projective
kg = Integer -> Projective
_mul Integer
k
Affine (Integer -> Integer
modQ -> Integer
r) Integer
_ = Projective -> Affine
affine Projective
kg
s :: Integer
s = case Integer -> Natural -> Maybe Integer
modinv Integer
k (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
_CURVE_Q) of
Maybe Integer
Nothing -> [Char] -> Integer
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (sign_ecdsa): bad k value"
Just Integer
kinv -> Integer -> Integer
remQ (Integer -> Integer
remQ (Integer
h_modQ Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer -> Integer
remQ (Integer
_SECRET Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
r)) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
kinv)
if Integer
r Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0
then DRBG s -> ST s ECDSA
sign_loop DRBG s
g
else let !sig :: ECDSA
sig = Integer -> Integer -> ECDSA
ECDSA Integer
r Integer
s
in case SigType
ty of
SigType
Unrestricted -> ECDSA -> ST s ECDSA
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ECDSA
sig
SigType
LowS -> ECDSA -> ST s ECDSA
forall a. a -> ST s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ECDSA -> ECDSA
low ECDSA
sig)
{-# INLINE _sign_ecdsa #-}
gen_k :: DRBG.DRBG s -> ST s Integer
gen_k :: forall s. DRBG s -> ST s Integer
gen_k DRBG s
g = DRBG (PrimState (ST s)) -> ST s Integer
forall {m :: * -> *}.
PrimMonad m =>
DRBG (PrimState m) -> m Integer
loop DRBG s
DRBG (PrimState (ST s))
g where
loop :: DRBG (PrimState m) -> m Integer
loop DRBG (PrimState m)
drbg = do
ByteString
bytes <- ByteString -> Word64 -> DRBG (PrimState m) -> m ByteString
forall (m :: * -> *).
PrimMonad m =>
ByteString -> Word64 -> DRBG (PrimState m) -> m ByteString
DRBG.gen ByteString
forall a. Monoid a => a
mempty (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fi Int
_CURVE_Q_BYTES) DRBG (PrimState m)
drbg
let can :: Integer
can = ByteString -> Integer
bits2int ByteString
bytes
if Integer
can Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
_CURVE_Q
then DRBG (PrimState m) -> m Integer
loop DRBG (PrimState m)
drbg
else Integer -> m Integer
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
can
{-# INLINE gen_k #-}
low :: ECDSA -> ECDSA
low :: ECDSA -> ECDSA
low (ECDSA Integer
r Integer
s) = Integer -> Integer -> ECDSA
ECDSA Integer
r Integer
ms where
ms :: Integer
ms
| Integer
s Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
B.unsafeShiftR Integer
_CURVE_Q Int
1 = Integer -> Integer
modQ (Integer -> Integer
forall a. Num a => a -> a
negate Integer
s)
| Bool
otherwise = Integer
s
{-# INLINE low #-}
verify_ecdsa
:: BS.ByteString
-> Pub
-> ECDSA
-> Bool
verify_ecdsa :: ByteString -> Projective -> ECDSA -> Bool
verify_ecdsa ByteString
m Projective
p sig :: ECDSA
sig@(ECDSA Integer
_ Integer
s)
| Integer
s Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
B.unsafeShiftR Integer
_CURVE_Q Int
1 = Bool
False
| Bool
otherwise = ByteString -> Projective -> ECDSA -> Bool
verify_ecdsa_unrestricted ByteString
m Projective
p ECDSA
sig
verify_ecdsa'
:: Context
-> BS.ByteString
-> Pub
-> ECDSA
-> Bool
verify_ecdsa' :: Context -> ByteString -> Projective -> ECDSA -> Bool
verify_ecdsa' Context
tex ByteString
m Projective
p sig :: ECDSA
sig@(ECDSA Integer
_ Integer
s)
| Integer
s Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
B.unsafeShiftR Integer
_CURVE_Q Int
1 = Bool
False
| Bool
otherwise = Context -> ByteString -> Projective -> ECDSA -> Bool
verify_ecdsa_unrestricted' Context
tex ByteString
m Projective
p ECDSA
sig
verify_ecdsa_unrestricted
:: BS.ByteString
-> Pub
-> ECDSA
-> Bool
verify_ecdsa_unrestricted :: ByteString -> Projective -> ECDSA -> Bool
verify_ecdsa_unrestricted = (Integer -> Projective)
-> ByteString -> Projective -> ECDSA -> Bool
_verify_ecdsa_unrestricted (Projective -> Integer -> Projective
mul_unsafe Projective
_CURVE_G)
verify_ecdsa_unrestricted'
:: Context
-> BS.ByteString
-> Pub
-> ECDSA
-> Bool
verify_ecdsa_unrestricted' :: Context -> ByteString -> Projective -> ECDSA -> Bool
verify_ecdsa_unrestricted' Context
tex = (Integer -> Projective)
-> ByteString -> Projective -> ECDSA -> Bool
_verify_ecdsa_unrestricted (Context -> Integer -> Projective
mul_wnaf Context
tex)
_verify_ecdsa_unrestricted
:: (Integer -> Projective)
-> BS.ByteString
-> Pub
-> ECDSA
-> Bool
_verify_ecdsa_unrestricted :: (Integer -> Projective)
-> ByteString -> Projective -> ECDSA -> Bool
_verify_ecdsa_unrestricted Integer -> Projective
_mul (ByteString -> ByteString
SHA256.hash -> ByteString
h) Projective
p (ECDSA Integer
r Integer
s)
| Bool -> Bool
not (Integer -> Bool
ge Integer
r) Bool -> Bool -> Bool
|| Bool -> Bool
not (Integer -> Bool
ge Integer
s) = Bool
False
| Bool
otherwise =
let e :: Integer
e = Integer -> Integer
remQ (ByteString -> Integer
bits2int ByteString
h)
s_inv :: Integer
s_inv = case Integer -> Natural -> Maybe Integer
modinv Integer
s (Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fi Integer
_CURVE_Q) of
Maybe Integer
Nothing ->
[Char] -> Integer
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (verify_ecdsa_unrestricted): no inverse"
Just Integer
si -> Integer
si
u1 :: Integer
u1 = Integer -> Integer
remQ (Integer
e Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
s_inv)
u2 :: Integer
u2 = Integer -> Integer
remQ (Integer
r Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
s_inv)
capR :: Projective
capR = Projective -> Projective -> Projective
add (Integer -> Projective
_mul Integer
u1) (Projective -> Integer -> Projective
mul_unsafe Projective
p Integer
u2)
in if Projective
capR Projective -> Projective -> Bool
forall a. Eq a => a -> a -> Bool
== Projective
_CURVE_ZERO
then Bool
False
else let Affine (Integer -> Integer
modQ -> Integer
v) Integer
_ = Projective -> Affine
affine Projective
capR
in Integer
v Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
r
{-# INLINE _verify_ecdsa_unrestricted #-}
ecdh
:: Projective
-> Integer
-> BS.ByteString
ecdh :: Projective -> Integer -> ByteString
ecdh Projective
pub Integer
_SECRET
| Bool -> Bool
not (Integer -> Bool
ge Integer
_SECRET) = [Char] -> ByteString
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (ecdh): invalid secret key"
| Bool
otherwise =
let pt :: Projective
pt = Projective -> Integer -> Projective
mul Projective
pub Integer
_SECRET
in if Projective
pt Projective -> Projective -> Bool
forall a. Eq a => a -> a -> Bool
== Projective
_CURVE_ZERO
then [Char] -> ByteString
forall a. HasCallStack => [Char] -> a
error [Char]
"ppad-secp256k1 (ecdh): invalid public key"
else let Affine Integer
x Integer
_ = Projective -> Affine
affine Projective
pt
in ByteString -> ByteString
SHA256.hash (Integer -> ByteString
unroll32 Integer
x)