RSA signature verification.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
use rsa::*;
|
use rsa::*;
|
||||||
use testing::{make_unsigned,run_test};
|
use testing::run_test;
|
||||||
|
|
||||||
fn get_signing_hash(s: usize) -> &'static SigningHash {
|
fn get_signing_hash(s: usize) -> &'static SigningHash {
|
||||||
match s {
|
match s {
|
||||||
@@ -13,17 +13,17 @@ fn get_signing_hash(s: usize) -> &'static SigningHash {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rsa_signature_tests()
|
fn rsa_signing_tests()
|
||||||
{
|
{
|
||||||
run_test("tests/rsa/signature.test", 7, |case| {
|
run_test("tests/rsa/signature.test", 7, |case| {
|
||||||
let (neg0, dbytes) = case.get("d").unwrap();
|
let (neg0, dbytes) = case.get("d").unwrap();
|
||||||
let (neg1, nbytes) = case.get("n").unwrap();
|
let (neg1, nbytes) = case.get("n").unwrap();
|
||||||
let (neg2, hbytes) = case.get("h").unwrap();
|
let (neg2, hbytes) = case.get("h").unwrap();
|
||||||
let (neg2, kbytes) = case.get("k").unwrap();
|
let (neg3, kbytes) = case.get("k").unwrap();
|
||||||
let (neg3, msg) = case.get("m").unwrap();
|
let (neg4, msg) = case.get("m").unwrap();
|
||||||
let (neg4, sig) = case.get("s").unwrap();
|
let (neg5, sig) = case.get("s").unwrap();
|
||||||
|
|
||||||
assert!(!neg0 & !neg1 & !neg2 & !neg3 & !neg4);
|
assert!(!neg0 & !neg1 & !neg2 & !neg3 & !neg4 & !neg5);
|
||||||
let hash = get_signing_hash(usize::from(UCN::from_bytes(hbytes)));
|
let hash = get_signing_hash(usize::from(UCN::from_bytes(hbytes)));
|
||||||
let size = usize::from(UCN::from_bytes(kbytes));
|
let size = usize::from(UCN::from_bytes(kbytes));
|
||||||
let key = RSAPrivate::new(UCN::from_bytes(nbytes),
|
let key = RSAPrivate::new(UCN::from_bytes(nbytes),
|
||||||
@@ -35,3 +35,24 @@ fn rsa_signature_tests()
|
|||||||
assert_eq!(*sig, sig2);
|
assert_eq!(*sig, sig2);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rsa_verification_tests()
|
||||||
|
{
|
||||||
|
run_test("tests/rsa/signature.test", 7, |case| {
|
||||||
|
let (neg1, nbytes) = case.get("n").unwrap();
|
||||||
|
let (neg2, hbytes) = case.get("h").unwrap();
|
||||||
|
let (neg3, kbytes) = case.get("k").unwrap();
|
||||||
|
let (neg4, msg) = case.get("m").unwrap();
|
||||||
|
let (neg5, sig) = case.get("s").unwrap();
|
||||||
|
|
||||||
|
assert!(!neg1 & !neg2 & !neg3 & !neg4 & !neg5);
|
||||||
|
let hash = get_signing_hash(usize::from(UCN::from_bytes(hbytes)));
|
||||||
|
let size = usize::from(UCN::from_bytes(kbytes));
|
||||||
|
let key = RSAPublic::new(UCN::from_bytes(nbytes),
|
||||||
|
UCN::from(65537u64));
|
||||||
|
|
||||||
|
assert_eq!(key.byte_len * 8, size);
|
||||||
|
assert!(key.verify(hash, &msg, sig));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use cryptonum::{BarrettUCN,UCN};
|
use cryptonum::{BarrettUCN,UCN};
|
||||||
use rsa::core::ACCEPTABLE_KEY_SIZES;
|
use rsa::core::{ACCEPTABLE_KEY_SIZES,pkcs1_pad,vp1};
|
||||||
|
use rsa::signing_hashes::SigningHash;
|
||||||
|
|
||||||
#[derive(Clone,Debug,PartialEq,Eq)]
|
#[derive(Clone,Debug,PartialEq,Eq)]
|
||||||
pub struct RSAPublic {
|
pub struct RSAPublic {
|
||||||
@@ -16,7 +17,7 @@ impl RSAPublic {
|
|||||||
let len = n.bits();
|
let len = n.bits();
|
||||||
|
|
||||||
for &(valid_bits, _) in ACCEPTABLE_KEY_SIZES.iter() {
|
for &(valid_bits, _) in ACCEPTABLE_KEY_SIZES.iter() {
|
||||||
if valid_bits > len {
|
if valid_bits >= len {
|
||||||
return RSAPublic{
|
return RSAPublic{
|
||||||
byte_len: valid_bits / 8,
|
byte_len: valid_bits / 8,
|
||||||
n: n.clone(),
|
n: n.clone(),
|
||||||
@@ -27,4 +28,15 @@ impl RSAPublic {
|
|||||||
}
|
}
|
||||||
panic!("Invalid RSA key size in new()")
|
panic!("Invalid RSA key size in new()")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Verify the signature for a given message, using the given signing hash,
|
||||||
|
/// returning true iff the signature validates.
|
||||||
|
pub fn verify(&self, shash: &SigningHash, msg: &[u8], sig: &[u8]) -> bool {
|
||||||
|
let hash = (shash.run)(msg);
|
||||||
|
let s = UCN::from_bytes(&sig);
|
||||||
|
let m = vp1(&self.nu, &self.e, &s);
|
||||||
|
let em = m.to_bytes(self.byte_len);
|
||||||
|
let em_ = pkcs1_pad(&shash.ident, &hash, self.byte_len);
|
||||||
|
(em == em_)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user