Как преобразовать хеш crypto :: sha2 :: Sha256 в представление & [u8]? - PullRequest
0 голосов
/ 26 апреля 2018

Я сейчас пытаюсь сгенерировать пару ключей ED25519 из хэша SHA256 (через rust-crypto ящик):

extern crate crypto; // rust-crypto = "0.2.36"

use crypto::ed25519;
use crypto::sha2::Sha256;
use crypto::digest::Digest;

fn main() {
    let phrase = "purchase hobby popular celery evil fantasy someone party position gossip host gather";
    let mut seed = Sha256::new();
    seed.input_str(&phrase);
    let (_priv, _publ) = ed25519::keypair(&seed); // expects slice
}

Однако я совершенно не понимаю, как правильно передать SHA256 в функцию ed25519::keypair(). Я проследил, что &seed.result_str() приводит к:

"fc37862cb425ca4368e8e368c54bb6ea0a1f305a225978564d1bdabdc7d99bdb"

Это правильный хеш, а &seed.result_str().as_bytes() приводит к:

[102, 99, 51, 55, 56, 54, 50, 99, 98, 52, 50, 53, 99, 97, 52, 51, 54, 56, 101, 56, 101, 51, 54, 56, 99, 53, 52, 98, 98, 54, 101, 97, 48, 97, 49, 102, 51, 48, 53, 97, 50, 50, 53, 57, 55, 56, 53, 54, 52, 100, 49, 98, 100, 97, 98, 100, 99, 55, 100, 57, 57, 98, 100, 98]

Что-то, чего я не хочу, что-то совершенно другое. Теперь вопрос сводится к:

   |
36 |     let (_priv, _publ) = ed25519::keypair(&seed);
   |                                           ^^^^^ expected slice, found struct `crypto::sha2::Sha256`
   |
   = note: expected type `&[u8]`
              found type `&crypto::sha2::Sha256`

Как правильно преобразовать хеш crypto::sha2::Sha256 в представление [u8]?

1 Ответ

0 голосов
/ 26 апреля 2018

Поначалу API Sha256 может показаться немного запутанным, поскольку он спроектирован так, что не выделяет никакой новой памяти для данных. Это позволит избежать напрасной траты памяти, если вы хотите выделить ее самостоятельно. Вместо этого вы даете ему буфер для записи:

// Create a buffer in which to write the bytes, making sure it's
// big enough for the size of the hash
let mut bytes = vec![0; seed.output_bytes()];
// Write the raw bytes from the hash into the buffer
seed.result(&mut bytes);

// A reference to a Vec can be coerced to a slice
let (_priv, _publ) = ed25519::keypair(&bytes);
...