|
iPXE
|
TLS key schedules. More...
#include <string.h>#include <stdio.h>#include <errno.h>#include <byteswap.h>#include <ipxe/malloc.h>#include <ipxe/hkdf.h>#include <ipxe/hmac.h>#include <ipxe/md5_sha1.h>#include <ipxe/tlskey.h>Go to the source code of this file.
Data Structures | |
| struct | tls_phase |
| A TLS traffic phase. More... | |
| struct | tlskey_hello |
| A ClientHello or ServerHello handshake record prefix of interest. More... | |
| struct | tlskey_finished |
| A Finished handshake record prefix of interest. More... | |
Macros | |
| #define | TLSKEY_HELLO_IDX(type) |
| Calculate endpoint index from ClientHello or ServerHello record type. | |
| #define | TLSKEY_FINISHED 20 |
| Finished record type. | |
| #define | TLSKEY_HASH_VERIFY_MIN 12 |
| Minimum length for verification data. | |
Functions | |
| FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
| FILE_SECBOOT (PERMITTED) | |
| 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. | |
| void | tlskey_stop (struct tls_key_schedule *tlskey) |
| Stop key schedule. | |
| 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. | |
| static unsigned int | tlskey_finished (struct tls_key_schedule *tlskey) |
| Process digested Finished handshake record. | |
| static unsigned int | tlskey_handshake (struct tls_key_schedule *tlskey, const void *data, size_t len) |
| Process digested handshake record. | |
| void | tlskey_digest (struct tls_key_schedule *tlskey, const void *data, size_t len) |
| Add handshake to running transcript digest. | |
| 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. | |
| void | tlskey_reset (struct tls_key_schedule *tlskey) |
| Reset key schedule. | |
| int | tlskey_apply (struct tls_key_schedule *tlskey, const void *shared, size_t shared_len) |
| Apply a new shared secret. | |
| int | tlskey_master (struct tls_key_schedule *tlskey, int ems) |
| Generate master secret. | |
| int | tlskey_verify (struct tls_key_schedule *tlskey, const struct tls_endpoint *end, void *verify, size_t verify_len) |
| Generate verification data. | |
| int | tlskey_traffic (struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase) |
| Generate traffic 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_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_save (struct tls_key_schedule *tlskey, const void *nonce, size_t nonce_len, struct tls_preshared_key *psk) |
| Save pre-shared key. | |
| int | tlskey_load (struct tls_key_schedule *tlskey, int ems, const struct tls_preshared_key *psk) |
| Load pre-shared key. | |
| 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 size_t | tlskey_hkdf_secretsize (struct digest_algorithm *digest) |
| Calculate secret size. | |
| 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 void | tlskey_hkdf_empty (struct digest_algorithm *digest, void *empty) |
| Calculate empty digest value. | |
| static void | tlskey_hkdf_finished (struct digest_algorithm *digest, const void *secret, const void *hash, void *out) |
| Calculate a finished MAC. | |
| static void | tlskey_hkdf_reset (struct tls_key_schedule *tlskey) |
| Reset key schedule. | |
| 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_master (struct tls_key_schedule *tlskey, int ems) |
| Generate master secret. | |
| static int | tlskey_hkdf_verify (struct tls_key_schedule *tlskey, const struct tls_endpoint *end, void *verify, size_t verify_len) |
| Generate verification data. | |
| static int | tlskey_hkdf_traffic (struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase) |
| Generate traffic secret. | |
| 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 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. | |
| 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_hkdf_load (struct tls_key_schedule *tlskey, const struct tls_preshared_key *psk) |
| Load pre-shared key. | |
| 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_hash_secretsize (struct digest_algorithm *digest) |
| Calculate secret size. | |
| 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 void | tlskey_hash_reset (struct tls_key_schedule *tlskey) |
| Reset key schedule. | |
| static int | tlskey_hash_apply (struct tls_key_schedule *tlskey, const void *shared, size_t shared_len) |
| Apply a new shared secret. | |
| static int | tlskey_hash_master (struct tls_key_schedule *tlskey, int ems) |
| Generate master secret. | |
| 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_traffic (struct tls_key_schedule *tlskey, const struct tls_endpoint *writer, const struct tls_phase *phase) |
| Generate traffic secret. | |
| 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 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 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. | |
| static int | tlskey_hash_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. | |
| static size_t | tlskey_md5_sha1_secretsize (struct digest_algorithm *digest) |
| Calculate secret size. | |
| 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_md5_sha1_apply (struct tls_key_schedule *tlskey, const void *shared, size_t shared_len) |
| Apply a new shared secret. | |
| 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. | |
Variables | |
| const struct tls_endpoint | tls_client |
| Client endpoint. | |
| const struct tls_endpoint | tls_server |
| Server endpoint. | |
| static const struct tls_endpoint * | tls_endpoint [] |
| Endpoint list. | |
| const struct tls_phase | tls_early |
| Early traffic phase. | |
| const struct tls_phase | tls_handshake |
| Handshake traffic phase. | |
| const struct tls_phase | tls_application |
| Application traffic phase. | |
| const struct tls_key_schedule_operations | tlskey_hkdf |
| TLS key schedule based on HKDF. | |
| const struct tls_key_schedule_operations | tlskey_hash |
| TLS key schedule based on P_Hash(). | |
| const struct tls_key_schedule_operations | tlskey_md5_sha1 |
| TLS key schedule based on P_MD5()+P_SHA1(). | |
TLS key schedules.
The TLS key schedule is responsible for maintaining the running handshake transcript digest, for deriving key material from the shared secret that was negotiated by a key exchange mechanism, and for performing all cryptographic calculations required by the TLS protocol.
A single abstraction of a key schedule is defined that is independent of the TLS protocol version. Three implementations of this abstraction are provided:
The basic set of operations is as required by the TLS protocol:
The key schedule is responsible only for raw key material: it has no notion of the peer identity and so is fundamentally anonymous in nature.
The separate secure channel abstraction handles all concepts of peer identity. The key schedule provides the cryptographic operations and properties that are documented as required by the secure channel, e.g. the calculations required to demonstrate or verify possession of key material.
Definition in file tlskey.c.
| #define TLSKEY_HELLO_IDX | ( | type | ) |
| #define TLSKEY_FINISHED 20 |
| #define TLSKEY_HASH_VERIFY_MIN 12 |
Minimum length for verification data.
Definition at line 1395 of file tlskey.c.
Referenced by tlskey_hash_verify().
| FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
| FILE_SECBOOT | ( | PERMITTED | ) |
| 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.
| tlskey | Key schedule |
| op | Key schedule operations |
| digest | Digest algorithm |
| nonce | Local endpoint random bytes |
| rc | Return status code |
The random bytes must be the random bytes that the local endpoint will subsequently incorporate within its own ClientHello (or ServerHello, if acting as a server). The caller must guarantee that these are fresh and are unpredictable by the peer. A freshly generated secure channel ephemeral secret can be used to fulfil this requirement.
Definition at line 180 of file tlskey.c.
References assert, tls_transcript::ctx, digest_algorithm::ctxsize, DBGC, DBGC_HDA, tls_key_schedule::digest, digest_init(), digest_algorithm::digestsize, digestsize, tls_key_schedule::dynamic, ENOMEM, ENOTSUP, ENOTTY, tls_transcript::finishing, memcpy(), digest_algorithm::name, tls_key_schedule_operations::name, nonce, tls_key_schedule::nonce, NULL, op, tls_key_schedule::op, rc, tls_transcript::running, tls_key_schedule::secret, tls_key_schedule::secretsize, tlskey_digest(), tlskey_reset(), tlskey_stop(), tls_key_schedule::transcript, and zalloc().
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), and tls_set_digest().
| void tlskey_stop | ( | struct tls_key_schedule * | tlskey | ) |
Stop key schedule.
| tlskey | Key schedule |
Definition at line 259 of file tlskey.c.
References tls_key_schedule::digest, digest_null, tls_key_schedule::dynamic, memset(), and zfree().
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), tls_clear_digest(), and tlskey_start().
|
static |
Process digested ClientHello or ServerHello handshake record.
| flags | Additional transcript flags to set |
Definition at line 305 of file tlskey.c.
References DBGC, DBGC_HDA, end, flags, hello, index, memcmp(), memcpy(), nonce, tls_key_schedule::nonce, random(), tls_key_schedule::random, and TLSKEY_TSF_NONCED.
Referenced by tlskey_handshake().
|
static |
Process digested Finished handshake record.
| tlskey | Key schedule |
| flags | Additional transcript flags to set |
Definition at line 340 of file tlskey.c.
References DBGC, DBGC_HDA, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, tls_transcript::running, TLSKEY_TSF_FINISHED, and tls_key_schedule::transcript.
Referenced by tlskey_handshake().
|
static |
Process digested handshake record.
| flags | Additional transcript flags to set |
Definition at line 385 of file tlskey.c.
References data, hello, index, len, TLS_CLIENT, TLS_SERVER, TLSKEY_FINISHED, tlskey_finished(), tlskey_hello(), TLSKEY_HELLO_IDX, and tlskey_finished::type.
Referenced by tlskey_digest().
| void tlskey_digest | ( | struct tls_key_schedule * | tlskey, |
| const void * | data, | ||
| size_t | len ) |
Add handshake to running transcript digest.
Definition at line 416 of file tlskey.c.
References ctx, tls_transcript::ctx, digest_algorithm::ctxsize, data, tls_key_schedule::digest, digest_final(), digest_update(), digest_algorithm::digestsize, digestsize, tls_transcript::finishing, flags, tls_transcript::flags, len, memcpy(), memset(), tls_transcript::running, tlskey_handshake(), TLSKEY_TSF_FINISHED, tmp, and tls_key_schedule::transcript.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), tls_add_handshake(), and tlskey_start().
|
static |
Expand key material.
| tlskey | Key schedule |
| secret | Secret |
| label | Label string |
| seed | Seed material |
| seed_len | Length of seed material |
| out | Output buffer |
| out_len | Length of output buffer |
Definition at line 466 of file tlskey.c.
References assert, DBGC2, DBGC2_HDA, tls_key_schedule::digest, NULL, op, tls_key_schedule::op, and out.
Referenced by tlskey_hash_cipher(), tlskey_hash_master(), tlskey_hash_verify(), tlskey_hkdf_apply(), tlskey_hkdf_cipher(), tlskey_hkdf_save(), and tlskey_hkdf_traffic().
| void tlskey_reset | ( | struct tls_key_schedule * | tlskey | ) |
Reset key schedule.
| tlskey | Key schedule |
It is safe to reset a key schedule that has been stopped, or that has not yet been started.
Definition at line 492 of file tlskey.c.
References assert, tls_kdf_secret::flags, tls_key_schedule::kdf, memset(), NULL, op, tls_key_schedule::op, tls_traffic_secret::phase, tls_key_schedule::secret, tls_key_schedule::secretsize, TLS_CLIENT, TLS_SERVER, and tls_key_schedule::traffic.
Referenced by tls_channel_reset(), tlskey_load(), and tlskey_start().
| int tlskey_apply | ( | struct tls_key_schedule * | tlskey, |
| const void * | shared, | ||
| size_t | shared_len ) |
Apply a new shared secret.
| tlskey | Key schedule |
| shared | New shared secret |
| shared_len | Length of new shared secret |
| rc | Return status code |
Definition at line 522 of file tlskey.c.
References DBGC, DBGC_HDA, ENOTTY, EPROTO, tls_kdf_secret::flags, tls_key_schedule::kdf, op, tls_key_schedule::op, rc, TLSKEY_KDF_KEYED, and TLSKEY_KDF_MASTER.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), tls_channel_apply(), tlskey_hash_load(), tlskey_hash_master(), and tlskey_hkdf_master().
| int tlskey_master | ( | struct tls_key_schedule * | tlskey, |
| int | ems ) |
Generate master secret.
| tlskey | Key schedule |
| ems | Extended master secret extension is enabled |
| rc | Return status code |
Definition at line 557 of file tlskey.c.
References DBGC, ENOTTY, EPROTO, tls_kdf_secret::flags, tls_key_schedule::kdf, op, tls_key_schedule::op, rc, TLSKEY_KDF_EMS, TLSKEY_KDF_KEYED, and TLSKEY_KDF_MASTER.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), and tls_send_client_key_exchange().
| int tlskey_verify | ( | struct tls_key_schedule * | tlskey, |
| const struct tls_endpoint * | end, | ||
| void * | verify, | ||
| size_t | verify_len ) |
Generate verification data.
| tlskey | Key schedule |
| end | Verification endpoint |
| verify | Verification data to fill in |
| verify_len | Length of verification data |
| rc | Return status code |
Definition at line 602 of file tlskey.c.
References DBGC, DBGC2, DBGC_HDA, end, ENOTTY, EPROTO, tls_transcript::flags, op, tls_key_schedule::op, rc, TLSKEY_TSF_NONCED, tls_key_schedule::transcript, and tls_key_schedule_operations::verify.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), tls_channel_verify(), and tls_send_finished().
| int tlskey_traffic | ( | struct tls_key_schedule * | tlskey, |
| const struct tls_endpoint * | writer, | ||
| const struct tls_phase * | phase ) |
Generate traffic secret.
| tlskey | Key schedule |
| writer | Writer endpoint |
| phase | Traffic phase |
| rc | Return status code |
Definition at line 639 of file tlskey.c.
References assert, DBGC, DBGC2, ENOTTY, EPROTO, tls_kdf_secret::flags, tls_phase::flags, tls_endpoint::index, tls_key_schedule::kdf, tls_endpoint::name, tls_phase::name, op, tls_key_schedule::op, tls_traffic_secret::phase, rc, TLSKEY_KDF_KEYED, and tls_key_schedule::traffic.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), and tls_change_cipher().
| 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.
| tlskey | Key schedule |
| writer | Writer endpoint |
| key | Cipher key to fill in |
| key_len | Length of cipher key |
| iv | Fixed portion of initialisation vector to fill in |
| iv_len | Length of fixed portion of initialisation vector |
| mac | MAC secret to fill in |
| mac_len | Length of MAC secret |
| rc | Return status code |
For key schedules that include a ratchet mechanism, each call consumes the current generation of traffic secret and replaces it with the next generation. Repeated calls may therefore be used to obtain multiple generations of the cipher key material.
Definition at line 691 of file tlskey.c.
References DBGC, DBGC2, DBGC_HDA, ENOTTY, EPROTO, tls_endpoint::index, iv, key, mac, tls_endpoint::name, tls_phase::name, op, tls_key_schedule::op, tls_traffic_secret::phase, rc, and tls_key_schedule::traffic.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), and tls_change_cipher().
| 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.
| tlskey | Key schedule |
| end | Endpoint |
| digest | Signature digest algorithm |
| data | Additional data |
| len | Length of additional data |
| tbs | Signable digest value to fill in |
| rc | Return status code |
Definition at line 744 of file tlskey.c.
References data, DBGC, DBGC2, DBGC_HDA, digest_algorithm::digestsize, end, ENOTTY, EPROTO, tls_transcript::flags, len, digest_algorithm::name, op, tls_key_schedule::op, rc, TLSKEY_TSF_NONCED, and tls_key_schedule::transcript.
Referenced by dummy_hash(), rfc8448_simple_test(), tls_new_server_key_exchange(), and tls_send_certificate_verify().
| int tlskey_save | ( | struct tls_key_schedule * | tlskey, |
| const void * | nonce, | ||
| size_t | nonce_len, | ||
| struct tls_preshared_key * | psk ) |
Save pre-shared key.
| tlskey | Key schedule |
| nonce | Ticket nonce |
| nonce_len | Length of ticket nonce |
| psk | Pre-shared key to fill in |
| rc | Return status code |
Definition at line 785 of file tlskey.c.
References DBGC, DBGC2, DBGC_HDA, tls_key_schedule::digest, tls_preshared_key::digest, ENOTTY, EPROTO, tls_kdf_secret::flags, tls_preshared_key::flags, tls_key_schedule::kdf, tls_preshared_key::key, memset(), nonce, op, tls_key_schedule::op, tls_preshared_key::op, rc, and TLSKEY_KDF_MASTER.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_simple_test(), and tls_channel_save().
| int tlskey_load | ( | struct tls_key_schedule * | tlskey, |
| int | ems, | ||
| const struct tls_preshared_key * | psk ) |
Load pre-shared key.
| tlskey | Key schedule |
| ems | Extended master secret extension is enabled |
| psk | Pre-shared key |
| rc | Return status code |
Definition at line 828 of file tlskey.c.
References DBGC, DBGC_HDA, tls_key_schedule::digest, tls_preshared_key::digest, ENOTTY, EPERM, EPROTO, tls_kdf_secret::flags, tls_preshared_key::flags, tls_key_schedule::kdf, tls_preshared_key::key, digest_algorithm::name, tls_key_schedule_operations::name, op, tls_key_schedule::op, tls_preshared_key::op, rc, TLSKEY_KDF_EMS, TLSKEY_KDF_MASTER, and tlskey_reset().
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), and tls_channel_load().
| 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.
| psk | Pre-shared key |
| prefix | ClientHello prefix |
| prefix_len | Length of ClientHello prefix |
| binder | Binder value to fill in |
| binder_len | Length of binder value |
| rc | Return status code |
Definition at line 885 of file tlskey.c.
References ctx, digest_algorithm::ctxsize, DBGC, DBGC2, DBGC2_HDA, DBGC_HDA, tls_preshared_key::digest, digest_final(), digest_init(), digest_update(), digest_algorithm::digestsize, digestsize, ENOENT, tls_preshared_key::key, op, tls_preshared_key::op, out, prefix, and rc.
Referenced by rfc8448_resumed_test().
|
static |
Calculate secret size.
| digest | Digest algorithm |
| secretsize | Secret size, or zero if unsupported |
Definition at line 931 of file tlskey.c.
References digest_algorithm::digestsize, and digestsize.
|
static |
Expand key material.
| digest | Digest algorithm |
| secret | Secret |
| label | Label string |
| seed | Seed material |
| seed_len | Length of seed material |
| out | Output buffer |
| out_len | Length of output buffer |
Definition at line 948 of file tlskey.c.
References __attribute__, hkdf_expand(), htons, info, len, memcpy(), out, prefix, and strlen().
Referenced by tlskey_hkdf_bind(), and tlskey_hkdf_finished().
|
static |
Calculate empty digest value.
| digest | Digest algorithm |
| empty | Empty digest to fill in |
Definition at line 984 of file tlskey.c.
References ctx, digest_algorithm::ctxsize, digest_final(), and digest_init().
Referenced by tlskey_hkdf_apply(), and tlskey_hkdf_bind().
|
static |
Calculate a finished MAC.
Definition at line 1002 of file tlskey.c.
References digest_algorithm::digestsize, digestsize, hash, hmac_ctxsize(), hmac_final(), hmac_init(), hmac_update(), key, memset(), NULL, out, tlskey_hkdf_expand(), and tmp.
Referenced by tlskey_hkdf_bind(), and tlskey_hkdf_verify().
|
static |
Reset key schedule.
| key | Key schedule |
Definition at line 1030 of file tlskey.c.
References assert, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, hkdf_extract(), tls_key_schedule::kdf, NULL, tls_kdf_secret::secret, tls_key_schedule::secret, tls_traffic_secret::secret, tls_key_schedule::secretsize, TLS_CLIENT, TLS_SERVER, and tls_key_schedule::traffic.
|
static |
Apply a new shared secret.
| tlskey | Key schedule |
| shared | New shared secret |
| shared_len | Length of new shared secret |
| rc | Return status code |
Definition at line 1054 of file tlskey.c.
References DBGC2, DBGC2_HDA, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, hkdf_extract(), tls_key_schedule::kdf, tls_kdf_secret::secret, tlskey_expand(), and tlskey_hkdf_empty().
|
static |
Generate master secret.
| tlskey | Key schedule |
| ems | Extended master secret extension is enabled |
| rc | Return status code |
Definition at line 1083 of file tlskey.c.
References DBGC, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, EPROTO, memset(), rc, and tlskey_apply().
|
static |
Generate verification data.
| tlskey | Key schedule |
| end | Verification endpoint |
| verify | Verification data to fill in |
| verify_len | Length of verification data |
| rc | Return status code |
Definition at line 1113 of file tlskey.c.
References DBGC, DBGC_HDA, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, EINVAL, end, EPROTO, tls_traffic_secret::phase, tls_transcript::running, tls_traffic_secret::secret, tls_handshake, tlskey_hkdf_finished(), tls_key_schedule::traffic, and tls_key_schedule::transcript.
|
static |
Generate traffic secret.
| tlskey | Key schedule |
| writer | Writer endpoint |
| phase | Traffic phase |
| rc | Return status code |
Definition at line 1149 of file tlskey.c.
References tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, tls_transcript::finishing, tls_endpoint::index, tls_key_schedule::kdf, tls_phase::label, tls_endpoint::name, tls_kdf_secret::secret, tls_traffic_secret::secret, snprintf(), tlskey_expand(), tls_key_schedule::traffic, and tls_key_schedule::transcript.
|
static |
Generate cipher key material.
| tlskey | Key schedule |
| writer | Writer endpoint |
| key | Cipher key to fill in |
| key_len | Length of cipher key |
| iv | Fixed portion of initialisation vector to fill in |
| iv_len | Length of fixed portion of initialisation vector |
| mac | MAC secret to fill in |
| mac_len | Length of MAC secret |
| rc | Return status code |
Definition at line 1182 of file tlskey.c.
References __unused, DBGC, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, ENOTSUP, tls_endpoint::index, iv, key, mac, NULL, tls_traffic_secret::phase, tls_traffic_secret::secret, tls_application, tlskey_expand(), and tls_key_schedule::traffic.
|
static |
Generate signable digest value.
| tlskey | Key schedule |
| end | Endpoint |
| digest | Signature digest algorithm |
| data | Additional data |
| len | Length of additional data |
| tbs | Signable digest value to fill in |
| rc | Return status code |
Definition at line 1225 of file tlskey.c.
References __unused, assert, ctx, digest_algorithm::ctxsize, data, DBGC, tls_key_schedule::digest, digest_final(), digest_init(), digest_update(), digest_algorithm::digestsize, end, ENOTSUP, len, memset(), tls_transcript::running, snprintf(), and tls_key_schedule::transcript.
|
static |
Save pre-shared key.
| tlskey | Key schedule |
| nonce | Ticket nonce |
| nonce_len | Length of ticket nonce |
| psk | Pre-shared key to fill in |
| rc | Return status code |
Definition at line 1266 of file tlskey.c.
References DBGC, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, ENOTSUP, tls_transcript::finishing, tls_key_schedule::kdf, tls_preshared_key::key, memset(), digest_algorithm::name, nonce, tls_preshared_key::resumption, tls_kdf_secret::secret, tlskey_expand(), tmp, and tls_key_schedule::transcript.
|
static |
Load pre-shared key.
| tlskey | Key schedule |
| psk | Pre-shared key |
| rc | Return status code |
Definition at line 1304 of file tlskey.c.
References assert, DBGC2, DBGC2_HDA, tls_key_schedule::digest, tls_preshared_key::digest, digest_algorithm::digestsize, digestsize, hkdf_extract(), tls_key_schedule::kdf, tls_preshared_key::key, NULL, tls_preshared_key::resumption, and tls_kdf_secret::secret.
|
static |
Generate pre-shared key binder value.
| psk | Pre-shared key |
| hash | Partial transcript hash |
| binder | Binder value to fill in |
| binder_len | Length of binder value |
| rc | Return status code |
Definition at line 1331 of file tlskey.c.
References DBGC2, DBGC2_HDA, tls_preshared_key::digest, digest_algorithm::digestsize, digestsize, EINVAL, hash, hkdf_extract(), key, tls_preshared_key::key, memset(), NULL, tlskey_hkdf_empty(), tlskey_hkdf_expand(), tlskey_hkdf_finished(), and tmp.
|
static |
Calculate secret size.
| digest | Digest algorithm |
| secretsize | Secret size, or zero if unsupported |
Definition at line 1403 of file tlskey.c.
References hmac_keysize().
|
static |
Expand key material.
| digest | Digest algorithm |
| secret | Secret |
| label | Label string |
| seed | Seed material |
| seed_len | Length of seed material |
| out | Output buffer |
| out_len | Length of output buffer |
Definition at line 1420 of file tlskey.c.
References ctx, digest_algorithm::digestsize, digestsize, hmac_ctxsize(), hmac_final(), hmac_init_key(), hmac_update(), index, memcpy(), memset(), out, strlen(), and tmp.
Referenced by tlskey_md5_sha1_expand().
|
static |
Reset key schedule.
| key | Key schedule |
Definition at line 1472 of file tlskey.c.
References tls_key_schedule::kdf, tls_kdf_secret::secret, tls_key_schedule::secret, tls_traffic_secret::secret, TLS_CLIENT, TLS_SERVER, and tls_key_schedule::traffic.
|
static |
Apply a new shared secret.
| tlskey | Key schedule |
| shared | New shared secret |
| shared_len | Length of new shared secret |
| rc | Return status code |
Definition at line 1489 of file tlskey.c.
References tls_key_schedule::digest, hmac_ctxsize(), hmac_key(), tls_key_schedule::kdf, memset(), tls_kdf_secret::secret, and tmp.
|
static |
Generate master secret.
| tlskey | Key schedule |
| ems | Extended master secret extension is enabled |
| rc | Return status code |
Definition at line 1513 of file tlskey.c.
References DBGC, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, EPROTO, tls_transcript::flags, tls_key_schedule::kdf, memset(), tls_key_schedule::random, rc, tls_transcript::running, tls_kdf_secret::secret, tlskey_apply(), tlskey_expand(), TLSKEY_TSF_NONCED, tmp, and tls_key_schedule::transcript.
|
static |
Generate verification data.
| tlskey | Key schedule |
| end | Verification endpoint |
| verify | Verification data to fill in |
| verify_len | Length of verification data |
| rc | Return status code |
Definition at line 1566 of file tlskey.c.
References DBGC, tls_key_schedule::digest, digest_algorithm::digestsize, digestsize, EINVAL, end, EPROTO, tls_kdf_secret::flags, tls_key_schedule::kdf, tls_transcript::running, tls_kdf_secret::secret, snprintf(), tlskey_expand(), TLSKEY_HASH_VERIFY_MIN, TLSKEY_KDF_MASTER, and tls_key_schedule::transcript.
|
static |
Generate traffic secret.
| tlskey | Key schedule |
| writer | Writer endpoint |
| phase | Traffic phase |
| rc | Return status code |
Definition at line 1603 of file tlskey.c.
References assert, DBGC, ENOTSUP, tls_endpoint::index, tls_key_schedule::kdf, tls_phase::name, tls_traffic_secret::phase, tls_kdf_secret::secret, tls_traffic_secret::secret, tls_application, and tls_key_schedule::traffic.
|
static |
Generate cipher key material.
| tlskey | Key schedule |
| writer | Writer endpoint |
| key | Cipher key to fill in |
| key_len | Length of cipher key |
| iv | Fixed portion of initialisation vector to fill in |
| iv_len | Length of fixed portion of initialisation vector |
| mac | MAC secret to fill in |
| mac_len | Length of MAC secret |
| rc | Return status code |
Definition at line 1634 of file tlskey.c.
References __attribute__, assert, tls_endpoint::index, iv, tls_key_schedule::kdf, key, mac, memcpy(), memset(), tls_key_schedule::random, tls_kdf_secret::secret, src, TLS_CLIENT, TLS_SERVER, tlskey_expand(), and tmp.
|
static |
Generate signable digest value.
| tlskey | Key schedule |
| end | Endpoint |
| digest | Signature digest algorithm |
| data | Additional data |
| len | Length of additional data |
| tbs | Signable digest value to fill in |
| rc | Return status code |
Definition at line 1687 of file tlskey.c.
References ctx, digest_algorithm::ctxsize, data, DBGC, tls_key_schedule::digest, digest_final(), digest_init(), digest_update(), digest_algorithm::digestsize, end, ENOTSUP, len, memcpy(), memset(), digest_algorithm::name, tls_key_schedule::random, tls_transcript::running, TLS_CLIENT, tmp, and tls_key_schedule::transcript.
|
static |
Save pre-shared key.
| tlskey | Key schedule |
| nonce | Ticket nonce |
| nonce_len | Length of ticket nonce |
| psk | Pre-shared key to fill in |
| rc | Return status code |
Definition at line 1747 of file tlskey.c.
References __unused, assert, tls_key_schedule::digest, ENOTSUP, hmac_keysize(), tls_key_schedule::kdf, tls_preshared_key::key, tls_preshared_key::master_secret, memcpy(), nonce, and tls_kdf_secret::secret.
|
static |
Load pre-shared key.
| tlskey | Key schedule |
| psk | Pre-shared key |
| rc | Return status code |
Definition at line 1780 of file tlskey.c.
References tls_preshared_key::key, tls_preshared_key::master_secret, rc, and tlskey_apply().
|
static |
Generate pre-shared key binder value.
| psk | Pre-shared key |
| hash | Partial transcript hash |
| binder | Binder value to fill in |
| binder_len | Length of binder value |
| rc | Return status code |
Definition at line 1807 of file tlskey.c.
|
static |
Calculate secret size.
| digest | Digest algorithm |
| secretsize | Secret size, or zero if unsupported |
Definition at line 1850 of file tlskey.c.
References assert, hmac_keysize(), md5_sha1_hmac_keys::md5, md5_algorithm, md5_sha1_algorithm, md5_sha1_hmac_keys::sha1, and sha1_algorithm.
|
static |
Expand key material.
| digest | Digest algorithm |
| secret | Secret |
| label | Label string |
| seed | Seed material |
| seed_len | Length of seed material |
| out | Output buffer |
| out_len | Length of output buffer |
Definition at line 1877 of file tlskey.c.
References assert, md5_sha1_hmac_keys::md5, md5_algorithm, md5_sha1_algorithm, memset(), out, md5_sha1_hmac_keys::sha1, sha1_algorithm, tlskey_hash_expand(), tmp, and xor().
|
static |
Apply a new shared secret.
| tlskey | Key schedule |
| shared | New shared secret |
| shared_len | Length of new shared secret |
| rc | Return status code |
Definition at line 1916 of file tlskey.c.
References assert, tls_key_schedule::digest, hmac_ctxsize(), hmac_key(), tls_key_schedule::kdf, md5_sha1_hmac_keys::md5, md5_algorithm, md5_sha1_algorithm, memset(), tls_kdf_secret::secret, md5_sha1_hmac_keys::sha1, sha1_algorithm, and tmp.
|
static |
Save pre-shared key.
| tlskey | Key schedule |
| nonce | Ticket nonce |
| nonce_len | Length of ticket nonce |
| psk | Pre-shared key |
| rc | Return status code |
Definition at line 1961 of file tlskey.c.
References __unused, assert, tls_key_schedule::digest, ENOTSUP, hmac_keysize(), tls_key_schedule::kdf, tls_preshared_key::key, tls_preshared_key::master_secret, md5_sha1_hmac_keys::md5, tls_preshared_key::md5, md5_algorithm, md5_sha1_algorithm, memcpy(), nonce, tls_kdf_secret::secret, md5_sha1_hmac_keys::sha1, tls_preshared_key::sha1, and sha1_algorithm.
| const struct tls_endpoint tls_client |
Client endpoint.
| const struct tls_endpoint tls_server |
Server endpoint.
|
static |
Endpoint list.
| const struct tls_phase tls_early |
Early traffic phase.
Definition at line 137 of file tlskey.c.
Referenced by rfc8448_resumed_test().
| const struct tls_phase tls_handshake |
Handshake traffic phase.
Definition at line 144 of file tlskey.c.
Referenced by rfc8448_resumed_test(), rfc8448_simple_test(), and tlskey_hkdf_verify().
| const struct tls_phase tls_application |
Application traffic phase.
Definition at line 151 of file tlskey.c.
Referenced by dummy_hash(), dummy_md5_sha1(), rfc8448_resumed_test(), rfc8448_simple_test(), tls_change_cipher(), tlskey_hash_traffic(), and tlskey_hkdf_cipher().
| const struct tls_key_schedule_operations tlskey_hkdf |
TLS key schedule based on HKDF.
Definition at line 1369 of file tlskey.c.
Referenced by rfc8448_resumed_test(), and rfc8448_simple_test().
| const struct tls_key_schedule_operations tlskey_hash |
TLS key schedule based on P_Hash().
Definition at line 1819 of file tlskey.c.
Referenced by dummy_hash(), and tls_set_digest().
| const struct tls_key_schedule_operations tlskey_md5_sha1 |
TLS key schedule based on P_MD5()+P_SHA1().
Definition at line 1993 of file tlskey.c.
Referenced by dummy_md5_sha1(), and tls_set_digest().