Move signing implementation into Signer trait
This commit is contained in:
parent
df80c1621d
commit
963ca96aa2
22
src/lib.rs
22
src/lib.rs
|
@ -309,6 +309,8 @@ impl AccountInner {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Signer for AccountInner {
|
impl Signer for AccountInner {
|
||||||
|
type Signature = <Key as Signer>::Signature;
|
||||||
|
|
||||||
fn header<'n, 'u: 'n, 's: 'u>(&'s self, nonce: &'n str, url: &'u str) -> Header<'n> {
|
fn header<'n, 'u: 'n, 's: 'u>(&'s self, nonce: &'n str, url: &'u str) -> Header<'n> {
|
||||||
Header {
|
Header {
|
||||||
alg: self.key.signing_algorithm,
|
alg: self.key.signing_algorithm,
|
||||||
|
@ -318,6 +320,10 @@ impl Signer for AccountInner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sign(&self, payload: &[u8]) -> Result<Self::Signature, Error> {
|
||||||
|
self.key.sign(payload)
|
||||||
|
}
|
||||||
|
|
||||||
fn key(&self) -> &Key {
|
fn key(&self) -> &Key {
|
||||||
&self.key
|
&self.key
|
||||||
}
|
}
|
||||||
|
@ -359,7 +365,9 @@ impl Client {
|
||||||
};
|
};
|
||||||
|
|
||||||
let nonce = nonce.ok_or("no nonce found")?;
|
let nonce = nonce.ok_or("no nonce found")?;
|
||||||
let body = signer.key().signed_json(payload, signer.header(&nonce, url))?;
|
let body = signer
|
||||||
|
.key()
|
||||||
|
.signed_json(payload, signer.header(&nonce, url))?;
|
||||||
let request = Request::builder()
|
let request = Request::builder()
|
||||||
.method(Method::POST)
|
.method(Method::POST)
|
||||||
.uri(url)
|
.uri(url)
|
||||||
|
@ -420,7 +428,7 @@ impl Key {
|
||||||
};
|
};
|
||||||
|
|
||||||
let combined = format!("{protected}.{payload}");
|
let combined = format!("{protected}.{payload}");
|
||||||
let signature = self.inner.sign(&self.rng, combined.as_bytes())?;
|
let signature = self.sign(combined.as_bytes())?;
|
||||||
Ok(Body::from(serde_json::to_vec(&JoseJson {
|
Ok(Body::from(serde_json::to_vec(&JoseJson {
|
||||||
protected,
|
protected,
|
||||||
payload,
|
payload,
|
||||||
|
@ -430,6 +438,8 @@ impl Key {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Signer for Key {
|
impl Signer for Key {
|
||||||
|
type Signature = ring::signature::Signature;
|
||||||
|
|
||||||
fn header<'n, 'u: 'n, 's: 'u>(&'s self, nonce: &'n str, url: &'u str) -> Header<'n> {
|
fn header<'n, 'u: 'n, 's: 'u>(&'s self, nonce: &'n str, url: &'u str) -> Header<'n> {
|
||||||
Header {
|
Header {
|
||||||
alg: self.signing_algorithm,
|
alg: self.signing_algorithm,
|
||||||
|
@ -439,14 +449,22 @@ impl Signer for Key {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sign(&self, payload: &[u8]) -> Result<Self::Signature, Error> {
|
||||||
|
Ok(self.inner.sign(&self.rng, payload)?)
|
||||||
|
}
|
||||||
|
|
||||||
fn key(&self) -> &Key {
|
fn key(&self) -> &Key {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trait Signer {
|
trait Signer {
|
||||||
|
type Signature: AsRef<[u8]>;
|
||||||
|
|
||||||
fn header<'n, 'u: 'n, 's: 'u>(&'s self, nonce: &'n str, url: &'u str) -> Header<'n>;
|
fn header<'n, 'u: 'n, 's: 'u>(&'s self, nonce: &'n str, url: &'u str) -> Header<'n>;
|
||||||
|
|
||||||
|
fn sign(&self, payload: &[u8]) -> Result<Self::Signature, Error>;
|
||||||
|
|
||||||
fn key(&self) -> &Key;
|
fn key(&self) -> &Key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue