Annotation of embedaddon/strongswan/src/libtls/tls_hkdf.h, revision 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>