Skip to content

Commit 84d8f57

Browse files
authored
Test signatures generated with ssh-key (#213)
1 parent 5a62f0b commit 84d8f57

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ walkdir = "2.5.0"
4242

4343
[dev-dependencies]
4444
pretty_assertions = "1.4.1"
45-
ssh-key = "0.6.0"
45+
ssh-key = { version = "0.6.0", features = ["ed25519"] }
4646
tempfile = "3.24.0"
4747

4848
[dev-dependencies.sequoia-openpgp]

src/pgp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ fn gpg_v4_signatures_can_be_verified() {
102102
}
103103

104104
#[test]
105-
fn pgp_v4_signatures_can_be_verified() {
105+
fn pgp_v4_signatures_can_be_generated_and_verified() {
106106
// create message
107107
let message = {
108108
let manifest = Manifest {

src/ssh.rs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::*;
22

33
#[test]
4-
fn ssh_signatures_can_be_verified() {
4+
fn ssh_keygen_signatures_can_be_verified() {
55
let message_bytes = include_bytes!("../static/ssh-test/message");
66
let signature_str = include_str!("../static/ssh-test/message.sig");
77
let public_key_str = include_str!("../static/ssh-test/id_ed25519.pub");
@@ -49,3 +49,48 @@ fn ssh_signatures_can_be_verified() {
4949
eprintln!("SSH_PUBLIC_KEY: {public_key}");
5050
eprintln!("SSH_SIGNATURE: {signature}");
5151
}
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

Comments
 (0)