|
1 | 1 | use super::*; |
2 | 2 |
|
3 | 3 | #[test] |
4 | | -fn ssh_signatures_can_be_verified() { |
| 4 | +fn ssh_keygen_signatures_can_be_verified() { |
5 | 5 | let message_bytes = include_bytes!("../static/ssh-test/message"); |
6 | 6 | let signature_str = include_str!("../static/ssh-test/message.sig"); |
7 | 7 | let public_key_str = include_str!("../static/ssh-test/id_ed25519.pub"); |
@@ -49,3 +49,48 @@ fn ssh_signatures_can_be_verified() { |
49 | 49 | eprintln!("SSH_PUBLIC_KEY: {public_key}"); |
50 | 50 | eprintln!("SSH_SIGNATURE: {signature}"); |
51 | 51 | } |
| 52 | + |
| 53 | +#[test] |
| 54 | +fn ssh_signatures_can_be_generated_and_verified() { |
| 55 | + use { |
| 56 | + rand::rngs::OsRng, |
| 57 | + ssh_key::{Algorithm, HashAlg}, |
| 58 | + }; |
| 59 | + |
| 60 | + let message = { |
| 61 | + let manifest = Manifest { |
| 62 | + files: Directory::new(), |
| 63 | + notes: Vec::new(), |
| 64 | + }; |
| 65 | + |
| 66 | + Message { |
| 67 | + fingerprint: manifest.fingerprint(), |
| 68 | + time: None, |
| 69 | + } |
| 70 | + .serialize() |
| 71 | + }; |
| 72 | + |
| 73 | + let private_key = ssh_key::PrivateKey::random(&mut OsRng, Algorithm::Ed25519).unwrap(); |
| 74 | + |
| 75 | + let ssh_sig = private_key |
| 76 | + .sign("filepack", HashAlg::Sha512, message.as_bytes()) |
| 77 | + .unwrap(); |
| 78 | + |
| 79 | + let signature = { |
| 80 | + let sig_bytes: [u8; 64] = ssh_sig.signature_bytes().try_into().unwrap(); |
| 81 | + Signature::new( |
| 82 | + SignatureScheme::Ssh, |
| 83 | + ed25519_dalek::Signature::from_bytes(&sig_bytes), |
| 84 | + ) |
| 85 | + }; |
| 86 | + |
| 87 | + let public_key = { |
| 88 | + let ssh_key::public::KeyData::Ed25519(ed25519_key) = private_key.public_key().key_data() else { |
| 89 | + panic!("expected ed25519"); |
| 90 | + }; |
| 91 | + |
| 92 | + PublicKey::from_bytes(ed25519_key.0) |
| 93 | + }; |
| 94 | + |
| 95 | + signature.verify(&message, public_key).unwrap(); |
| 96 | +} |
0 commit comments