152 .name =
"application",
185 size_t ctxsize = digest->
ctxsize;
201 secretsize =
op->secretsize ( digest );
202 if ( ! secretsize ) {
203 DBGC ( tlskey,
"TLSKEY %p cannot use %s with %s\n",
204 tlskey,
op->name, digest->
name );
208 total = ( secretsize +
214 dynamic =
zalloc ( total );
224 DBGC ( tlskey,
"TLSKEY %p using %s with %s\n",
229 tlskey->
secret = dynamic; dynamic += secretsize;
239 DBGC ( tlskey,
"TLSKEY %p local nonce:\n", tlskey );
265 memset ( tlskey, 0,
sizeof ( *tlskey ) );
287#define TLSKEY_HELLO_IDX( type ) ( (type) - 1 )
295#define TLSKEY_FINISHED 20
307 unsigned int index ) {
311 unsigned int flags = 0;
328 DBGC ( tlskey,
"TLSKEY %p %s random bytes%s:\n", tlskey,
end->name,
372 DBGC ( tlskey,
"TLSKEY %p finishing digest:\n", tlskey );
386 const void *
data,
size_t len ) {
400 if (
len >=
sizeof ( *finished ) ) {
495 const void *secret,
const char *
label,
496 const void *seed,
size_t seed_len,
497 void *
out,
size_t out_len ) {
505 DBGC2 ( tlskey,
"TLSKEY %p expanding seed \"%s\":\n", tlskey,
label );
507 op->expand ( digest, secret,
label, seed, seed_len,
out, out_len );
508 DBGC2 ( tlskey,
"TLSKEY %p expanded:\n", tlskey );
539 op->reset ( tlskey );
551 size_t shared_len ) {
561 DBGC ( tlskey,
"TLSKEY %p cannot apply a new shared secret "
562 "after generating master secret\n", tlskey );
567 DBGC ( tlskey,
"TLSKEY %p applying secret:\n", tlskey );
568 DBGC_HDA ( tlskey, 0, shared, shared_len );
569 if ( (
rc =
op->apply ( tlskey, shared, shared_len ) ) != 0 )
595 DBGC ( tlskey,
"TLSKEY %p cannot generate master secret "
596 "without key material\n", tlskey );
602 DBGC ( tlskey,
"TLSKEY %p cannot regenerate master secret\n",
608 DBGC ( tlskey,
"TLSKEY %p generating %smaster secret\n",
609 tlskey, ( ems ?
"extended " :
"" ) );
610 if ( (
rc =
op->master ( tlskey, ems ) ) != 0 )
632 void *
verify,
size_t verify_len ) {
642 DBGC ( tlskey,
"TLSKEY %p cannot generate verification data "
643 "without a digested nonce\n", tlskey );
648 DBGC2 ( tlskey,
"TLSKEY %p generating %s verification data\n",
650 if ( (
rc =
op->verify ( tlskey,
end,
verify, verify_len ) ) != 0 )
652 DBGC ( tlskey,
"TLSKEY %p %s verification data:\n",
672 unsigned int missing;
683 DBGC ( tlskey,
"TLSKEY %p cannot generate %s %s traffic "
684 "secrets (missing KDF flags %#04x)\n",
690 DBGC2 ( tlskey,
"TLSKEY %p generating %s %s traffic secret\n",
692 if ( (
rc =
op->traffic ( tlskey, writer,
phase ) ) != 0 )
721 void *
key,
size_t key_len,
void *
iv,
size_t iv_len,
722 void *
mac,
size_t mac_len ) {
732 if ( ! traffic->
phase ) {
733 DBGC ( tlskey,
"TLSKEY %p cannot generate cipher key "
734 "material without traffic secrets\n", tlskey );
739 DBGC2 ( tlskey,
"TLSKEY %p generating %s %s cipher key material\n",
741 if ( (
rc =
op->cipher ( tlskey, writer,
key, key_len,
iv, iv_len,
742 mac, mac_len ) ) != 0 ) {
746 DBGC ( tlskey,
"TLSKEY %p %s key:\n", tlskey, writer->
name );
750 DBGC ( tlskey,
"TLSKEY %p %s IV:\n", tlskey, writer->
name );
754 DBGC ( tlskey,
"TLSKEY %p %s MAC:\n", tlskey, writer->
name );
775 const void *
data,
size_t len,
void *tbs ) {
785 DBGC ( tlskey,
"TLSKEY %p cannot generate signable digest "
786 "without a digested nonce\n", tlskey );
795 DBGC ( tlskey,
"TLSKEY %p cannot generate signable digest "
796 "without a shared secret\n", tlskey );
801 DBGC2 ( tlskey,
"TLSKEY %p generating signable %s %s digest\n",
802 tlskey,
end->name, digest->
name );
807 DBGC ( tlskey,
"TLSKEY %p generated signable %s %s digest:\n",
808 tlskey,
end->name, digest->
name );
830 memset ( psk, 0,
sizeof ( *psk ) );
838 DBGC ( tlskey,
"TLSKEY %p cannot save key without a master "
839 "secret\n", tlskey );
844 DBGC2 ( tlskey,
"TLSKEY %p saving key\n", tlskey );
845 if ( (
rc =
op->save ( tlskey,
nonce, nonce_len, psk ) ) != 0 )
847 DBGC ( tlskey,
"TLSKEY %p saved key:\n", tlskey );
881 DBGC ( tlskey,
"TLSKEY %p cannot load from a non-master "
882 "secret\n", tlskey );
888 DBGC ( tlskey,
"TLSKEY %p cannot load from %sextended master "
889 "secret\n", tlskey, ( ems ?
"non-" :
"" ) );
894 if ( (
op != psk->
op ) || ( digest != psk->
digest ) ) {
895 DBGC ( tlskey,
"TLSKEY %p cannot load from %s with %s\n",
896 tlskey, ( psk->
op ? psk->
op->
name :
"(unknown)" ),
902 DBGC ( tlskey,
"TLSKEY %p loading key:\n", tlskey );
904 if ( (
rc =
op->load ( tlskey, psk ) ) != 0 )
924 size_t prefix_len,
void *binder,
size_t binder_len ) {
930 if (
op && digest ) {
942 DBGC2 ( psk,
"TLSKEY %p generating key binder:\n", psk );
944 if ( (
rc =
op->bind ( psk,
out, binder, binder_len ) ) != 0 )
946 DBGC ( psk,
"TLSKEY %p generated key binder:\n", psk );
947 DBGC_HDA ( psk, 0, binder, binder_len );
952 DBGC ( psk,
"TLSKEY %p cannot bind empty pre-shared key\n", psk );
987 const void *secret,
const char *
label,
988 const void *seed,
size_t seed_len,
989 void *
out,
size_t out_len ) {
990 static const char prefix[6] =
"tls13 ";
991 const void *context = seed;
992 size_t context_len = seed_len;
993 size_t prefix_len =
sizeof (
prefix );
999 char label[label_len];
1006 info.label_len = ( prefix_len + label_len );
1009 info.context_len = context_len;
1010 memcpy (
info.context, context, context_len );
1024 size_t ctxsize = digest->
ctxsize;
1041 const void *secret,
const void *
hash,
1052 tmp.key, sizeof (
tmp.key ) );
1071 void *secret = tlskey->
secret;
1093 const void *shared,
size_t shared_len ) {
1102 DBGC2 ( tlskey,
"TLSKEY %p derived:\n", tlskey );
1108 DBGC2 ( tlskey,
"TLSKEY %p extracted PRK:\n", tlskey );
1129 DBGC ( tlskey,
"TLSKEY %p requires an extended master "
1130 "secret\n", tlskey );
1135 memset ( zero, 0,
sizeof ( zero ) );
1136 if ( (
rc =
tlskey_apply ( tlskey, zero,
sizeof ( zero ) ) ) != 0 )
1153 void *verify,
size_t verify_len ) {
1164 DBGC ( tlskey,
"TLSKEY %p cannot generate %s verification "
1165 "data without %s handshake traffic secrets\n",
1166 tlskey,
end->name,
end->name );
1173 DBGC ( tlskey,
"TLSKEY %p %s verification:\n", tlskey,
end->name );
1174 DBGC_HDA ( tlskey, 0, verify, verify_len );
1222 void *
key,
size_t key_len,
void *
iv,
1228 void *secret = traffic->
secret;
1232 DBGC ( tlskey,
"TLSKEY %p does not support MAC secrets\n",
1275 DBGC ( tlskey,
"TLSKEY %p cannot generate digest with "
1276 "additional data\n", tlskey );
1282 memset ( buf, 0x20,
sizeof ( buf ) );
1284 label_len =
snprintf ( buf,
sizeof ( buf ),
1285 "TLS 1.3, %s CertificateVerify",
end->name );
1286 assert ( label_len == 33 );
1305 const void *
nonce,
size_t nonce_len,
1315 DBGC ( tlskey,
"TLSKEY %p cannot save %s pre-shared key\n",
1316 tlskey, digest->
name );
1323 tmp.master, sizeof (
tmp.master ) );
1354 DBGC2 ( tlskey,
"TLSKEY %p early secret:\n", tlskey );
1370 const void *
hash,
void *binder,
1371 size_t binder_len ) {
1385 DBGC2 ( psk,
"TLSKEY %p temporary early secret:\n", psk );
1392 DBGC2 ( psk,
"TLSKEY %p resumption binder secret:\n", psk );
1397 DBGC2 ( psk,
"TLSKEY %p binder:\n", psk );
1398 DBGC2_HDA ( psk, 0, binder, binder_len );
1433#define TLSKEY_HASH_VERIFY_MIN 12
1459 const void *secret,
const char *
label,
1460 const void *seed,
size_t seed_len,
1461 void *
out,
size_t out_len ) {
1466 unsigned int index = 0;
1482 sizeof (
tmp.ctx[1] ) );
1492 if ( frag_len > out_len )
1498 out_len -= frag_len;
1511 void *secret = tlskey->
secret;
1528 const void *shared,
size_t shared_len ) {
1566 DBGC ( tlskey,
"TLSKEY %p cannot generate master secret "
1567 "without a digested nonce\n", tlskey );
1573 label =
"extended master secret";
1577 label =
"master secret";
1579 seed_len =
sizeof ( tlskey->
random );
1582 tmp.master, sizeof (
tmp.master ) );
1586 sizeof (
tmp.master ) ) ) != 0 ) {
1606 void *verify,
size_t verify_len ) {
1617 DBGC ( tlskey,
"TLSKEY %p cannot generate verification data "
1618 "without a master secret\n", tlskey );
1628 verify, verify_len );
1648 DBGC ( tlskey,
"TLSKEY %p does not support %s traffic keys\n",
1674 void *
key,
size_t key_len,
void *
iv,
1675 size_t iv_len,
void *
mac,
size_t mac_len ) {
1676 size_t total = ( 2 * ( mac_len + key_len + iv_len ) );
1689 sizeof ( seed.server ) );
1691 sizeof ( seed.client ) );
1695 sizeof ( seed ),
tmp.key, sizeof (
tmp.key ) );
1701 src += ( 2 * mac_len );
1703 src += ( 2 * key_len );
1704 memcpy (
iv, (
src + ( iv_len & mask ) ), iv_len );
1705 src += ( 2 * iv_len );
1728 const void *
data,
size_t len,
void *tbs ) {
1729 size_t ctxsize = digest->
ctxsize;
1743 if ( digest != tlskey->
digest ) {
1744 DBGC ( tlskey,
"TLSKEY %p cannot generate %s "
1745 "transcript digest\n", tlskey, digest->
name );
1751 DBGC ( tlskey,
"TLSKEY %p cannot generate digest "
1752 "with additional data\n", tlskey );
1768 DBGC ( tlskey,
"TLSKEY %p cannot generate digest "
1769 "without additional data\n", tlskey );
1776 sizeof ( tlskey->
random ) );
1858 void *binder
__unused,
size_t binder_len ) {
1910 secretsize =
sizeof ( *hkeys );
1927 const void *secret,
const char *
label,
1928 const void *seed,
size_t seed_len,
1929 void *
out,
size_t out_len ) {
1942 seed_len,
out, out_len );
1946 seed_len,
tmp.sha1, out_len );
1950 for ( i = 0 ; i < out_len ; i++ )
1966 const void *shared,
size_t shared_len ) {
1973 const void *shared_md5;
1974 const void *shared_sha1;
1975 size_t shared_sublen;
1981 shared_sublen = ( ( shared_len + 1 ) / 2 );
1982 shared_md5 = shared;
1983 shared_sha1 = ( shared + shared_len - shared_sublen );
2034 DBGC ( tlskey,
"TLSKEY %p cannot generate %s "
2035 "transcript digest\n", tlskey, digest->
name );
2041 DBGC ( tlskey,
"TLSKEY %p cannot generate digest "
2042 "with additional data\n", tlskey );
2098 .name =
"P_MD5()+P_SHA1()",
#define NULL
NULL pointer (VOID *).
struct golan_eq_context ctx
union @162305117151260234136356364136041353210355154177 key
struct arbelprm_rc_send_wqe rc
pseudo_bit_t hash[0x00010]
#define assert(condition)
Assert a condition at run-time.
struct digest_algorithm digest_null
uint8_t data[48]
Additional event data.
uint8_t mac[ETH_ALEN]
MAC address.
#define __unused
Declare a variable or data structure as unused.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define ENOENT
No such file or directory.
#define EINVAL
Invalid argument.
#define EPROTO
Protocol error.
#define ENOMEM
Not enough space.
#define ENOTSUP
Operation not supported.
#define ENOTTY
Inappropriate I/O control operation.
#define EPERM
Operation not permitted.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
void hkdf_expand(struct digest_algorithm *digest, const void *prk, const void *info, size_t info_len, void *out, size_t len)
Expand pseudorandom key.
void hkdf_extract(struct digest_algorithm *digest, const void *salt, size_t salt_len, const void *ikm, size_t ikm_len, void *prk)
Extract fixed-length pseudorandom key.
HMAC-based Extract-and-Expand Key Derivation Function (HKDF).
void hmac_init(struct digest_algorithm *digest, void *ctx, const void *secret, size_t len)
Initialise HMAC.
void hmac_final(struct digest_algorithm *digest, void *ctx, void *hmac)
Finalise HMAC.
void hmac_key(struct digest_algorithm *digest, void *ctx, const void *secret, size_t len, void *key)
Construct HMAC reduced key.
void hmac_init_key(struct digest_algorithm *digest, void *ctx, const void *key)
Initialise HMAC from reduced key.
Keyed-Hashing for Message Authentication.
static void hmac_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Update HMAC.
static size_t hmac_ctxsize(struct digest_algorithm *digest)
Calculate HMAC context size.
static size_t hmac_keysize(struct digest_algorithm *digest)
Calculate HMAC reduced key size.
static void digest_init(struct digest_algorithm *digest, void *ctx)
static void digest_final(struct digest_algorithm *digest, void *ctx, void *out)
static void digest_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
void * zalloc(size_t size)
Allocate cleared memory.
void zfree(void *ptr)
Clear and free memory.
Dynamic memory allocation.
struct digest_algorithm md5_algorithm
struct digest_algorithm md5_sha1_algorithm
Hybrid MD5+SHA1 digest algorithm.
Hybrid MD5+SHA1 hash as used by TLSv1.1 and earlier.
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
uint32_t end
Ending offset.
static uint16_t struct vmbus_xfer_pages_operations * op
uint32_t digestsize
Digest size (i.e.
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
struct digest_algorithm sha1_algorithm
uint16_t hello
Hello time.
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
size_t strlen(const char *src)
Get length of string.
A message digest algorithm.
size_t digestsize
Digest size.
size_t ctxsize
Context size.
const char * name
Algorithm name.
uint8_t md5[MD5_DIGEST_SIZE]
MD5 digest.
uint8_t sha1[SHA1_DIGEST_SIZE]
SHA-1 digest.
An MD5+SHA1 HMAC key block.
uint8_t md5[MD5_BLOCK_SIZE]
MD5 HMAC key.
uint8_t sha1[SHA1_BLOCK_SIZE]
SHA-1 HMAC key.
uint8_t index
Endpoint index.
const char name[7]
Name (for key expansion labels).
unsigned int flags
Key flags.
TLS key schedule operations.
int(* save)(struct tls_key_schedule *tlskey, const void *nonce, size_t nonce_len, struct tls_preshared_key *psk)
Save pre-shared key.
int(* load)(struct tls_key_schedule *tlskey, const struct tls_preshared_key *psk)
Load pre-shared key.
int(* master)(struct tls_key_schedule *tlskey, int ems)
Generate master secret.
int(* cipher)(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, void *key, size_t key_len, void *iv, size_t iv_len, void *mac, size_t mac_len)
Generate cipher key material.
int(* bind)(const struct tls_preshared_key *psk, const void *hash, void *binder, size_t binder_len)
Generate pre-shared key binder value.
int(* verify)(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, void *verify, size_t verify_len)
Generate verification data.
size_t(* secretsize)(struct digest_algorithm *digest)
Calculate secret size.
int(* tbshash)(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, struct digest_algorithm *digest, const void *data, size_t len, void *tbs)
Generate signable digest value.
int(* traffic)(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase)
Generate traffic secrets.
void(* expand)(struct digest_algorithm *digest, const void *secret, const char *label, const void *seed, size_t seed_len, void *out, size_t out_len)
Expand key material.
void(* reset)(struct tls_key_schedule *tlskey)
Reset key schedule.
int(* apply)(struct tls_key_schedule *tlskey, const void *shared, size_t shared_len)
Apply a new shared secret.
const struct tls_key_schedule_operations * op
Key schedule operations.
struct tls_random random[2]
Client and server random bytes.
size_t secretsize
Secret size.
struct tls_transcript transcript
Running handshake transcript digest.
struct tls_random nonce
Local endpoint random bytes.
struct tls_traffic_secret traffic[2]
Traffic secrets.
struct digest_algorithm * digest
Digest algorithm.
void * dynamic
Dynamically-allocated storage.
struct tls_kdf_secret kdf
Key derivation function secret.
const char label[3]
Key expansion label.
uint8_t flags
Required key derivation function flags.
uint8_t resumption[48]
Resumption secret.
union tls_preshared_key::@022173016027117201055347232316162256252261104170::@216204225163015142232067115177347130257031275370 master_secret
Master secret.
struct digest_algorithm * digest
Digest algorithm (if set).
unsigned int flags
Key flags.
union tls_preshared_key::@022173016027117201055347232316162256252261104170 key
Key material.
const struct tls_key_schedule_operations * op
Key schedule operations (if set).
TLS client or server random bytes.
const struct tls_phase * phase
Phase.
A TLS running handshake transcript digest.
void * finishing
Running digest value up to the most recent Finished (if any).
void * running
Running digest value.
unsigned int flags
Transcript flags.
void * ctx
Digest context.
A Finished handshake record prefix of interest.
A ClientHello or ServerHello handshake record prefix of interest.
static u32 xor(u32 a, u32 b)
static int tlskey_hash_tbshash(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, struct digest_algorithm *digest, const void *data, size_t len, void *tbs)
Generate signable digest value.
static void tlskey_md5_sha1_expand(struct digest_algorithm *digest, const void *secret, const char *label, const void *seed, size_t seed_len, void *out, size_t out_len)
Expand key material.
static int tlskey_hash_cipher(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, void *key, size_t key_len, void *iv, size_t iv_len, void *mac, size_t mac_len)
Generate cipher key material.
static void tlskey_hkdf_expand(struct digest_algorithm *digest, const void *secret, const char *label, const void *seed, size_t seed_len, void *out, size_t out_len)
Expand key material.
static int tlskey_hash_load(struct tls_key_schedule *tlskey, const struct tls_preshared_key *psk)
Load pre-shared key.
int tlskey_save(struct tls_key_schedule *tlskey, const void *nonce, size_t nonce_len, struct tls_preshared_key *psk)
Save pre-shared key.
static unsigned int tlskey_handshake(struct tls_key_schedule *tlskey, const void *data, size_t len)
Process digested handshake record.
int tlskey_master(struct tls_key_schedule *tlskey, int ems)
Generate master secret.
static void tlskey_hkdf_empty(struct digest_algorithm *digest, void *empty)
Calculate empty digest value.
static int tlskey_hash_verify(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, void *verify, size_t verify_len)
Generate verification data.
static int tlskey_hash_master(struct tls_key_schedule *tlskey, int ems)
Generate master secret.
int tlskey_cipher(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, void *key, size_t key_len, void *iv, size_t iv_len, void *mac, size_t mac_len)
Generate cipher key material.
int tlskey_load(struct tls_key_schedule *tlskey, int ems, const struct tls_preshared_key *psk)
Load pre-shared key.
static int tlskey_hkdf_master(struct tls_key_schedule *tlskey, int ems)
Generate master secret.
static void tlskey_hash_reset(struct tls_key_schedule *tlskey)
Reset key schedule.
void tlskey_stop(struct tls_key_schedule *tlskey)
Stop key schedule.
static int tlskey_hkdf_cipher(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, void *key, size_t key_len, void *iv, size_t iv_len, void *mac __unused, size_t mac_len)
Generate cipher key material.
static void tlskey_hkdf_reset(struct tls_key_schedule *tlskey)
Reset key schedule.
const struct tls_phase tls_early
Early traffic phase.
static int tlskey_hash_traffic(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase)
Generate traffic secret.
void tlskey_reset(struct tls_key_schedule *tlskey)
Reset key schedule.
const struct tls_phase tls_handshake
Handshake traffic phase.
int tlskey_start(struct tls_key_schedule *tlskey, const struct tls_key_schedule_operations *op, struct digest_algorithm *digest, const struct tls_random *nonce)
Start key schedule.
static int tlskey_hkdf_verify(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, void *verify, size_t verify_len)
Generate verification data.
#define TLSKEY_FINISHED
Finished record type.
static int tlskey_md5_sha1_save(struct tls_key_schedule *tlskey, const void *nonce __unused, size_t nonce_len, struct tls_preshared_key *psk)
Save pre-shared key.
int tlskey_tbshash(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, struct digest_algorithm *digest, const void *data, size_t len, void *tbs)
Generate signable digest value.
int tlskey_apply(struct tls_key_schedule *tlskey, const void *shared, size_t shared_len)
Apply a new shared secret.
static int tlskey_hkdf_save(struct tls_key_schedule *tlskey, const void *nonce, size_t nonce_len, struct tls_preshared_key *psk)
Save pre-shared key.
static int tlskey_hash_save(struct tls_key_schedule *tlskey, const void *nonce __unused, size_t nonce_len, struct tls_preshared_key *psk)
Save pre-shared key.
#define TLSKEY_HELLO_IDX(type)
Calculate endpoint index from ClientHello or ServerHello record type.
static int tlskey_hkdf_load(struct tls_key_schedule *tlskey, const struct tls_preshared_key *psk)
Load pre-shared key.
static int tlskey_hash_bind(const struct tls_preshared_key *psk __unused, const void *hash __unused, void *binder __unused, size_t binder_len)
Generate pre-shared key binder value.
const struct tls_key_schedule_operations tlskey_hash
TLS key schedule based on P_Hash().
int tlskey_traffic(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase)
Generate traffic secret.
static int tlskey_hkdf_bind(const struct tls_preshared_key *psk, const void *hash, void *binder, size_t binder_len)
Generate pre-shared key binder value.
static size_t tlskey_hkdf_secretsize(struct digest_algorithm *digest)
Calculate secret size.
void tlskey_message(struct tls_key_schedule *tlskey)
Replace running transcript digest with a message hash of itself.
static int tlskey_hkdf_apply(struct tls_key_schedule *tlskey, const void *shared, size_t shared_len)
Apply a new shared secret.
static int tlskey_hkdf_tbshash(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, struct digest_algorithm *digest, const void *data __unused, size_t len, void *tbs)
Generate signable digest value.
const struct tls_key_schedule_operations tlskey_md5_sha1
TLS key schedule based on P_MD5()+P_SHA1().
static int tlskey_hash_apply(struct tls_key_schedule *tlskey, const void *shared, size_t shared_len)
Apply a new shared secret.
static unsigned int tlskey_hello(struct tls_key_schedule *tlskey, const struct tlskey_hello *hello, unsigned int index)
Process digested ClientHello or ServerHello handshake record.
#define TLSKEY_HASH_VERIFY_MIN
Minimum length for verification data.
static size_t tlskey_hash_secretsize(struct digest_algorithm *digest)
Calculate secret size.
static int tlskey_hkdf_traffic(struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase)
Generate traffic secret.
int tlskey_verify(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, void *verify, size_t verify_len)
Generate verification data.
static void tlskey_hkdf_finished(struct digest_algorithm *digest, const void *secret, const void *hash, void *out)
Calculate a finished MAC.
static void tlskey_hash_expand(struct digest_algorithm *digest, const void *secret, const char *label, const void *seed, size_t seed_len, void *out, size_t out_len)
Expand key material.
static size_t tlskey_md5_sha1_secretsize(struct digest_algorithm *digest)
Calculate secret size.
static unsigned int tlskey_finished(struct tls_key_schedule *tlskey)
Process digested Finished handshake record.
void tlskey_digest(struct tls_key_schedule *tlskey, const void *data, size_t len)
Add handshake to running transcript digest.
const struct tls_phase tls_application
Application traffic phase.
static int tlskey_md5_sha1_apply(struct tls_key_schedule *tlskey, const void *shared, size_t shared_len)
Apply a new shared secret.
int tlskey_bind(const struct tls_preshared_key *psk, const void *prefix, size_t prefix_len, void *binder, size_t binder_len)
Generate pre-shared key binder value.
static void tlskey_expand(struct tls_key_schedule *tlskey, const void *secret, const char *label, const void *seed, size_t seed_len, void *out, size_t out_len)
Expand key material.
const struct tls_key_schedule_operations tlskey_hkdf
TLS key schedule based on HKDF.
static int tlskey_md5_sha1_tbshash(struct tls_key_schedule *tlskey, const struct tls_endpoint *end, struct digest_algorithm *digest, const void *data, size_t len, void *tbs)
Generate signable digest value.
#define TLSKEY_KDF_EMS
Key derivation function has an extended master secret.
#define TLS_CLIENT
Client endpoint index.
#define TLSKEY_TSF_FINISHED
Transcript digest includes a Finished record.
#define TLSKEY_KDF_MASTER
Key derivation function has a master secret.
#define TLSKEY_KDF_KEYED
Key derivation function has key material.
#define TLS_SERVER
Server endpoint index.
#define TLS_MESSAGE_HASH
A TLS message hash.
#define TLSKEY_TSF_NONCED
Transcript digest includes a Hello record containing the local nonce.
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
u8 iv[16]
Initialization vector.