|
iPXE
|
TLS key schedules. More...
Go to the source code of this file.
Data Structures | |
| struct | tls_endpoint |
| A TLS endpoint. More... | |
| struct | tls_random |
| TLS client or server random bytes. More... | |
| struct | tls_transcript |
| A TLS running handshake transcript digest. More... | |
| struct | tls_kdf_secret |
| A TLS key derivation function secret. More... | |
| struct | tls_traffic_secret |
| A TLS traffic secret. More... | |
| struct | tls_key_schedule |
| A TLS key schedule. More... | |
| struct | tls_preshared_key |
| A TLS pre-shared key. More... | |
| struct | tls_key_schedule_operations |
| TLS key schedule operations. More... | |
Macros | |
| #define | TLS_CLIENT 0 |
| Client endpoint index. | |
| #define | TLS_SERVER 1 |
| Server endpoint index. | |
| #define | TLS_RANDOM_LEN 32 |
| Number of random bytes. | |
| #define | TLSKEY_TSF_NONCED 0x0001 |
| Transcript digest includes a Hello record containing the local nonce. | |
| #define | TLSKEY_TSF_FINISHED 0x0002 |
| Transcript digest includes a Finished record. | |
| #define | TLSKEY_KDF_KEYED 0x0001 |
| Key derivation function has key material. | |
| #define | TLSKEY_KDF_MASTER 0x0002 |
| Key derivation function has a master secret. | |
| #define | TLSKEY_KDF_EMS 0x0004 |
| Key derivation function has an extended master secret. | |
Functions | |
| FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
| FILE_SECBOOT (PERMITTED) | |
| static int | tlskey_is_accumulating (struct tls_key_schedule *tlskey) |
| Check if key schedule accumulates shared secrets. | |
| int | tlskey_start (struct tls_key_schedule *tlskey, const struct tls_key_schedule_operations *op, struct digest_algorithm *digest, const struct tls_random *random) |
| Start key schedule. | |
| void | tlskey_stop (struct tls_key_schedule *tlskey) |
| Stop key schedule. | |
| void | tlskey_digest (struct tls_key_schedule *tlskey, const void *data, size_t len) |
| Add handshake to running transcript digest. | |
| 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. | |
Variables | |
| const struct tls_endpoint | tls_client |
| Client endpoint. | |
| const struct tls_endpoint | tls_server |
| Server endpoint. | |
| 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.
Definition in file tlskey.h.
| #define TLS_CLIENT 0 |
Client endpoint index.
Definition at line 27 of file tlskey.h.
Referenced by rfc8448_resumed_test(), rfc8448_simple_test(), tlskey_handshake(), tlskey_hash_cipher(), tlskey_hash_reset(), tlskey_hash_tbshash(), tlskey_hkdf_reset(), and tlskey_reset().
| #define TLS_SERVER 1 |
Server endpoint index.
Definition at line 30 of file tlskey.h.
Referenced by rfc8448_resumed_test(), rfc8448_simple_test(), tlskey_handshake(), tlskey_hash_cipher(), tlskey_hash_reset(), tlskey_hkdf_reset(), and tlskey_reset().
| #define TLSKEY_TSF_NONCED 0x0001 |
Transcript digest includes a Hello record containing the local nonce.
Definition at line 69 of file tlskey.h.
Referenced by tlskey_hash_master(), tlskey_hello(), tlskey_tbshash(), and tlskey_verify().
| #define TLSKEY_TSF_FINISHED 0x0002 |
Transcript digest includes a Finished record.
Definition at line 72 of file tlskey.h.
Referenced by tlskey_digest(), and tlskey_finished().
| #define TLSKEY_KDF_KEYED 0x0001 |
Key derivation function has key material.
Definition at line 83 of file tlskey.h.
Referenced by tlskey_apply(), tlskey_master(), and tlskey_traffic().
| #define TLSKEY_KDF_MASTER 0x0002 |
Key derivation function has a master secret.
Definition at line 86 of file tlskey.h.
Referenced by tlskey_apply(), tlskey_hash_verify(), tlskey_load(), tlskey_master(), and tlskey_save().
| #define TLSKEY_KDF_EMS 0x0004 |
Key derivation function has an extended master secret.
Definition at line 89 of file tlskey.h.
Referenced by tlskey_load(), and tlskey_master().
| FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
| FILE_SECBOOT | ( | PERMITTED | ) |
|
inlinestatic |
Check if key schedule accumulates shared secrets.
| tlskey | Key schedule |
| is_accumulating | Key schedule accumulates all shared secrets |
Definition at line 329 of file tlskey.h.
References op, and tls_key_schedule::op.
Referenced by tls_channel_apply().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
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().
|
extern |
Client endpoint.
|
extern |
Server endpoint.
|
extern |
|
extern |
Handshake traffic phase.
Definition at line 144 of file tlskey.c.
Referenced by rfc8448_resumed_test(), rfc8448_simple_test(), and tlskey_hkdf_verify().
|
extern |
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().
|
extern |
TLS key schedule based on HKDF.
Definition at line 1369 of file tlskey.c.
Referenced by rfc8448_resumed_test(), and rfc8448_simple_test().
|
extern |
TLS key schedule based on P_Hash().
Definition at line 1819 of file tlskey.c.
Referenced by dummy_hash(), and tls_set_digest().
|
extern |
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().