Annotation of embedaddon/strongswan/src/libstrongswan/crypto/crypters/crypter.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2005-2006 Martin Willi
        !             3:  * Copyright (C) 2005 Jan Hutter
        !             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 crypter crypter
        !            19:  * @{ @ingroup crypto
        !            20:  */
        !            21: 
        !            22: #ifndef CRYPTER_H_
        !            23: #define CRYPTER_H_
        !            24: 
        !            25: typedef enum encryption_algorithm_t encryption_algorithm_t;
        !            26: typedef struct crypter_t crypter_t;
        !            27: 
        !            28: #include <library.h>
        !            29: 
        !            30: /**
        !            31:  * Encryption algorithm, as in IKEv2 RFC 3.3.2.
        !            32:  */
        !            33: enum encryption_algorithm_t {
        !            34:        ENCR_DES_IV64 =            1,
        !            35:        ENCR_DES =                 2,
        !            36:        ENCR_3DES =                3,
        !            37:        ENCR_RC5 =                 4,
        !            38:        ENCR_IDEA =                5,
        !            39:        ENCR_CAST =                6,
        !            40:        ENCR_BLOWFISH =            7,
        !            41:        ENCR_3IDEA =               8,
        !            42:        ENCR_DES_IV32 =            9,
        !            43:        ENCR_NULL =               11,
        !            44:        ENCR_AES_CBC =            12,
        !            45:        /** CTR as specified for IPsec (RFC5930/RFC3686), nonce appended to key */
        !            46:        ENCR_AES_CTR =            13,
        !            47:        ENCR_AES_CCM_ICV8 =       14,
        !            48:        ENCR_AES_CCM_ICV12 =      15,
        !            49:        ENCR_AES_CCM_ICV16 =      16,
        !            50:        ENCR_AES_GCM_ICV8 =       18,
        !            51:        ENCR_AES_GCM_ICV12 =      19,
        !            52:        ENCR_AES_GCM_ICV16 =      20,
        !            53:        ENCR_NULL_AUTH_AES_GMAC = 21,
        !            54:        ENCR_CAMELLIA_CBC =       23,
        !            55:        /* CTR as specified for IPsec (RFC5529), nonce appended to key */
        !            56:        ENCR_CAMELLIA_CTR =       24,
        !            57:        ENCR_CAMELLIA_CCM_ICV8 =  25,
        !            58:        ENCR_CAMELLIA_CCM_ICV12 = 26,
        !            59:        ENCR_CAMELLIA_CCM_ICV16 = 27,
        !            60:        ENCR_CHACHA20_POLY1305 =  28,
        !            61:        ENCR_UNDEFINED =        1024,
        !            62:        ENCR_DES_ECB =          1025,
        !            63:        ENCR_SERPENT_CBC =      1026,
        !            64:        ENCR_TWOFISH_CBC =      1027,
        !            65:        /* see macros below to handle RC2 (effective) key length */
        !            66:        ENCR_RC2_CBC =          1028,
        !            67:        ENCR_AES_ECB =                  1029,
        !            68: };
        !            69: 
        !            70: #define DES_BLOCK_SIZE                  8
        !            71: #define BLOWFISH_BLOCK_SIZE             8
        !            72: #define AES_BLOCK_SIZE                 16
        !            73: #define CAMELLIA_BLOCK_SIZE            16
        !            74: #define SERPENT_BLOCK_SIZE             16
        !            75: #define TWOFISH_BLOCK_SIZE             16
        !            76: 
        !            77: /**
        !            78:  * For RC2, if the effective key size in bits is not key_size * 8, it should
        !            79:  * be encoded with the macro below. It can be decoded with the other two macros.
        !            80:  * After decoding the value should be validated.
        !            81:  */
        !            82: #define RC2_KEY_SIZE(kl, eff) ((kl) | ((eff) << 8))
        !            83: #define RC2_EFFECTIVE_KEY_LEN(ks) ((ks) >> 8)
        !            84: #define RC2_KEY_LEN(ks) ((ks) & 0xff)
        !            85: 
        !            86: /**
        !            87:  * enum name for encryption_algorithm_t.
        !            88:  */
        !            89: extern enum_name_t *encryption_algorithm_names;
        !            90: 
        !            91: /**
        !            92:  * Generic interface for symmetric encryption algorithms.
        !            93:  */
        !            94: struct crypter_t {
        !            95: 
        !            96:        /**
        !            97:         * Encrypt a chunk of data and allocate space for the encrypted value.
        !            98:         *
        !            99:         * The length of the iv must equal to get_iv_size(), while the length
        !           100:         * of data must be a multiple of get_block_size().
        !           101:         * If encrypted is NULL, the encryption is done in-place (overwriting data).
        !           102:         *
        !           103:         * @param data                  data to encrypt
        !           104:         * @param iv                    initializing vector
        !           105:         * @param encrypted             chunk to allocate encrypted data, or NULL
        !           106:         * @return                              TRUE if encryption successful
        !           107:         */
        !           108:        bool (*encrypt)(crypter_t *this, chunk_t data, chunk_t iv,
        !           109:                                        chunk_t *encrypted) __attribute__((warn_unused_result));
        !           110: 
        !           111:        /**
        !           112:         * Decrypt a chunk of data and allocate space for the decrypted value.
        !           113:         *
        !           114:         * The length of the iv must equal to get_iv_size(), while the length
        !           115:         * of data must be a multiple of get_block_size().
        !           116:         * If decrypted is NULL, the encryption is done in-place (overwriting data).
        !           117:         *
        !           118:         * @param data                  data to decrypt
        !           119:         * @param iv                    initializing vector
        !           120:         * @param encrypted             chunk to allocate decrypted data, or NULL
        !           121:         * @return                              TRUE if decryption successful
        !           122:         */
        !           123:        bool (*decrypt)(crypter_t *this, chunk_t data, chunk_t iv,
        !           124:                                        chunk_t *decrypted) __attribute__((warn_unused_result));
        !           125: 
        !           126:        /**
        !           127:         * Get the block size of the crypto algorithm.
        !           128:         *
        !           129:         * get_block_size() returns the smallest block the crypter can handle,
        !           130:         * not the block size of the underlying crypto algorithm. For counter mode,
        !           131:         * it is usually 1.
        !           132:         *
        !           133:         * @return                              block size in bytes
        !           134:         */
        !           135:        size_t (*get_block_size)(crypter_t *this);
        !           136: 
        !           137:        /**
        !           138:         * Get the IV size of the crypto algorithm.
        !           139:         *
        !           140:         * @return                              initialization vector size in bytes
        !           141:         */
        !           142:        size_t (*get_iv_size)(crypter_t *this);
        !           143: 
        !           144:        /**
        !           145:         * Get the key size of the crypto algorithm.
        !           146:         *
        !           147:         * get_key_size() might return a key length different from the key
        !           148:         * size passed to the factory constructor. For Counter Mode, the nonce
        !           149:         * is handled as a part of the key material and is passed to set_key().
        !           150:         *
        !           151:         * @return                              key size in bytes
        !           152:         */
        !           153:        size_t (*get_key_size)(crypter_t *this);
        !           154: 
        !           155:        /**
        !           156:         * Set the key.
        !           157:         *
        !           158:         * The length of the key must match get_key_size().
        !           159:         *
        !           160:         * @param key                   key to set
        !           161:         * @return                              TRUE if key set successfully
        !           162:         */
        !           163:        bool (*set_key)(crypter_t *this,
        !           164:                                        chunk_t key) __attribute__((warn_unused_result));
        !           165: 
        !           166:        /**
        !           167:         * Destroys a crypter_t object.
        !           168:         */
        !           169:        void (*destroy)(crypter_t *this);
        !           170: };
        !           171: 
        !           172: /**
        !           173:  * Conversion of ASN.1 OID to encryption algorithm.
        !           174:  *
        !           175:  * @param oid                  ASN.1 OID
        !           176:  * @param key_size             returns size of encryption key in bits
        !           177:  * @return                             encryption algorithm, ENCR_UNDEFINED if OID unsupported
        !           178:  */
        !           179: encryption_algorithm_t encryption_algorithm_from_oid(int oid, size_t *key_size);
        !           180: 
        !           181: /**
        !           182:  * Conversion of encryption algorithm to ASN.1 OID.
        !           183:  *
        !           184:  * @param alg                  encryption algorithm
        !           185:  * @param key_size             size of encryption key in bits
        !           186:  * @return                             ASN.1 OID, OID_UNKNOWN if OID is unknown
        !           187:  */
        !           188: int encryption_algorithm_to_oid(encryption_algorithm_t alg, size_t key_size);
        !           189: 
        !           190: /**
        !           191:  * Check if an encryption algorithm identifier is an AEAD algorithm.
        !           192:  *
        !           193:  * @param alg                  algorithm identifier
        !           194:  * @return                             TRUE if it is an AEAD algorithm
        !           195:  */
        !           196: bool encryption_algorithm_is_aead(encryption_algorithm_t alg);
        !           197: 
        !           198: #endif /** CRYPTER_H_ @}*/

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