Skip to content

Commit 4870153

Browse files
authored
des: implement weak key test as a free-standing function (#528)
1 parent beb7203 commit 4870153

File tree

7 files changed

+138
-166
lines changed

7 files changed

+138
-166
lines changed

des/CHANGELOG.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## 0.9.0 (UNRELEASED)
99
### Added
10-
- Weak key detection in the `KeyInit::weak_key_test` method ([#465], [#468], [#469], [#470])
10+
- `weak_key_test` function for weak key detection ([#528])
1111

1212
### Changed
1313
- Bump `cipher` dependency to v0.5.0
1414
- Edition changed to 2024 and MSRV bumped to 1.85 ([#472])
1515
- Relax MSRV policy and allow MSRV bumps in patch releases ([#477])
1616

17-
[#465]: https://github.com/RustCrypto/block-ciphers/pull/465
18-
[#468]: https://github.com/RustCrypto/block-ciphers/pull/468
19-
[#469]: https://github.com/RustCrypto/block-ciphers/pull/469
20-
[#470]: https://github.com/RustCrypto/block-ciphers/pull/470
2117
[#472]: https://github.com/RustCrypto/block-ciphers/pull/472
2218
[#477]: https://github.com/RustCrypto/block-ciphers/pull/477
19+
[#528]: https://github.com/RustCrypto/block-ciphers/pull/528
2320

2421
## 0.8.1 (2022-02-17)
2522
### Fixed

des/src/consts.rs

Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -57,76 +57,3 @@ pub const SBOXES: [[u8; 64]; 8] = [
5757
0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11,
5858
],
5959
];
60-
61-
macro_rules! as_ne_u64 {
62-
[$($key:expr,)*] => {
63-
[$(u64::from_ne_bytes($key),)*]
64-
};
65-
}
66-
67-
pub(crate) static WEAK_KEYS: &[u64; 64] = &as_ne_u64![
68-
[0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01],
69-
[0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE],
70-
[0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1],
71-
[0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E],
72-
[0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E],
73-
[0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01],
74-
[0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1],
75-
[0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01],
76-
[0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE],
77-
[0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01],
78-
[0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1],
79-
[0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E],
80-
[0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE],
81-
[0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E],
82-
[0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE],
83-
[0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1],
84-
[0x01, 0x01, 0x1F, 0x1F, 0x01, 0x01, 0x0E, 0x0E],
85-
[0x1F, 0x1F, 0x01, 0x01, 0x0E, 0x0E, 0x01, 0x01],
86-
[0xE0, 0xE0, 0x1F, 0x1F, 0xF1, 0xF1, 0x0E, 0x0E],
87-
[0x01, 0x01, 0xE0, 0xE0, 0x01, 0x01, 0xF1, 0xF1],
88-
[0x1F, 0x1F, 0xE0, 0xE0, 0x0E, 0x0E, 0xF1, 0xF1],
89-
[0xE0, 0xE0, 0xFE, 0xFE, 0xF1, 0xF1, 0xFE, 0xFE],
90-
[0x01, 0x01, 0xFE, 0xFE, 0x01, 0x01, 0xFE, 0xFE],
91-
[0x1F, 0x1F, 0xFE, 0xFE, 0x0E, 0x0E, 0xFE, 0xFE],
92-
[0xE0, 0xFE, 0x01, 0x1F, 0xF1, 0xFE, 0x01, 0x0E],
93-
[0x01, 0x1F, 0x1F, 0x01, 0x01, 0x0E, 0x0E, 0x01],
94-
[0x1F, 0xE0, 0x01, 0xFE, 0x0E, 0xF1, 0x01, 0xFE],
95-
[0xE0, 0xFE, 0x1F, 0x01, 0xF1, 0xFE, 0x0E, 0x01],
96-
[0x01, 0x1F, 0xE0, 0xFE, 0x01, 0x0E, 0xF1, 0xFE],
97-
[0x1F, 0xE0, 0xE0, 0x1F, 0x0E, 0xF1, 0xF1, 0x0E],
98-
[0xE0, 0xFE, 0xFE, 0xE0, 0xF1, 0xFE, 0xFE, 0xF1],
99-
[0x01, 0x1F, 0xFE, 0xE0, 0x01, 0x0E, 0xFE, 0xF1],
100-
[0x1F, 0xE0, 0xFE, 0x01, 0x0E, 0xF1, 0xFE, 0x01],
101-
[0xFE, 0x01, 0x01, 0xFE, 0xFE, 0x01, 0x01, 0xFE],
102-
[0x01, 0xE0, 0x1F, 0xFE, 0x01, 0xF1, 0x0E, 0xFE],
103-
[0x1F, 0xFE, 0x01, 0xE0, 0x0E, 0xFE, 0x01, 0xF1],
104-
[0xFE, 0x01, 0x1F, 0xE0, 0xFE, 0x01, 0x0E, 0xF1],
105-
[0xFE, 0x01, 0xE0, 0x1F, 0xFE, 0x01, 0xF1, 0x0E],
106-
[0x1F, 0xFE, 0xE0, 0x01, 0x0E, 0xFE, 0xF1, 0x01],
107-
[0xFE, 0x1F, 0x01, 0xE0, 0xFE, 0x0E, 0x01, 0xF1],
108-
[0x01, 0xE0, 0xE0, 0x01, 0x01, 0xF1, 0xF1, 0x01],
109-
[0x1F, 0xFE, 0xFE, 0x1F, 0x0E, 0xFE, 0xFE, 0x0E],
110-
[0xFE, 0x1F, 0xE0, 0x01, 0xFE, 0x0E, 0xF1, 0x01],
111-
[0x01, 0xE0, 0xFE, 0x1F, 0x01, 0xF1, 0xFE, 0x0E],
112-
[0xE0, 0x01, 0x01, 0xE0, 0xF1, 0x01, 0x01, 0xF1],
113-
[0xFE, 0x1F, 0x1F, 0xFE, 0xFE, 0x0E, 0x0E, 0xFE],
114-
[0x01, 0xFE, 0x1F, 0xE0, 0x01, 0xFE, 0x0E, 0xF1],
115-
[0xE0, 0x01, 0x1F, 0xFE, 0xF1, 0x01, 0x0E, 0xFE],
116-
[0xFE, 0xE0, 0x01, 0x1F, 0xFE, 0xF1, 0x01, 0x0E],
117-
[0x01, 0xFE, 0xE0, 0x1F, 0x01, 0xFE, 0xF1, 0x0E],
118-
[0xE0, 0x01, 0xFE, 0x1F, 0xF1, 0x01, 0xFE, 0x0E],
119-
[0xFE, 0xE0, 0x1F, 0x01, 0xFE, 0xF1, 0x0E, 0x01],
120-
[0x01, 0xFE, 0xFE, 0x01, 0x01, 0xFE, 0xFE, 0x01],
121-
[0xE0, 0x1F, 0x01, 0xFE, 0xF1, 0x0E, 0x01, 0xFE],
122-
[0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xF1, 0xF1, 0xFE],
123-
[0x1F, 0x01, 0x01, 0x1F, 0x0E, 0x01, 0x01, 0x0E],
124-
[0xE0, 0x1F, 0x1F, 0xE0, 0xF1, 0x0E, 0x0E, 0xF1],
125-
[0xFE, 0xFE, 0x01, 0x01, 0xFE, 0xFE, 0x01, 0x01],
126-
[0x1F, 0x01, 0xE0, 0xFE, 0x0E, 0x01, 0xF1, 0xFE],
127-
[0xE0, 0x1F, 0xFE, 0x01, 0xF1, 0x0E, 0xFE, 0x01],
128-
[0xFE, 0xFE, 0x1F, 0x1F, 0xFE, 0xFE, 0x0E, 0x0E],
129-
[0x1F, 0x01, 0xFE, 0xE0, 0x0E, 0x01, 0xFE, 0xF1],
130-
[0xE0, 0xE0, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01],
131-
[0xFE, 0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xF1, 0xF1],
132-
];

des/src/des.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use cipher::{
77
BlockCipherEncBackend, BlockCipherEncClosure, BlockCipherEncrypt, BlockSizeUser, InOut, Key,
88
KeyInit, KeySizeUser, ParBlocksSizeUser,
99
consts::{U1, U8},
10-
crypto_common::WeakKeyError,
1110
};
1211
use core::fmt;
1312

@@ -50,15 +49,6 @@ impl KeyInit for Des {
5049
let keys = gen_keys(u64::from_be_bytes(key.0));
5150
Self { keys }
5251
}
53-
54-
#[inline]
55-
fn weak_key_test(key: &Key<Self>) -> Result<(), WeakKeyError> {
56-
let key = u64::from_ne_bytes(key.0);
57-
match super::weak_key_test(key) {
58-
0 => Ok(()),
59-
_ => Err(WeakKeyError),
60-
}
61-
}
6252
}
6353

6454
impl BlockSizeUser for Des {

des/src/lib.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,8 @@ mod consts;
2727
mod des;
2828
mod tdes;
2929
mod utils;
30+
mod weak_key;
3031

3132
pub use crate::des::Des;
3233
pub use crate::tdes::{TdesEde2, TdesEde3, TdesEee2, TdesEee3};
33-
34-
/// Checks whether the key is weak.
35-
///
36-
/// Returns 1 if the key is weak; otherwise, returns 0.
37-
fn weak_key_test(key: u64) -> u8 {
38-
let mut is_weak = 0u8;
39-
for &weak_key in crate::consts::WEAK_KEYS {
40-
is_weak |= u8::from(key == weak_key);
41-
}
42-
is_weak
43-
}
34+
pub use weak_key::{WeakKeyError, weak_key_test};

des/src/tdes.rs

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,12 @@ use cipher::{
66
BlockCipherEncBackend, BlockCipherEncClosure, BlockCipherEncrypt, BlockSizeUser, InOut, Key,
77
KeyInit, KeySizeUser, ParBlocksSizeUser,
88
consts::{U1, U8, U16, U24},
9-
crypto_common::WeakKeyError,
109
};
1110
use core::fmt;
1211

1312
#[cfg(feature = "zeroize")]
1413
use cipher::zeroize::ZeroizeOnDrop;
1514

16-
#[inline]
17-
fn weak_key_test2(key: &[u8; 16]) -> Result<(), WeakKeyError> {
18-
let k1 = u64::from_ne_bytes(key[..8].try_into().unwrap());
19-
let k2 = u64::from_ne_bytes(key[8..16].try_into().unwrap());
20-
21-
let mut is_weak = 0u8;
22-
is_weak |= super::weak_key_test(k1);
23-
is_weak |= super::weak_key_test(k2);
24-
is_weak |= u8::from(k1 == k2);
25-
26-
match is_weak {
27-
0 => Ok(()),
28-
_ => Err(WeakKeyError),
29-
}
30-
}
31-
32-
#[inline]
33-
fn weak_key_test3(key: &[u8; 24]) -> Result<(), WeakKeyError> {
34-
let k1 = u64::from_ne_bytes(key[..8].try_into().unwrap());
35-
let k2 = u64::from_ne_bytes(key[8..16].try_into().unwrap());
36-
let k3 = u64::from_ne_bytes(key[16..24].try_into().unwrap());
37-
38-
let mut is_weak = 0u8;
39-
is_weak |= super::weak_key_test(k1);
40-
is_weak |= super::weak_key_test(k2);
41-
is_weak |= super::weak_key_test(k3);
42-
is_weak |= u8::from(k1 == k2);
43-
is_weak |= u8::from(k1 == k3);
44-
is_weak |= u8::from(k2 == k3);
45-
46-
match is_weak {
47-
0 => Ok(()),
48-
_ => Err(WeakKeyError),
49-
}
50-
}
51-
5215
/// Triple DES (3DES) block cipher.
5316
#[derive(Clone)]
5417
pub struct TdesEde3 {
@@ -72,11 +35,6 @@ impl KeyInit for TdesEde3 {
7235
let d3 = Des { keys: gen_keys(k3) };
7336
Self { d1, d2, d3 }
7437
}
75-
76-
#[inline]
77-
fn weak_key_test(key: &Key<Self>) -> Result<(), WeakKeyError> {
78-
weak_key_test3(&key.0)
79-
}
8038
}
8139

8240
impl BlockSizeUser for TdesEde3 {
@@ -161,11 +119,6 @@ impl KeyInit for TdesEee3 {
161119
let d3 = Des { keys: gen_keys(k3) };
162120
Self { d1, d2, d3 }
163121
}
164-
165-
#[inline]
166-
fn weak_key_test(key: &Key<Self>) -> Result<(), WeakKeyError> {
167-
weak_key_test3(&key.0)
168-
}
169122
}
170123

171124
impl BlockSizeUser for TdesEee3 {
@@ -247,11 +200,6 @@ impl KeyInit for TdesEde2 {
247200
let d2 = Des { keys: gen_keys(k2) };
248201
Self { d1, d2 }
249202
}
250-
251-
#[inline]
252-
fn weak_key_test(key: &Key<Self>) -> Result<(), WeakKeyError> {
253-
weak_key_test2(&key.0)
254-
}
255203
}
256204

257205
impl BlockSizeUser for TdesEde2 {
@@ -333,11 +281,6 @@ impl KeyInit for TdesEee2 {
333281
let d2 = Des { keys: gen_keys(k2) };
334282
Self { d1, d2 }
335283
}
336-
337-
#[inline]
338-
fn weak_key_test(key: &Key<Self>) -> Result<(), WeakKeyError> {
339-
weak_key_test2(&key.0)
340-
}
341284
}
342285

343286
impl BlockSizeUser for TdesEee2 {

des/src/weak_key.rs

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
use core::fmt;
2+
3+
/// Checks whether `key` contains one of the known [weak DES keys][TCG].
4+
///
5+
/// [TCG]: https://trustedcomputinggroup.org/wp-content/uploads/TPM-2.0-1.83-Part-1-Architecture.pdf#page=82
6+
///
7+
/// # Panics
8+
/// If `key` length is not equal to 8, 16, or 24.
9+
#[inline]
10+
pub fn weak_key_test(key: &[u8]) -> Result<(), WeakKeyError> {
11+
assert!(
12+
matches!(key.len(), 8 | 16 | 24),
13+
"key size is not equal to 8, 16, or 24 bytes"
14+
);
15+
16+
let mut is_weak = 0u8;
17+
18+
for subkey in key.chunks_exact(8) {
19+
let key = u64::from_ne_bytes(subkey.try_into().expect("`subkey` length is equal to 8"));
20+
for &weak_key in WEAK_KEYS {
21+
is_weak |= u8::from(key == weak_key);
22+
}
23+
}
24+
25+
match key.len() {
26+
16 => {
27+
is_weak |= u8::from(key[..8] == key[8..]);
28+
}
29+
24 => {
30+
let k1 = &key[..8];
31+
let k2 = &key[8..16];
32+
let k3 = &key[16..];
33+
is_weak |= u8::from(k1 == k2);
34+
is_weak |= u8::from(k1 == k3);
35+
is_weak |= u8::from(k2 == k3);
36+
}
37+
_ => {}
38+
}
39+
40+
match is_weak {
41+
0 => Ok(()),
42+
_ => Err(WeakKeyError),
43+
}
44+
}
45+
46+
/// The error type returned when a key is found to be weak.
47+
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
48+
pub struct WeakKeyError;
49+
50+
impl fmt::Display for WeakKeyError {
51+
#[inline]
52+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
53+
f.write_str("WeakKey")
54+
}
55+
}
56+
57+
impl core::error::Error for WeakKeyError {}
58+
59+
macro_rules! as_ne_u64 {
60+
[$($key:expr,)*] => {
61+
[$(u64::from_ne_bytes($key),)*]
62+
};
63+
}
64+
65+
pub(crate) static WEAK_KEYS: &[u64; 64] = &as_ne_u64![
66+
[0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01],
67+
[0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE],
68+
[0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1],
69+
[0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E],
70+
[0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E],
71+
[0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01],
72+
[0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1],
73+
[0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01],
74+
[0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE],
75+
[0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01],
76+
[0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1],
77+
[0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E],
78+
[0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE],
79+
[0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E],
80+
[0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE],
81+
[0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1],
82+
[0x01, 0x01, 0x1F, 0x1F, 0x01, 0x01, 0x0E, 0x0E],
83+
[0x1F, 0x1F, 0x01, 0x01, 0x0E, 0x0E, 0x01, 0x01],
84+
[0xE0, 0xE0, 0x1F, 0x1F, 0xF1, 0xF1, 0x0E, 0x0E],
85+
[0x01, 0x01, 0xE0, 0xE0, 0x01, 0x01, 0xF1, 0xF1],
86+
[0x1F, 0x1F, 0xE0, 0xE0, 0x0E, 0x0E, 0xF1, 0xF1],
87+
[0xE0, 0xE0, 0xFE, 0xFE, 0xF1, 0xF1, 0xFE, 0xFE],
88+
[0x01, 0x01, 0xFE, 0xFE, 0x01, 0x01, 0xFE, 0xFE],
89+
[0x1F, 0x1F, 0xFE, 0xFE, 0x0E, 0x0E, 0xFE, 0xFE],
90+
[0xE0, 0xFE, 0x01, 0x1F, 0xF1, 0xFE, 0x01, 0x0E],
91+
[0x01, 0x1F, 0x1F, 0x01, 0x01, 0x0E, 0x0E, 0x01],
92+
[0x1F, 0xE0, 0x01, 0xFE, 0x0E, 0xF1, 0x01, 0xFE],
93+
[0xE0, 0xFE, 0x1F, 0x01, 0xF1, 0xFE, 0x0E, 0x01],
94+
[0x01, 0x1F, 0xE0, 0xFE, 0x01, 0x0E, 0xF1, 0xFE],
95+
[0x1F, 0xE0, 0xE0, 0x1F, 0x0E, 0xF1, 0xF1, 0x0E],
96+
[0xE0, 0xFE, 0xFE, 0xE0, 0xF1, 0xFE, 0xFE, 0xF1],
97+
[0x01, 0x1F, 0xFE, 0xE0, 0x01, 0x0E, 0xFE, 0xF1],
98+
[0x1F, 0xE0, 0xFE, 0x01, 0x0E, 0xF1, 0xFE, 0x01],
99+
[0xFE, 0x01, 0x01, 0xFE, 0xFE, 0x01, 0x01, 0xFE],
100+
[0x01, 0xE0, 0x1F, 0xFE, 0x01, 0xF1, 0x0E, 0xFE],
101+
[0x1F, 0xFE, 0x01, 0xE0, 0x0E, 0xFE, 0x01, 0xF1],
102+
[0xFE, 0x01, 0x1F, 0xE0, 0xFE, 0x01, 0x0E, 0xF1],
103+
[0xFE, 0x01, 0xE0, 0x1F, 0xFE, 0x01, 0xF1, 0x0E],
104+
[0x1F, 0xFE, 0xE0, 0x01, 0x0E, 0xFE, 0xF1, 0x01],
105+
[0xFE, 0x1F, 0x01, 0xE0, 0xFE, 0x0E, 0x01, 0xF1],
106+
[0x01, 0xE0, 0xE0, 0x01, 0x01, 0xF1, 0xF1, 0x01],
107+
[0x1F, 0xFE, 0xFE, 0x1F, 0x0E, 0xFE, 0xFE, 0x0E],
108+
[0xFE, 0x1F, 0xE0, 0x01, 0xFE, 0x0E, 0xF1, 0x01],
109+
[0x01, 0xE0, 0xFE, 0x1F, 0x01, 0xF1, 0xFE, 0x0E],
110+
[0xE0, 0x01, 0x01, 0xE0, 0xF1, 0x01, 0x01, 0xF1],
111+
[0xFE, 0x1F, 0x1F, 0xFE, 0xFE, 0x0E, 0x0E, 0xFE],
112+
[0x01, 0xFE, 0x1F, 0xE0, 0x01, 0xFE, 0x0E, 0xF1],
113+
[0xE0, 0x01, 0x1F, 0xFE, 0xF1, 0x01, 0x0E, 0xFE],
114+
[0xFE, 0xE0, 0x01, 0x1F, 0xFE, 0xF1, 0x01, 0x0E],
115+
[0x01, 0xFE, 0xE0, 0x1F, 0x01, 0xFE, 0xF1, 0x0E],
116+
[0xE0, 0x01, 0xFE, 0x1F, 0xF1, 0x01, 0xFE, 0x0E],
117+
[0xFE, 0xE0, 0x1F, 0x01, 0xFE, 0xF1, 0x0E, 0x01],
118+
[0x01, 0xFE, 0xFE, 0x01, 0x01, 0xFE, 0xFE, 0x01],
119+
[0xE0, 0x1F, 0x01, 0xFE, 0xF1, 0x0E, 0x01, 0xFE],
120+
[0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xF1, 0xF1, 0xFE],
121+
[0x1F, 0x01, 0x01, 0x1F, 0x0E, 0x01, 0x01, 0x0E],
122+
[0xE0, 0x1F, 0x1F, 0xE0, 0xF1, 0x0E, 0x0E, 0xF1],
123+
[0xFE, 0xFE, 0x01, 0x01, 0xFE, 0xFE, 0x01, 0x01],
124+
[0x1F, 0x01, 0xE0, 0xFE, 0x0E, 0x01, 0xF1, 0xFE],
125+
[0xE0, 0x1F, 0xFE, 0x01, 0xF1, 0x0E, 0xFE, 0x01],
126+
[0xFE, 0xFE, 0x1F, 0x1F, 0xFE, 0xFE, 0x0E, 0x0E],
127+
[0x1F, 0x01, 0xFE, 0xE0, 0x0E, 0x01, 0xFE, 0xF1],
128+
[0xE0, 0xE0, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01],
129+
[0xFE, 0xFE, 0xE0, 0xE0, 0xFE, 0xFE, 0xF1, 0xF1],
130+
];

0 commit comments

Comments
 (0)