summaryrefslogtreecommitdiffstats
path: root/vendor/signature/tests/derive.rs
blob: 70e2dc0fcd26f46d94e782f1e680ae3fb7032696 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//! Tests for code generated by `signature_derive`

#![cfg(feature = "derive")]

use digest::{generic_array::GenericArray, Digest, OutputSizeUser};
use hex_literal::hex;
use sha2::Sha256;
use signature::{
    hazmat::{PrehashSigner, PrehashVerifier},
    DigestSigner, DigestVerifier, Error, PrehashSignature, SignatureEncoding, Signer, Verifier,
};

/// Test vector to compute SHA-256 digest of
const INPUT_STRING: &[u8] = b"abc";

/// Expected SHA-256 digest for the input string
const INPUT_STRING_DIGEST: [u8; 32] =
    hex!("ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad");

type Repr = GenericArray<u8, <Sha256 as OutputSizeUser>::OutputSize>;

/// Dummy signature which just contains a digest output
#[derive(Clone, Debug)]
struct DummySignature(Repr);

impl PrehashSignature for DummySignature {
    type Digest = Sha256;
}

impl SignatureEncoding for DummySignature {
    type Repr = Repr;
}

impl TryFrom<&[u8]> for DummySignature {
    type Error = Error;

    fn try_from(bytes: &[u8]) -> Result<Self, Error> {
        Ok(DummySignature(GenericArray::clone_from_slice(
            bytes.as_ref(),
        )))
    }
}

impl From<DummySignature> for Repr {
    fn from(sig: DummySignature) -> Repr {
        sig.0
    }
}

/// Dummy signer which just returns the message digest as a `DummySignature`
#[derive(Signer, DigestSigner, Default)]
struct DummySigner {}

impl PrehashSigner<DummySignature> for DummySigner {
    fn sign_prehash(&self, prehash: &[u8]) -> signature::Result<DummySignature> {
        DummySignature::try_from(prehash)
    }
}

/// Dummy verifier which ensures the `DummySignature` digest matches the
/// expected value.
///
/// Panics (via `assert_eq!`) if the value is not what is expected.
#[derive(Verifier, DigestVerifier, Default)]
struct DummyVerifier {}

impl PrehashVerifier<DummySignature> for DummyVerifier {
    fn verify_prehash(&self, prehash: &[u8], signature: &DummySignature) -> signature::Result<()> {
        assert_eq!(signature.to_bytes().as_slice(), prehash);
        Ok(())
    }
}

#[test]
fn derived_signer_impl() {
    let sig: DummySignature = DummySigner::default().sign(INPUT_STRING);
    assert_eq!(sig.to_bytes().as_slice(), INPUT_STRING_DIGEST.as_ref())
}

#[test]
fn derived_verifier_impl() {
    let sig: DummySignature = DummySigner::default().sign(INPUT_STRING);
    assert!(DummyVerifier::default().verify(INPUT_STRING, &sig).is_ok());
}