initial setup for bssl crate with hmac and sha2 bindings
- update rust folder to split into `bssl` and `bssl-sys`
- add initial bindings for hmac and a subset of sha2
Change-Id: I09e0e778c1590de6818a49e19529ceb011e4d9f6
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57285
Reviewed-by: Bob Beck <bbe@google.com>
Commit-Queue: Bob Beck <bbe@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs
new file mode 100644
index 0000000..166f999
--- /dev/null
+++ b/rust/bssl-crypto/src/lib.rs
@@ -0,0 +1,118 @@
+/* Copyright (c) 2023, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#![deny(
+ missing_docs,
+ clippy::indexing_slicing,
+ clippy::unwrap_used,
+ clippy::panic,
+ clippy::expect_used
+)]
+
+//! Rust boringssl binding
+
+extern crate core;
+use core::ops::Not;
+
+/// BoringSSL implemented hmac operations.
+pub mod hmac;
+
+/// BoringSSL implemented hash functions.
+pub mod digest;
+
+/// Used for handling result types from C APIs.
+trait PanicResultHandler {
+ /// Panics if a C api returns an invalid result
+ /// Used for APIs which return error codes for allocation failures.
+ fn panic_if_error(&self);
+}
+
+impl PanicResultHandler for i32 {
+ /// BoringSSL APIs return 1 on success or 0 on allocation failure.
+ #[allow(clippy::expect_used)]
+ fn panic_if_error(&self) {
+ self.gt(&0).then_some(()).expect("allocation failed!")
+ }
+}
+
+impl<T> PanicResultHandler for *mut T {
+ /// Boringssl APIs return NULL on allocation failure for APIs that return a CTX.
+ #[allow(clippy::expect_used)]
+ fn panic_if_error(&self) {
+ self.is_null()
+ .not()
+ .then_some(())
+ .expect("allocation failed!")
+ }
+}
+
+struct CSlice<'a>(&'a [u8]);
+
+impl CSlice<'_> {
+ pub fn as_ptr<T>(&self) -> *const T {
+ if self.0.is_empty() {
+ std::ptr::null()
+ } else {
+ self.0.as_ptr() as *const T
+ }
+ }
+}
+
+impl<'a> From<&'a [u8]> for CSlice<'a> {
+ fn from(value: &'a [u8]) -> Self {
+ Self(value)
+ }
+}
+
+/// A helper trait implemented by types which reference borrowed foreign types.
+///
+/// # Safety
+///
+/// Implementations of `ForeignTypeRef` must guarantee the following:
+///
+/// - `Self::from_ptr(x).as_ptr() == x`
+/// - `Self::from_mut_ptr(x).as_ptr() == x`
+unsafe trait ForeignTypeRef: Sized {
+ /// The raw C type.
+ type CType;
+
+ /// Constructs a shared instance of this type from its raw type.
+ ///
+ /// # Safety
+ ///
+ /// `ptr` must be a valid, immutable, instance of the type for the `'a` lifetime.
+ #[inline]
+ unsafe fn from_ptr<'a>(ptr: *mut Self::CType) -> &'a Self {
+ debug_assert!(!ptr.is_null());
+ &*(ptr as *mut _)
+ }
+
+ /// Constructs a mutable reference of this type from its raw type.
+ ///
+ /// # Safety
+ ///
+ /// `ptr` must be a valid, unique, instance of the type for the `'a` lifetime.
+ #[inline]
+ unsafe fn from_ptr_mut<'a>(ptr: *mut Self::CType) -> &'a mut Self {
+ debug_assert!(!ptr.is_null());
+ &mut *(ptr as *mut _)
+ }
+
+ /// Returns a raw pointer to the wrapped value.
+ #[inline]
+ fn as_ptr(&self) -> *mut Self::CType {
+ self as *const _ as *mut _
+ }
+}