Skip to content

Commit 4f77858

Browse files
added a separate Key type to support usage of hardware/wrapped keys
1 parent 8471eaa commit 4f77858

14 files changed

Lines changed: 88 additions & 43 deletions

File tree

capsules/aes_gcm/src/aes_gcm.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use ghash::GHash;
1717
use ghash::Key;
1818
use kernel::hil::symmetric_encryption;
1919
use kernel::hil::symmetric_encryption::{
20-
AESCtr, AES, AES128, AES128_KEY_SIZE, AESCBC, AESCCM, AESECB, AES_BLOCK_SIZE,
20+
AESCtr, AESKey, AES, AES128, AES128_KEY_SIZE, AESCBC, AESCCM, AESECB, AES_BLOCK_SIZE,
2121
};
2222
use kernel::utilities::cells::{OptionalCell, TakeCell};
2323
use kernel::ErrorCode;
@@ -76,7 +76,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB + AESCCM<'a, AES128>> Aes
7676
fn start_ctr_encrypt(&self) -> Result<(), ErrorCode> {
7777
self.aes.set_mode_aesctr(self.encrypting.get())?;
7878

79-
let res = AES::set_key(self.aes, &self.key.get());
79+
let res = AES::set_key(self.aes, AESKey::PlainText(&self.key.get()));
8080
if res != Ok(()) {
8181
return res;
8282
}
@@ -120,7 +120,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB + AESCCM<'a, AES128>> Aes
120120
self.encrypting.set(encrypting);
121121

122122
self.aes.set_mode_aesctr(self.encrypting.get()).unwrap();
123-
AES::set_key(self.aes, &self.key.get()).unwrap();
123+
AES::set_key(self.aes, AESKey::PlainText(&self.key.get())).unwrap();
124124
self.aes.set_iv(&[0; AES_BLOCK_SIZE]).unwrap();
125125

126126
self.aes.start_message();
@@ -162,7 +162,11 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB + AESCCM<'a, AES128>>
162162
self.gcm_client.set(client);
163163
}
164164

165-
fn set_key(&self, key: &[u8]) -> Result<(), ErrorCode> {
165+
fn set_key(&self, key: AESKey) -> Result<(), ErrorCode> {
166+
let key = match key {
167+
AESKey::PlainText(key) => key,
168+
_ => return Err(ErrorCode::INVAL),
169+
};
166170
if key.len() < AES128_KEY_SIZE {
167171
Err(ErrorCode::INVAL)
168172
} else {
@@ -230,7 +234,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB + AESCCM<'a, AES128>>
230234
self.client.set(client);
231235
}
232236

233-
fn set_key(&self, key: &[u8]) -> Result<(), ErrorCode> {
237+
fn set_key(&self, key: AESKey) -> Result<(), ErrorCode> {
234238
AES::set_key(self.aes, key)
235239
}
236240

@@ -266,7 +270,7 @@ impl<
266270
self.ccm_client.set(client);
267271
}
268272

269-
fn set_key(&self, key: &[u8]) -> Result<(), ErrorCode> {
273+
fn set_key(&self, key: AESKey) -> Result<(), ErrorCode> {
270274
AESCCM::set_key(self.aes, key)
271275
}
272276

capsules/core/src/virtualizers/virtual_aes_ccm.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ use kernel::debug;
8787
use kernel::deferred_call::{DeferredCall, DeferredCallClient};
8888
use kernel::hil::symmetric_encryption;
8989
use kernel::hil::symmetric_encryption::{
90-
AESCtr, AES, AES128, AES128_KEY_SIZE, AESCBC, AESECB, AES_BLOCK_SIZE, CCM_NONCE_LENGTH,
90+
AESCtr, AESKey, AES, AES128, AES128_KEY_SIZE, AESCBC, AESECB, AES_BLOCK_SIZE, CCM_NONCE_LENGTH,
9191
};
9292
use kernel::utilities::cells::{OptionalCell, TakeCell};
9393
use kernel::ErrorCode;
@@ -409,7 +409,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB> VirtualAES128CCM<'a, A>
409409
if res != Ok(()) {
410410
return res;
411411
}
412-
let res = self.aes.set_key(&self.key.get());
412+
let res = self.aes.set_key(AESKey::PlainText(&self.key.get()));
413413
if res != Ok(()) {
414414
return res;
415415
}
@@ -457,7 +457,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB> VirtualAES128CCM<'a, A>
457457

458458
self.aes.set_mode_aesctr(self.encrypting.get())?;
459459

460-
let res = self.aes.set_key(&self.key.get());
460+
let res = self.aes.set_key(AESKey::PlainText(&self.key.get()));
461461
if res != Ok(()) {
462462
return res;
463463
}
@@ -664,7 +664,11 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB> symmetric_encryption::AE
664664
self.ccm_client.set(client);
665665
}
666666

667-
fn set_key(&self, key: &[u8]) -> Result<(), ErrorCode> {
667+
fn set_key(&self, key: AESKey) -> Result<(), ErrorCode> {
668+
let key = match key {
669+
AESKey::PlainText(key) => key,
670+
_ => return Err(ErrorCode::INVAL),
671+
};
668672
if key.len() < AES128_KEY_SIZE {
669673
Err(ErrorCode::INVAL)
670674
} else {
@@ -735,7 +739,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr + AESCBC + AESECB> symmetric_encryption::AE
735739
self.mux.client.set(client);
736740
}
737741

738-
fn set_key(&self, key: &[u8]) -> Result<(), ErrorCode> {
742+
fn set_key(&self, key: AESKey) -> Result<(), ErrorCode> {
739743
if self.mux.inflight.is_none() {
740744
self.mux.aes.set_key(key)
741745
} else {

capsules/extra/src/ieee802154/framer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ use crate::net::stream::{encode_bytes, encode_u32, encode_u8};
8787
use core::cell::Cell;
8888

8989
use kernel::hil::radio::{self, LQI_SIZE};
90-
use kernel::hil::symmetric_encryption::{CCMClient, AES128, AESCCM};
90+
use kernel::hil::symmetric_encryption::{AESKey, CCMClient, AES128, AESCCM};
9191
use kernel::processbuffer::ReadableProcessSlice;
9292
use kernel::utilities::cells::{MapCell, OptionalCell};
9393
use kernel::utilities::leasable_buffer::SubSliceMut;
@@ -547,7 +547,7 @@ impl<'a, M: Mac<'a>, A: AESCCM<'a, AES128>> Framer<'a, M, A> {
547547
(radio::PSDU_OFFSET, radio::PSDU_OFFSET + m_off);
548548

549549
// Crypto setup failed; fail sending packet and return to idle
550-
if self.aes_ccm.set_key(&key) != Ok(())
550+
if self.aes_ccm.set_key(AESKey::PlainText(&key)) != Ok(())
551551
|| self.aes_ccm.set_nonce(&nonce) != Ok(())
552552
{
553553
(TxState::Idle, Err((ErrorCode::FAIL, buf)))
@@ -614,7 +614,7 @@ impl<'a, M: Mac<'a>, A: AESCCM<'a, AES128>> Framer<'a, M, A> {
614614
let (a_off, m_off) = (radio::PSDU_OFFSET, radio::PSDU_OFFSET + m_off);
615615

616616
// Crypto setup failed; fail receiving packet and return to idle
617-
if self.aes_ccm.set_key(&key) != Ok(())
617+
if self.aes_ccm.set_key(AESKey::PlainText(&key)) != Ok(())
618618
|| self.aes_ccm.set_nonce(&nonce) != Ok(())
619619
{
620620
// No error is returned for the receive function because recv occurs implicitly

capsules/extra/src/net/thread/driver.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ use kernel::capabilities::UdpDriverCapability;
5757
use kernel::errorcode::into_statuscode;
5858
use kernel::grant::{AllowRoCount, AllowRwCount, Grant, UpcallCount};
5959
use kernel::hil::symmetric_encryption::CCMClient;
60-
use kernel::hil::symmetric_encryption::{AES128, AESCCM};
60+
use kernel::hil::symmetric_encryption::{AESKey, AES128, AESCCM};
6161
use kernel::hil::time;
6262
use kernel::processbuffer::ReadableProcessBuffer;
6363
use kernel::syscall::{CommandReturn, SyscallDriver};
@@ -350,7 +350,10 @@ impl<'a, A: time::Alarm<'a>> ThreadNetworkDriver<'a, A> {
350350
let mic_len = security.level.mic_len();
351351
match mle_key {
352352
Some(netkey) => {
353-
if self.aes_crypto.set_key(&netkey.mle_key).is_err()
353+
if self
354+
.aes_crypto
355+
.set_key(AESKey::PlainText(&netkey.mle_key))
356+
.is_err()
354357
|| self.aes_crypto.set_nonce(&nonce).is_err()
355358
{
356359
// UNCOMMENT TO DEBUG THREAD //

capsules/extra/src/symmetric_encryption/aes.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use core::marker::PhantomData;
1313

1414
use kernel::grant::{AllowRoCount, AllowRwCount, Grant, UpcallCount};
1515
use kernel::hil::symmetric_encryption::{
16-
AESCtr, AESKeySize, CCMClient, Client, GCMClient, AES, AESCBC, AESCCM, AESECB, AESGCM,
16+
AESCtr, AESKey, AESKeySize, CCMClient, Client, GCMClient, AES, AESCBC, AESCCM, AESECB, AESGCM,
1717
AES_BLOCK_SIZE,
1818
};
1919
use kernel::processbuffer::{ReadableProcessBuffer, WriteableProcessBuffer};
@@ -125,15 +125,15 @@ impl<
125125
AesOperation::AESCtr(_)
126126
| AesOperation::AESCBC(_)
127127
| AesOperation::AESECB(_) => {
128-
AES::set_key(self.aes, buf)?;
128+
AES::set_key(self.aes, AESKey::PlainText(buf))?;
129129
Ok(())
130130
}
131131
AesOperation::AESCCM(_) => {
132-
AESCCM::set_key(self.aes, buf)?;
132+
AESCCM::set_key(self.aes, AESKey::PlainText(buf))?;
133133
Ok(())
134134
}
135135
AesOperation::AESGCM(_) => {
136-
AESGCM::set_key(self.aes, buf)?;
136+
AESGCM::set_key(self.aes, AESKey::PlainText(buf))?;
137137
Ok(())
138138
}
139139
}

capsules/extra/src/test/aes.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use core::cell::Cell;
99
use kernel::debug;
1010
use kernel::hil;
1111
use kernel::hil::symmetric_encryption::{
12-
AESCtr, AES, AES128, AES128_KEY_SIZE, AESCBC, AESECB, AES_BLOCK_SIZE,
12+
AESCtr, AESKey, AES, AES128, AES128_KEY_SIZE, AESCBC, AESECB, AES_BLOCK_SIZE,
1313
};
1414
use kernel::utilities::cells::OptionalCell;
1515
use kernel::utilities::cells::TakeCell;
@@ -95,7 +95,7 @@ impl<'a, A: AES<'a, AES128> + AESECB> TestAes128Ecb<'a, A> {
9595
key[i] = *b;
9696
}
9797

98-
assert!(self.aes.set_key(key) == Ok(()));
98+
assert!(self.aes.set_key(AESKey::PlainText(key)) == Ok(()));
9999
});
100100

101101
// Copy mode-appropriate source into source buffer
@@ -196,7 +196,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr> TestAes128Ctr<'a, A> {
196196
key[i] = *b;
197197
}
198198

199-
assert!(self.aes.set_key(key) == Ok(()));
199+
assert!(self.aes.set_key(AESKey::PlainText(key)) == Ok(()));
200200
});
201201

202202
// Copy mode-appropriate IV into IV buffer and configure it in the hardware
@@ -370,7 +370,7 @@ impl<'a, A: AES<'a, AES128> + AESCBC> TestAes128Cbc<'a, A> {
370370
key[i] = *b;
371371
}
372372

373-
assert!(self.aes.set_key(key) == Ok(()));
373+
assert!(self.aes.set_key(AESKey::PlainText(key)) == Ok(()));
374374
});
375375

376376
// Copy mode-appropriate IV into IV buffer and configure it in the hardware

capsules/extra/src/test/aes_ccm.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use core::cell::Cell;
88
use kernel::debug;
99
use kernel::hil::symmetric_encryption::{
10-
CCMClient, AES128, AES128_KEY_SIZE, AESCCM, CCM_NONCE_LENGTH,
10+
AESKey, CCMClient, AES128, AES128_KEY_SIZE, AESCCM, CCM_NONCE_LENGTH,
1111
};
1212
use kernel::utilities::cells::TakeCell;
1313
use kernel::ErrorCode;
@@ -103,7 +103,9 @@ impl<'a, A: AESCCM<'a, AES128>> Test<'a, A> {
103103
buf[m_off..m_off + m_len + mic_len].copy_from_slice(c_data);
104104
}
105105

106-
if self.aes_ccm.set_key(&KEY) != Ok(()) || self.aes_ccm.set_nonce(nonce) != Ok(()) {
106+
if self.aes_ccm.set_key(AESKey::PlainText(&KEY)) != Ok(())
107+
|| self.aes_ccm.set_nonce(nonce) != Ok(())
108+
{
107109
panic!("aes_ccm_test failed: cannot set key or nonce.");
108110
}
109111

capsules/extra/src/test/aes_gcm.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
use core::cell::Cell;
88
use kernel::debug;
9-
use kernel::hil::symmetric_encryption::{GCMClient, AES128, AES128_KEY_SIZE, AESGCM};
9+
use kernel::hil::symmetric_encryption::{AESKey, GCMClient, AES128, AES128_KEY_SIZE, AESGCM};
1010
use kernel::utilities::cells::TakeCell;
1111
use kernel::ErrorCode;
1212

@@ -93,7 +93,7 @@ impl<'a, A: AESGCM<'a, AES128>> Test<'a, A> {
9393
buf[pt_off + pt_len..(pt_off + pt_len + tag.len())].copy_from_slice(tag);
9494
}
9595

96-
if self.aes_gcm.set_key(key) != Ok(()) {
96+
if self.aes_gcm.set_key(AESKey::PlainText(key)) != Ok(()) {
9797
panic!("aes_gcm_test failed: cannot set key.");
9898
}
9999

capsules/extra/src/tutorials/encryption_oracle_chkpt4.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use core::cell::Cell;
66

77
use kernel::grant::{AllowRoCount, AllowRwCount, Grant, UpcallCount};
8-
use kernel::hil::symmetric_encryption::{AESCtr, Client, AES, AES128, AES_BLOCK_SIZE};
8+
use kernel::hil::symmetric_encryption::{AESCtr, AESKey, Client, AES, AES128, AES_BLOCK_SIZE};
99
use kernel::processbuffer::ReadableProcessBuffer;
1010
use kernel::syscall::{CommandReturn, SyscallDriver};
1111
use kernel::utilities::cells::{OptionalCell, TakeCell};
@@ -155,7 +155,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr> EncryptionOracleDriver<'a, A> {
155155
// make this a decryption operation:
156156
self.aes.set_mode_aesctr(true)?;
157157

158-
self.aes.set_key(KEY)?;
158+
self.aes.set_key(AESKey::PlainText(KEY))?;
159159

160160
// Set the initialization vector:
161161
kernel_data

capsules/extra/src/tutorials/encryption_oracle_chkpt5.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use core::cell::Cell;
66

77
use kernel::grant::{AllowRoCount, AllowRwCount, Grant, UpcallCount};
8-
use kernel::hil::symmetric_encryption::{AESCtr, Client, AES, AES128, AES_BLOCK_SIZE};
8+
use kernel::hil::symmetric_encryption::{AESCtr, AESKey, Client, AES, AES128, AES_BLOCK_SIZE};
99
use kernel::processbuffer::{ReadableProcessBuffer, WriteableProcessBuffer};
1010
use kernel::syscall::{CommandReturn, SyscallDriver};
1111
use kernel::utilities::cells::{OptionalCell, TakeCell};
@@ -155,7 +155,7 @@ impl<'a, A: AES<'a, AES128> + AESCtr> EncryptionOracleDriver<'a, A> {
155155
// make this a decryption operation:
156156
self.aes.set_mode_aesctr(true)?;
157157

158-
self.aes.set_key(KEY)?;
158+
self.aes.set_key(AESKey::PlainText(KEY))?;
159159

160160
// Set the initialization vector:
161161
kernel_data

0 commit comments

Comments
 (0)