msecret 0.1.2

A reference implementation of MSecret key derivation, written in pure Rust. Includes a helpful command-line utility.
Documentation
// MSecret
//
// Copyright 2023 Robert Quattlebaum
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use crate::prelude_internal::*;

pub trait ExtractBytes {
    /// Extracts pseudo-randomly generated bytes into the mutable output slice.
    fn extract_bytes_into(&self, output: &mut [u8]) -> Result<()>;

    /// Extracts pseudo-randomly generated bytes into a returned `Vec<u8>`.
    fn extract_bytes(&self, len: usize) -> Result<Vec<u8>> {
        let mut ret = vec![0; len];
        self.extract_bytes_into(ret.as_mut_slice())?;
        Ok(ret)
    }
}

impl ExtractBytes for Secret {
    fn extract_bytes_into(&self, output: &mut [u8]) -> Result<()> {
        let info = b"\x00Bytes_v1";
        let hk = Hkdf::<Sha256>::from_prk(self.as_bytes()).unwrap();
        hk.expand(info, output).unwrap();
        Ok(())
    }
}