Skip to content

Commit c3282d1

Browse files
author
Dan Robertson
committed
test: add basic encrypted key management tests
1 parent a5d26a4 commit c3282d1

File tree

1 file changed

+80
-1
lines changed

1 file changed

+80
-1
lines changed

src/tests/add.rs

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626

2727
use std::iter;
28+
use std::borrow::Cow;
2829

29-
use crate::keytypes::User;
30+
use crate::keytype::KeyPayload;
31+
use crate::keytypes::{Encrypted, User};
32+
use crate::keytypes::encrypted::{Format, MasterKeyType, Payload};
3033
use crate::{Keyring, KeyringSerial, SpecialKeyring};
3134

3235
use super::utils::kernel::*;
@@ -129,3 +132,79 @@ fn add_key_to_session() {
129132
assert_eq!(new_payload, new_expected);
130133
keyring.unlink_key(&key).unwrap();
131134
}
135+
136+
#[test]
137+
fn add_encrypted_key_to_session() {
138+
let mut keyring = Keyring::attach_or_create(SpecialKeyring::Session).unwrap();
139+
let master_key = keyring.add_key::<User, _, _>("foo", "bar".as_bytes()).unwrap();
140+
let new_payload = Payload::New {
141+
format: Some(Format::default()),
142+
keytype: MasterKeyType::User,
143+
description: Cow::Borrowed("foo"),
144+
keylen: 32
145+
};
146+
147+
let mut enc_key = keyring.add_key::<Encrypted, _, _>("baz", new_payload).unwrap();
148+
149+
// A normal payload update fails
150+
assert_eq!(enc_key.update("qux".as_bytes()), Err(errno::Errno(libc::EINVAL)));
151+
152+
keyring.unlink_key(&enc_key).unwrap();
153+
keyring.unlink_key(&master_key).unwrap();
154+
}
155+
156+
#[test]
157+
#[should_panic(expected="called `Result::unwrap()` on an `Err` value: Errno { code: 22, description: Some(\"Invalid argument\") }")]
158+
fn load_encrypted_key_to_session() {
159+
let mut keyring = Keyring::attach_or_create(SpecialKeyring::Session).unwrap();
160+
let master_key = keyring.add_key::<User, _, _>("foo", "bar".as_bytes()).unwrap();
161+
let new_payload = Payload::New {
162+
format: Some(Format::default()),
163+
keytype: MasterKeyType::User,
164+
description: Cow::Borrowed("foo"),
165+
keylen: 32
166+
};
167+
let enc_key = keyring.add_key::<Encrypted, _, _>("baz", new_payload).unwrap();
168+
let buf = enc_key.read().unwrap();
169+
170+
let load_payload = Payload::Load {
171+
blob: buf.clone(),
172+
};
173+
174+
keyring.unlink_key(&enc_key).unwrap();
175+
176+
// FIXME: This should not panic but currently does due to the use of ByteBuf
177+
// when encoding the load payload.
178+
let load_key = keyring.add_key::<Encrypted, _, _>("qux", load_payload).unwrap();
179+
180+
keyring.unlink_key(&load_key).unwrap();
181+
keyring.unlink_key(&master_key).unwrap();
182+
}
183+
184+
#[test]
185+
fn update_encrypted_key_in_session() {
186+
let mut keyring = Keyring::attach_or_create(SpecialKeyring::Session).unwrap();
187+
let old_master_key = keyring.add_key::<User, _, _>("foo", "bar".as_bytes()).unwrap();
188+
let new_master_key = keyring.add_key::<User, _, _>("bar", "foo".as_bytes()).unwrap();
189+
let new_payload = Payload::New {
190+
format: Some(Format::default()),
191+
keytype: MasterKeyType::User,
192+
description: Cow::Borrowed("foo"),
193+
keylen: 32
194+
};
195+
196+
let mut enc_key = keyring.add_key::<Encrypted, _, _>("baz", new_payload).unwrap();
197+
198+
// A normal payload update fails
199+
assert_eq!(enc_key.update("qux".as_bytes()), Err(errno::Errno(libc::EINVAL)));
200+
201+
let update_payload = Payload::Update {
202+
keytype: MasterKeyType::User,
203+
description: Cow::Borrowed("bar")
204+
};
205+
enc_key.update(update_payload.payload()).unwrap();
206+
207+
keyring.unlink_key(&enc_key).unwrap();
208+
keyring.unlink_key(&old_master_key).unwrap();
209+
keyring.unlink_key(&new_master_key).unwrap();
210+
}

0 commit comments

Comments
 (0)