/rust/registry/src/index.crates.io-1949cf8c6b5b557f/untrusted-0.9.0/src/input.rs
Line  | Count  | Source  | 
1  |  | // Copyright 2015-2021 Brian Smith.  | 
2  |  | //  | 
3  |  | // Permission to use, copy, modify, and/or distribute this software for any  | 
4  |  | // purpose with or without fee is hereby granted, provided that the above  | 
5  |  | // copyright notice and this permission notice appear in all copies.  | 
6  |  | //  | 
7  |  | // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES  | 
8  |  | // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF  | 
9  |  | // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR  | 
10  |  | // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES  | 
11  |  | // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN  | 
12  |  | // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF  | 
13  |  | // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  | 
14  |  |  | 
15  |  | use crate::{no_panic, Reader}; | 
16  |  |  | 
17  |  | /// A wrapper around `&'a [u8]` that helps in writing panic-free code.  | 
18  |  | ///  | 
19  |  | /// No methods of `Input` will ever panic.  | 
20  |  | ///  | 
21  |  | /// Intentionally avoids implementing `PartialEq` and `Eq` to avoid implicit  | 
22  |  | /// non-constant-time comparisons.  | 
23  |  | #[derive(Clone, Copy)]  | 
24  |  | pub struct Input<'a> { | 
25  |  |     value: no_panic::Slice<'a>,  | 
26  |  | }  | 
27  |  |  | 
28  |  | /// The value is intentionally omitted from the output to avoid leaking  | 
29  |  | /// secrets.  | 
30  |  | impl core::fmt::Debug for Input<'_> { | 
31  | 0  |     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { | 
32  | 0  |         f.debug_struct("Input").finish() | 
33  | 0  |     }  | 
34  |  | }  | 
35  |  |  | 
36  |  | impl<'a> Input<'a> { | 
37  |  |     /// Construct a new `Input` for the given input `bytes`.  | 
38  | 0  |     pub const fn from(bytes: &'a [u8]) -> Self { | 
39  |  |         // This limit is important for avoiding integer overflow. In particular,  | 
40  |  |         // `Reader` assumes that an `i + 1 > i` if `input.value.get(i)` does  | 
41  |  |         // not return `None`. According to the Rust language reference, the  | 
42  |  |         // maximum object size is `core::isize::MAX`, and in practice it is  | 
43  |  |         // impossible to create an object of size `core::usize::MAX` or larger.  | 
44  | 0  |         Self { | 
45  | 0  |             value: no_panic::Slice::new(bytes),  | 
46  | 0  |         }  | 
47  | 0  |     }  | 
48  |  |  | 
49  |  |     /// Returns `true` if the input is empty and false otherwise.  | 
50  |  |     #[inline]  | 
51  | 0  |     pub fn is_empty(&self) -> bool { | 
52  | 0  |         self.value.is_empty()  | 
53  | 0  |     } Unexecuted instantiation: <untrusted::input::Input>::is_empty Unexecuted instantiation: <untrusted::input::Input>::is_empty  | 
54  |  |  | 
55  |  |     /// Returns the length of the `Input`.  | 
56  |  |     #[inline]  | 
57  | 0  |     pub fn len(&self) -> usize { | 
58  | 0  |         self.value.len()  | 
59  | 0  |     } Unexecuted instantiation: <untrusted::input::Input>::len Unexecuted instantiation: <untrusted::input::Input>::len  | 
60  |  |  | 
61  |  |     /// Calls `read` with the given input as a `Reader`, ensuring that `read`  | 
62  |  |     /// consumed the entire input. If `read` does not consume the entire input,  | 
63  |  |     /// `incomplete_read` is returned.  | 
64  | 0  |     pub fn read_all<F, R, E>(&self, incomplete_read: E, read: F) -> Result<R, E>  | 
65  | 0  |     where  | 
66  | 0  |         F: FnOnce(&mut Reader<'a>) -> Result<R, E>,  | 
67  |  |     { | 
68  | 0  |         let mut input = Reader::new(*self);  | 
69  | 0  |         let result = read(&mut input)?;  | 
70  | 0  |         if input.at_end() { | 
71  | 0  |             Ok(result)  | 
72  |  |         } else { | 
73  | 0  |             Err(incomplete_read)  | 
74  |  |         }  | 
75  | 0  |     } Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::rsa::parse_public_key::{closure#0}::{closure#0}, (ring::io::positive::Positive, ring::io::positive::Positive), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::pkcs8::unwrap_key_::{closure#0}::{closure#0}, (untrusted::input::Input, core::option::Option<untrusted::input::Input>), ring::error::key_rejected::KeyRejected>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::ec::suite_b::key_pair_from_pkcs8::{closure#0}::{closure#0}, (untrusted::input::Input, untrusted::input::Input), ring::error::key_rejected::KeyRejected>Unexecuted instantiation: <untrusted::input::Input>::read_all::<<ring::rsa::public_exponent::PublicExponent>::from_be_bytes::{closure#0}, u64, ring::error::key_rejected::KeyRejected>Unexecuted instantiation: <untrusted::input::Input>::read_all::<<ring::rsa::keypair::KeyPair>::from_der::{closure#0}, ring::rsa::keypair::KeyPair, ring::error::key_rejected::KeyRejected>Unexecuted instantiation: <untrusted::input::Input>::read_all::<<ring::ec::suite_b::ecdsa::verification::EcdsaVerificationAlgorithm>::verify_digest::{closure#0}, (untrusted::input::Input, untrusted::input::Input), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::rsa::parse_public_key::{closure#0}, (ring::io::positive::Positive, ring::io::positive::Positive), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::pkcs8::unwrap_key_::{closure#0}, (untrusted::input::Input, core::option::Option<untrusted::input::Input>), ring::error::key_rejected::KeyRejected>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::ec::suite_b::key_pair_from_pkcs8::{closure#0}, (untrusted::input::Input, untrusted::input::Input), ring::error::key_rejected::KeyRejected>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::io::der::bit_string_tagged_with_no_unused_bits::{closure#0}, untrusted::input::Input, ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::rsa::verification::verify_rsa_::{closure#0}, (), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::ec::suite_b::public_key::parse_uncompressed_point::{closure#0}, (ring::ec::suite_b::ops::elem::Elem<ring::ec::suite_b::ops::Q, ring::arithmetic::montgomery::R>, ring::ec::suite_b::ops::elem::Elem<ring::ec::suite_b::ops::Q, ring::arithmetic::montgomery::R>), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::ec::curve25519::ed25519::signing::unwrap_pkcs8::{closure#0}, untrusted::input::Input, ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::ec::suite_b::ecdsa::verification::split_rs_asn1::{closure#0}, (untrusted::input::Input, untrusted::input::Input), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<<ring::rsa::padding::pss::PSS as ring::rsa::padding::Verification>::verify::{closure#0}, (), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<<ring::ec::curve25519::ed25519::verification::EdDSAParameters as ring::signature::VerificationAlgorithm>::verify::{closure#0}, (&[u8; 32], &[u8; 32]), ring::error::unspecified::Unspecified>Unexecuted instantiation: <untrusted::input::Input>::read_all::<<ring::rsa::keypair::KeyPair>::from_der_reader, ring::rsa::keypair::KeyPair, ring::error::key_rejected::KeyRejected> Unexecuted instantiation: <untrusted::input::Input>::read_all::<ring::io::der::bit_string_with_no_unused_bits, untrusted::input::Input, ring::error::unspecified::Unspecified> Unexecuted instantiation: <untrusted::input::Input>::read_all::<_, _, _>  | 
76  |  |  | 
77  |  |     /// Access the input as a slice so it can be processed by functions that  | 
78  |  |     /// are not written using the Input/Reader framework.  | 
79  |  |     #[inline]  | 
80  | 0  |     pub fn as_slice_less_safe(&self) -> &'a [u8] { | 
81  | 0  |         self.value.as_slice_less_safe()  | 
82  | 0  |     } Unexecuted instantiation: <untrusted::input::Input>::as_slice_less_safe Unexecuted instantiation: <untrusted::input::Input>::as_slice_less_safe  | 
83  |  |  | 
84  | 0  |     pub(super) fn into_value(self) -> no_panic::Slice<'a> { | 
85  | 0  |         self.value  | 
86  | 0  |     }  | 
87  |  | }  | 
88  |  |  | 
89  |  | impl<'a> From<&'a [u8]> for Input<'a> { | 
90  |  |     #[inline]  | 
91  | 0  |     fn from(value: &'a [u8]) -> Self { | 
92  | 0  |         no_panic::Slice::new(value).into()  | 
93  | 0  |     }  | 
94  |  | }  | 
95  |  |  | 
96  |  | impl<'a> From<no_panic::Slice<'a>> for Input<'a> { | 
97  |  |     #[inline]  | 
98  | 0  |     fn from(value: no_panic::Slice<'a>) -> Self { | 
99  | 0  |         Self { value } | 
100  | 0  |     } Unexecuted instantiation: <untrusted::input::Input as core::convert::From<untrusted::no_panic::Slice>>::from Unexecuted instantiation: <untrusted::input::Input as core::convert::From<untrusted::no_panic::Slice>>::from  | 
101  |  | }  |