|
Tor
0.4.7.0-alpha-dev
|
Functions for deriving keys from human-readable passphrases. More...
#include "lib/crypt_ops/crypto_cipher.h"#include "lib/crypt_ops/crypto_digest.h"#include "lib/crypt_ops/crypto_hkdf.h"#include "lib/crypt_ops/crypto_rand.h"#include "lib/crypt_ops/crypto_s2k.h"#include "lib/crypt_ops/crypto_util.h"#include "lib/ctime/di_ops.h"#include "lib/log/util_bug.h"#include "lib/intmath/cmp.h"#include <string.h>Go to the source code of this file.
Functions | |
| static int | secret_to_key_spec_len (uint8_t type) |
| static int | secret_to_key_key_len (uint8_t type) |
| static int | secret_to_key_get_type (const uint8_t *spec_and_key, size_t spec_and_key_len, int key_included, int *legacy_out) |
| static int | make_specifier (uint8_t *spec_out, uint8_t type, unsigned flags) |
| void | secret_to_key_rfc2440 (char *key_out, size_t key_out_len, const char *secret, size_t secret_len, const char *s2k_specifier) |
| STATIC int | secret_to_key_compute_key (uint8_t *key_out, size_t key_out_len, const uint8_t *spec, size_t spec_len, const char *secret, size_t secret_len, int type) |
| int | secret_to_key_derivekey (uint8_t *key_out, size_t key_out_len, const uint8_t *spec, size_t spec_len, const char *secret, size_t secret_len) |
| int | secret_to_key_make_specifier (uint8_t *buf, size_t buf_len, unsigned flags) |
| int | secret_to_key_new (uint8_t *buf, size_t buf_len, size_t *len_out, const char *secret, size_t secret_len, unsigned flags) |
| int | secret_to_key_check (const uint8_t *spec_and_key, size_t spec_and_key_len, const char *secret, size_t secret_len) |
Functions for deriving keys from human-readable passphrases.
Definition in file crypto_s2k.c.
|
static |
Write a new random s2k specifier of type type, without prefixing type byte, to spec_out, which must have enough room. May adjust parameter choice based on flags.
Definition at line 159 of file crypto_s2k.c.
| int secret_to_key_check | ( | const uint8_t * | spec_and_key, |
| size_t | spec_and_key_len, | ||
| const char * | secret, | ||
| size_t | secret_len | ||
| ) |
Given a hashed passphrase in spec_and_key of length spec_and_key_len as generated by secret_to_key_new(), verify whether it is a hash of the passphrase secret of length secret_len. Return S2K_OKAY on a match, S2K_BAD_SECRET on a well-formed hash that doesn't match this secret, and another error code on other errors.
Definition at line 486 of file crypto_s2k.c.
| STATIC int secret_to_key_compute_key | ( | uint8_t * | key_out, |
| size_t | key_out_len, | ||
| const uint8_t * | spec, | ||
| size_t | spec_len, | ||
| const char * | secret, | ||
| size_t | secret_len, | ||
| int | type | ||
| ) |
Helper: given a valid specifier without prefix type byte in spec, whose length must be correct, and given a secret passphrase secret of length secret_len, compute the key and store it into key_out, which must have enough room for secret_to_key_key_len(type) bytes. Return the number of bytes written on success and an error code on failure.
Definition at line 258 of file crypto_s2k.c.
| int secret_to_key_derivekey | ( | uint8_t * | key_out, |
| size_t | key_out_len, | ||
| const uint8_t * | spec, | ||
| size_t | spec_len, | ||
| const char * | secret, | ||
| size_t | secret_len | ||
| ) |
Given a specifier previously constructed with secret_to_key_make_specifier in spec of length spec_len, and a secret password in secret of length secret_len, generate key_out_len bytes of cryptographic material in key_out. The native output of the secret-to-key function will be truncated if key_out_len is short, and expanded with HKDF if key_out_len is long. Returns S2K_OKAY on success, and an error code on failure.
Definition at line 370 of file crypto_s2k.c.
|
static |
Given a specifier in spec_and_key of length spec_and_key_len, along with its prefix algorithm ID byte, and along with a key if key_included is true, check whether the whole specifier-and-key is of valid length, and return the algorithm type if it is. Set *legacy_out to 1 iff this is a legacy password hash or legacy specifier. Return an error code on failure.
Definition at line 117 of file crypto_s2k.c.
|
static |
Given an algorithm ID (one of S2K_TYPE_*), return the length of the its preferred output.
Definition at line 92 of file crypto_s2k.c.
| int secret_to_key_make_specifier | ( | uint8_t * | buf, |
| size_t | buf_len, | ||
| unsigned | flags | ||
| ) |
Construct a new s2k algorithm specifier and salt in buf, according to the bitwise-or of some S2K_FLAG_* options in flags. Up to buf_len bytes of storage may be used in buf. Return the number of bytes used on success and an error code on failure.
Definition at line 405 of file crypto_s2k.c.
| int secret_to_key_new | ( | uint8_t * | buf, |
| size_t | buf_len, | ||
| size_t * | len_out, | ||
| const char * | secret, | ||
| size_t | secret_len, | ||
| unsigned | flags | ||
| ) |
Hash a passphrase from secret of length secret_len, according to the bitwise-or of some S2K_FLAG_* options in flags, and store the hash along with salt and hashing parameters into buf. Up to buf_len bytes of storage may be used in buf. Set *len_out to the number of bytes used and return S2K_OKAY on success; and return an error code on failure.
Definition at line 442 of file crypto_s2k.c.
| void secret_to_key_rfc2440 | ( | char * | key_out, |
| size_t | key_out_len, | ||
| const char * | secret, | ||
| size_t | secret_len, | ||
| const char * | s2k_specifier | ||
| ) |
Implement RFC2440-style iterated-salted S2K conversion: convert the secret_len-byte secret into a key_out_len byte key_out. As in RFC2440, the first 8 bytes of s2k_specifier are a salt; the 9th byte describes how much iteration to do. If key_out_len > DIGEST_LEN, use HDKF to expand the result.
Definition at line 203 of file crypto_s2k.c.
Referenced by do_hash_password().
|
static |
Given an algorithm ID (one of S2K_TYPE_*), return the length of the specifier part of it, without the prefix type byte. Return -1 if it is not a valid algorithm ID.
Definition at line 75 of file crypto_s2k.c.