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 );
763 DBGC2 ( tlskey,
"TLSKEY %p generating signable %s %s digest\n",
764 tlskey,
end->name, digest->
name );
769 DBGC ( tlskey,
"TLSKEY %p generated signable %s %s digest:\n",
770 tlskey,
end->name, digest->
name );
792 memset ( psk, 0,
sizeof ( *psk ) );
800 DBGC ( tlskey,
"TLSKEY %p cannot save key without a master "
801 "secret\n", tlskey );
806 DBGC2 ( tlskey,
"TLSKEY %p saving key\n", tlskey );
807 if ( (
rc =
op->save ( tlskey,
nonce, nonce_len, psk ) ) != 0 )
809 DBGC ( tlskey,
"TLSKEY %p saved key:\n", tlskey );
843 DBGC ( tlskey,
"TLSKEY %p cannot load from a non-master "
844 "secret\n", tlskey );
850 DBGC ( tlskey,
"TLSKEY %p cannot load from %sextended master "
851 "secret\n", tlskey, ( ems ?
"non-" :
"" ) );
856 if ( (
op != psk->
op ) || ( digest != psk->
digest ) ) {
857 DBGC ( tlskey,
"TLSKEY %p cannot load from %s with %s\n",
858 tlskey, ( psk->
op ? psk->
op->
name :
"(unknown)" ),
864 DBGC ( tlskey,
"TLSKEY %p loading key:\n", tlskey );
866 if ( (
rc =
op->load ( tlskey, psk ) ) != 0 )
886 size_t prefix_len,
void *binder,
size_t binder_len ) {
892 if (
op && digest ) {
904 DBGC2 ( psk,
"TLSKEY %p generating key binder:\n", psk );
906 if ( (
rc =
op->bind ( psk,
out, binder, binder_len ) ) != 0 )
908 DBGC ( psk,
"TLSKEY %p generated key binder:\n", psk );
909 DBGC_HDA ( psk, 0, binder, binder_len );
914 DBGC ( psk,
"TLSKEY %p cannot bind empty pre-shared key\n", psk );
949 const void *secret,
const char *
label,
950 const void *seed,
size_t seed_len,
951 void *
out,
size_t out_len ) {
952 static const char prefix[6] =
"tls13 ";
953 const void *context = seed;
954 size_t context_len = seed_len;
955 size_t prefix_len =
sizeof (
prefix );
961 char label[label_len];
968 info.label_len = ( prefix_len + label_len );
971 info.context_len = context_len;
972 memcpy (
info.context, context, context_len );
986 size_t ctxsize = digest->
ctxsize;
1003 const void *secret,
const void *
hash,
1014 tmp.key, sizeof (
tmp.key ) );
1033 void *secret = tlskey->
secret;
1055 const void *shared,
size_t shared_len ) {
1064 DBGC2 ( tlskey,
"TLSKEY %p derived:\n", tlskey );
1070 DBGC2 ( tlskey,
"TLSKEY %p extracted PRK:\n", tlskey );
1091 DBGC ( tlskey,
"TLSKEY %p requires an extended master "
1092 "secret\n", tlskey );
1097 memset ( zero, 0,
sizeof ( zero ) );
1098 if ( (
rc =
tlskey_apply ( tlskey, zero,
sizeof ( zero ) ) ) != 0 )
1115 void *verify,
size_t verify_len ) {
1126 DBGC ( tlskey,
"TLSKEY %p cannot generate %s verification "
1127 "data without %s handshake traffic secrets\n",
1128 tlskey,
end->name,
end->name );
1135 DBGC ( tlskey,
"TLSKEY %p %s verification:\n", tlskey,
end->name );
1136 DBGC_HDA ( tlskey, 0, verify, verify_len );
1184 void *
key,
size_t key_len,
void *
iv,
1190 void *secret = traffic->
secret;
1194 DBGC ( tlskey,
"TLSKEY %p does not support MAC secrets\n",
1237 DBGC ( tlskey,
"TLSKEY %p cannot generate digest with "
1238 "additional data\n", tlskey );
1244 memset ( buf, 0x20,
sizeof ( buf ) );
1246 label_len =
snprintf ( buf,
sizeof ( buf ),
1247 "TLS 1.3, %s CertificateVerify",
end->name );
1248 assert ( label_len == 33 );
1267 const void *
nonce,
size_t nonce_len,
1277 DBGC ( tlskey,
"TLSKEY %p cannot save %s pre-shared key\n",
1278 tlskey, digest->
name );
1285 tmp.master, sizeof (
tmp.master ) );
1316 DBGC2 ( tlskey,
"TLSKEY %p early secret:\n", tlskey );
1332 const void *
hash,
void *binder,
1333 size_t binder_len ) {
1347 DBGC2 ( psk,
"TLSKEY %p temporary early secret:\n", psk );
1354 DBGC2 ( psk,
"TLSKEY %p resumption binder secret:\n", psk );
1359 DBGC2 ( psk,
"TLSKEY %p binder:\n", psk );
1360 DBGC2_HDA ( psk, 0, binder, binder_len );
1395#define TLSKEY_HASH_VERIFY_MIN 12
1421 const void *secret,
const char *
label,
1422 const void *seed,
size_t seed_len,
1423 void *
out,
size_t out_len ) {
1428 unsigned int index = 0;
1444 sizeof (
tmp.ctx[1] ) );
1454 if ( frag_len > out_len )
1460 out_len -= frag_len;
1473 void *secret = tlskey->
secret;
1490 const void *shared,
size_t shared_len ) {
1528 DBGC ( tlskey,
"TLSKEY %p cannot generate master secret "
1529 "without a digested nonce\n", tlskey );
1535 label =
"extended master secret";
1539 label =
"master secret";
1541 seed_len =
sizeof ( tlskey->
random );
1544 tmp.master, sizeof (
tmp.master ) );
1548 sizeof (
tmp.master ) ) ) != 0 ) {
1568 void *verify,
size_t verify_len ) {
1579 DBGC ( tlskey,
"TLSKEY %p cannot generate verification data "
1580 "without a master secret\n", tlskey );
1590 verify, verify_len );
1610 DBGC ( tlskey,
"TLSKEY %p does not support %s traffic keys\n",
1636 void *
key,
size_t key_len,
void *
iv,
1637 size_t iv_len,
void *
mac,
size_t mac_len ) {
1638 size_t total = ( 2 * ( mac_len + key_len + iv_len ) );
1651 sizeof ( seed.server ) );
1653 sizeof ( seed.client ) );
1657 sizeof ( seed ),
tmp.key, sizeof (
tmp.key ) );
1663 src += ( 2 * mac_len );
1665 src += ( 2 * key_len );
1666 memcpy (
iv, (
src + ( iv_len & mask ) ), iv_len );
1667 src += ( 2 * iv_len );
1690 const void *
data,
size_t len,
void *tbs ) {
1691 size_t ctxsize = digest->
ctxsize;
1705 if ( digest != tlskey->
digest ) {
1706 DBGC ( tlskey,
"TLSKEY %p cannot generate %s "
1707 "transcript digest\n", tlskey, digest->
name );
1713 DBGC ( tlskey,
"TLSKEY %p cannot generate digest "
1714 "with additional data\n", tlskey );
1727 sizeof ( tlskey->
random ) );
1809 void *binder
__unused,
size_t binder_len ) {
1861 secretsize =
sizeof ( *hkeys );
1878 const void *secret,
const char *
label,
1879 const void *seed,
size_t seed_len,
1880 void *
out,
size_t out_len ) {
1893 seed_len,
out, out_len );
1897 seed_len,
tmp.sha1, out_len );
1901 for ( i = 0 ; i < out_len ; i++ )
1917 const void *shared,
size_t shared_len ) {
1924 const void *shared_md5;
1925 const void *shared_sha1;
1926 size_t shared_sublen;
1932 shared_sublen = ( ( shared_len + 1 ) / 2 );
1933 shared_md5 = shared;
1934 shared_sha1 = ( shared + shared_len - shared_sublen );
1994 .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.