1#![allow(clippy::cast_possible_truncation)]
2
3use ::core::fmt::Display;
4use ::core::future::Future;
5
6use tokio::io::{AsyncRead, AsyncReadExt as _, AsyncWrite, AsyncWriteExt as _};
7use tokio_util::bytes::{Buf as _, BytesMut};
8use tokio_util::codec::{Decoder, Encoder};
9
10#[derive(Debug)]
12pub struct Overflow<const N: usize>;
13
14impl Display for Overflow<8> {
15 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16 write!(f, "varint overflows an 8-bit integer")
17 }
18}
19
20impl std::error::Error for Overflow<8> {}
21
22impl Display for Overflow<16> {
23 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24 write!(f, "varint overflows a 16-bit integer")
25 }
26}
27
28impl std::error::Error for Overflow<16> {}
29
30impl Display for Overflow<32> {
31 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32 write!(f, "varint overflows a 32-bit integer")
33 }
34}
35
36impl std::error::Error for Overflow<32> {}
37
38impl Display for Overflow<64> {
39 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40 write!(f, "varint overflows a 64-bit integer")
41 }
42}
43
44impl std::error::Error for Overflow<64> {}
45
46impl Display for Overflow<128> {
47 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48 write!(f, "varint overflows a 128-bit integer")
49 }
50}
51
52impl std::error::Error for Overflow<128> {}
53
54#[derive(Debug)]
56pub struct OverflowVar(u8);
57
58impl Display for OverflowVar {
59 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60 write!(f, "varint overflows a {}-bit integer", self.0)
61 }
62}
63
64impl std::error::Error for OverflowVar {}
65
66fn invalid_data(err: impl Sync + Send + std::error::Error + 'static) -> std::io::Error {
67 std::io::Error::new(std::io::ErrorKind::InvalidData, err)
68}
69
70pub trait AsyncReadLeb128: AsyncRead {
71 #[cfg_attr(
72 feature = "tracing",
73 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u8"))
74 )]
75 fn read_u8_leb128(&mut self) -> impl Future<Output = std::io::Result<u8>>
76 where
77 Self: Unpin,
78 {
79 async move {
80 let mut x = 0;
81 let mut s = 0u8;
82 for _ in 0..2 {
83 let b = self.read_u8().await?;
84 if s == 7 && b > 0x01 {
85 return Err(invalid_data(Overflow::<8>));
86 }
87 x |= (b & 0x7f) << s;
88 if b & 0x80 == 0 {
89 return Ok(x);
90 }
91 s += 7;
92 }
93 Err(invalid_data(Overflow::<8>))
94 }
95 }
96
97 #[cfg_attr(
98 feature = "tracing",
99 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u16"))
100 )]
101 fn read_u16_leb128(&mut self) -> impl Future<Output = std::io::Result<u16>>
102 where
103 Self: Unpin,
104 {
105 async move {
106 let mut x = 0;
107 let mut s = 0u8;
108 for _ in 0..3 {
109 let b = self.read_u8().await?;
110 if s == 14 && b > 0x03 {
111 return Err(invalid_data(Overflow::<16>));
112 }
113 x |= (u16::from(b) & 0x7f) << s;
114 if b & 0x80 == 0 {
115 return Ok(x);
116 }
117 s += 7;
118 }
119 Err(invalid_data(Overflow::<16>))
120 }
121 }
122
123 #[cfg_attr(
124 feature = "tracing",
125 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u32"))
126 )]
127 fn read_u32_leb128(&mut self) -> impl Future<Output = std::io::Result<u32>>
128 where
129 Self: Unpin,
130 {
131 async move {
132 let mut x = 0;
133 let mut s = 0u8;
134 for _ in 0..5 {
135 let b = self.read_u8().await?;
136 if s == 28 && b > 0x0f {
137 return Err(invalid_data(Overflow::<32>));
138 }
139 x |= (u32::from(b) & 0x7f) << s;
140 if b & 0x80 == 0 {
141 return Ok(x);
142 }
143 s += 7;
144 }
145 Err(invalid_data(Overflow::<32>))
146 }
147 }
148
149 #[cfg_attr(
150 feature = "tracing",
151 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u64"))
152 )]
153 fn read_u64_leb128(&mut self) -> impl Future<Output = std::io::Result<u64>>
154 where
155 Self: Unpin,
156 {
157 async move {
158 let mut x = 0;
159 let mut s = 0u8;
160 for _ in 0..10 {
161 let b = self.read_u8().await?;
162 if s == 63 && b > 0x01 {
163 return Err(invalid_data(Overflow::<64>));
164 }
165 x |= (u64::from(b) & 0x7f) << s;
166 if b & 0x80 == 0 {
167 return Ok(x);
168 }
169 s += 7;
170 }
171 Err(invalid_data(Overflow::<64>))
172 }
173 }
174
175 #[cfg_attr(
176 feature = "tracing",
177 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u128"))
178 )]
179 fn read_u128_leb128(&mut self) -> impl Future<Output = std::io::Result<u128>>
180 where
181 Self: Unpin,
182 {
183 async move {
184 let mut x = 0;
185 let mut s = 0u8;
186 for _ in 0..19 {
187 let b = self.read_u8().await?;
188 if s == 126 && b > 0x03 {
189 return Err(invalid_data(Overflow::<128>));
190 }
191 x |= (u128::from(b) & 0x7f) << s;
192 if b & 0x80 == 0 {
193 return Ok(x);
194 }
195 s += 7;
196 }
197 Err(invalid_data(Overflow::<128>))
198 }
199 }
200
201 #[cfg_attr(
202 feature = "tracing",
203 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "uvarint", n))
204 )]
205 fn read_var_u8_leb128(&mut self, n: u8) -> impl Future<Output = std::io::Result<u8>>
206 where
207 Self: Unpin,
208 {
209 async move {
210 if n == 8 {
211 return self.read_u8_leb128().await;
212 }
213 debug_assert!(n <= 8);
214 let max = (n / 7) + 1;
215 let mut x = 0u8;
216 let mut s = 0u8;
217 for _ in 0..max {
218 let b = self.read_u8().await?;
219 if s == (n / 7) * 7 && b > n % 7 {
220 return Err(invalid_data(OverflowVar(n)));
221 }
222 x |= (b & 0x7f) << s;
223 if b & 0x80 == 0 {
224 return Ok(x);
225 }
226 s += 7;
227 }
228 Err(invalid_data(OverflowVar(n)))
229 }
230 }
231
232 #[cfg_attr(
233 feature = "tracing",
234 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "uvarint", n))
235 )]
236 fn read_var_u16_leb128(&mut self, n: u8) -> impl Future<Output = std::io::Result<u16>>
237 where
238 Self: Unpin,
239 {
240 async move {
241 match n {
242 8 => return self.read_u8_leb128().await.map(Into::into),
243 16 => return self.read_u16_leb128().await,
244 _ => {}
245 }
246 debug_assert!(n <= 16);
247 let max = (n / 7) + 1;
248 let mut x = 0;
249 let mut s = 0u8;
250 for _ in 0..max {
251 let b = self.read_u8().await?;
252 if s == (n / 7) * 7 && b > n % 7 {
253 return Err(invalid_data(OverflowVar(n)));
254 }
255 x |= (u16::from(b) & 0x7f) << s;
256 if b & 0x80 == 0 {
257 return Ok(x);
258 }
259 s += 7;
260 }
261 Err(invalid_data(OverflowVar(n)))
262 }
263 }
264
265 #[cfg_attr(
266 feature = "tracing",
267 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "uvarint", n))
268 )]
269 fn read_var_u32_leb128(&mut self, n: u8) -> impl Future<Output = std::io::Result<u32>>
270 where
271 Self: Unpin,
272 {
273 async move {
274 match n {
275 8 => return self.read_u8_leb128().await.map(Into::into),
276 16 => return self.read_u16_leb128().await.map(Into::into),
277 32 => return self.read_u32_leb128().await,
278 _ => {}
279 }
280 debug_assert!(n <= 32);
281 let max = (n / 7) + 1;
282 let mut x = 0;
283 let mut s = 0u8;
284 for _ in 0..max {
285 let b = self.read_u8().await?;
286 if s == (n / 7) * 7 && b > n % 7 {
287 return Err(invalid_data(OverflowVar(n)));
288 }
289 x |= (u32::from(b) & 0x7f) << s;
290 if b & 0x80 == 0 {
291 return Ok(x);
292 }
293 s += 7;
294 }
295 Err(invalid_data(OverflowVar(n)))
296 }
297 }
298
299 #[cfg_attr(
300 feature = "tracing",
301 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "uvarint", n))
302 )]
303 fn read_var_u64_leb128(&mut self, n: u8) -> impl Future<Output = std::io::Result<u64>>
304 where
305 Self: Unpin,
306 {
307 async move {
308 match n {
309 8 => return self.read_u8_leb128().await.map(Into::into),
310 16 => return self.read_u16_leb128().await.map(Into::into),
311 32 => return self.read_u32_leb128().await.map(Into::into),
312 64 => return self.read_u64_leb128().await,
313 _ => {}
314 }
315 debug_assert!(n <= 64);
316 let max = (n / 7) + 1;
317 let mut x = 0;
318 let mut s = 0u8;
319 for _ in 0..max {
320 let b = self.read_u8().await?;
321 if s == (n / 7) * 7 && b > n % 7 {
322 return Err(invalid_data(OverflowVar(n)));
323 }
324 x |= (u64::from(b) & 0x7f) << s;
325 if b & 0x80 == 0 {
326 return Ok(x);
327 }
328 s += 7;
329 }
330 Err(invalid_data(OverflowVar(n)))
331 }
332 }
333
334 #[cfg_attr(
335 feature = "tracing",
336 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "uvarint", n))
337 )]
338 fn read_var_u128_leb128(&mut self, n: u8) -> impl Future<Output = std::io::Result<u128>>
339 where
340 Self: Unpin,
341 {
342 async move {
343 match n {
344 8 => return self.read_u8_leb128().await.map(Into::into),
345 16 => return self.read_u16_leb128().await.map(Into::into),
346 32 => return self.read_u32_leb128().await.map(Into::into),
347 64 => return self.read_u64_leb128().await.map(Into::into),
348 128 => return self.read_u128_leb128().await,
349 _ => {}
350 }
351 debug_assert!(n <= 128);
352 let max = (n / 7) + 1;
353 let mut x = 0;
354 let mut s = 0u8;
355 for _ in 0..max {
356 let b = self.read_u8().await?;
357 if s == (n / 7) * 7 && b > n % 7 {
358 return Err(invalid_data(OverflowVar(n)));
359 }
360 x |= (u128::from(b) & 0x7f) << s;
361 if b & 0x80 == 0 {
362 return Ok(x);
363 }
364 s += 7;
365 }
366 Err(invalid_data(OverflowVar(n)))
367 }
368 }
369
370 #[cfg_attr(
371 feature = "tracing",
372 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i8"))
373 )]
374 fn read_i8_leb128(&mut self) -> impl Future<Output = std::io::Result<i8>>
375 where
376 Self: Unpin,
377 {
378 async move {
379 let mut x = 0;
380 let mut s = 0u8;
381 for _ in 0..2 {
382 let b = self.read_u8().await?;
383 if s == 7 && b > 0x01 {
384 return Err(invalid_data(Overflow::<8>));
385 }
386 x |= ((b as i8) & 0x7f) << s;
387 s += 7;
388 if b & 0x80 == 0 {
389 if s != 14 && b & 0x40 != 0 {
390 return Ok(x | !0 << s);
391 } else {
392 return Ok(x);
393 }
394 }
395 }
396 Err(invalid_data(Overflow::<8>))
397 }
398 }
399
400 #[cfg_attr(
401 feature = "tracing",
402 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i16"))
403 )]
404 fn read_i16_leb128(&mut self) -> impl Future<Output = std::io::Result<i16>>
405 where
406 Self: Unpin,
407 {
408 async move {
409 let mut x = 0;
410 let mut s = 0u8;
411 for _ in 0..3 {
412 let b = self.read_u8().await?;
413 if s == 14 && b > 0x03 {
414 return Err(invalid_data(Overflow::<16>));
415 }
416 x |= (i16::from(b) & 0x7f) << s;
417 s += 7;
418 if b & 0x80 == 0 {
419 if s != 21 && b & 0x40 != 0 {
420 return Ok(x | !0 << s);
421 } else {
422 return Ok(x);
423 }
424 }
425 }
426 Err(invalid_data(Overflow::<16>))
427 }
428 }
429
430 #[cfg_attr(
431 feature = "tracing",
432 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i32"))
433 )]
434 fn read_i32_leb128(&mut self) -> impl Future<Output = std::io::Result<i32>>
435 where
436 Self: Unpin,
437 {
438 async move {
439 let mut x = 0;
440 let mut s = 0u8;
441 for _ in 0..5 {
442 let b = self.read_u8().await?;
443 if s == 28 && b > 0x0f {
444 return Err(invalid_data(Overflow::<32>));
445 }
446 x |= (i32::from(b) & 0x7f) << s;
447 s += 7;
448 if b & 0x80 == 0 {
449 if s != 35 && b & 0x40 != 0 {
450 return Ok(x | !0 << s);
451 } else {
452 return Ok(x);
453 }
454 }
455 }
456 Err(invalid_data(Overflow::<32>))
457 }
458 }
459
460 #[cfg_attr(
461 feature = "tracing",
462 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i64"))
463 )]
464 fn read_i64_leb128(&mut self) -> impl Future<Output = std::io::Result<i64>>
465 where
466 Self: Unpin,
467 {
468 async move {
469 let mut x = 0;
470 let mut s = 0u8;
471 for _ in 0..10 {
472 let b = self.read_u8().await?;
473 if s == 63 && b > 0x01 {
474 return Err(invalid_data(Overflow::<64>));
475 }
476 x |= (i64::from(b) & 0x7f) << s;
477 s += 7;
478 if b & 0x80 == 0 {
479 if s != 70 && b & 0x40 != 0 {
480 return Ok(x | !0 << s);
481 } else {
482 return Ok(x);
483 }
484 }
485 }
486 Err(invalid_data(Overflow::<64>))
487 }
488 }
489
490 #[cfg_attr(
491 feature = "tracing",
492 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i128"))
493 )]
494 fn read_i128_leb128(&mut self) -> impl Future<Output = std::io::Result<i128>>
495 where
496 Self: Unpin,
497 {
498 async move {
499 let mut x = 0;
500 let mut s = 0u8;
501 for _ in 0..19 {
502 let b = self.read_u8().await?;
503 if s == 126 && b > 0x03 {
504 return Err(invalid_data(Overflow::<128>));
505 }
506 x |= (i128::from(b) & 0x7f) << s;
507 s += 7;
508 if b & 0x80 == 0 {
509 if s != 133 && b & 0x40 != 0 {
510 return Ok(x | !0 << s);
511 } else {
512 return Ok(x);
513 }
514 }
515 }
516 Err(invalid_data(Overflow::<128>))
517 }
518 }
519}
520
521impl<T: AsyncRead> AsyncReadLeb128 for T {}
522
523pub fn put_u8_leb128(buf: &mut [u8; 2], mut x: u8) -> &mut [u8] {
524 let mut i = 0;
525 while x >= 0x80 {
526 buf[i] = x | 0x80;
527 x >>= 7;
528 i += 1;
529 }
530 buf[i] = x;
531 &mut buf[..=i]
532}
533
534pub fn put_u16_leb128(buf: &mut [u8; 3], mut x: u16) -> &mut [u8] {
535 let mut i = 0;
536 while x >= 0x80 {
537 buf[i] = (x as u8) | 0x80;
538 x >>= 7;
539 i += 1;
540 }
541 buf[i] = x as u8;
542 &mut buf[..=i]
543}
544
545pub fn put_u32_leb128(buf: &mut [u8; 5], mut x: u32) -> &mut [u8] {
546 let mut i = 0;
547 while x >= 0x80 {
548 buf[i] = (x as u8) | 0x80;
549 x >>= 7;
550 i += 1;
551 }
552 buf[i] = x as u8;
553 &mut buf[..=i]
554}
555
556pub fn put_u64_leb128(buf: &mut [u8; 10], mut x: u64) -> &mut [u8] {
557 let mut i = 0;
558 while x >= 0x80 {
559 buf[i] = (x as u8) | 0x80;
560 x >>= 7;
561 i += 1;
562 }
563 buf[i] = x as u8;
564 &mut buf[..=i]
565}
566
567pub fn put_u128_leb128(buf: &mut [u8; 19], mut x: u128) -> &mut [u8] {
568 let mut i = 0;
569 while x >= 0x80 {
570 buf[i] = (x as u8) | 0x80;
571 x >>= 7;
572 i += 1;
573 }
574 buf[i] = x as u8;
575 &mut buf[..=i]
576}
577
578pub fn put_i8_leb128(buf: &mut [u8; 2], mut x: i8) -> &mut [u8] {
579 let mut i = 0;
580 loop {
581 let b = x as u8;
582 x >>= 6;
583 if x == 0 || x == !0 {
584 buf[i] = b & 0x7f;
585 return &mut buf[..=i];
586 } else {
587 buf[i] = b | 0x80;
588 x >>= 1;
589 }
590 i += 1;
591 }
592}
593
594pub fn put_i16_leb128(buf: &mut [u8; 3], mut x: i16) -> &mut [u8] {
595 let mut i = 0;
596 loop {
597 let b = x as u8;
598 x >>= 6;
599 if x == 0 || x == !0 {
600 buf[i] = b & 0x7f;
601 return &mut buf[..=i];
602 } else {
603 buf[i] = b | 0x80;
604 x >>= 1;
605 }
606 i += 1;
607 }
608}
609
610pub fn put_i32_leb128(buf: &mut [u8; 5], mut x: i32) -> &mut [u8] {
611 let mut i = 0;
612 loop {
613 let b = x as u8;
614 x >>= 6;
615 if x == 0 || x == !0 {
616 buf[i] = b & 0x7f;
617 return &mut buf[..=i];
618 } else {
619 buf[i] = b | 0x80;
620 x >>= 1;
621 }
622 i += 1;
623 }
624}
625
626pub fn put_i64_leb128(buf: &mut [u8; 10], mut x: i64) -> &mut [u8] {
627 let mut i = 0;
628 loop {
629 let b = x as u8;
630 x >>= 6;
631 if x == 0 || x == !0 {
632 buf[i] = b & 0x7f;
633 return &mut buf[..=i];
634 } else {
635 buf[i] = b | 0x80;
636 x >>= 1;
637 }
638 i += 1;
639 }
640}
641
642pub fn put_i128_leb128(buf: &mut [u8; 19], mut x: i128) -> &mut [u8] {
643 let mut i = 0;
644 loop {
645 let b = x as u8;
646 x >>= 6;
647 if x == 0 || x == !0 {
648 buf[i] = b & 0x7f;
649 return &mut buf[..=i];
650 } else {
651 buf[i] = b | 0x80;
652 x >>= 1;
653 }
654 i += 1;
655 }
656}
657
658pub trait AsyncWriteLeb128: AsyncWrite {
659 #[cfg_attr(
660 feature = "tracing",
661 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u8"))
662 )]
663 fn write_u8_leb128(&mut self, x: u8) -> impl Future<Output = std::io::Result<()>>
664 where
665 Self: Unpin,
666 {
667 async move {
668 self.write_all(put_u8_leb128(&mut Default::default(), x))
669 .await
670 }
671 }
672
673 #[cfg_attr(
674 feature = "tracing",
675 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u16"))
676 )]
677 fn write_u16_leb128(&mut self, x: u16) -> impl Future<Output = std::io::Result<()>>
678 where
679 Self: Unpin,
680 {
681 async move {
682 self.write_all(put_u16_leb128(&mut Default::default(), x))
683 .await
684 }
685 }
686
687 #[cfg_attr(
688 feature = "tracing",
689 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u32"))
690 )]
691 fn write_u32_leb128(&mut self, x: u32) -> impl Future<Output = std::io::Result<()>>
692 where
693 Self: Unpin,
694 {
695 async move {
696 self.write_all(put_u32_leb128(&mut Default::default(), x))
697 .await
698 }
699 }
700
701 #[cfg_attr(
702 feature = "tracing",
703 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u64"))
704 )]
705 fn write_u64_leb128(&mut self, x: u64) -> impl Future<Output = std::io::Result<()>>
706 where
707 Self: Unpin,
708 {
709 async move {
710 self.write_all(put_u64_leb128(&mut Default::default(), x))
711 .await
712 }
713 }
714
715 #[cfg_attr(
716 feature = "tracing",
717 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "u128"))
718 )]
719 fn write_u128_leb128(&mut self, x: u128) -> impl Future<Output = std::io::Result<()>>
720 where
721 Self: Unpin,
722 {
723 async move {
724 self.write_all(put_u128_leb128(&mut Default::default(), x))
725 .await
726 }
727 }
728
729 #[cfg_attr(
730 feature = "tracing",
731 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i8"))
732 )]
733 fn write_i8_leb128(&mut self, x: i8) -> impl Future<Output = std::io::Result<()>>
734 where
735 Self: Unpin,
736 {
737 async move {
738 self.write_all(put_i8_leb128(&mut Default::default(), x))
739 .await
740 }
741 }
742
743 #[cfg_attr(
744 feature = "tracing",
745 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i16"))
746 )]
747 fn write_i16_leb128(&mut self, x: i16) -> impl Future<Output = std::io::Result<()>>
748 where
749 Self: Unpin,
750 {
751 async move {
752 self.write_all(put_i16_leb128(&mut Default::default(), x))
753 .await
754 }
755 }
756
757 #[cfg_attr(
758 feature = "tracing",
759 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i32"))
760 )]
761 fn write_i32_leb128(&mut self, x: i32) -> impl Future<Output = std::io::Result<()>>
762 where
763 Self: Unpin,
764 {
765 async move {
766 self.write_all(put_i32_leb128(&mut Default::default(), x))
767 .await
768 }
769 }
770
771 #[cfg_attr(
772 feature = "tracing",
773 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i64"))
774 )]
775 fn write_i64_leb128(&mut self, x: i64) -> impl Future<Output = std::io::Result<()>>
776 where
777 Self: Unpin,
778 {
779 async move {
780 self.write_all(put_i64_leb128(&mut Default::default(), x))
781 .await
782 }
783 }
784
785 #[cfg_attr(
786 feature = "tracing",
787 tracing::instrument(level = "trace", ret, skip_all, fields(ty = "i128"))
788 )]
789 fn write_i128_leb128(&mut self, x: i128) -> impl Future<Output = std::io::Result<()>>
790 where
791 Self: Unpin,
792 {
793 async move {
794 self.write_all(put_i128_leb128(&mut Default::default(), x))
795 .await
796 }
797 }
798}
799
800impl<T: AsyncWrite> AsyncWriteLeb128 for T {}
801
802pub struct Leb128DecoderU8;
803
804impl Decoder for Leb128DecoderU8 {
805 type Item = u8;
806 type Error = std::io::Error;
807
808 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
809 let mut x = 0;
810 let mut s = 0u8;
811 for i in 0..2 {
812 let Some(b) = src.get(i) else {
813 src.reserve(1);
814 return Ok(None);
815 };
816 if s == 7 && *b > 0x01 {
817 return Err(invalid_data(Overflow::<8>));
818 }
819 x |= (b & 0x7f) << s;
820 if b & 0x80 == 0 {
821 src.advance(i + 1);
822 return Ok(Some(x));
823 }
824 s += 7;
825 }
826 Err(invalid_data(Overflow::<8>))
827 }
828}
829
830pub struct Leb128DecoderU16;
831
832impl Decoder for Leb128DecoderU16 {
833 type Item = u16;
834 type Error = std::io::Error;
835
836 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
837 let mut x = 0;
838 let mut s = 0u8;
839 for i in 0..3 {
840 let Some(b) = src.get(i) else {
841 src.reserve(1);
842 return Ok(None);
843 };
844 if s == 14 && *b > 0x03 {
845 return Err(invalid_data(Overflow::<16>));
846 }
847 x |= (u16::from(*b) & 0x7f) << s;
848 if b & 0x80 == 0 {
849 src.advance(i + 1);
850 return Ok(Some(x));
851 }
852 s += 7;
853 }
854 Err(invalid_data(Overflow::<16>))
855 }
856}
857
858pub struct Leb128DecoderU32;
859
860impl Decoder for Leb128DecoderU32 {
861 type Item = u32;
862 type Error = std::io::Error;
863
864 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
865 let mut x = 0;
866 let mut s = 0u8;
867 for i in 0..5 {
868 let Some(b) = src.get(i) else {
869 src.reserve(1);
870 return Ok(None);
871 };
872 if s == 28 && *b > 0x0f {
873 return Err(invalid_data(Overflow::<32>));
874 }
875 x |= (u32::from(*b) & 0x7f) << s;
876 if b & 0x80 == 0 {
877 src.advance(i + 1);
878 return Ok(Some(x));
879 }
880 s += 7;
881 }
882 Err(invalid_data(Overflow::<32>))
883 }
884}
885
886pub struct Leb128DecoderU64;
887
888impl Decoder for Leb128DecoderU64 {
889 type Item = u64;
890 type Error = std::io::Error;
891
892 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
893 let mut x = 0;
894 let mut s = 0u8;
895 for i in 0..10 {
896 let Some(b) = src.get(i) else {
897 src.reserve(1);
898 return Ok(None);
899 };
900 if s == 63 && *b > 0x01 {
901 return Err(invalid_data(Overflow::<64>));
902 }
903 x |= (u64::from(*b) & 0x7f) << s;
904 if b & 0x80 == 0 {
905 src.advance(i + 1);
906 return Ok(Some(x));
907 }
908 s += 7;
909 }
910 Err(invalid_data(Overflow::<64>))
911 }
912}
913
914pub struct Leb128DecoderU128;
915
916impl Decoder for Leb128DecoderU128 {
917 type Item = u128;
918 type Error = std::io::Error;
919
920 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
921 let mut x = 0;
922 let mut s = 0u8;
923 for i in 0..19 {
924 let Some(b) = src.get(i) else {
925 src.reserve(1);
926 return Ok(None);
927 };
928 if s == 126 && *b > 0x03 {
929 return Err(invalid_data(Overflow::<128>));
930 }
931 x |= (u128::from(*b) & 0x7f) << s;
932 if b & 0x80 == 0 {
933 src.advance(i + 1);
934 return Ok(Some(x));
935 }
936 s += 7;
937 }
938 Err(invalid_data(Overflow::<128>))
939 }
940}
941
942pub struct Leb128DecoderI8;
943
944impl Decoder for Leb128DecoderI8 {
945 type Item = i8;
946 type Error = std::io::Error;
947
948 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
949 let mut x = 0;
950 let mut s = 0u8;
951 for i in 0..2 {
952 let Some(b) = src.get(i).copied() else {
953 src.reserve(1);
954 return Ok(None);
955 };
956 if s == 7 && b > 0x01 {
957 return Err(invalid_data(Overflow::<8>));
958 }
959 x |= ((b as i8) & 0x7f) << s;
960 s += 7;
961 if b & 0x80 == 0 {
962 src.advance(i + 1);
963 if s != 14 && b & 0x40 != 0 {
964 return Ok(Some(x | !0 << s));
965 } else {
966 return Ok(Some(x));
967 }
968 }
969 }
970 Err(invalid_data(Overflow::<8>))
971 }
972}
973
974pub struct Leb128DecoderI16;
975
976impl Decoder for Leb128DecoderI16 {
977 type Item = i16;
978 type Error = std::io::Error;
979
980 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
981 let mut x = 0;
982 let mut s = 0u8;
983 for i in 0..3 {
984 let Some(b) = src.get(i).copied() else {
985 src.reserve(1);
986 return Ok(None);
987 };
988 if s == 14 && b > 0x03 {
989 return Err(invalid_data(Overflow::<16>));
990 }
991 x |= (i16::from(b) & 0x7f) << s;
992 s += 7;
993 if b & 0x80 == 0 {
994 src.advance(i + 1);
995 if s != 21 && b & 0x40 != 0 {
996 return Ok(Some(x | !0 << s));
997 } else {
998 return Ok(Some(x));
999 }
1000 }
1001 }
1002 Err(invalid_data(Overflow::<16>))
1003 }
1004}
1005
1006pub struct Leb128DecoderI32;
1007
1008impl Decoder for Leb128DecoderI32 {
1009 type Item = i32;
1010 type Error = std::io::Error;
1011
1012 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1013 let mut x = 0;
1014 let mut s = 0u8;
1015 for i in 0..5 {
1016 let Some(b) = src.get(i).copied() else {
1017 src.reserve(1);
1018 return Ok(None);
1019 };
1020 if s == 28 && b > 0x0f {
1021 return Err(invalid_data(Overflow::<32>));
1022 }
1023 x |= (i32::from(b) & 0x7f) << s;
1024 s += 7;
1025 if b & 0x80 == 0 {
1026 src.advance(i + 1);
1027 if s != 35 && b & 0x40 != 0 {
1028 return Ok(Some(x | !0 << s));
1029 } else {
1030 return Ok(Some(x));
1031 }
1032 }
1033 }
1034 Err(invalid_data(Overflow::<32>))
1035 }
1036}
1037
1038pub struct Leb128DecoderI64;
1039
1040impl Decoder for Leb128DecoderI64 {
1041 type Item = i64;
1042 type Error = std::io::Error;
1043
1044 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1045 let mut x = 0;
1046 let mut s = 0u8;
1047 for i in 0..10 {
1048 let Some(b) = src.get(i).copied() else {
1049 src.reserve(1);
1050 return Ok(None);
1051 };
1052 if s == 63 && b > 0x01 {
1053 return Err(invalid_data(Overflow::<64>));
1054 }
1055 x |= (i64::from(b) & 0x7f) << s;
1056 s += 7;
1057 if b & 0x80 == 0 {
1058 src.advance(i + 1);
1059 if s != 70 && b & 0x40 != 0 {
1060 return Ok(Some(x | !0 << s));
1061 } else {
1062 return Ok(Some(x));
1063 }
1064 }
1065 }
1066 Err(invalid_data(Overflow::<64>))
1067 }
1068}
1069
1070pub struct Leb128DecoderI128;
1071
1072impl Decoder for Leb128DecoderI128 {
1073 type Item = i128;
1074 type Error = std::io::Error;
1075
1076 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1077 let mut x = 0;
1078 let mut s = 0u8;
1079 for i in 0..19 {
1080 let Some(b) = src.get(i).copied() else {
1081 src.reserve(1);
1082 return Ok(None);
1083 };
1084 if s == 126 && b > 0x03 {
1085 return Err(invalid_data(Overflow::<128>));
1086 }
1087 x |= (i128::from(b) & 0x7f) << s;
1088 s += 7;
1089 if b & 0x80 == 0 {
1090 src.advance(i + 1);
1091 if s != 133 && b & 0x40 != 0 {
1092 return Ok(Some(x | !0 << s));
1093 } else {
1094 return Ok(Some(x));
1095 }
1096 }
1097 }
1098 Err(invalid_data(Overflow::<128>))
1099 }
1100}
1101
1102pub struct Leb128Encoder;
1103
1104macro_rules! impl_encode {
1105 ($t:ty, $f:ident) => {
1106 impl Encoder<$t> for Leb128Encoder {
1107 type Error = std::io::Error;
1108
1109 fn encode(&mut self, item: $t, dst: &mut BytesMut) -> Result<(), Self::Error> {
1110 dst.extend_from_slice($f(&mut Default::default(), item));
1111 Ok(())
1112 }
1113 }
1114
1115 impl Encoder<&$t> for Leb128Encoder {
1116 type Error = std::io::Error;
1117
1118 fn encode(&mut self, item: &$t, dst: &mut BytesMut) -> Result<(), Self::Error> {
1119 self.encode(*item, dst)
1120 }
1121 }
1122
1123 impl Encoder<&&$t> for Leb128Encoder {
1124 type Error = std::io::Error;
1125
1126 fn encode(&mut self, item: &&$t, dst: &mut BytesMut) -> Result<(), Self::Error> {
1127 self.encode(*item, dst)
1128 }
1129 }
1130 };
1131}
1132
1133impl_encode!(u8, put_u8_leb128);
1134impl_encode!(u16, put_u16_leb128);
1135impl_encode!(u32, put_u32_leb128);
1136impl_encode!(u64, put_u64_leb128);
1137impl_encode!(u128, put_u128_leb128);
1138impl_encode!(i8, put_i8_leb128);
1139impl_encode!(i16, put_i16_leb128);
1140impl_encode!(i32, put_i32_leb128);
1141impl_encode!(i64, put_i64_leb128);
1142impl_encode!(i128, put_i128_leb128);
1143
1144#[cfg(test)]
1145mod tests {
1146 use super::*;
1147
1148 #[tokio::test]
1149 async fn unsigned_leb128() {
1150 const ENCODED: [u8; 3] = [0xe5, 0x8e, 0x26];
1151
1152 let v = ENCODED
1153 .as_slice()
1154 .read_u32_leb128()
1155 .await
1156 .expect("failed to read u32");
1157 assert_eq!(v, 624_485);
1158
1159 let v = Leb128DecoderU32
1160 .decode(&mut ENCODED.as_slice().into())
1161 .expect("failed to decode u32");
1162 assert_eq!(v, Some(624_485));
1163
1164 let v = ENCODED
1165 .as_slice()
1166 .read_u64_leb128()
1167 .await
1168 .expect("failed to read u64");
1169 assert_eq!(v, 624_485);
1170
1171 let v = Leb128DecoderU64
1172 .decode(&mut ENCODED.as_slice().into())
1173 .expect("failed to decode u64");
1174 assert_eq!(v, Some(624_485));
1175
1176 let mut buf = vec![];
1177 buf.write_u32_leb128(624_485)
1178 .await
1179 .expect("failed to write u32");
1180 assert_eq!(buf, ENCODED);
1181
1182 let mut buf = vec![];
1183 buf.write_u64_leb128(624_485)
1184 .await
1185 .expect("failed to write u64");
1186 assert_eq!(buf, ENCODED);
1187
1188 let v = [0xff, 0x01]
1189 .as_slice()
1190 .read_u8_leb128()
1191 .await
1192 .expect("failed to read u8");
1193 assert_eq!(v, u8::MAX);
1194
1195 let v = [0x7f]
1196 .as_slice()
1197 .read_u8_leb128()
1198 .await
1199 .expect("failed to read u8");
1200 assert_eq!(v, 0x7f);
1201
1202 let v = [0xff, 0x00]
1203 .as_slice()
1204 .read_u8_leb128()
1205 .await
1206 .expect("failed to read u8");
1207 assert_eq!(v, 0x7f);
1208
1209 [0xff, 0x02]
1210 .as_slice()
1211 .read_u8_leb128()
1212 .await
1213 .expect_err("u8 read should have failed, since it encoded 9 bits");
1214
1215 let v = [0xff, 0xff, 0x01]
1216 .as_slice()
1217 .read_u16_leb128()
1218 .await
1219 .expect("failed to read u16");
1220 assert_eq!(v, 0x7fff);
1221
1222 let v = [0xff, 0xff, 0x02]
1223 .as_slice()
1224 .read_u16_leb128()
1225 .await
1226 .expect("failed to read u16");
1227 assert_eq!(v, 0xbfff);
1228
1229 let v = [0xff, 0xff, 0x03]
1230 .as_slice()
1231 .read_u16_leb128()
1232 .await
1233 .expect("failed to read u16");
1234 assert_eq!(v, u16::MAX);
1235
1236 [0xff, 0xff, 0x04]
1237 .as_slice()
1238 .read_u16_leb128()
1239 .await
1240 .expect_err("u16 read should have failed, since it encoded 17 bits");
1241
1242 let v = [0xff, 0xff, 0xff, 0xff, 0x0f]
1243 .as_slice()
1244 .read_u32_leb128()
1245 .await
1246 .expect("failed to read u32");
1247 assert_eq!(v, u32::MAX);
1248
1249 [0xff, 0xff, 0xff, 0xff, 0x10]
1250 .as_slice()
1251 .read_u32_leb128()
1252 .await
1253 .expect_err("u32 read should have failed, since it encoded 33 bits");
1254
1255 let v = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01]
1256 .as_slice()
1257 .read_u64_leb128()
1258 .await
1259 .expect("failed to read u64");
1260 assert_eq!(v, u64::MAX);
1261
1262 [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02]
1263 .as_slice()
1264 .read_u64_leb128()
1265 .await
1266 .expect_err("u64 read should have failed, since it encoded 65 bits");
1267
1268 let v = [
1269 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1270 0xff, 0xff, 0xff, 0xff, 0x03,
1271 ]
1272 .as_slice()
1273 .read_u128_leb128()
1274 .await
1275 .expect("failed to read u128");
1276 assert_eq!(v, u128::MAX);
1277
1278 [
1279 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1280 0xff, 0xff, 0xff, 0xff, 0x04,
1281 ]
1282 .as_slice()
1283 .read_u128_leb128()
1284 .await
1285 .expect_err("u128 read should have failed, since it encoded 129 bits");
1286 }
1287
1288 #[tokio::test]
1289 async fn signed_leb128() {
1290 const ENCODED: [u8; 3] = [0xc0, 0xbb, 0x78];
1291
1292 let v = ENCODED
1293 .as_slice()
1294 .read_i32_leb128()
1295 .await
1296 .expect("failed to read i32");
1297 assert_eq!(v, -123_456);
1298
1299 let v = ENCODED
1300 .as_slice()
1301 .read_i64_leb128()
1302 .await
1303 .expect("failed to read i64");
1304 assert_eq!(v, -123_456);
1305
1306 let mut buf = vec![];
1307 buf.write_i32_leb128(-123_456)
1308 .await
1309 .expect("failed to write i32");
1310 assert_eq!(buf, ENCODED);
1311
1312 let mut buf = vec![];
1313 buf.write_i64_leb128(-123_456)
1314 .await
1315 .expect("failed to write i64");
1316 assert_eq!(buf, ENCODED);
1317
1318 let mut buf = vec![];
1319 buf.write_i64_leb128(-1).await.expect("failed to write i64");
1320 assert_eq!(buf, [0x7f]);
1321
1322 let mut buf = vec![];
1323 buf.write_i64_leb128(-2).await.expect("failed to write i64");
1324 assert_eq!(buf, [0x7e]);
1325
1326 let v = [0xff, 0x01]
1327 .as_slice()
1328 .read_i8_leb128()
1329 .await
1330 .expect("failed to read i8");
1331 assert_eq!(v, -1);
1332
1333 let v = [0x7f]
1334 .as_slice()
1335 .read_i8_leb128()
1336 .await
1337 .expect("failed to read i8");
1338 assert_eq!(v, -1);
1339
1340 let v = [0xff, 0x00]
1341 .as_slice()
1342 .read_i8_leb128()
1343 .await
1344 .expect("failed to read i8");
1345 assert_eq!(v, 0x7f);
1346
1347 [0xff, 0x02]
1348 .as_slice()
1349 .read_i8_leb128()
1350 .await
1351 .expect_err("i8 read should have failed, since it encoded 9 bits");
1352
1353 let v = [0xff, 0xff, 0x01]
1354 .as_slice()
1355 .read_i16_leb128()
1356 .await
1357 .expect("failed to read i16");
1358 assert_eq!(v, 0x7fff);
1359
1360 let v = [0xff, 0xff, 0x02]
1361 .as_slice()
1362 .read_i16_leb128()
1363 .await
1364 .expect("failed to read i16");
1365 assert_eq!(v, -0x4001);
1366
1367 let v = [0xff, 0xff, 0x03]
1368 .as_slice()
1369 .read_i16_leb128()
1370 .await
1371 .expect("failed to read i16");
1372 assert_eq!(v, -1);
1373
1374 [0xff, 0xff, 0x04]
1375 .as_slice()
1376 .read_i16_leb128()
1377 .await
1378 .expect_err("i16 read should have failed, since it encoded 17 bits");
1379
1380 let v = [0x7f]
1381 .as_slice()
1382 .read_i32_leb128()
1383 .await
1384 .expect("failed to read i32");
1385 assert_eq!(v, -1);
1386
1387 let v = [0x7e]
1388 .as_slice()
1389 .read_i32_leb128()
1390 .await
1391 .expect("failed to read i32");
1392 assert_eq!(v, -2);
1393
1394 let v = [0xff, 0xff, 0xff, 0xff, 0x0f]
1395 .as_slice()
1396 .read_i32_leb128()
1397 .await
1398 .expect("failed to read i32");
1399 assert_eq!(v, -1);
1400
1401 let v = [0xfe, 0xff, 0xff, 0xff, 0x0f]
1402 .as_slice()
1403 .read_i32_leb128()
1404 .await
1405 .expect("failed to read i32");
1406 assert_eq!(v, -2);
1407
1408 [0xff, 0xff, 0xff, 0xff, 0x10]
1409 .as_slice()
1410 .read_i32_leb128()
1411 .await
1412 .expect_err("i32 read should have failed, since it encoded 33 bits");
1413
1414 let v = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01]
1415 .as_slice()
1416 .read_i64_leb128()
1417 .await
1418 .expect("failed to read i64");
1419 assert_eq!(v, -1);
1420
1421 [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02]
1422 .as_slice()
1423 .read_i64_leb128()
1424 .await
1425 .expect_err("i64 read should have failed, since it encoded 65 bits");
1426
1427 let v = [
1428 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1429 0xff, 0xff, 0xff, 0xff, 0x03,
1430 ]
1431 .as_slice()
1432 .read_i128_leb128()
1433 .await
1434 .expect("failed to read i128");
1435 assert_eq!(v, -1);
1436
1437 [
1438 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1439 0xff, 0xff, 0xff, 0xff, 0x04,
1440 ]
1441 .as_slice()
1442 .read_i128_leb128()
1443 .await
1444 .expect_err("i128 read should have failed, since it encoded 129 bits");
1445 }
1446
1447 #[tokio::test]
1448 async fn unsigned() {
1449 let v = [0x01u8]
1450 .as_slice()
1451 .read_var_u8_leb128(2)
1452 .await
1453 .expect("failed to read u2");
1454 assert_eq!(v, 1);
1455
1456 let v = [0x02]
1457 .as_slice()
1458 .read_var_u8_leb128(2)
1459 .await
1460 .expect("failed to read u2");
1461 assert_eq!(v, 2);
1462
1463 [0b100]
1464 .as_slice()
1465 .read_var_u8_leb128(2)
1466 .await
1467 .expect_err("u2 read should have failed, since it encoded 3 bits");
1468
1469 [0x80, 0x80, 0x01]
1470 .as_slice()
1471 .read_var_u16_leb128(9)
1472 .await
1473 .expect_err("u9 read should have failed, since it used over 9 bits");
1474
1475 let v = [0x80, 0x80, 0x80, 0x80, 0x80, 0x01]
1476 .as_slice()
1477 .read_var_u64_leb128(64)
1478 .await
1479 .expect("failed to read u64");
1480 assert_eq!(v, 0b1000_0000_0000_0000_0000_0000_0000_0000_0000);
1481 }
1482}