Annotation of embedaddon/strongswan/src/libtls/tls.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2010 Martin Willi
        !             3:  * Copyright (C) 2010 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 libtls libtls
        !            18:  *
        !            19:  * @addtogroup libtls
        !            20:  * TLS implementation on top of libstrongswan
        !            21:  *
        !            22:  * @defgroup tls tls
        !            23:  * @{ @ingroup libtls
        !            24:  */
        !            25: 
        !            26: #ifndef TLS_H_
        !            27: #define TLS_H_
        !            28: 
        !            29: /**
        !            30:  * Maximum size of a TLS fragment
        !            31:  * as defined by section 6.2.1. "Fragmentation" of RFC 5246 TLS 1.2
        !            32:  */
        !            33: #define TLS_MAX_FRAGMENT_LEN   16384
        !            34: 
        !            35: typedef enum tls_version_t tls_version_t;
        !            36: typedef enum tls_content_type_t tls_content_type_t;
        !            37: typedef enum tls_handshake_type_t tls_handshake_type_t;
        !            38: typedef enum tls_purpose_t tls_purpose_t;
        !            39: typedef struct tls_t tls_t;
        !            40: 
        !            41: #include <library.h>
        !            42: 
        !            43: #include "tls_application.h"
        !            44: #include "tls_cache.h"
        !            45: 
        !            46: /**
        !            47:  * TLS/SSL version numbers
        !            48:  */
        !            49: enum tls_version_t {
        !            50:        SSL_2_0 = 0x0200,
        !            51:        SSL_3_0 = 0x0300,
        !            52:        TLS_1_0 = 0x0301,
        !            53:        TLS_1_1 = 0x0302,
        !            54:        TLS_1_2 = 0x0303,
        !            55: };
        !            56: 
        !            57: /**
        !            58:  * Enum names for tls_version_t
        !            59:  */
        !            60: extern enum_name_t *tls_version_names;
        !            61: 
        !            62: /**
        !            63:  * TLS higher level content type
        !            64:  */
        !            65: enum tls_content_type_t {
        !            66:        TLS_CHANGE_CIPHER_SPEC = 20,
        !            67:        TLS_ALERT = 21,
        !            68:        TLS_HANDSHAKE = 22,
        !            69:        TLS_APPLICATION_DATA = 23,
        !            70: };
        !            71: 
        !            72: /**
        !            73:  * Enum names for tls_content_type_t
        !            74:  */
        !            75: extern enum_name_t *tls_content_type_names;
        !            76: 
        !            77: /**
        !            78:  * TLS handshake subtype
        !            79:  */
        !            80: enum tls_handshake_type_t {
        !            81:        TLS_HELLO_REQUEST = 0,
        !            82:        TLS_CLIENT_HELLO = 1,
        !            83:        TLS_SERVER_HELLO = 2,
        !            84:        TLS_CERTIFICATE = 11,
        !            85:        TLS_SERVER_KEY_EXCHANGE = 12,
        !            86:        TLS_CERTIFICATE_REQUEST = 13,
        !            87:        TLS_SERVER_HELLO_DONE = 14,
        !            88:        TLS_CERTIFICATE_VERIFY = 15,
        !            89:        TLS_CLIENT_KEY_EXCHANGE = 16,
        !            90:        TLS_FINISHED = 20,
        !            91: };
        !            92: 
        !            93: /**
        !            94:  * Enum names for tls_handshake_type_t
        !            95:  */
        !            96: extern enum_name_t *tls_handshake_type_names;
        !            97: 
        !            98: /**
        !            99:  * Purpose the TLS stack is initiated for.
        !           100:  */
        !           101: enum tls_purpose_t {
        !           102:        /** authentication in EAP-TLS */
        !           103:        TLS_PURPOSE_EAP_TLS,
        !           104:        /** outer authentication and protection in EAP-TTLS */
        !           105:        TLS_PURPOSE_EAP_TTLS,
        !           106:        /** outer authentication and protection in EAP-PEAP */
        !           107:        TLS_PURPOSE_EAP_PEAP,
        !           108:        /** non-EAP TLS */
        !           109:        TLS_PURPOSE_GENERIC,
        !           110:        /** non-EAP TLS accepting NULL encryption */
        !           111:        TLS_PURPOSE_GENERIC_NULLOK,
        !           112:        /** EAP binding for TNC */
        !           113:        TLS_PURPOSE_EAP_TNC
        !           114: };
        !           115: 
        !           116: /**
        !           117:  * TLS Hello extension types.
        !           118:  */
        !           119: enum tls_extension_t {
        !           120:        /** Server name the client wants to talk to */
        !           121:        TLS_EXT_SERVER_NAME = 0,
        !           122:        /** request a maximum fragment size */
        !           123:        TLS_EXT_MAX_FRAGMENT_LENGTH = 1,
        !           124:        /** indicate client certificate URL support */
        !           125:        TLS_EXT_CLIENT_CERTIFICATE_URL = 2,
        !           126:        /** list of CA the client trusts */
        !           127:        TLS_EXT_TRUSTED_CA_KEYS = 3,
        !           128:        /** request MAC truncation to 80-bit */
        !           129:        TLS_EXT_TRUNCATED_HMAC = 4,
        !           130:        /** list of OCSP responders the client trusts */
        !           131:        TLS_EXT_STATUS_REQUEST = 5,
        !           132:        /** list of supported elliptic curves */
        !           133:        TLS_EXT_ELLIPTIC_CURVES = 10,
        !           134:        /** supported point formats */
        !           135:        TLS_EXT_EC_POINT_FORMATS = 11,
        !           136:        /** list supported signature algorithms */
        !           137:        TLS_EXT_SIGNATURE_ALGORITHMS = 13,
        !           138:        /** cryptographic binding for RFC 5746 renegotiation indication */
        !           139:        TLS_EXT_RENEGOTIATION_INFO = 65281,
        !           140: };
        !           141: 
        !           142: enum tls_name_type_t {
        !           143:        TLS_NAME_TYPE_HOST_NAME = 0,
        !           144: };
        !           145: 
        !           146: /**
        !           147:  * Enum names for tls_extension_t
        !           148:  */
        !           149: extern enum_name_t *tls_extension_names;
        !           150: 
        !           151: /**
        !           152:  * A bottom-up driven TLS stack, suitable for EAP implementations.
        !           153:  */
        !           154: struct tls_t {
        !           155: 
        !           156:        /**
        !           157:         * Process one or more TLS records, pass it to upper layers.
        !           158:         *
        !           159:         * @param buf           TLS record data, including headers
        !           160:         * @param buflen        number of bytes in buf to process
        !           161:         * @return
        !           162:         *                                      - SUCCESS if TLS negotiation complete
        !           163:         *                                      - FAILED if TLS handshake failed
        !           164:         *                                      - NEED_MORE if more invocations to process/build needed
        !           165:         */
        !           166:        status_t (*process)(tls_t *this, void *buf, size_t buflen);
        !           167: 
        !           168:        /**
        !           169:         * Query upper layer for one or more TLS records, build fragments.
        !           170:         *
        !           171:         * The TLS stack automatically fragments the records to the given buffer
        !           172:         * size. Fragmentation is indicated by the reclen output parameter and
        !           173:         * the return value. For the first fragment of a TLS record, a non-zero
        !           174:         * record length is returned in reclen. If more fragments follow, NEED_MORE
        !           175:         * is returned. A return value of ALREADY_DONE indicates that the final
        !           176:         * fragment has been returned.
        !           177:         *
        !           178:         * @param buf           buffer to write TLS record fragments to
        !           179:         * @param buflen        size of buffer, receives bytes written
        !           180:         * @param msglen        receives size of all TLS fragments
        !           181:         * @return
        !           182:         *                                      - SUCCESS if TLS negotiation complete
        !           183:         *                                      - FAILED if TLS handshake failed
        !           184:         *                                      - INVALID_STATE if more input data required
        !           185:         *                                      - NEED_MORE if more fragments available
        !           186:         *                                      - ALREADY_DONE if the last available fragment returned
        !           187:         */
        !           188:        status_t (*build)(tls_t *this, void *buf, size_t *buflen, size_t *msglen);
        !           189: 
        !           190:        /**
        !           191:         * Check if TLS stack is acting as a server.
        !           192:         *
        !           193:         * @return                      TRUE if server, FALSE if peer
        !           194:         */
        !           195:        bool (*is_server)(tls_t *this);
        !           196: 
        !           197:        /**
        !           198:         * Return the server identity.
        !           199:         *
        !           200:         * @return                      server identity
        !           201:         */
        !           202:        identification_t* (*get_server_id)(tls_t *this);
        !           203: 
        !           204:        /**
        !           205:         * Set the peer identity.
        !           206:         *
        !           207:         * @param id            peer identity
        !           208:         */
        !           209:        void (*set_peer_id)(tls_t *this, identification_t *id);
        !           210: 
        !           211:        /**
        !           212:         * Return the peer identity.
        !           213:         *
        !           214:         * @return                      peer identity
        !           215:         */
        !           216:        identification_t* (*get_peer_id)(tls_t *this);
        !           217: 
        !           218:        /**
        !           219:         * Get the negotiated TLS/SSL version.
        !           220:         *
        !           221:         * @return                      negotiated TLS version
        !           222:         */
        !           223:        tls_version_t (*get_version)(tls_t *this);
        !           224: 
        !           225:        /**
        !           226:         * Set the negotiated TLS/SSL version.
        !           227:         *
        !           228:         * @param version       negotiated TLS version
        !           229:         * @return                      TRUE if version acceptable
        !           230:         */
        !           231:        bool (*set_version)(tls_t *this, tls_version_t version);
        !           232: 
        !           233:        /**
        !           234:         * Get the purpose of this TLS stack instance.
        !           235:         *
        !           236:         * @return                      purpose given during construction
        !           237:         */
        !           238:        tls_purpose_t (*get_purpose)(tls_t *this);
        !           239: 
        !           240:        /**
        !           241:         * Check if TLS negotiation completed successfully.
        !           242:         *
        !           243:         * @return                      TRUE if TLS negotiation and authentication complete
        !           244:         */
        !           245:        bool (*is_complete)(tls_t *this);
        !           246: 
        !           247:        /**
        !           248:         * Get the MSK for EAP-TLS.
        !           249:         *
        !           250:         * @return                      MSK, internal data
        !           251:         */
        !           252:        chunk_t (*get_eap_msk)(tls_t *this);
        !           253: 
        !           254:        /**
        !           255:         * Get the authentication details after completing the handshake.
        !           256:         *
        !           257:         * @return                      authentication details, internal data
        !           258:         */
        !           259:        auth_cfg_t* (*get_auth)(tls_t *this);
        !           260: 
        !           261:        /**
        !           262:         * Destroy a tls_t.
        !           263:         */
        !           264:        void (*destroy)(tls_t *this);
        !           265: };
        !           266: 
        !           267: /**
        !           268:  * Dummy libtls initialization function needed for integrity test
        !           269:  */
        !           270: void libtls_init(void);
        !           271: 
        !           272: /**
        !           273:  * Create a tls instance.
        !           274:  *
        !           275:  * @param is_server                    TRUE to act as server, FALSE for client
        !           276:  * @param server                       server identity
        !           277:  * @param peer                         peer identity, NULL for no client authentication
        !           278:  * @param purpose                      purpose this TLS stack instance is used for
        !           279:  * @param application          higher layer application or NULL if none
        !           280:  * @param cache                                session cache to use, or NULL
        !           281:  * @return                                     TLS stack
        !           282:  */
        !           283: tls_t *tls_create(bool is_server, identification_t *server,
        !           284:                                  identification_t *peer, tls_purpose_t purpose,
        !           285:                                  tls_application_t *application, tls_cache_t *cache);
        !           286: 
        !           287: #endif /** TLS_H_ @}*/

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