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
85
86
87
88
89
90
91
92
93
use std::sync::Arc;
use tink_core::{utils::wrap_err, TinkError};
pub fn new_signer(h: &tink_core::keyset::Handle) -> Result<Box<dyn tink_core::Signer>, TinkError> {
new_signer_with_key_manager(h, None)
}
fn new_signer_with_key_manager(
h: &tink_core::keyset::Handle,
km: Option<Arc<dyn tink_core::registry::KeyManager>>,
) -> Result<Box<dyn tink_core::Signer>, TinkError> {
let ps = h
.primitives_with_key_manager(km)
.map_err(|e| wrap_err("signer::factory: cannot obtain primitive set", e))?;
let ret = WrappedSigner::new(ps)?;
Ok(Box::new(ret))
}
#[derive(Clone)]
struct WrappedSigner {
ps: tink_core::primitiveset::TypedPrimitiveSet<Box<dyn tink_core::Signer>>,
}
impl WrappedSigner {
fn new(ps: tink_core::primitiveset::PrimitiveSet) -> Result<WrappedSigner, TinkError> {
let primary = match &ps.primary {
None => return Err("signer::factory: no primary primitive".into()),
Some(p) => p,
};
match primary.primitive {
tink_core::Primitive::Signer(_) => {}
_ => return Err("signer::factory: not a Signer primitive".into()),
};
for (_, primitives) in ps.entries.iter() {
for p in primitives {
match p.primitive {
tink_core::Primitive::Signer(_) => {}
_ => return Err("signer::factory: not a Signer primitive".into()),
};
}
}
Ok(WrappedSigner { ps: ps.into() })
}
}
impl tink_core::Signer for WrappedSigner {
fn sign(&self, data: &[u8]) -> Result<Vec<u8>, TinkError> {
let primary = match &self.ps.primary {
Some(p) => p,
None => return Err("signer::factory: no primary primitive".into()),
};
let signature = if primary.prefix_type == tink_proto::OutputPrefixType::Legacy {
let mut signed_data_copy = Vec::with_capacity(data.len() + 1);
signed_data_copy.extend_from_slice(data);
signed_data_copy.push(tink_core::cryptofmt::LEGACY_START_BYTE);
primary.primitive.sign(&signed_data_copy)?
} else {
primary.primitive.sign(data)?
};
let mut ret = Vec::with_capacity(primary.prefix.len() + signature.len());
ret.extend_from_slice(&primary.prefix);
ret.extend_from_slice(&signature);
Ok(ret)
}
}