Time-constant P256.scalarAdd and P256.scalarSub
This commit is contained in:
parent
f4be05eb2e
commit
3253501166
@ -222,34 +222,21 @@ scalarIsZero s = unsafeDoIO $ withScalar s $ \d -> do
|
|||||||
result <- ccryptonite_p256_is_zero d
|
result <- ccryptonite_p256_is_zero d
|
||||||
return $ result /= 0
|
return $ result /= 0
|
||||||
|
|
||||||
scalarNeedReducing :: Ptr P256Scalar -> IO Bool
|
|
||||||
scalarNeedReducing d = do
|
|
||||||
c <- ccryptonite_p256_cmp d ccryptonite_SECP256r1_n
|
|
||||||
return (c >= 0)
|
|
||||||
|
|
||||||
-- | Perform addition between two scalars
|
-- | Perform addition between two scalars
|
||||||
--
|
--
|
||||||
-- > a + b
|
-- > a + b
|
||||||
scalarAdd :: Scalar -> Scalar -> Scalar
|
scalarAdd :: Scalar -> Scalar -> Scalar
|
||||||
scalarAdd a b =
|
scalarAdd a b =
|
||||||
withNewScalarFreeze $ \d -> withScalar a $ \pa -> withScalar b $ \pb -> do
|
withNewScalarFreeze $ \d -> withScalar a $ \pa -> withScalar b $ \pb ->
|
||||||
carry <- ccryptonite_p256_add pa pb d
|
ccryptonite_p256e_modadd ccryptonite_SECP256r1_n pa pb d
|
||||||
when (carry /= 0) $ void $ ccryptonite_p256_sub d ccryptonite_SECP256r1_n d
|
|
||||||
needReducing <- scalarNeedReducing d
|
|
||||||
when needReducing $ do
|
|
||||||
ccryptonite_p256_mod ccryptonite_SECP256r1_n d d
|
|
||||||
|
|
||||||
-- | Perform subtraction between two scalars
|
-- | Perform subtraction between two scalars
|
||||||
--
|
--
|
||||||
-- > a - b
|
-- > a - b
|
||||||
scalarSub :: Scalar -> Scalar -> Scalar
|
scalarSub :: Scalar -> Scalar -> Scalar
|
||||||
scalarSub a b =
|
scalarSub a b =
|
||||||
withNewScalarFreeze $ \d -> withScalar a $ \pa -> withScalar b $ \pb -> do
|
withNewScalarFreeze $ \d -> withScalar a $ \pa -> withScalar b $ \pb ->
|
||||||
borrow <- ccryptonite_p256_sub pa pb d
|
ccryptonite_p256e_modsub ccryptonite_SECP256r1_n pa pb d
|
||||||
when (borrow /= 0) $ void $ ccryptonite_p256_add d ccryptonite_SECP256r1_n d
|
|
||||||
--needReducing <- scalarNeedReducing d
|
|
||||||
--when needReducing $ do
|
|
||||||
-- ccryptonite_p256_mod ccryptonite_SECP256r1_n d d
|
|
||||||
|
|
||||||
-- | Give the inverse of the scalar
|
-- | Give the inverse of the scalar
|
||||||
--
|
--
|
||||||
@ -352,12 +339,12 @@ foreign import ccall "cryptonite_p256_is_zero"
|
|||||||
ccryptonite_p256_is_zero :: Ptr P256Scalar -> IO CInt
|
ccryptonite_p256_is_zero :: Ptr P256Scalar -> IO CInt
|
||||||
foreign import ccall "cryptonite_p256_clear"
|
foreign import ccall "cryptonite_p256_clear"
|
||||||
ccryptonite_p256_clear :: Ptr P256Scalar -> IO ()
|
ccryptonite_p256_clear :: Ptr P256Scalar -> IO ()
|
||||||
foreign import ccall "cryptonite_p256_add"
|
foreign import ccall "cryptonite_p256e_modadd"
|
||||||
ccryptonite_p256_add :: Ptr P256Scalar -> Ptr P256Scalar -> Ptr P256Scalar -> IO CInt
|
ccryptonite_p256e_modadd :: Ptr P256Scalar -> Ptr P256Scalar -> Ptr P256Scalar -> Ptr P256Scalar -> IO ()
|
||||||
foreign import ccall "cryptonite_p256_add_d"
|
foreign import ccall "cryptonite_p256_add_d"
|
||||||
ccryptonite_p256_add_d :: Ptr P256Scalar -> P256Digit -> Ptr P256Scalar -> IO CInt
|
ccryptonite_p256_add_d :: Ptr P256Scalar -> P256Digit -> Ptr P256Scalar -> IO CInt
|
||||||
foreign import ccall "cryptonite_p256_sub"
|
foreign import ccall "cryptonite_p256e_modsub"
|
||||||
ccryptonite_p256_sub :: Ptr P256Scalar -> Ptr P256Scalar -> Ptr P256Scalar -> IO CInt
|
ccryptonite_p256e_modsub :: Ptr P256Scalar -> Ptr P256Scalar -> Ptr P256Scalar -> Ptr P256Scalar -> IO ()
|
||||||
foreign import ccall "cryptonite_p256_cmp"
|
foreign import ccall "cryptonite_p256_cmp"
|
||||||
ccryptonite_p256_cmp :: Ptr P256Scalar -> Ptr P256Scalar -> IO CInt
|
ccryptonite_p256_cmp :: Ptr P256Scalar -> Ptr P256Scalar -> IO CInt
|
||||||
foreign import ccall "cryptonite_p256_mod"
|
foreign import ccall "cryptonite_p256_mod"
|
||||||
|
|||||||
@ -386,3 +386,23 @@ void cryptonite_p256_to_bin(const cryptonite_p256_int* src, uint8_t dst[P256_NBY
|
|||||||
p += 4;
|
p += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
"p256e" functions are not part of the original source
|
||||||
|
*/
|
||||||
|
|
||||||
|
// c = a + b mod MOD
|
||||||
|
void cryptonite_p256e_modadd(const cryptonite_p256_int* MOD, const cryptonite_p256_int* a, const cryptonite_p256_int* b, cryptonite_p256_int* c) {
|
||||||
|
int carry = cryptonite_p256_add(a, b, c);
|
||||||
|
|
||||||
|
// same as cryptonite_p256_mod, but with top = carry
|
||||||
|
addM(MOD, 0, P256_DIGITS(c), subM(MOD, carry, P256_DIGITS(c), -1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// c = a - b mod MOD
|
||||||
|
void cryptonite_p256e_modsub(const cryptonite_p256_int* MOD, const cryptonite_p256_int* a, const cryptonite_p256_int* b, cryptonite_p256_int* c) {
|
||||||
|
int borrow = cryptonite_p256_sub(a, b, c);
|
||||||
|
|
||||||
|
// use borrow as mask in order to make difference positive when necessary
|
||||||
|
addM(MOD, 0, P256_DIGITS(c), borrow);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user