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