1use core::{
2 convert::{AsMut, AsRef},
3 mem,
4};
5
6use crate::{error::Error, scalar::Scalar};
7
8pub struct SignatureArray([u8; 6 + 33 + 33], usize);
9
10impl SignatureArray {
11 pub fn new(size: usize) -> Self {
12 SignatureArray([0u8; 6 + 33 + 33], size)
13 }
14
15 pub fn len(&self) -> usize {
16 self.1
17 }
18
19 pub fn is_empty(&self) -> bool {
20 self.len() == 0
21 }
22}
23
24impl AsRef<[u8]> for SignatureArray {
25 fn as_ref(&self) -> &[u8] {
26 &self.0[..self.1]
27 }
28}
29
30impl AsMut<[u8]> for SignatureArray {
31 fn as_mut(&mut self) -> &mut [u8] {
32 &mut self.0[..self.1]
33 }
34}
35
36pub struct Decoder<'a>(&'a [u8], usize);
37
38impl<'a> Decoder<'a> {
39 pub fn new(arr: &'a [u8]) -> Self {
40 Decoder(arr, 0)
41 }
42
43 pub fn remaining_len(&self) -> usize {
44 self.0.len() - self.1
45 }
46
47 pub fn read(&mut self) -> Result<u8, Error> {
48 if self.1 >= self.0.len() {
49 Err(Error::InvalidSignature)
50 } else {
51 let v = self.0[self.1];
52 self.1 += 1;
53 Ok(v)
54 }
55 }
56
57 pub fn peek(&self, forward: usize) -> Result<u8, Error> {
58 if self.1 + forward >= self.0.len() {
59 Err(Error::InvalidSignature)
60 } else {
61 let v = self.0[self.1 + forward];
62 Ok(v)
63 }
64 }
65
66 pub fn peek_slice(&self, len: usize) -> Result<&[u8], Error> {
67 if (len == 0 && self.1 >= self.0.len()) || self.1 + len > self.0.len() {
68 Err(Error::InvalidSignature)
69 } else {
70 let v = &self.0[self.1..(self.1 + len)];
71 Ok(v)
72 }
73 }
74
75 pub fn skip(&mut self, len: usize) -> Result<(), Error> {
76 if (len == 0 && self.1 >= self.0.len()) || self.1 + len > self.0.len() {
77 Err(Error::InvalidSignature)
78 } else {
79 self.1 += len;
80 Ok(())
81 }
82 }
83
84 pub fn read_constructed_sequence(&mut self) -> Result<(), Error> {
85 let v = self.read()?;
86 if v == 0x30 {
87 Ok(())
88 } else {
89 Err(Error::InvalidSignature)
90 }
91 }
92
93 pub fn read_len(&mut self) -> Result<usize, Error> {
94 let b1 = self.read()?;
95 if b1 == 0xff {
96 return Err(Error::InvalidSignature);
97 }
98
99 if b1 & 0x80 == 0 {
101 return Ok(b1 as usize);
102 }
103
104 if b1 == 0x80 {
106 return Err(Error::InvalidSignature);
107 }
108
109 let mut lenleft = (b1 & 0x7f) as usize;
110 if lenleft > self.remaining_len() {
111 return Err(Error::InvalidSignature);
112 }
113
114 if self.peek(0)? == 0 {
115 return Err(Error::InvalidSignature);
117 }
118
119 if lenleft > mem::size_of::<usize>() {
120 return Err(Error::InvalidSignature);
121 }
122
123 let mut ret = 0;
124 while lenleft > 0 {
125 ret = (ret << 8) | (self.read()? as usize);
126 if ret + lenleft > self.remaining_len() {
127 return Err(Error::InvalidSignature);
128 }
129 lenleft -= 1;
130 }
131
132 if ret < 128 {
133 return Err(Error::InvalidSignature);
135 }
136
137 Ok(ret)
138 }
139
140 pub fn read_integer(&mut self) -> Result<Scalar, Error> {
141 if self.read()? != 0x02 {
142 return Err(Error::InvalidSignature);
143 }
144
145 let mut rlen = self.read_len()?;
146 if rlen == 0 || rlen > self.remaining_len() {
147 return Err(Error::InvalidSignature);
148 }
149
150 if self.peek(0)? == 0x00 && rlen > 1 && (self.peek(1)? & 0x80) == 0x00 {
151 return Err(Error::InvalidSignature);
152 }
153
154 if self.peek(0)? == 0xff && rlen > 1 && (self.peek(1)? & 0x80) == 0x00 {
155 return Err(Error::InvalidSignature);
156 }
157
158 let mut overflow = false;
159 if self.peek(0)? & 0x80 == 0x80 {
160 overflow |= true;
161 }
162
163 while rlen > 0 && self.peek(0)? == 0 {
165 rlen -= 1;
166 self.read()?;
167 }
168
169 if rlen > 32 {
170 overflow |= true;
171 }
172
173 let mut int = Scalar::default();
174
175 if !overflow {
176 let mut b32 = [0u8; 32];
177 b32[32 - rlen..].copy_from_slice(self.peek_slice(rlen)?);
178 self.skip(rlen)?;
179
180 overflow |= bool::from(int.set_b32(&b32));
181 }
182
183 if overflow {
184 int = Scalar::default();
185 }
186
187 Ok(int)
188 }
189
190 pub fn read_seq_len_lax(&mut self) -> Result<usize, Error> {
191 let mut len = self.read()?;
192 if len & 0x80 != 0x00 {
193 len -= 0x80;
194 if len as usize > self.remaining_len() {
195 return Err(Error::InvalidSignature);
196 }
197 self.skip(len as usize)?;
198 }
199
200 Ok(len as usize)
201 }
202
203 pub fn read_len_lax(&mut self) -> Result<usize, Error> {
204 let mut ret = 0usize;
205 let mut len = self.read()?;
206 if len & 0x80 != 0x00 {
207 len -= 0x80;
208 if len as usize > self.remaining_len() {
209 return Err(Error::InvalidSignature);
210 }
211 while len > 0 && self.peek(0)? == 0 {
212 self.skip(1)?;
213 len -= 1;
214 }
215 if (len as usize) >= mem::size_of::<usize>() {
216 return Err(Error::InvalidSignature);
217 }
218 while len > 0 {
219 ret = (ret << 8) + (self.read()? as usize);
220 len -= 1;
221 }
222 } else {
223 ret = len as usize;
224 }
225 if ret > self.remaining_len() {
226 return Err(Error::InvalidSignature);
227 }
228
229 Ok(ret)
230 }
231
232 pub fn read_integer_lax(&mut self) -> Result<Scalar, Error> {
233 if self.read()? != 0x02 {
235 return Err(Error::InvalidSignature);
236 }
237
238 let mut len = self.read_len_lax()?;
239
240 while len > 0 && self.peek(0)? == 0 {
242 len -= 1;
243 self.skip(1)?;
244 }
245
246 let mut overflow = false;
247 if len > 32 {
249 overflow |= true;
250 }
251
252 let mut int = Scalar::default();
253
254 if !overflow {
255 let mut b32 = [0u8; 32];
256 b32[32 - len..].copy_from_slice(&self.peek_slice(len)?);
257 self.skip(len)?;
258
259 overflow |= bool::from(int.set_b32(&b32));
260 }
261
262 if overflow {
263 int = Scalar::default();
264 }
265
266 Ok(int)
267 }
268}