#const #point #ed25519 #evaluation #hashing #codec #curve

const-crypto

A #[no_std] 库,用于 const sha2/sha3 哈希,ed25519 脱曲点评估,以及 bs58 编码/解码,依赖最少

3 个版本 (破坏性)

0.3.0 2024年6月1日
0.2.0 2024年4月28日
0.1.0 2024年4月28日

#268 in 魔法豆

Download history 248/week @ 2024-04-23 50/week @ 2024-04-30 532/week @ 2024-05-07 322/week @ 2024-05-14 58/week @ 2024-05-21 185/week @ 2024-05-28 66/week @ 2024-06-04 68/week @ 2024-06-11 47/week @ 2024-06-18 13/week @ 2024-06-25 46/week @ 2024-07-02 426/week @ 2024-07-09 286/week @ 2024-07-16 476/week @ 2024-07-23 5738/week @ 2024-07-30

每月下载量:7,743
用于 7 个 crate (2 直接)

MIT/Apache

44KB
709

const-crypto

A #[no_std] 库,用于 const sha2/sha3 哈希,ed25519 脱曲点评估,以及 bs58 编码/解码,依赖最少。

特性

  • 我们编写了一个 const 的 Edwards 点分解实现,并使用它提供了一个 const 的曲线在线/离线评估实现。然后使用它构建了一个 const 的 Solana 的 Pubkey::find_program_address 实现。 注意:这个点分解实现不是密码学安全的;它不使用恒定时间的内部数学运算实现,因为它不打算与秘密一起使用。不要重复使用。
  • 将 32 字节数组编码为字符串(反之亦然,即解码)。编码来自 fd_bs58,并为 const/`#[no_std] 做了一些错误修复。
  • 完整的 sha2/sha3 哈希套件。重新导出 sha2-const-stable(由本人撰写)和 keccak-const(由 OffChainLabs 撰写)

用法

文件 examples/pda.rs 简明扼要地演示了所有功能

use const_crypto::{bs58, ed25519, sha2, sha3};

/// Uses const bs58 to roundtrip (decode + encode) system_program ID
pub const PROGRAM_KEY: [u8; 32] = bs58::decode_pubkey("11111111111111111111111111111111");
pub const PROGRAM_KEY_STR: &'static str = bs58::encode_pubkey(&PROGRAM_KEY).str();
const _: () = assert!(ascii_str_eq(
    PROGRAM_KEY_STR,
    "11111111111111111111111111111111"
));

/// Uses const ed25519 (and thus const sha2 internally)
pub const PROGRAM_DERIVED_ADDRESS: [u8; 32] =
    ed25519::derive_program_address(&[b"seed"], &PROGRAM_KEY).0;

// the address is off curve
const _: () = assert!(!ed25519::crypto_unsafe_is_on_curve(
    &PROGRAM_DERIVED_ADDRESS
));

pub fn main() {
    pub const KECCAK_DEMO: [u8; 32] = sha3::Keccak256::new().update(b"const-keccak").finalize();
    pub const SHA3_256_DEMO: [u8; 32] = sha3::Sha3_256::new().update(b"const-sha3").finalize();
    pub const SHA256_DEMO: [u8; 32] = sha2::Sha256::new().update(b"const-sha2").finalize();

    println!("pda      = {PROGRAM_DERIVED_ADDRESS:?}\n");
    println!("keccak   = {KECCAK_DEMO:?}\n");
    println!("sha3_256 = {SHA3_256_DEMO:?}\n");
    println!("sha256   = {SHA256_DEMO:?}\n");
}

/// A utility function used to show round trip is correct
pub const fn ascii_str_eq(a: &str, b: &str) -> bool {
    assert!(a.len() == b.len());
    assert!(a.is_ascii());
    assert!(b.is_ascii());

    let mut i = 0;
    while i < a.len() {
        assert!(a.as_bytes()[i] == b.as_bytes()[i]);
        i += 1
    }
    true
}

依赖

~4.5MB