dryoc/classic/
crypto_box_impl.rs

1use zeroize::Zeroize;
2
3use super::crypto_core::crypto_scalarmult;
4use crate::classic::crypto_box::{PublicKey, SecretKey};
5use crate::classic::crypto_core::crypto_core_hsalsa20;
6use crate::classic::crypto_hash::crypto_hash_sha512;
7use crate::classic::crypto_secretbox::Key;
8use crate::constants::{
9    CRYPTO_BOX_SEEDBYTES, CRYPTO_CORE_HSALSA20_INPUTBYTES, CRYPTO_CORE_HSALSA20_OUTPUTBYTES,
10    CRYPTO_HASH_SHA512_BYTES, CRYPTO_SCALARMULT_BYTES,
11};
12use crate::dryocstream::ByteArray;
13use crate::rng::copy_randombytes;
14use crate::scalarmult_curve25519::*;
15
16pub(crate) fn crypto_box_curve25519xsalsa20poly1305_beforenm(
17    public_key: &PublicKey,
18    secret_key: &SecretKey,
19) -> Key {
20    let mut s = [0u8; CRYPTO_SCALARMULT_BYTES];
21    crypto_scalarmult(&mut s, secret_key.as_array(), public_key.as_array());
22
23    let mut hash = [0u8; CRYPTO_CORE_HSALSA20_OUTPUTBYTES];
24    crypto_core_hsalsa20(&mut hash, &[0u8; CRYPTO_CORE_HSALSA20_INPUTBYTES], &s, None);
25
26    hash
27}
28
29#[inline]
30pub(crate) fn crypto_box_curve25519xsalsa20poly1305_keypair_inplace(
31    public_key: &mut PublicKey,
32    secret_key: &mut SecretKey,
33) {
34    copy_randombytes(secret_key);
35    crypto_scalarmult_curve25519_base(public_key, secret_key);
36}
37
38#[inline]
39pub(crate) fn crypto_box_curve25519xsalsa20poly1305_seed_keypair_inplace(
40    public_key: &mut PublicKey,
41    secret_key: &mut SecretKey,
42    seed: &[u8],
43) {
44    let mut hash = [0u8; CRYPTO_HASH_SHA512_BYTES];
45    crypto_hash_sha512(&mut hash, seed);
46
47    secret_key.copy_from_slice(&hash[0..CRYPTO_BOX_SEEDBYTES]);
48
49    hash.zeroize();
50
51    crypto_scalarmult_curve25519_base(public_key, secret_key);
52}
53pub(crate) fn crypto_box_curve25519xsalsa20poly1305_keypair() -> (PublicKey, SecretKey) {
54    let mut secret_key = SecretKey::default();
55    let mut public_key = PublicKey::default();
56
57    crypto_box_curve25519xsalsa20poly1305_keypair_inplace(&mut public_key, &mut secret_key);
58
59    (public_key, secret_key)
60}
61
62pub(crate) fn crypto_box_curve25519xsalsa20poly1305_seed_keypair(
63    seed: &[u8],
64) -> (PublicKey, SecretKey) {
65    let mut secret_key = [0u8; CRYPTO_BOX_SEEDBYTES];
66    let mut public_key = [0u8; CRYPTO_BOX_SEEDBYTES];
67
68    crypto_box_curve25519xsalsa20poly1305_seed_keypair_inplace(
69        &mut public_key,
70        &mut secret_key,
71        seed,
72    );
73
74    (public_key, secret_key)
75}