1use crate::{common::common::QRC_SYSTEM_AESNI_ENABLED, digest::{sha2::{qrc_hkdf256_expand, qrc_hkdf256_extract, qrc_hmac256_blockupdate, qrc_hmac256_dispose, qrc_hmac256_blockfinalize, qrc_hmac256_initialize, QrcHmac256State, QRC_HMAC_256_MAC_SIZE}, sha3::{qrc_cshake256_compute, qrc_cshake_initialize, qrc_cshake_squeezeblocks, qrc_keccak_dispose, qrc_kmac_finalize, qrc_kmac_initialize, qrc_kmac_update, QrcKeccakRate, QrcKeccakState, QRC_KECCAK_256_RATE, QRC_KECCAK_STATE_SIZE}}, tools::intutils::{qrc_intutils_be8increment, qrc_intutils_be8to32, qrc_intutils_clear32, qrc_intutils_clear64, qrc_intutils_clear8, qrc_intutils_copy8, qrc_intutils_le32to8, qrc_intutils_le64to8, qrc_intutils_le8increment, qrc_intutils_min, qrc_intutils_verify}};
29
30use core::{mem::size_of, default::Default};
31
32#[cfg(feature = "no_std")]
33use alloc::{vec::Vec, borrow::ToOwned};
34
35pub const QRC_HBA_KMAC_EXTENSION: bool = true;
40
41pub const QRC_HBA_HKDF_EXTENSION: bool = true;
46
47#[derive(PartialEq)]
51pub enum QrcAesCipherType {
52 AES128 = 1, AES256 = 2, }
55#[derive(PartialEq)]
59pub enum QrcAesCipherMode {
60 CBC = 1, CTR = 2, ECB = 3, }
64
65pub const QRC_AES_BLOCK_SIZE: usize = 16;
74
75pub const QRC_AES_IV_SIZE: usize = 16;
80
81pub const QRC_AES128_KEY_SIZE: usize = 16;
86
87pub const QRC_AES256_KEY_SIZE: usize = 32;
92
93pub const QRC_HBA256_MAC_LENGTH: usize = 32;
98
99pub const QRC_HBA_MAXAAD_SIZE: usize = 256;
104
105pub const QRC_HBA_MAXINFO_SIZE: usize = 256;
110
111
112pub const QRC_HBA_KMAC_AUTH: bool = if QRC_HBA_KMAC_EXTENSION {
118 true
119} else {
120 false
121};
122
123#[derive(Clone)]
130pub struct QrcAesKeyparams {
131 pub key: Vec<u8>, pub keylen: usize, pub nonce: Vec<u8>, pub info: Vec<u8>, pub infolen: usize, }
137impl Default for QrcAesKeyparams {
138 fn default() -> Self {
139 Self {
140 key: Default::default(),
141 keylen: Default::default(),
142 nonce: Default::default(),
143 info: Default::default(),
144 infolen: Default::default()
145 }
146 }
147}
148
149#[derive(Clone)]
153pub struct QrcAesState{
154 pub roundkeys: [u32; 124], pub roundkeylen: usize, pub rounds: usize, pub nonce: Vec<u8>, }
159impl Default for QrcAesState {
160 fn default() -> Self {
161 Self {
162 roundkeys: [Default::default(); 124],
163 roundkeylen: Default::default(),
164 rounds: Default::default(),
165 nonce: Default::default()
166 }
167 }
168}
169
170pub fn qrc_aes_dispose(state: &mut QrcAesState) {
176 qrc_intutils_clear32(&mut state.roundkeys, 124);
178 state.roundkeylen = 0;
179}
180
181pub fn qrc_aes_initialize(state: &mut QrcAesState, keyparams: QrcAesKeyparams, ctype: QrcAesCipherType) {
192 state.nonce = keyparams.nonce.clone();
193
194 qrc_intutils_clear32(&mut state.roundkeys, 124);
195
196 if ctype == QrcAesCipherType::AES256 {
197 state.roundkeylen = AES256_ROUNDKEY_SIZE;
198 state.rounds = 14;
199 aes_standard_expand(state, keyparams);
200 } else if ctype == QrcAesCipherType::AES128 {
201 state.roundkeylen = AES128_ROUNDKEY_SIZE;
202 state.rounds = 10;
203 aes_standard_expand(state, keyparams);
204 } else {
205 state.rounds = 0;
206 state.roundkeylen = 0;
207 }
208}
209
210pub fn qrc_aes_cbc_decrypt(state: &mut QrcAesState, output: &mut [u8], outputlen: &mut usize, input: &[u8], mut length: usize) {
223 let tmpb = &mut [0u8; QRC_AES_BLOCK_SIZE];
224 let mut oft = 0;
225
226 while length > QRC_AES_BLOCK_SIZE {
227 qrc_aes_cbc_decrypt_block(state, &mut output[oft..], &input[oft..]);
228 length -= QRC_AES_BLOCK_SIZE;
229 oft += QRC_AES_BLOCK_SIZE;
230 }
231
232 qrc_aes_cbc_decrypt_block(state, tmpb, &input[oft..]);
233 let nlen = qrc_pkcs7_padding_length(tmpb);
234 qrc_intutils_copy8(&mut output[oft..], tmpb, QRC_AES_BLOCK_SIZE - nlen);
235 *outputlen = oft + QRC_AES_BLOCK_SIZE - nlen;
236}
237
238pub fn qrc_aes_cbc_encrypt(state: &mut QrcAesState, output: &mut [u8], input: &[u8], mut length: usize) {
249 let mut oft = 0;
250
251 while length > QRC_AES_BLOCK_SIZE {
252 qrc_aes_cbc_encrypt_block(state, &mut output[oft..], &input[oft..]);
253 length -= QRC_AES_BLOCK_SIZE;
254 oft += QRC_AES_BLOCK_SIZE;
255 }
256
257 if length != 0 {
258 let tmpb = &mut [0u8; QRC_AES_BLOCK_SIZE];
259 qrc_intutils_copy8(tmpb, &input[oft..], length);
260
261 if length < QRC_AES_BLOCK_SIZE {
262 qrc_pkcs7_add_padding(tmpb, QRC_AES_BLOCK_SIZE - length);
263 }
264
265 qrc_aes_cbc_encrypt_block(state, &mut output[oft..], tmpb);
266 }
267}
268
269pub fn qrc_aes_cbc_decrypt_block(state: &mut QrcAesState, output: &mut [u8], input: &[u8]) {
279 let tmpv = &mut [0u8; QRC_AES_BLOCK_SIZE];
280
281 qrc_intutils_copy8(tmpv, input, QRC_AES_BLOCK_SIZE);
282 aes_decrypt_block(state.clone(), output, input);
283
284 for i in 0..QRC_AES_BLOCK_SIZE {
285 output[i] ^= state.nonce[i];
286 }
287
288 qrc_intutils_copy8(&mut state.nonce, tmpv, QRC_AES_BLOCK_SIZE);
289}
290
291pub fn qrc_aes_cbc_encrypt_block(state: &mut QrcAesState, output: &mut [u8], input: &[u8]) {
301 for i in 0..QRC_AES_BLOCK_SIZE {
302 state.nonce[i] ^= input[i];
303 }
304
305 aes_encrypt_block(state.clone(), output, &state.nonce);
306 qrc_intutils_copy8(&mut state.nonce, output, QRC_AES_BLOCK_SIZE);
307}
308
309pub fn qrc_pkcs7_add_padding(input: &mut [u8], length: usize) {
319
320 let padoft = QRC_AES_BLOCK_SIZE - length;
321
322 let code = length as u8;
323 let mut ctr = padoft;
324
325 while ctr != QRC_AES_BLOCK_SIZE {
326 input[ctr] = code;
327 ctr += 1;
328 }
329}
330
331pub fn qrc_pkcs7_padding_length(input: &[u8]) -> usize {
341 let mut count = input[QRC_AES_BLOCK_SIZE - 1] as usize;
342 count = if count < QRC_AES_BLOCK_SIZE { count } else { 0 };
343
344 if count != 0 {
345 for i in 2..=count {
346 if input[QRC_AES_BLOCK_SIZE - i] as usize != count {
347 count = 0;
348 break;
349 }
350 }
351 }
352
353 return count;
354}
355
356pub fn qrc_aes_ctrbe_transform(state: &mut QrcAesState, output: &mut [u8], input: &[u8], mut length: usize) {
370 let mut oft = 0;
371
372 while length >= QRC_AES_BLOCK_SIZE {
373 aes_encrypt_block(state.clone(), &mut output[oft..], &state.nonce);
374
375 for i in 0..QRC_AES_BLOCK_SIZE {
376 output[oft + i] ^= input[oft + i];
377 }
378
379 qrc_intutils_be8increment(&mut state.nonce, QRC_AES_BLOCK_SIZE);
380
381 length -= QRC_AES_BLOCK_SIZE;
382 oft += QRC_AES_BLOCK_SIZE;
383 }
384
385 if length != 0 {
386 let tmpb = &mut [0u8; QRC_AES_BLOCK_SIZE];
387
388 aes_encrypt_block(state.clone(), tmpb, &state.nonce);
389
390 for i in 0..length {
391 output[oft + i] = tmpb[i] ^ input[oft + i];
392 }
393
394 qrc_intutils_be8increment(&mut state.nonce, QRC_AES_BLOCK_SIZE);
395 }
396}
397
398pub fn qrc_aes_ctrle_transform(state: &mut QrcAesState, output: &mut [u8], input: &[u8], mut length: usize) {
410 let mut oft = 0;
411
412 while length >= QRC_AES_BLOCK_SIZE {
413 aes_encrypt_block(state.clone(), &mut output[oft..], &state.nonce);
414
415 for i in 0..QRC_AES_BLOCK_SIZE {
416 output[oft + i] ^= input[oft + i];
417 }
418
419 qrc_intutils_le8increment(&mut state.nonce, QRC_AES_BLOCK_SIZE);
420
421 length -= QRC_AES_BLOCK_SIZE;
422 oft += QRC_AES_BLOCK_SIZE;
423 }
424
425 if length != 0 {
426 let tmpb = &mut [0u8; QRC_AES_BLOCK_SIZE];
427
428 aes_encrypt_block(state.clone(), tmpb, &state.nonce);
429
430 for i in 0..length {
431 output[oft + i] = tmpb[i] ^ input[oft + i];
432 }
433
434 qrc_intutils_le8increment(&mut state.nonce, QRC_AES_BLOCK_SIZE);
435 }
436}
437
438pub fn qrc_aes_ecb_decrypt_block(state: QrcAesState, output: &mut [u8], input: &[u8]) {
449 aes_decrypt_block(state, output, input);
450}
451
452pub fn qrc_aes_ecb_encrypt_block(state: QrcAesState, output: &mut [u8], input: &[u8]) {
461 aes_encrypt_block(state, output, input);
462}
463
464pub struct QrcAesHba256State {
471 pub kstate: QrcKeccakState, pub hstate: QrcHmac256State, pub cstate: QrcAesState, pub counter: u64, pub mkey: [u8; 32], pub cust: [u8; QRC_HBA_MAXINFO_SIZE], pub custlen: usize, pub encrypt: bool, }
480impl Default for QrcAesHba256State {
481 fn default() -> Self {
482 Self {
483 kstate: QrcKeccakState::default(),
484 hstate: QrcHmac256State::default(),
485 cstate: QrcAesState::default(),
486 counter: Default::default(),
487 mkey: [Default::default(); 32],
488 cust: [Default::default(); QRC_HBA_MAXINFO_SIZE],
489 custlen: Default::default(),
490 encrypt: Default::default()
491 }
492 }
493}
494
495pub fn qrc_aes_hba256_dispose(state: &mut QrcAesHba256State) {
505 if QRC_HBA_KMAC_EXTENSION {
506 qrc_keccak_dispose(&mut state.kstate);
507 } else {
508 qrc_hmac256_dispose(&mut state.hstate);
509 }
510
511 qrc_aes_dispose(&mut state.cstate);
512 qrc_intutils_clear8(&mut state.cust, QRC_HBA_MAXINFO_SIZE);
513 qrc_intutils_clear8(&mut state.mkey, 32);
514
515 state.counter = 0;
516 state.custlen = 0;
517 state.encrypt = false;
518}
519
520pub fn qrc_aes_hba256_initialize(state: &mut QrcAesHba256State, keyparams: QrcAesKeyparams, encrypt: bool) {
531 let cprk = &mut [0u8; QRC_AES256_KEY_SIZE];
532
533 state.custlen = qrc_intutils_min(keyparams.infolen, QRC_HBA_MAXINFO_SIZE);
534
535 if state.custlen != 0 {
536 qrc_intutils_clear8(&mut state.cust, QRC_HBA_MAXINFO_SIZE);
537 qrc_intutils_copy8(&mut state.cust, &keyparams.info, state.custlen);
538 }
539
540 qrc_intutils_clear8(&mut state.mkey, 32);
541
542 aes_hba256_genkeys(keyparams.clone(), cprk, &mut state.mkey);
544
545 if QRC_HBA_KMAC_EXTENSION {
547 qrc_kmac_initialize(&mut state.kstate, QRC_KECCAK_256_RATE, &mut state.mkey, HBA256_MKEY_LENGTH, &mut [], 0);
548 } else {
549 qrc_hmac256_initialize(&mut state.hstate, &state.mkey, HBA256_MKEY_LENGTH);
550 }
551
552 let kp = QrcAesKeyparams {
554 key: cprk.to_vec(),
555 keylen: QRC_AES256_KEY_SIZE,
556 nonce: keyparams.nonce,
557 info: [].to_vec(),
558 infolen: 0,
559 };
560 qrc_aes_initialize(&mut state.cstate, kp, QrcAesCipherType::AES256);
562
563 state.counter = 1;
566 state.encrypt = encrypt;
567}
568
569pub fn qrc_aes_hba256_set_associated(state: &mut QrcAesHba256State, data: &[u8], datalen: usize) {
580 if datalen != 0 {
582 let actr = &mut [0u8; size_of::<u32>()];
583
584 aes_hba256_update(state, data, datalen);
586 qrc_intutils_le32to8(actr, datalen as u32);
588 aes_hba256_update(state, actr, size_of::<u32>());
589 }
590}
591
592pub fn qrc_aes_hba256_transform(state: &mut QrcAesHba256State, output: &mut [u8], input: &[u8], length: usize) -> bool {
608 let mut res = false;
609
610 state.counter += length as u64;
612
613 let nonce = &state.cstate.nonce.to_owned();
614 if state.encrypt {
615 aes_hba256_update(state, nonce, QRC_AES_BLOCK_SIZE);
617 qrc_aes_ctrle_transform(&mut state.cstate, output, input, length);
619 aes_hba256_update(state, output, length);
621 aes_hba256_finalize(state, &mut output[length..]);
623 res = true;
624 } else {
625 let code = &mut [0u8; QRC_HBA256_MAC_LENGTH];
626
627 aes_hba256_update(state, nonce, QRC_AES_BLOCK_SIZE);
629 aes_hba256_update(state, input, length);
631 aes_hba256_finalize(state, code);
633
634 if qrc_intutils_verify(code, &input[length..], QRC_HBA256_MAC_LENGTH) == 0 {
636 qrc_aes_ctrle_transform(&mut state.cstate, output, input, length);
638 res = true;
639 } else {
640 let mut fake_state = state.cstate.clone();
642 let fake_output_len = output.len();
643 let mut fake_output = vec![0u8; fake_output_len];
644 qrc_intutils_copy8(&mut fake_output, output, fake_output_len);
645 qrc_aes_ctrle_transform(&mut fake_state, &mut fake_output, input, length);
646 qrc_aes_dispose(&mut fake_state);
647 qrc_intutils_clear8(&mut fake_output, fake_output_len);
648 }
649 }
650
651 return res;
652}
653
654const AES128_ROUND_COUNT: usize = 10;
659
660const AES256_ROUND_COUNT: usize = 14;
665
666const ROUNDKEY_ELEMENT_SIZE: usize = if QRC_SYSTEM_AESNI_ENABLED {
671 16
672} else {
673 4
674};
675
676const AES128_ROUNDKEY_SIZE: usize = (AES128_ROUND_COUNT + 1) * (QRC_AES_BLOCK_SIZE / ROUNDKEY_ELEMENT_SIZE);
688
689const AES256_ROUNDKEY_SIZE: usize = (AES256_ROUND_COUNT + 1) * (QRC_AES_BLOCK_SIZE / ROUNDKEY_ELEMENT_SIZE);
695
696const HBA256_MKEY_LENGTH: usize = 32;
709
710const HBA_NAME_LENGTH: usize = if QRC_HBA_KMAC_EXTENSION {
721 29
722} else {
723 33
724};
725const HBA_NAME_LENGTH_MAX: usize = 33;
726
727
728const RCON: [u32; 30] = [
731 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000,
732 0x80000000, 0x1B000000, 0x36000000, 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000,
733 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, 0x97000000, 0x35000000, 0x6A000000,
734 0xD4000000, 0xB3000000, 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000
735];
736
737fn gf_mul(mut a: u8, mut b: u8) -> u8 {
738 let mut res: u16 = 0;
739 for _ in 0..8 {
740 let mask = 0u16.wrapping_sub((b & 1) as u16);
741 res ^= (a as u16) & mask;
742
743 let hi = (a & 0x80) != 0;
744 a = a << 1;
745 let red = 0u8.wrapping_sub(hi as u8) & 0x1B;
746 a ^= red;
747
748 b >>= 1;
749 }
750 return (res & 0xFF) as u8;
751}
752
753fn rotl8(x: u8, r: u32) -> u8 {
754 return x.rotate_left(r);
755}
756
757fn gf_inv(a: u8) -> u8 {
758 let a2 = gf_mul(a, a); let a4 = gf_mul(a2, a2); let a8 = gf_mul(a4, a4); let a16 = gf_mul(a8, a8); let a32 = gf_mul(a16, a16); let a64 = gf_mul(a32, a32); let a128 = gf_mul(a64, a64); let mut t = a2;
767 t = gf_mul(t, a4);
768 t = gf_mul(t, a8);
769 t = gf_mul(t, a16);
770 t = gf_mul(t, a32);
771 t = gf_mul(t, a64);
772 t = gf_mul(t, a128);
773 return t;
774}
775
776fn affine_transform(x: u8) -> u8 {
777 return x ^ rotl8(x, 1) ^ rotl8(x, 2) ^ rotl8(x, 3) ^ rotl8(x, 4) ^ 0x63;
778}
779
780fn inverse_affine_transform(s: u8) -> u8 {
781 return rotl8(s, 1) ^ rotl8(s, 3) ^ rotl8(s, 6) ^ 0x05;
782}
783
784fn sbox_u8(x: u8) -> u8 {
785 let inv = gf_inv(x);
786 return affine_transform(inv);
787}
788
789fn inv_sbox_u8(s: u8) -> u8 {
790 let b = inverse_affine_transform(s);
791 return gf_inv(b);
792}
793
794fn aes_add_roundkey(state: &mut [u8], skeys: &[u32]) {
795 let mut k: u32;
796 for i in (0..QRC_AES_BLOCK_SIZE).step_by(size_of::<u32>()) {
797 k = skeys[i/size_of::<u32>()];
798 state[i] ^= (k >> 24) as u8;
799 state[i + 1] ^= ((k >> 16) & 0xFF) as u8 ;
800 state[i + 2] ^= ((k >> 8) & 0xFF) as u8 ;
801 state[i + 3] ^= (k & 0xFF) as u8;
802 }
803}
804
805fn aes_gf256_reduce(x: u32) -> u8 {
806 let y = x >> 8;
807
808 return (x ^ y ^ (y << 1) ^ (y << 3) ^ (y << 4)) as u8 & 0xFF;
809}
810
811
812fn aes_invmix_columns(state: &mut [u8]) {
813 for i in (0..QRC_AES_BLOCK_SIZE).step_by(size_of::<u32>()) {
814 let s0 = state[i] as u32;
815 let s1 = state[i + 1] as u32;
816 let s2 = state[i + 2] as u32;
817 let s3 = state[i + 3] as u32;
818
819 let t0 = (s0 << 1) ^ (s0 << 2) ^ (s0 << 3) ^ s1 ^ (s1 << 1) ^ (s1 << 3)
820 ^ s2 ^ (s2 << 2) ^ (s2 << 3) ^ s3 ^ (s3 << 3);
821
822 let t1 = s0 ^ (s0 << 3) ^ (s1 << 1) ^ (s1 << 2) ^ (s1 << 3)
823 ^ s2 ^ (s2 << 1) ^ (s2 << 3) ^ s3 ^ (s3 << 2) ^ (s3 << 3);
824
825 let t2 = s0 ^ (s0 << 2) ^ (s0 << 3) ^ s1 ^ (s1 << 3)
826 ^ (s2 << 1) ^ (s2 << 2) ^ (s2 << 3) ^ s3 ^ (s3 << 1) ^ (s3 << 3);
827
828 let t3 = s0 ^ (s0 << 1) ^ (s0 << 3) ^ s1 ^ (s1 << 2) ^ (s1 << 3)
829 ^ s2 ^ (s2 << 3) ^ (s3 << 1) ^ (s3 << 2) ^ (s3 << 3);
830
831 state[i] = aes_gf256_reduce(t0);
832 state[i + 1] = aes_gf256_reduce(t1);
833 state[i + 2] = aes_gf256_reduce(t2);
834 state[i + 3] = aes_gf256_reduce(t3);
835 }
836}
837
838fn aes_invshift_rows(state: &mut [u8]) {
839 let mut tmp = state[13];
840 state[13] = state[9];
841 state[9] = state[5];
842 state[5] = state[1];
843 state[1] = tmp;
844
845 tmp = state[2];
846 state[2] = state[10];
847 state[10] = tmp;
848 tmp = state[6];
849 state[6] = state[14];
850 state[14] = tmp;
851
852 tmp = state[3];
853 state[3] = state[7];
854 state[7] = state[11];
855 state[11] = state[15];
856 state[15] = tmp;
857}
858
859fn aes_invsub_bytes(state: &mut [u8]) {
860 for i in 0..QRC_AES_BLOCK_SIZE {
861 state[i] = inv_sbox_u8(state[i]);
862 }
863}
864
865fn aes_mix_columns(state: &mut [u8]) {
866 for i in (0..QRC_AES_BLOCK_SIZE).step_by(size_of::<u32>()) {
867 let s0 = state[i + 0] as u32;
868 let s1 = state[i + 1] as u32;
869 let s2 = state[i + 2] as u32;
870 let s3 = state[i + 3] as u32;
871
872 let t0 = (s0 << 1) ^ s1 ^ (s1 << 1) ^ s2 ^ s3;
873 let t1 = s0 ^ (s1 << 1) ^ s2 ^ (s2 << 1) ^ s3;
874 let t2 = s0 ^ s1 ^ (s2 << 1) ^ s3 ^ (s3 << 1);
875 let t3 = s0 ^ (s0 << 1) ^ s1 ^ s2 ^ (s3 << 1);
876
877 state[i + 0] = (t0 ^ (((!(t0 >> 8)).wrapping_add(1)) & 0x0000011B)) as u8;
878 state[i + 1] = (t1 ^ (((!(t1 >> 8)).wrapping_add(1)) & 0x0000011B)) as u8;
879 state[i + 2] = (t2 ^ (((!(t2 >> 8)).wrapping_add(1)) & 0x0000011B)) as u8;
880 state[i + 3] = (t3 ^ (((!(t3 >> 8)).wrapping_add(1)) & 0x0000011B)) as u8;
881 }
882}
883
884fn aes_shift_rows(state: &mut [u8]) {
885 let mut tmp = state[1];
886 state[1] = state[5];
887 state[5] = state[9];
888 state[9] = state[13];
889 state[13] = tmp;
890
891 tmp = state[2];
892 state[2] = state[10];
893 state[10] = tmp;
894 tmp = state[6];
895 state[6] = state[14];
896 state[14] = tmp;
897
898 tmp = state[15];
899 state[15] = state[11];
900 state[11] = state[7];
901 state[7] = state[3];
902 state[3] = tmp;
903}
904
905fn aes_sub_bytes(state: &mut [u8]) {
906 for i in 0..QRC_AES_BLOCK_SIZE {
907 state[i] = sbox_u8(state[i]);
908 }
909}
910
911fn aes_substitution(rot: u32) -> u32 {
912 let b0 = sbox_u8((rot & 0xFF) as u8) as u32;
913 let b1 = sbox_u8(((rot >> 8) & 0xFF) as u8) as u32;
914 let b2 = sbox_u8(((rot >> 16) & 0xFF) as u8) as u32;
915 let b3 = sbox_u8(((rot >> 24) & 0xFF) as u8) as u32;
916 return b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
917}
918
919fn aes_decrypt_block(state: QrcAesState, output: &mut [u8], input: &[u8]) {
920 let s = &mut [0u8; 16];
921
922 let buf = input;
923 qrc_intutils_copy8(s, buf, QRC_AES_BLOCK_SIZE);
924 aes_add_roundkey(s, &state.roundkeys[(state.rounds << 2)..]);
925
926 for i in (1..(state.rounds)).rev() {
927
928 aes_invshift_rows(s);
929 aes_invsub_bytes(s);
930 aes_add_roundkey(s, &state.roundkeys[(i << 2)..]);
931 aes_invmix_columns(s);
932 }
933
934 aes_invshift_rows(s);
935 aes_invsub_bytes(s);
936 aes_add_roundkey(s, &state.roundkeys);
937 qrc_intutils_copy8(output, s, QRC_AES_BLOCK_SIZE);
938}
939
940fn aes_encrypt_block(state: QrcAesState, output: &mut [u8], input: &[u8]) {
941 let buf = &mut [0u8; QRC_AES_BLOCK_SIZE];
942
943 qrc_intutils_copy8(buf, input, QRC_AES_BLOCK_SIZE);
944 aes_add_roundkey(buf, &state.roundkeys);
945
946 for i in 1..state.rounds {
947 aes_sub_bytes(buf);
948 aes_shift_rows(buf);
949 aes_mix_columns(buf);
950 aes_add_roundkey(buf, &state.roundkeys[(i << 2)..]);
951 }
952
953 aes_sub_bytes(buf);
954 aes_shift_rows(buf);
955
956 aes_add_roundkey(buf, &state.roundkeys[(state.rounds << 2)..]);
957
958 qrc_intutils_copy8(output, buf, QRC_AES_BLOCK_SIZE);
959}
960
961fn aes_expand_rot(key: &mut [u32], mut keyindex: u32, keyoffset: u32, rconindex: u32) {
962 let mut subkey = keyindex - keyoffset;
963 key[keyindex as usize] = key[subkey as usize] ^ aes_substitution((key[keyindex as usize - 1] << 8) | ((key[keyindex as usize - 1] >> 24) & 0xFF)) ^ RCON[rconindex as usize];
964 keyindex += 1;
965 subkey += 1;
966 key[keyindex as usize] = key[subkey as usize] ^ key[keyindex as usize - 1];
967 keyindex += 1;
968 subkey += 1;
969 key[keyindex as usize] = key[subkey as usize] ^ key[keyindex as usize - 1];
970 keyindex += 1;
971 subkey += 1;
972 key[keyindex as usize] = key[subkey as usize] ^ key[keyindex as usize - 1];
973}
974
975fn aes_expand_sub(key: &mut [u32], mut keyindex: u32, keyoffset: u32) {
976 let mut subkey = keyindex - keyoffset;
977 key[keyindex as usize] = aes_substitution(key[keyindex as usize - 1]) ^ key[subkey as usize];
978 keyindex += 1;
979 subkey += 1;
980 key[keyindex as usize] = key[subkey as usize] ^ key[keyindex as usize - 1];
981 keyindex += 1;
982 subkey += 1;
983 key[keyindex as usize] = key[subkey as usize] ^ key[keyindex as usize - 1];
984 keyindex += 1;
985 subkey += 1;
986 key[keyindex as usize] = key[subkey as usize] ^ key[keyindex as usize - 1];
987}
988
989fn aes_standard_expand(state: &mut QrcAesState, keyparams: QrcAesKeyparams) {
990 let kwords = keyparams.keylen / size_of::<u32>();
992
993 if kwords == 8 {
994 state.roundkeys[0] = qrc_intutils_be8to32(&keyparams.key);
995 state.roundkeys[1] = qrc_intutils_be8to32(&keyparams.key[4..]);
996 state.roundkeys[2] = qrc_intutils_be8to32(&keyparams.key[8..]);
997 state.roundkeys[3] = qrc_intutils_be8to32(&keyparams.key[12..]);
998 state.roundkeys[4] = qrc_intutils_be8to32(&keyparams.key[16..]);
999 state.roundkeys[5] = qrc_intutils_be8to32(&keyparams.key[20..]);
1000 state.roundkeys[6] = qrc_intutils_be8to32(&keyparams.key[24..]);
1001 state.roundkeys[7] = qrc_intutils_be8to32(&keyparams.key[28..]);
1002
1003 aes_expand_rot(&mut state.roundkeys, 8, 8, 1);
1005 aes_expand_sub(&mut state.roundkeys, 12, 8);
1006 aes_expand_rot(&mut state.roundkeys, 16, 8, 2);
1007 aes_expand_sub(&mut state.roundkeys, 20, 8);
1008 aes_expand_rot(&mut state.roundkeys, 24, 8, 3);
1009 aes_expand_sub(&mut state.roundkeys, 28, 8);
1010 aes_expand_rot(&mut state.roundkeys, 32, 8, 4);
1011 aes_expand_sub(&mut state.roundkeys, 36, 8);
1012 aes_expand_rot(&mut state.roundkeys, 40, 8, 5);
1013 aes_expand_sub(&mut state.roundkeys, 44, 8);
1014 aes_expand_rot(&mut state.roundkeys, 48, 8, 6);
1015 aes_expand_sub(&mut state.roundkeys, 52, 8);
1016 aes_expand_rot(&mut state.roundkeys, 56, 8, 7);
1017 } else {
1018 state.roundkeys[0] = qrc_intutils_be8to32(&keyparams.key);
1019 state.roundkeys[1] = qrc_intutils_be8to32(&keyparams.key[4..]);
1020 state.roundkeys[2] = qrc_intutils_be8to32(&keyparams.key[8..]);
1021 state.roundkeys[3] = qrc_intutils_be8to32(&keyparams.key[12..]);
1022
1023 aes_expand_rot(&mut state.roundkeys, 4, 4, 1);
1025 aes_expand_rot(&mut state.roundkeys, 8, 4, 2);
1026 aes_expand_rot(&mut state.roundkeys, 12, 4, 3);
1027 aes_expand_rot(&mut state.roundkeys, 16, 4, 4);
1028 aes_expand_rot(&mut state.roundkeys, 20, 4, 5);
1029 aes_expand_rot(&mut state.roundkeys, 24, 4, 6);
1030 aes_expand_rot(&mut state.roundkeys, 28, 4, 7);
1031 aes_expand_rot(&mut state.roundkeys, 32, 4, 8);
1032 aes_expand_rot(&mut state.roundkeys, 36, 4, 9);
1033 aes_expand_rot(&mut state.roundkeys, 40, 4, 10);
1034 }
1035}
1036
1037const fn def_aes_hba256_name() -> [u8; HBA_NAME_LENGTH_MAX] {
1042 if QRC_HBA_KMAC_AUTH {
1043 return [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x48, 0x42, 0x41, 0x2D, 0x52, 0x48, 0x58, 0x53, 0x32, 0x35, 0x36, 0x2D, 0x4B, 0x4D, 0x41, 0x43, 0x32, 0x35, 0x36, 0x00, 0x00, 0x00, 0x00];
1044 } else {
1045 return [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x48, 0x42, 0x41, 0x2D, 0x52, 0x48, 0x58, 0x48, 0x32, 0x35, 0x36, 0x2D, 0x48, 0x4D, 0x41, 0x43, 0x53, 0x48, 0x41, 0x32, 0x32, 0x35, 0x36];
1046 };
1047}
1048const AES_HBA256_NAME: [u8; HBA_NAME_LENGTH] = {
1049 let a = def_aes_hba256_name();
1050 const L: usize = HBA_NAME_LENGTH;
1051 let mut o = [0u8; L];
1052
1053 let mut i = 0;
1054 while i < L {
1055 o[i] = a[i];
1056 i += 1;
1057 }
1058 o
1059};
1060
1061fn aes_hba256_update(state: &mut QrcAesHba256State, input: &[u8], length: usize) {
1062 if QRC_HBA_KMAC_EXTENSION {
1063 qrc_kmac_update(&mut state.kstate, QRC_KECCAK_256_RATE, input, length);
1064 } else {
1065 qrc_hmac256_blockupdate(&mut state.hstate, input, length);
1066 }
1067}
1068
1069fn aes_hba256_finalize(state: &mut QrcAesHba256State, output: &mut [u8]) {
1070 let mkey = &mut [0u8; HBA256_MKEY_LENGTH];
1071 let pctr = &mut [0u8; size_of::<u64>()];
1072 let tmpn = &mut [0u8; HBA_NAME_LENGTH];
1073
1074 let mctr = (QRC_AES_BLOCK_SIZE + state.counter as usize + size_of::<u64>()) as u64;
1076 qrc_intutils_le64to8(pctr, mctr);
1078 aes_hba256_update(state, pctr, size_of::<u64>());
1080
1081 if QRC_HBA_KMAC_AUTH {
1082 qrc_kmac_finalize(&mut state.kstate, QRC_KECCAK_256_RATE, output, QRC_HBA256_MAC_LENGTH);
1084 } else {
1085 qrc_hmac256_blockfinalize(&mut state.hstate, output, &[], 0);
1087 }
1088
1089 qrc_intutils_copy8(tmpn, &AES_HBA256_NAME, HBA_NAME_LENGTH);
1091 qrc_intutils_le64to8(tmpn, state.counter);
1094
1095 if QRC_HBA_KMAC_AUTH {
1096 qrc_cshake256_compute(mkey, HBA256_MKEY_LENGTH, &state.mkey, 32, tmpn, HBA_NAME_LENGTH, &state.cust, state.custlen);
1097 qrc_intutils_copy8(&mut state.mkey, mkey, HBA256_MKEY_LENGTH);
1098 qrc_kmac_initialize(&mut state.kstate, QRC_KECCAK_256_RATE, &mut state.mkey, HBA256_MKEY_LENGTH, &mut [], 0);
1099 } else {
1100 qrc_hkdf256_extract(mkey, &state.mkey, HBA256_MKEY_LENGTH, tmpn, 32);
1102 qrc_hkdf256_expand(&mut state.mkey, 32, mkey, HBA256_MKEY_LENGTH, &state.cust, state.custlen);
1104 }
1105}
1106
1107fn aes_hba256_genkeys(keyparams: QrcAesKeyparams, cprk: &mut [u8], mack: &mut [u8]) {
1108 if QRC_HBA_KMAC_EXTENSION {
1109
1110 let kstate = &mut QrcKeccakState::default();
1111 let sbuf = &mut [0u8; QRC_KECCAK_256_RATE];
1112
1113 qrc_intutils_clear64(&mut kstate.state, QRC_KECCAK_STATE_SIZE);
1114
1115 let rate = QrcKeccakRate::QrcKeccakRate256 as usize;
1116
1117 qrc_cshake_initialize(kstate, rate, &keyparams.key, keyparams.keylen, &AES_HBA256_NAME, HBA_NAME_LENGTH, &keyparams.info, keyparams.infolen);
1119
1120 qrc_cshake_squeezeblocks(kstate, rate, sbuf, 1);
1122 qrc_intutils_copy8(cprk, sbuf, keyparams.keylen);
1123 qrc_cshake_squeezeblocks(kstate, rate, sbuf, 1);
1124 qrc_intutils_copy8(mack, sbuf, HBA256_MKEY_LENGTH);
1125 qrc_intutils_clear64(&mut kstate.state, QRC_KECCAK_STATE_SIZE);
1127
1128 } else {
1129
1130 let kbuf = &mut [0u8; QRC_AES256_KEY_SIZE + HBA256_MKEY_LENGTH];
1131 let genk = &mut [0u8; QRC_HMAC_256_MAC_SIZE];
1132
1133 qrc_hkdf256_extract(genk, &keyparams.key, keyparams.keylen, &AES_HBA256_NAME, HBA_NAME_LENGTH);
1135
1136 qrc_hkdf256_expand(kbuf, QRC_AES256_KEY_SIZE + HBA256_MKEY_LENGTH, genk, QRC_HMAC_256_MAC_SIZE, &keyparams.info, keyparams.infolen);
1138
1139 qrc_intutils_copy8(cprk, kbuf, QRC_AES256_KEY_SIZE);
1141 qrc_intutils_copy8(mack, &kbuf[QRC_AES256_KEY_SIZE..], HBA256_MKEY_LENGTH);
1142
1143 qrc_intutils_clear8(kbuf, QRC_AES256_KEY_SIZE + HBA256_MKEY_LENGTH);
1145
1146 }
1147}