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 ) ) {
467 const void *secret,
const char *
label,
468 const void *seed,
size_t seed_len,
469 void *
out,
size_t out_len ) {
477 DBGC2 ( tlskey,
"TLSKEY %p expanding seed \"%s\":\n", tlskey,
label );
479 op->expand ( digest, secret,
label, seed, seed_len,
out, out_len );
480 DBGC2 ( tlskey,
"TLSKEY %p expanded:\n", tlskey );
511 op->reset ( tlskey );
523 size_t shared_len ) {
533 DBGC ( tlskey,
"TLSKEY %p cannot apply a new shared secret "
534 "after generating master secret\n", tlskey );
539 DBGC ( tlskey,
"TLSKEY %p applying secret:\n", tlskey );
540 DBGC_HDA ( tlskey, 0, shared, shared_len );
541 if ( (
rc =
op->apply ( tlskey, shared, shared_len ) ) != 0 )
567 DBGC ( tlskey,
"TLSKEY %p cannot generate master secret "
568 "without key material\n", tlskey );
574 DBGC ( tlskey,
"TLSKEY %p cannot regenerate master secret\n",
580 DBGC ( tlskey,
"TLSKEY %p generating %smaster secret\n",
581 tlskey, ( ems ?
"extended " :
"" ) );
582 if ( (
rc =
op->master ( tlskey, ems ) ) != 0 )
604 void *
verify,
size_t verify_len ) {
614 DBGC ( tlskey,
"TLSKEY %p cannot generate verification data "
615 "without a digested nonce\n", tlskey );
620 DBGC2 ( tlskey,
"TLSKEY %p generating %s verification data\n",
622 if ( (
rc =
op->verify ( tlskey,
end,
verify, verify_len ) ) != 0 )
624 DBGC ( tlskey,
"TLSKEY %p %s verification data:\n",
644 unsigned int missing;
655 DBGC ( tlskey,
"TLSKEY %p cannot generate %s %s traffic "
656 "secrets (missing KDF flags %#04x)\n",
662 DBGC2 ( tlskey,
"TLSKEY %p generating %s %s traffic secret\n",
664 if ( (
rc =
op->traffic ( tlskey, writer,
phase ) ) != 0 )
693 void *
key,
size_t key_len,
void *
iv,
size_t iv_len,
694 void *
mac,
size_t mac_len ) {
704 if ( ! traffic->
phase ) {
705 DBGC ( tlskey,
"TLSKEY %p cannot generate cipher key "
706 "material without traffic secrets\n", tlskey );
711 DBGC2 ( tlskey,
"TLSKEY %p generating %s %s cipher key material\n",
713 if ( (
rc =
op->cipher ( tlskey, writer,
key, key_len,
iv, iv_len,
714 mac, mac_len ) ) != 0 ) {
718 DBGC ( tlskey,
"TLSKEY %p %s key:\n", tlskey, writer->
name );
722 DBGC ( tlskey,
"TLSKEY %p %s IV:\n", tlskey, writer->
name );
726 DBGC ( tlskey,
"TLSKEY %p %s MAC:\n", tlskey, writer->
name );
747 const void *
data,
size_t len,
void *tbs ) {
757 DBGC ( tlskey,
"TLSKEY %p cannot generate signable digest "
758 "without a digested nonce\n", tlskey );
767 DBGC ( tlskey,
"TLSKEY %p cannot generate signable digest "
768 "without a shared secret\n", tlskey );
773 DBGC2 ( tlskey,
"TLSKEY %p generating signable %s %s digest\n",
774 tlskey,
end->name, digest->
name );
779 DBGC ( tlskey,
"TLSKEY %p generated signable %s %s digest:\n",
780 tlskey,
end->name, digest->
name );
802 memset ( psk, 0,
sizeof ( *psk ) );
810 DBGC ( tlskey,
"TLSKEY %p cannot save key without a master "
811 "secret\n", tlskey );
816 DBGC2 ( tlskey,
"TLSKEY %p saving key\n", tlskey );
817 if ( (
rc =
op->save ( tlskey,
nonce, nonce_len, psk ) ) != 0 )
819 DBGC ( tlskey,
"TLSKEY %p saved key:\n", tlskey );
853 DBGC ( tlskey,
"TLSKEY %p cannot load from a non-master "
854 "secret\n", tlskey );
860 DBGC ( tlskey,
"TLSKEY %p cannot load from %sextended master "
861 "secret\n", tlskey, ( ems ?
"non-" :
"" ) );
866 if ( (
op != psk->
op ) || ( digest != psk->
digest ) ) {
867 DBGC ( tlskey,
"TLSKEY %p cannot load from %s with %s\n",
868 tlskey, ( psk->
op ? psk->
op->
name :
"(unknown)" ),
874 DBGC ( tlskey,
"TLSKEY %p loading key:\n", tlskey );
876 if ( (
rc =
op->load ( tlskey, psk ) ) != 0 )
896 size_t prefix_len,
void *binder,
size_t binder_len ) {
902 if (
op && digest ) {
914 DBGC2 ( psk,
"TLSKEY %p generating key binder:\n", psk );
916 if ( (
rc =
op->bind ( psk,
out, binder, binder_len ) ) != 0 )
918 DBGC ( psk,
"TLSKEY %p generated key binder:\n", psk );
919 DBGC_HDA ( psk, 0, binder, binder_len );
924 DBGC ( psk,
"TLSKEY %p cannot bind empty pre-shared key\n", psk );
959 const void *secret,
const char *
label,
960 const void *seed,
size_t seed_len,
961 void *
out,
size_t out_len ) {
962 static const char prefix[6] =
"tls13 ";
963 const void *context = seed;
964 size_t context_len = seed_len;
965 size_t prefix_len =
sizeof (
prefix );
971 char label[label_len];
978 info.label_len = ( prefix_len + label_len );
981 info.context_len = context_len;
982 memcpy (
info.context, context, context_len );
996 size_t ctxsize = digest->
ctxsize;
1013 const void *secret,
const void *
hash,
1024 tmp.key, sizeof (
tmp.key ) );
1043 void *secret = tlskey->
secret;
1065 const void *shared,
size_t shared_len ) {
1074 DBGC2 ( tlskey,
"TLSKEY %p derived:\n", tlskey );
1080 DBGC2 ( tlskey,
"TLSKEY %p extracted PRK:\n", tlskey );
1101 DBGC ( tlskey,
"TLSKEY %p requires an extended master "
1102 "secret\n", tlskey );
1107 memset ( zero, 0,
sizeof ( zero ) );
1108 if ( (
rc =
tlskey_apply ( tlskey, zero,
sizeof ( zero ) ) ) != 0 )
1125 void *verify,
size_t verify_len ) {
1136 DBGC ( tlskey,
"TLSKEY %p cannot generate %s verification "
1137 "data without %s handshake traffic secrets\n",
1138 tlskey,
end->name,
end->name );
1145 DBGC ( tlskey,
"TLSKEY %p %s verification:\n", tlskey,
end->name );
1146 DBGC_HDA ( tlskey, 0, verify, verify_len );
1194 void *
key,
size_t key_len,
void *
iv,
1200 void *secret = traffic->
secret;
1204 DBGC ( tlskey,
"TLSKEY %p does not support MAC secrets\n",
1247 DBGC ( tlskey,
"TLSKEY %p cannot generate digest with "
1248 "additional data\n", tlskey );
1254 memset ( buf, 0x20,
sizeof ( buf ) );
1256 label_len =
snprintf ( buf,
sizeof ( buf ),
1257 "TLS 1.3, %s CertificateVerify",
end->name );
1258 assert ( label_len == 33 );
1277 const void *
nonce,
size_t nonce_len,
1287 DBGC ( tlskey,
"TLSKEY %p cannot save %s pre-shared key\n",
1288 tlskey, digest->
name );
1295 tmp.master, sizeof (
tmp.master ) );
1326 DBGC2 ( tlskey,
"TLSKEY %p early secret:\n", tlskey );
1342 const void *
hash,
void *binder,
1343 size_t binder_len ) {
1357 DBGC2 ( psk,
"TLSKEY %p temporary early secret:\n", psk );
1364 DBGC2 ( psk,
"TLSKEY %p resumption binder secret:\n", psk );
1369 DBGC2 ( psk,
"TLSKEY %p binder:\n", psk );
1370 DBGC2_HDA ( psk, 0, binder, binder_len );
1405#define TLSKEY_HASH_VERIFY_MIN 12
1431 const void *secret,
const char *
label,
1432 const void *seed,
size_t seed_len,
1433 void *
out,
size_t out_len ) {
1438 unsigned int index = 0;
1454 sizeof (
tmp.ctx[1] ) );
1464 if ( frag_len > out_len )
1470 out_len -= frag_len;
1483 void *secret = tlskey->
secret;
1500 const void *shared,
size_t shared_len ) {
1538 DBGC ( tlskey,
"TLSKEY %p cannot generate master secret "
1539 "without a digested nonce\n", tlskey );
1545 label =
"extended master secret";
1549 label =
"master secret";
1551 seed_len =
sizeof ( tlskey->
random );
1554 tmp.master, sizeof (
tmp.master ) );
1558 sizeof (
tmp.master ) ) ) != 0 ) {
1578 void *verify,
size_t verify_len ) {
1589 DBGC ( tlskey,
"TLSKEY %p cannot generate verification data "
1590 "without a master secret\n", tlskey );
1600 verify, verify_len );
1620 DBGC ( tlskey,
"TLSKEY %p does not support %s traffic keys\n",
1646 void *
key,
size_t key_len,
void *
iv,
1647 size_t iv_len,
void *
mac,
size_t mac_len ) {
1648 size_t total = ( 2 * ( mac_len + key_len + iv_len ) );
1661 sizeof ( seed.server ) );
1663 sizeof ( seed.client ) );
1667 sizeof ( seed ),
tmp.key, sizeof (
tmp.key ) );
1673 src += ( 2 * mac_len );
1675 src += ( 2 * key_len );
1676 memcpy (
iv, (
src + ( iv_len & mask ) ), iv_len );
1677 src += ( 2 * iv_len );
1700 const void *
data,
size_t len,
void *tbs ) {
1701 size_t ctxsize = digest->
ctxsize;
1715 if ( digest != tlskey->
digest ) {
1716 DBGC ( tlskey,
"TLSKEY %p cannot generate %s "
1717 "transcript digest\n", tlskey, digest->
name );
1723 DBGC ( tlskey,
"TLSKEY %p cannot generate digest "
1724 "with additional data\n", tlskey );
1740 DBGC ( tlskey,
"TLSKEY %p cannot generate digest "
1741 "without additional data\n", tlskey );
1748 sizeof ( tlskey->
random ) );
1830 void *binder
__unused,
size_t binder_len ) {
1882 secretsize =
sizeof ( *hkeys );
1899 const void *secret,
const char *
label,
1900 const void *seed,
size_t seed_len,
1901 void *
out,
size_t out_len ) {
1914 seed_len,
out, out_len );
1918 seed_len,
tmp.sha1, out_len );
1922 for ( i = 0 ; i < out_len ; i++ )
1938 const void *shared,
size_t shared_len ) {
1945 const void *shared_md5;
1946 const void *shared_sha1;
1947 size_t shared_sublen;
1953 shared_sublen = ( ( shared_len + 1 ) / 2 );
1954 shared_md5 = shared;
1955 shared_sha1 = ( shared + shared_len - shared_sublen );
2015 .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.
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.
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.
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.
#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 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.