Skip to content

Commit 9385117

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

File tree

1 file changed

+104
-1
lines changed

1 file changed

+104
-1
lines changed

src/tests/add.rs

+104-1
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@
2424
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2525
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626

27+
use std::borrow::Cow;
2728
use std::iter;
2829

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

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

0 commit comments

Comments
 (0)