|
24 | 24 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25 | 25 | // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26 | 26 |
|
| 27 | +use std::borrow::Cow; |
27 | 28 | use std::iter;
|
28 | 29 |
|
29 |
| -use crate::keytypes::User; |
| 30 | +use crate::keytype::KeyPayload; |
| 31 | +use crate::keytypes::encrypted::{Format, MasterKeyType, Payload}; |
| 32 | +use crate::keytypes::{Encrypted, User}; |
30 | 33 | use crate::{Keyring, KeyringSerial, SpecialKeyring};
|
31 | 34 |
|
32 | 35 | use super::utils::kernel::*;
|
@@ -129,3 +132,103 @@ fn add_key_to_session() {
|
129 | 132 | assert_eq!(new_payload, new_expected);
|
130 | 133 | keyring.unlink_key(&key).unwrap();
|
131 | 134 | }
|
| 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