Annotation of embedaddon/strongswan/src/libtls/tls_hkdf.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2020 Pascal Knecht
                      3:  * Copyright (C) 2020 Méline Sieber
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: /**
                     18:  * @defgroup tls_hkdf tls_hkdf
                     19:  * @{ @ingroup libtls
                     20:  */
                     21: 
                     22: #ifndef TLS_HKDF_H_
                     23: #define TLS_HKDF_H_
                     24: 
                     25: #include <library.h>
                     26: #include <crypto/hashers/hasher.h>
                     27: 
                     28: typedef enum tls_hkdf_label_t tls_hkdf_label_t;
                     29: typedef struct tls_hkdf_t tls_hkdf_t;
                     30: 
                     31: /**
                     32:  * TLS HKDF labels
                     33:  */
                     34: enum tls_hkdf_label_t {
                     35:        TLS_HKDF_EXT_BINDER,
                     36:        TLS_HKDF_RES_BINDER,
                     37:        TLS_HKDF_C_E_TRAFFIC,
                     38:        TLS_HKDF_E_EXP_MASTER,
                     39:        TLS_HKDF_C_HS_TRAFFIC,
                     40:        TLS_HKDF_S_HS_TRAFFIC,
                     41:        TLS_HKDF_C_AP_TRAFFIC,
                     42:        TLS_HKDF_S_AP_TRAFFIC,
                     43:        TLS_HKDF_EXP_MASTER,
                     44:        TLS_HKDF_RES_MASTER,
                     45:        TLS_HKDF_UPD_C_TRAFFIC,
                     46:        TLS_HKDF_UPD_S_TRAFFIC,
                     47: };
                     48: 
                     49: /**
                     50:  * TLS HKDF helper functions.
                     51:  */
                     52: struct tls_hkdf_t {
                     53: 
                     54:        /**
                     55:         * Set the (EC)DHE shared secret of this connection.
                     56:         *
                     57:         * @param shared_secret         input key material to use
                     58:         */
                     59:        void (*set_shared_secret)(tls_hkdf_t *this, chunk_t shared_secret);
                     60: 
                     61:        /**
                     62:         * Allocate secret of the requested label.
                     63:         *
                     64:         * Space for returned secret is allocated and must be freed by the caller.
                     65:         *
                     66:         * @param label                         HKDF label of requested secret
                     67:         * @param messages                      handshake messages
                     68:         * @param secret                        secret will be written into this chunk, if used
                     69:         * @return                                      TRUE if secrets derived successfully
                     70:         */
                     71:        bool (*generate_secret)(tls_hkdf_t *this, tls_hkdf_label_t label,
                     72:                                                        chunk_t messages, chunk_t *secret);
                     73: 
                     74:        /**
                     75:         * Allocate traffic encryption key bytes.
                     76:         *
                     77:         * Key used to encrypt traffic data as defined in RFC 8446, section 7.3.
                     78:         * Space for returned secret is allocated and must be freed by the caller.
                     79:         *
                     80:         * @param is_server                     TRUE if server, FALSE if client derives secret
                     81:         * @param length                        key length, in bytes
                     82:         * @param key                           key will be written into this chunk
                     83:         * @return                                      TRUE if secrets derived successfully
                     84:         */
                     85:        bool (*derive_key)(tls_hkdf_t *this, bool is_server, size_t length,
                     86:                                           chunk_t *key);
                     87: 
                     88:        /**
                     89:         * Allocate traffic IV bytes.
                     90:         *
                     91:         * IV used to encrypt traffic data as defined in RFC 8446, section 7.3.
                     92:         * Space for returned secret is allocated and must be freed by the caller.
                     93:         *
                     94:         * @param is_server                     TRUE if server, FALSE if client derives secret
                     95:         * @param length                        key length, in bytes
                     96:         * @param iv                            IV will be written into this chunk
                     97:         * @return                                      TRUE if secrets derived successfully
                     98:         */
                     99:        bool (*derive_iv)(tls_hkdf_t *this, bool is_server, size_t length,
                    100:                                          chunk_t *iv);
                    101: 
                    102:        /**
                    103:         * Allocate finished key bytes.
                    104:         *
                    105:         * Key used to compute Finished messages as defined in RFC 8446,
                    106:         * section 4.4.4. Space for returned secret is allocated and must be freed
                    107:         * by the caller.
                    108:         *
                    109:         * @param server                        Whether the client or server finish key is derived
                    110:         * @param finished                      key will be written into this chunk
                    111:         * @return                                      TRUE if secrets derived successfully
                    112:         */
                    113:        bool (*derive_finished)(tls_hkdf_t *this, bool server,
                    114:                                                        chunk_t *finished);
                    115: 
                    116:        /**
                    117:         * Export key material.
                    118:         *
                    119:         * @param label                         exporter label
                    120:         * @param context                       optional context
                    121:         * @param messages                      handshake messages
                    122:         * @param length                        key length, in bytes
                    123:         * @param key                           exported key material
                    124:         * @return                                      TRUE if key material successfully exported
                    125:         */
                    126:        bool (*export)(tls_hkdf_t *this, char *label, chunk_t context,
                    127:                                   chunk_t messages, size_t length, chunk_t *key);
                    128: 
                    129:        /**
                    130:         * Generate resumption PSKs.
                    131:         *
                    132:         * @param messages                      handshake messages
                    133:         * @param nonce                         nonce to use for this PSK
                    134:         * @param psk                           generated PSK
                    135:         * @return                                      TRUE if PSK successfully generated
                    136:         */
                    137:        bool (*resume)(tls_hkdf_t *this, chunk_t messages, chunk_t nonce,
                    138:                                   chunk_t *psk);
                    139: 
                    140:        /**
                    141:         * Generate a PSK binder.
                    142:         *
                    143:         * @note The transcript hash is built of the partial ClientHello message up
                    144:         * to and including the PreSharedKey extension's identities field, excluding
                    145:         * the actual binders (their length is included in that of the extension(s)
                    146:         * and message, though), as per RFC 8446, section 4.2.11.2.
                    147:         *
                    148:         * @param seed                          transcript-hash of client_hello to seed the PRF
                    149:         * @param psk_binder            generated psk binder
                    150:         * @return                                      TRUE if output was generated
                    151:         */
                    152:        bool (*binder)(tls_hkdf_t *this, chunk_t seed, chunk_t *psk_binder);
                    153: 
                    154:        /**
                    155:         * Use the internal PRF to allocate data (mainly for the finished message
                    156:         * where the key is from derive_finished() and the seed is the transcript
                    157:         * hash).
                    158:         *
                    159:         * @param key                           key to use with the PRF
                    160:         * @param seed                          seed to use with the PRF
                    161:         * @param out                           output from the PRF (allocated)
                    162:         * @return                                      TRUE if output was generated
                    163:         */
                    164:        bool (*allocate_bytes)(tls_hkdf_t *this, chunk_t key, chunk_t seed,
                    165:                                                   chunk_t *out);
                    166: 
                    167:        /**
                    168:         * Destroy a tls_hkdf_t
                    169:         */
                    170:        void (*destroy)(tls_hkdf_t *this);
                    171: };
                    172: 
                    173: /**
                    174:  * Create a tls_hkdf instance.
                    175:  *
                    176:  * @param hash_algorithm       hash algorithm to use
                    177:  * @param psk                          Pre shared key if available otherwise NULL
                    178:  * @return                                     TLS HKDF helper
                    179:  */
                    180: tls_hkdf_t *tls_hkdf_create(hash_algorithm_t hash_algorithm, chunk_t psk);
                    181: 
                    182: #endif /** TLS_HKDF_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>