1 use byte_tools
::{zero, set}
;
3 /// Trait for padding messages divided into blocks
5 /// Pads `block` filled with data up to `pos`
6 fn pad(block
: &mut [u8], pos
: usize);
9 #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
10 /// Error for indicating failed unpadding process
11 pub struct UnpadError
;
13 /// Trait for extracting oringinal message from padded medium
15 /// Unpad given `data` by truncating it according to the used padding.
16 /// In case of the malformed padding will return `UnpadError`
17 fn unpad(data
: &[u8]) -> Result
<&[u8], UnpadError
>;
21 #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
22 pub enum ZeroPadding{}
24 impl Padding
for ZeroPadding
{
26 fn pad(block
: &mut [u8], pos
: usize) {
27 zero(&mut block
[pos
..])
31 impl Unpadding
for ZeroPadding
{
33 fn unpad(data
: &[u8]) -> Result
<&[u8], UnpadError
> {
34 let mut n
= data
.len() - 1;
45 #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
48 impl Padding
for Pkcs7
{
50 fn pad(block
: &mut [u8], pos
: usize) {
51 let n
= block
.len() - pos
;
52 set(&mut block
[pos
..], n
as u8);
56 impl Unpadding
for Pkcs7
{
58 fn unpad(data
: &[u8]) -> Result
<&[u8], UnpadError
> {
59 if data
.is_empty() { return Err(UnpadError); }
63 return Err(UnpadError
)
65 for v
in &data
[l
-n
as usize..l
-1] {
66 if *v
!= n { return Err(UnpadError); }
68 Ok(&data
[..l
-n
as usize])
72 #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
75 impl Padding
for AnsiX923
{
77 fn pad(block
: &mut [u8], pos
: usize) {
78 let n
= block
.len() - 1;
79 zero(&mut block
[pos
..n
]);
80 block
[n
] = (n
- pos
) as u8;
84 impl Unpadding
for AnsiX923
{
86 fn unpad(data
: &[u8]) -> Result
<&[u8], UnpadError
> {
87 if data
.is_empty() { return Err(UnpadError); }
89 let n
= data
[l
-1] as usize;
91 return Err(UnpadError
)
93 for v
in &data
[l
-n
..l
-1] {
94 if *v
!= 0 { return Err(UnpadError); }
102 #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
105 impl Padding
for Iso7816
{
107 fn pad(block
: &mut [u8], pos
: usize) {
108 let n
= block
.len() - pos
;
110 for b
in block
[pos
+1..].iter_mut() {
116 impl Unpadding
for Iso7816
{
117 fn unpad(data
: &[u8]) -> Result
<&[u8], UnpadError
> {
118 if data
.is_empty() { return Err(UnpadError); }
119 let mut n
= data
.len() - 1;
126 if data
[n
] != 0x80 { return Err(UnpadError); }