amaru_kernel/utils/array.rs
1// Copyright 2026 PRAGMA
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::{array::TryFromSliceError, ops::Deref};
16
17use crate::Bytes;
18
19/// Turn any Bytes-like structure into a sized slice. Useful for crypto operation requiring
20/// operands with specific bytes sizes. For example:
21///
22/// # ```
23/// # let public_key: [u8; ed25519::PublicKey::SIZE] = into_sized_array(vkey, |error, expected| {
24/// # InvalidVKeyWitness::InvalidKeySize { error, expected }
25/// # })?;
26/// # ```
27pub fn into_sized_array<const SIZE: usize, E, T>(
28 bytes: T,
29 into_error: impl Fn(TryFromSliceError, usize) -> E,
30) -> Result<[u8; SIZE], E>
31where
32 T: Deref<Target = Bytes>,
33{
34 bytes.deref().as_slice().try_into().map_err(|e| into_error(e, SIZE))
35}