aboutsummaryrefslogtreecommitdiffstats
path: root/license-generator/paddle/src/lib.rs
diff options
context:
space:
mode:
authorTeddy Wing2018-11-10 20:39:48 +0100
committerTeddy Wing2018-11-10 20:39:48 +0100
commit20f7a268cce05cd63842adbc7a5d05d4d4cc5bc7 (patch)
tree4b7f5318f7ca07ab6087295510776c02a684a28c /license-generator/paddle/src/lib.rs
parentd2587251a9b1b1d4d8f887fe079a3e0bbc017de8 (diff)
downloaddome-key-web-20f7a268cce05cd63842adbc7a5d05d4d4cc5bc7.tar.bz2
paddle::verify_signature(): Extract signature from params
Make it easier on users by not requiring them to pass a signature into the method. This means they don't have to extract the `p_signature` param and base64 decode it themselves. Essentially, we want to move the code from `request` that removes the `p_signature` key and base64 decodes it into the `paddle::verify_signature()` function. We need to make the string-like type params in `verify_signature()` conform additionally to `PartialEq<str>` and `PartialOrd`. Doing so allows us to find the key "p_signature". To remove the `p_signature` param from the iterator, we partition it into two iterators: one for the `p_signature` entry, and another for the rest. We then extract the value of `p_signature` and base64 decode it for verification. Add a new error type in case no `p_signature` entry is found in the iterator.
Diffstat (limited to 'license-generator/paddle/src/lib.rs')
-rw-r--r--license-generator/paddle/src/lib.rs24
1 files changed, 21 insertions, 3 deletions
diff --git a/license-generator/paddle/src/lib.rs b/license-generator/paddle/src/lib.rs
index be10a76..6d685cd 100644
--- a/license-generator/paddle/src/lib.rs
+++ b/license-generator/paddle/src/lib.rs
@@ -1,14 +1,24 @@
+extern crate base64;
+
#[macro_use]
extern crate error_chain;
extern crate openssl;
pub mod errors {
+ use base64;
use openssl;
error_chain! {
foreign_links {
+ Base64(base64::DecodeError);
Openssl(openssl::error::ErrorStack);
}
+
+ errors {
+ SignatureNotFound {
+ display("no signature could be found in params")
+ }
+ }
}
}
@@ -26,21 +36,29 @@ use errors::*;
// https://paddle.com/docs/reference-verifying-webhooks/
pub fn verify_signature<'a, S, I>(
pem: &[u8],
- signature: &[u8],
params: I,
) -> Result<bool>
where
- S: AsRef<str> + Deref<Target = str> + Display,
+ S: AsRef<str> + Deref<Target = str> + PartialEq<str> + PartialOrd + Display,
I: IntoIterator<Item = (S, S)> + PartialOrd,
{
let rsa = Rsa::public_key_from_pem(pem)?;
let pkey = PKey::from_rsa(rsa)?;
let mut verifier = Verifier::new(MessageDigest::sha1(), &pkey)?;
+ let (signature_params, params): (Vec<_>, Vec<_>) = params
+ .into_iter()
+ .partition(|(k, _v)| k == "p_signature");
+ let signature = &signature_params
+ .first()
+ .ok_or(ErrorKind::SignatureNotFound)?
+ .1;
+ let signature = base64::decode(signature.as_bytes())?;
+
let digest = php_serialize(params);
verifier.update(digest.as_bytes())?;
- Ok(verifier.verify(signature)?)
+ Ok(verifier.verify(&signature)?)
}
fn php_serialize<'a, S, I>(pairs: I) -> String