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

1.1       misho       1: /*
                      2:  * Copyright (C) 2014 Martin Willi
                      3:  * Copyright (C) 2014 revosec AG
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: /**
                     17:  * @defgroup tls_aead tls_aead
                     18:  * @{ @ingroup tls
                     19:  */
                     20: 
                     21: #ifndef TLS_AEAD_H_
                     22: #define TLS_AEAD_H_
                     23: 
                     24: typedef struct tls_aead_t tls_aead_t;
                     25: 
                     26: #include "tls.h"
                     27: 
                     28: /**
                     29:  * TLS specific AEAD interface, includes padding.
                     30:  *
                     31:  * As TLS uses sign-then-encrypt instead of the more modern encrypt-then-sign,
                     32:  * we can't directly abstract traditional transforms using our aead_t interface.
                     33:  * With traditional transforms, the AEAD operation has to manage padding, as
                     34:  * the MAC is calculated over unpadded data.
                     35:  */
                     36: struct tls_aead_t {
                     37: 
                     38:        /**
                     39:         * Encrypt and sign a TLS record.
                     40:         *
                     41:         * The plain data chunk gets freed on success, and the data chunk
                     42:         * gets updated with a new allocation of the encrypted data.
                     43:         * If next_iv is given, it must contain the IV for this operation. It
                     44:         * gets updated to the IV for the next record.
                     45:         *
                     46:         * @param version               TLS version
                     47:         * @param type                  TLS content type
                     48:         * @param seq                   record sequence number
                     49:         * @param data                  data to encrypt, encryption result
                     50:         * @return                              TRUE if successfully encrypted
                     51:         */
                     52:        bool (*encrypt)(tls_aead_t *this, tls_version_t version,
                     53:                                        tls_content_type_t type, uint64_t seq, chunk_t *data);
                     54: 
                     55:        /**
                     56:         * Decrypt and verify a TLS record.
                     57:         *
                     58:         * The passed encrypted data chunk gets updated to the decrypted record
                     59:         * length, decryption is done inline.
                     60:         *
                     61:         * @param version               TLS version
                     62:         * @param type                  TLS content type
                     63:         * @param seq                   record sequence number
                     64:         * @param data                  data to decrypt, decrypted result
                     65:         * @return                              TRUE if successfully decrypted
                     66:         */
                     67:        bool (*decrypt)(tls_aead_t *this, tls_version_t version,
                     68:                                        tls_content_type_t type, uint64_t seq, chunk_t *data);
                     69: 
                     70:        /**
                     71:         * Get the authentication key size.
                     72:         *
                     73:         * @return              key size, in bytes, 0 if not used
                     74:         */
                     75:        size_t (*get_mac_key_size)(tls_aead_t *this);
                     76: 
                     77:        /**
                     78:         * Get the encryption key size, if used.
                     79:         *
                     80:         * @return              key size, in bytes, 0 if not used
                     81:         */
                     82:        size_t (*get_encr_key_size)(tls_aead_t *this);
                     83: 
                     84:        /**
                     85:         * Get the size of implicit IV (or AEAD salt), if used.
                     86:         *
                     87:         * @return              IV/salt size, in bytes, 0 if not used
                     88:         */
                     89:        size_t (*get_iv_size)(tls_aead_t *this);
                     90: 
                     91:        /**
                     92:         * Set the keys used by an AEAD transform.
                     93:         *
                     94:         * @param mac           authentication key, if used
                     95:         * @param encr          encryption key, if used
                     96:         * @param iv            initial implicit IV or AEAD salt, if any
                     97:         * @return                      TRUE if key valid and set
                     98:         */
                     99:        bool (*set_keys)(tls_aead_t *this, chunk_t mac, chunk_t ecnr, chunk_t iv);
                    100: 
                    101:        /**
                    102:         * Destroy a tls_aead_t.
                    103:         */
                    104:        void (*destroy)(tls_aead_t *this);
                    105: };
                    106: 
                    107: /**
                    108:  * Create a tls_aead instance using traditional transforms, explicit IV.
                    109:  *
                    110:  * An explicit IV means that the IV is prepended to each TLS record. This is
                    111:  * the mechanism used in TLS 1.1 and newer.
                    112:  *
                    113:  * @param mac                  integrity protection algorithm
                    114:  * @param encr                 encryption algorithm
                    115:  * @param encr_size            encryption key size, in bytes
                    116:  * @return                             TLS AEAD transform
                    117:  */
                    118: tls_aead_t *tls_aead_create_explicit(integrity_algorithm_t mac,
                    119:                                                                encryption_algorithm_t encr, size_t encr_size);
                    120: 
                    121: /**
                    122:  * Create a tls_aead instance using traditional transforms, implicit IV.
                    123:  *
                    124:  * An implicit IV uses a first IV derived from the TLS keymat, which then
                    125:  * gets replaced by the last encrypted records tail. This is the mechanism
                    126:  * used for TLS 1.0 and older.
                    127:  *
                    128:  * @param mac                  integrity protection algorithm
                    129:  * @param encr                 encryption algorithm
                    130:  * @param encr_size            encryption key size, in bytes
                    131:  * @return                             TLS AEAD transform
                    132:  */
                    133: tls_aead_t *tls_aead_create_implicit(integrity_algorithm_t mac,
                    134:                                                                encryption_algorithm_t encr, size_t encr_size);
                    135: 
                    136: /**
                    137:  * Create a tls_aead instance using NULL encryption.
                    138:  *
                    139:  * As no IV is involved with null encryption, this AEAD works with any
                    140:  * version of TLS.
                    141:  *
                    142:  * @param mac                  integrity protection algorithm
                    143:  * @return                             TLS AEAD transform
                    144:  */
                    145: tls_aead_t *tls_aead_create_null(integrity_algorithm_t mac);
                    146: 
                    147: /**
                    148:  * Create a tls_aead instance using real a AEAD cipher.
                    149:  *
                    150:  * @param encr                 AEAD encryption algorithm
                    151:  * @param encr_size            encryption key size, in bytes
                    152:  * @return                             TLS AEAD transform
                    153:  */
                    154: tls_aead_t *tls_aead_create_aead(encryption_algorithm_t encr, size_t encr_size);
                    155: 
                    156: #endif /** TLS_AEAD_H_ @}*/

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