@@ -3,7 +3,7 @@ use core::marker::PhantomData;
33use kernel:: debug;
44use kernel:: errorcode:: ErrorCode ;
55use kernel:: hil:: symmetric_encryption:: {
6- AESKey , AESKeySize , AES , AES128_KEY_SIZE , AES_BLOCK_SIZE , AES_IV_SIZE ,
6+ AESKey , AESKeySize , AES , AES128_KEY_SIZE , AES256_KEY_SIZE , AES_BLOCK_SIZE , AES_IV_SIZE ,
77} ;
88use kernel:: utilities:: cells:: { OptionalCell , TakeCell } ;
99use kernel:: utilities:: registers:: interfaces:: { ReadWriteable , Readable , Writeable } ;
@@ -13,6 +13,8 @@ use kernel::utilities::registers::{
1313
1414use kernel:: utilities:: StaticRef ;
1515
16+ use crate :: entropy:: Trng ;
17+
1618register_structs ! {
1719 /// Secure AES coprocessor
1820 pub SaesRegisters {
@@ -236,7 +238,7 @@ pub struct Saes<'a, K: AESKeySize> {
236238}
237239
238240impl < ' a , K : AESKeySize > Saes < ' a , K > {
239- pub fn new ( base : StaticRef < SaesRegisters > ) -> Saes < ' a , K > {
241+ pub fn new ( base : StaticRef < SaesRegisters > , _trng : & ' static Trng ) -> Saes < ' a , K > {
240242 Saes {
241243 registers : base,
242244 mode : Cell :: new ( SAESMode :: ECB ) ,
@@ -269,23 +271,23 @@ impl<'a, K: AESKeySize> Saes<'a, K> {
269271 /// Helper to write a 128-bit or 256-bit key into the hardware key registers
270272 fn write_key_registers ( & self , key : & [ u8 ] ) {
271273 // Default to using the first 16 bytes for the lower registers (AES-128 behavior)
272- let mut lower_key_chunk = & key[ 0 ..16 ] ;
274+ let mut lower_key_chunk = & key[ 0 ..AES128_KEY_SIZE ] ;
273275
274- if K :: LENGTH == 32 {
276+ if K :: LENGTH == AES256_KEY_SIZE {
275277 // AES-256: Write KEYR7 down to KEYR4 first
276278 for ( reg, chunk) in self
277279 . registers
278280 . keyr2
279281 . iter ( )
280282 . rev ( )
281- . zip ( key[ 0 ..16 ] . chunks_exact ( 4 ) )
283+ . zip ( key[ 0 ..AES128_KEY_SIZE ] . chunks_exact ( 4 ) )
282284 {
283285 let word = u32:: from_be_bytes ( chunk. try_into ( ) . unwrap ( ) ) ;
284286 reg. write ( Data :: DATA . val ( word) ) ;
285287 }
286288
287289 // Update the slice so the lower registers get the second half of the 256-bit key
288- lower_key_chunk = & key[ 16 .. 32 ] ;
290+ lower_key_chunk = & key[ AES128_KEY_SIZE .. AES256_KEY_SIZE ] ;
289291 }
290292
291293 // Write KEYR3 down to KEYR0
@@ -354,7 +356,7 @@ impl<'a, K: AESKeySize> Saes<'a, K> {
354356 let mut block = [ 0u8 ; AES_BLOCK_SIZE ] ;
355357 for chunk in block. chunks_exact_mut ( 4 ) {
356358 let word = self . registers . doutr . get ( ) ;
357- chunk. copy_from_slice ( & word. to_le_bytes ( ) ) ;
359+ chunk. copy_from_slice ( & word. to_be_bytes ( ) ) ;
358360 }
359361 block
360362 }
@@ -365,19 +367,16 @@ impl<'a, K: AESKeySize> Saes<'a, K> {
365367 self . registers . cr . modify ( CR :: EN :: SET ) ;
366368 }
367369 self . write_input ( ctx) ;
368- debug ! ( "wrote input" ) ;
369- debug ! ( "CR: {:02x?}" , self . registers. cr. get( ) ) ;
370- debug ! ( "SR: {:02x?}" , self . registers. sr. get( ) ) ;
371370 }
372371
373372 fn start_key_wrapping ( & self , ctx : CryptoContext , key_id : KeyID ) {
374373 let regs = self . registers ;
375374
376375 match K :: LENGTH {
377- 16 => {
376+ AES128_KEY_SIZE => {
378377 regs. cr . modify ( CR :: KEYSIZE :: AES128 ) ;
379378 }
380- 32 => {
379+ AES256_KEY_SIZE => {
381380 regs. cr . modify ( CR :: KEYSIZE :: AES256 ) ;
382381 }
383382 _ => { }
@@ -444,11 +443,7 @@ impl<'a, K: AESKeySize> Saes<'a, K> {
444443 }
445444
446445 pub fn handle_interrupt ( & self ) {
447- debug ! ( "INTERRUPT" ) ;
448- debug ! ( "CR: {:02x?}" , self . registers. cr. get( ) ) ;
449- debug ! ( "SR: {:02x?}" , self . registers. sr. get( ) ) ;
450446 if self . registers . isr . is_set ( ISR :: CCF ) {
451- debug ! ( "CCF" ) ;
452447 self . registers . icr . write ( ICR :: CCF :: SET ) ;
453448 self . computation_complete ( ) ;
454449 }
@@ -474,12 +469,9 @@ impl<'a, K: AESKeySize> kernel::hil::symmetric_encryption::AES<'a, K> for Saes<'
474469 fn enable ( & self ) {
475470 self . registers . cr . modify ( CR :: IPRST :: SET ) ;
476471 self . registers . cr . write ( CR :: EN :: CLEAR ) ;
477- self . registers . cr . modify ( CR :: DATATYPE :: Byte ) ;
472+ self . registers . cr . modify ( CR :: DATATYPE :: None ) ;
478473 self . state . set ( State :: Idle ) ;
479474 self . enable_interrupts ( ) ;
480- debug ! ( "ENABLE" ) ;
481- debug ! ( "CR: {:02x?}" , self . registers. cr. get( ) ) ;
482- debug ! ( "SR: {:02x?}" , self . registers. sr. get( ) ) ;
483475 }
484476
485477 fn disable ( & self ) {
@@ -494,9 +486,6 @@ impl<'a, K: AESKeySize> kernel::hil::symmetric_encryption::AES<'a, K> for Saes<'
494486 }
495487
496488 fn set_key ( & self , key : AESKey ) -> Result < ( ) , ErrorCode > {
497- debug ! ( "KEY" ) ;
498- debug ! ( "CR: {:02x?}" , self . registers. cr. get( ) ) ;
499- debug ! ( "SR: {:02x?}" , self . registers. sr. get( ) ) ;
500489 if self . registers . cr . any_matching_bits_set ( CR :: EN :: SET )
501490 || self . registers . sr . any_matching_bits_set ( SR :: BUSY :: SET )
502491 {
@@ -522,7 +511,7 @@ impl<'a, K: AESKeySize> kernel::hil::symmetric_encryption::AES<'a, K> for Saes<'
522511 return Err ( ErrorCode :: INVAL ) ;
523512 }
524513
525- if K :: LENGTH == 16 {
514+ if K :: LENGTH == AES128_KEY_SIZE {
526515 self . registers . cr . modify ( CR :: KEYSIZE :: AES128 ) ;
527516 } else {
528517 self . registers . cr . modify ( CR :: KEYSIZE :: AES256 ) ;
@@ -542,14 +531,13 @@ impl<'a, K: AESKeySize> kernel::hil::symmetric_encryption::AES<'a, K> for Saes<'
542531 }
543532
544533 fn set_iv ( & self , iv : & [ u8 ] ) -> Result < ( ) , ErrorCode > {
545- debug ! ( "IV" ) ;
546- debug ! ( "CR: {:02x?}" , self . registers. cr. get( ) ) ;
547- debug ! ( "SR: {:02x?}" , self . registers. sr. get( ) ) ;
548534 if iv. len ( ) != AES_IV_SIZE {
549535 return Err ( ErrorCode :: INVAL ) ;
550536 }
551537
552- if self . registers . cr . any_matching_bits_set ( CR :: EN :: SET ) {
538+ if self . registers . cr . any_matching_bits_set ( CR :: EN :: SET )
539+ || self . registers . sr . any_matching_bits_set ( SR :: BUSY :: SET )
540+ {
553541 return Err ( ErrorCode :: BUSY ) ;
554542 }
555543
@@ -578,13 +566,10 @@ impl<'a, K: AESKeySize> kernel::hil::symmetric_encryption::AES<'a, K> for Saes<'
578566 Option < & ' static mut [ u8 ] > ,
579567 & ' static mut [ u8 ] ,
580568 ) > {
581- debug ! ( "CRYPT" ) ;
582- debug ! ( "CR: {:02x?}" , self . registers. cr. get( ) ) ;
583- debug ! ( "SR: {:02x?}" , self . registers. sr. get( ) ) ;
584569 let state = self . state . get ( ) ;
585570
586571 // Hardware busy check
587- if self . output . is_some ( ) {
572+ if self . output . is_some ( ) || self . registers . sr . any_matching_bits_set ( SR :: BUSY :: SET ) {
588573 return Some ( ( Err ( ErrorCode :: BUSY ) , source, dest) ) ;
589574 }
590575
0 commit comments