pub(crate) fn sign<C>(
signing_key: ecdsa::SigningKey<C>,
string_to_sign: &[u8],
) -> Result<ecdsa::Signature<C>, crate::error::Error>
where
C: ecdsa::elliptic_curve::PrimeCurveArithmetic + ecdsa::hazmat::DigestPrimitive,
C::Uint: for<'a> From<&'a ecdsa::elliptic_curve::Scalar<C>>, C::Digest: ecdsa::signature::digest::Digest
+ ecdsa::signature::digest::core_api::BlockSizeUser
+ ecdsa::signature::digest::FixedOutput<
OutputSize = <C as elliptic_curve::Curve>::FieldBytesSize,
> + ecdsa::signature::digest::FixedOutputReset,
ecdsa::elliptic_curve::Scalar<C>: ecdsa::elliptic_curve::ops::Invert<
Output = ecdsa::elliptic_curve::subtle::CtOption<ecdsa::elliptic_curve::Scalar<C>>,
> + ecdsa::elliptic_curve::ops::Reduce<C::Uint>
+ ecdsa::hazmat::SignPrimitive<C>,
ecdsa::SignatureSize<C>: ecdsa::elliptic_curve::generic_array::ArrayLength<u8>,
{
use sha2::Digest as _;
let digest = sha2::Sha256::new_with_prefix(string_to_sign);
sign_inner(signing_key, digest)
}
fn sign_inner<C, D>(
signing_key: ecdsa::SigningKey<C>,
digest: D,
) -> Result<ecdsa::Signature<C>, crate::error::Error>
where
C: ecdsa::elliptic_curve::PrimeCurveArithmetic + ecdsa::hazmat::DigestPrimitive,
C::Uint: for<'a> From<&'a ecdsa::elliptic_curve::Scalar<C>>, C::Digest: ecdsa::signature::digest::Digest
+ ecdsa::signature::digest::core_api::BlockSizeUser
+ ecdsa::signature::digest::FixedOutput<
OutputSize = <C as elliptic_curve::Curve>::FieldBytesSize,
> + ecdsa::signature::digest::FixedOutputReset,
D: ecdsa::signature::digest::Digest
+ ecdsa::signature::digest::core_api::BlockSizeUser
+ ecdsa::signature::digest::FixedOutput<
OutputSize = ecdsa::elliptic_curve::generic_array::typenum::U32, > + ecdsa::signature::digest::FixedOutputReset,
ecdsa::elliptic_curve::Scalar<C>: ecdsa::elliptic_curve::ops::Invert<
Output = ecdsa::elliptic_curve::subtle::CtOption<ecdsa::elliptic_curve::Scalar<C>>,
> + ecdsa::elliptic_curve::ops::Reduce<C::Uint>
+ ecdsa::hazmat::SignPrimitive<C>,
ecdsa::SignatureSize<C>: ecdsa::elliptic_curve::generic_array::ArrayLength<u8>,
{
use ecdsa::hazmat::SignPrimitive as _;
use rand::RngCore as _;
let mut ad = ecdsa::elliptic_curve::FieldBytes::<C>::default();
rand::thread_rng().fill_bytes(&mut ad);
let secret_scalar = signing_key.as_nonzero_scalar();
let src: [u8; 32] = digest.finalize_fixed().into(); let scalar = ecdsa::hazmat::bits2field::<C>(&src)?;
Ok(secret_scalar
.try_sign_prehashed_rfc6979::<C::Digest>(&scalar, &ad)?
.0)
}