tor  0.4.2.0-alpha-dev
Data Structures | Macros | Typedefs | Enumerations | Functions
crypto_digest.h File Reference
#include "lib/cc/torint.h"
#include "lib/defs/digest_sizes.h"
#include "lib/malloc/malloc.h"
#include "lib/testsupport/testsupport.h"

Go to the source code of this file.

Data Structures

struct  crypto_digest_checkpoint_t
 
struct  common_digests_t
 

Macros

#define BASE32_DIGEST_LEN   32
 
#define BASE64_DIGEST_LEN   27
 
#define BASE64_DIGEST256_LEN   43
 
#define BASE64_DIGEST512_LEN   86
 
#define HEX_DIGEST_LEN   40
 
#define HEX_DIGEST256_LEN   64
 
#define HEX_DIGEST512_LEN   128
 
#define N_DIGEST_ALGORITHMS   (DIGEST_SHA3_512+1)
 
#define N_COMMON_DIGEST_ALGORITHMS   (DIGEST_SHA256+1)
 
#define DIGEST_CHECKPOINT_BYTES   (SIZEOF_VOID_P + 512)
 
#define crypto_digest_free(d)   FREE_AND_NULL(crypto_digest_t, crypto_digest_free_, (d))
 
#define crypto_xof_free(xof)   FREE_AND_NULL(crypto_xof_t, crypto_xof_free_, (xof))
 

Typedefs

typedef struct crypto_digest_checkpoint_t crypto_digest_checkpoint_t
 
typedef struct crypto_digest_t crypto_digest_t
 
typedef struct crypto_xof_t crypto_xof_t
 

Enumerations

enum  digest_algorithm_t {
  DIGEST_SHA1 = 0, DIGEST_SHA256 = 1, DIGEST_SHA512 = 2, DIGEST_SHA3_256 = 3,
  DIGEST_SHA3_512 = 4
}
 

Functions

 MOCK_DECL (int, crypto_digest,(char *digest, const char *m, size_t len))
 
int crypto_digest256 (char *digest, const char *m, size_t len, digest_algorithm_t algorithm)
 
int crypto_digest512 (char *digest, const char *m, size_t len, digest_algorithm_t algorithm)
 
int crypto_common_digests (common_digests_t *ds_out, const char *m, size_t len)
 
void crypto_digest_smartlist_prefix (char *digest_out, size_t len_out, const char *prepend, const struct smartlist_t *lst, const char *append, digest_algorithm_t alg)
 
void crypto_digest_smartlist (char *digest_out, size_t len_out, const struct smartlist_t *lst, const char *append, digest_algorithm_t alg)
 
const char * crypto_digest_algorithm_get_name (digest_algorithm_t alg)
 
size_t crypto_digest_algorithm_get_length (digest_algorithm_t alg)
 
int crypto_digest_algorithm_parse_name (const char *name)
 
crypto_digest_tcrypto_digest_new (void)
 
crypto_digest_tcrypto_digest256_new (digest_algorithm_t algorithm)
 
crypto_digest_tcrypto_digest512_new (digest_algorithm_t algorithm)
 
void crypto_digest_free_ (crypto_digest_t *digest)
 
void crypto_digest_add_bytes (crypto_digest_t *digest, const char *data, size_t len)
 
void crypto_digest_get_digest (crypto_digest_t *digest, char *out, size_t out_len)
 
crypto_digest_tcrypto_digest_dup (const crypto_digest_t *digest)
 
void crypto_digest_checkpoint (crypto_digest_checkpoint_t *checkpoint, const crypto_digest_t *digest)
 
void crypto_digest_restore (crypto_digest_t *digest, const crypto_digest_checkpoint_t *checkpoint)
 
void crypto_digest_assign (crypto_digest_t *into, const crypto_digest_t *from)
 
void crypto_hmac_sha256 (char *hmac_out, const char *key, size_t key_len, const char *msg, size_t msg_len)
 
void crypto_mac_sha3_256 (uint8_t *mac_out, size_t len_out, const uint8_t *key, size_t key_len, const uint8_t *msg, size_t msg_len)
 
crypto_xof_tcrypto_xof_new (void)
 
void crypto_xof_add_bytes (crypto_xof_t *xof, const uint8_t *data, size_t len)
 
void crypto_xof_squeeze_bytes (crypto_xof_t *xof, uint8_t *out, size_t len)
 
void crypto_xof_free_ (crypto_xof_t *xof)
 
void crypto_xof (uint8_t *output, size_t output_len, const uint8_t *input, size_t input_len)
 

Detailed Description

Headers for crypto_digest.c.

Definition in file crypto_digest.h.

Macro Definition Documentation

◆ BASE32_DIGEST_LEN

#define BASE32_DIGEST_LEN   32

Length of a sha1 message digest when encoded in base32 with trailing = signs removed.

Definition at line 23 of file crypto_digest.h.

◆ BASE64_DIGEST256_LEN

#define BASE64_DIGEST256_LEN   43

Length of a sha256 message digest when encoded in base64 with trailing = signs removed.

Definition at line 29 of file crypto_digest.h.

◆ BASE64_DIGEST512_LEN

#define BASE64_DIGEST512_LEN   86

Length of a sha512 message digest when encoded in base64 with trailing = signs removed.

Definition at line 32 of file crypto_digest.h.

◆ BASE64_DIGEST_LEN

#define BASE64_DIGEST_LEN   27

Length of a sha1 message digest when encoded in base64 with trailing = signs removed.

Definition at line 26 of file crypto_digest.h.

◆ HEX_DIGEST256_LEN

#define HEX_DIGEST256_LEN   64

Length of hex encoding of SHA256 digest, not including final NUL.

Definition at line 37 of file crypto_digest.h.

◆ HEX_DIGEST512_LEN

#define HEX_DIGEST512_LEN   128

Length of hex encoding of SHA512 digest, not including final NUL.

Definition at line 39 of file crypto_digest.h.

◆ HEX_DIGEST_LEN

#define HEX_DIGEST_LEN   40

Length of hex encoding of SHA1 digest, not including final NUL.

Definition at line 35 of file crypto_digest.h.

Typedef Documentation

◆ crypto_digest_checkpoint_t

Structure used to temporarily save the a digest object. Only implemented for SHA1 digest for now.

Function Documentation

◆ crypto_common_digests()

int crypto_common_digests ( common_digests_t ds_out,
const char *  m,
size_t  len 
)

Set the common_digests_t in ds_out to contain every digest on the len bytes in m that we know how to compute. Return 0 on success, -1 on failure.

Definition at line 30 of file crypto_digest.c.

References tor_assert().

Referenced by router_get_hashes_impl().

◆ crypto_digest256()

int crypto_digest256 ( char *  digest,
const char *  m,
size_t  len,
digest_algorithm_t  algorithm 
)

Compute a 256-bit digest of len bytes in data stored in m, using the algorithm algorithm. Write the DIGEST_LEN256-byte result into digest. Return 0 on success, -1 on failure.

Definition at line 117 of file crypto_digest_nss.c.

References tor_assert().

Referenced by router_get_networkstatus_v3_sha3_as_signed().

◆ crypto_digest256_new()

crypto_digest_t* crypto_digest256_new ( digest_algorithm_t  algorithm)

Allocate and return a new digest object to compute 256-bit digests using algorithm.

C_RUST_COUPLED: external::crypto_digest::crypto_digest256_new C_RUST_COUPLED: crypto::digest::Sha256::default

Definition at line 268 of file crypto_digest_nss.c.

References tor_assert().

Referenced by crypto_mac_sha3_256(), dirserv_read_measured_bandwidths(), generate_ope_cipher_for_desc(), and or_handshake_state_record_var_cell().

◆ crypto_digest512()

int crypto_digest512 ( char *  digest,
const char *  m,
size_t  len,
digest_algorithm_t  algorithm 
)

Compute a 512-bit digest of len bytes in data stored in m, using the algorithm algorithm. Write the DIGEST_LEN512-byte result into digest. Return 0 on success, -1 on failure.

Definition at line 141 of file crypto_digest_nss.c.

References tor_assert().

◆ crypto_digest512_new()

crypto_digest_t* crypto_digest512_new ( digest_algorithm_t  algorithm)

Allocate and return a new digest object to compute 512-bit digests using algorithm.

Definition at line 277 of file crypto_digest_nss.c.

References tor_assert().

Referenced by ed25519_keypair_from_curve25519_keypair().

◆ crypto_digest_add_bytes()

void crypto_digest_add_bytes ( crypto_digest_t digest,
const char *  data,
size_t  len 
)

Add len bytes from data to the digest object.

C_RUST_COUPLED: external::crypto_digest::crypto_digest_add_bytess C_RUST_COUPLED: crypto::digest::Sha256::process

Definition at line 304 of file crypto_digest_nss.c.

References crypto_digest_t::algorithm, and tor_assert().

Referenced by crypto_digest_smartlist_prefix(), get_secret_id_part_bytes(), and rend_get_descriptor_id_bytes().

◆ crypto_digest_algorithm_get_length()

size_t crypto_digest_algorithm_get_length ( digest_algorithm_t  alg)

Given an algorithm, return the digest length in bytes.

Definition at line 86 of file crypto_digest.c.

Referenced by crypto_digest_get_digest().

◆ crypto_digest_algorithm_get_name()

const char* crypto_digest_algorithm_get_name ( digest_algorithm_t  alg)

Return the name of an algorithm, as used in directory documents.

Definition at line 44 of file crypto_digest.c.

◆ crypto_digest_algorithm_parse_name()

int crypto_digest_algorithm_parse_name ( const char *  name)

Given the name of a digest algorithm, return its integer value, or -1 if the name is not recognized.

Definition at line 68 of file crypto_digest.c.

◆ crypto_digest_assign()

void crypto_digest_assign ( crypto_digest_t into,
const crypto_digest_t from 
)

Replace the state of the digest object into with the state of the digest object from. Requires that 'into' and 'from' have the same digest type.

Definition at line 446 of file crypto_digest_nss.c.

References crypto_digest_t::algorithm, crypto_digest_alloc_bytes(), crypto_digest_t::d, library_supports_digest(), and tor_assert().

◆ crypto_digest_checkpoint()

void crypto_digest_checkpoint ( crypto_digest_checkpoint_t checkpoint,
const crypto_digest_t digest 
)

Temporarily save the state of digest in checkpoint. Asserts that digest is a SHA1 digest object.

Definition at line 405 of file crypto_digest_nss.c.

References crypto_digest_t::algorithm, crypto_digest_alloc_bytes(), crypto_digest_t::d, library_supports_digest(), and tor_assert().

◆ crypto_digest_dup()

crypto_digest_t* crypto_digest_dup ( const crypto_digest_t digest)

Allocate and return a new digest object with the same state as digest

C_RUST_COUPLED: external::crypto_digest::crypto_digest_dup C_RUST_COUPLED: impl Clone for crypto::digest::Sha256

Definition at line 388 of file crypto_digest_nss.c.

References crypto_digest_t::algorithm, crypto_digest_alloc_bytes(), and tor_assert().

◆ crypto_digest_free_()

void crypto_digest_free_ ( crypto_digest_t digest)

◆ crypto_digest_get_digest()

void crypto_digest_get_digest ( crypto_digest_t digest,
char *  out,
size_t  out_len 
)

Compute the hash of the data that has been passed to the digest object; write the first out_len bytes of the result to out. out_len must be <= DIGEST512_LEN.

C_RUST_COUPLED: external::crypto_digest::crypto_digest_get_digest C_RUST_COUPLED: impl digest::FixedOutput for Sha256

Definition at line 344 of file crypto_digest_nss.c.

References crypto_digest_t::algorithm, crypto_digest_algorithm_get_length(), DIGEST512_LEN, and tor_assert().

Referenced by crypto_digest_smartlist_prefix(), get_secret_id_part_bytes(), and rend_get_descriptor_id_bytes().

◆ crypto_digest_new()

crypto_digest_t* crypto_digest_new ( void  )

Allocate and return a new digest object to compute SHA1 digests.

Definition at line 256 of file crypto_digest_nss.c.

References crypto_digest_new_internal().

Referenced by get_secret_id_part_bytes(), and rend_get_descriptor_id_bytes().

◆ crypto_digest_restore()

void crypto_digest_restore ( crypto_digest_t digest,
const crypto_digest_checkpoint_t checkpoint 
)

Restore the state of digest from checkpoint. Asserts that digest is a SHA1 digest object. Requires that the state was previously stored with crypto_digest_checkpoint()

Definition at line 427 of file crypto_digest_nss.c.

References crypto_digest_t::algorithm, crypto_digest_alloc_bytes(), crypto_digest_t::d, library_supports_digest(), and tor_assert().

◆ crypto_hmac_sha256()

void crypto_hmac_sha256 ( char *  hmac_out,
const char *  key,
size_t  key_len,
const char *  msg,
size_t  msg_len 
)

Compute the HMAC-SHA-256 of the msg_len bytes in msg, using the key of length key_len. Store the DIGEST256_LEN-byte result in hmac_out. Asserts on failure.

Definition at line 504 of file crypto_digest_nss.c.

References DIGEST256_LEN, and tor_assert().

Referenced by crypto_expand_key_material_rfc5869_sha256_legacy(), and h_tweak().

◆ crypto_mac_sha3_256()

void crypto_mac_sha3_256 ( uint8_t *  mac_out,
size_t  len_out,
const uint8_t *  key,
size_t  key_len,
const uint8_t *  msg,
size_t  msg_len 
)

Compute a MAC using SHA3-256 of msg_len bytes in msg using a key of length key_len and a salt of length salt_len. Store the result of len_out bytes in in mac_out. This function can't fail.

Definition at line 110 of file crypto_digest.c.

References crypto_digest256_new(), tor_assert(), and tor_htonll().

◆ crypto_xof()

void crypto_xof ( uint8_t *  output,
size_t  output_len,
const uint8_t *  input,
size_t  input_len 
)

Compute the XOF (SHAKE256) of a input_len bytes at input, putting output_len bytes at output.

Definition at line 226 of file crypto_digest.c.

References crypto_xof_add_bytes(), crypto_xof_new(), crypto_xof_squeeze_bytes(), and tor_assert().

◆ crypto_xof_add_bytes()

void crypto_xof_add_bytes ( crypto_xof_t xof,
const uint8_t *  data,
size_t  len 
)

Absorb bytes into a XOF object. Must not be called after a call to crypto_xof_squeeze_bytes() for the same instance, and will assert if attempted.

Definition at line 183 of file crypto_digest.c.

References tor_assert().

Referenced by crypto_fast_rng_add_entopy(), and crypto_xof().

◆ crypto_xof_free_()

void crypto_xof_free_ ( crypto_xof_t xof)

Cleanse and deallocate a XOF object.

Definition at line 211 of file crypto_digest.c.

References memwipe(), and tor_free.

◆ crypto_xof_new()

crypto_xof_t* crypto_xof_new ( void  )

Allocate a new XOF object backed by SHAKE-256. The security level provided is a function of the length of the output used. Read and understand FIPS-202 A.2 "Additional Consideration for Extendable-Output Functions" before using this construct.

Definition at line 163 of file crypto_digest.c.

Referenced by crypto_fast_rng_add_entopy(), and crypto_xof().

◆ crypto_xof_squeeze_bytes()

void crypto_xof_squeeze_bytes ( crypto_xof_t xof,
uint8_t *  out,
size_t  len 
)

Squeeze bytes out of a XOF object. Calling this routine will render the XOF instance ineligible to absorb further data.

Definition at line 198 of file crypto_digest.c.

References tor_assert().

Referenced by crypto_xof().