Annotation of embedaddon/strongswan/src/libstrongswan/crypto/hashers/hasher.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2016-2017 Andreas Steffen
                      3:  * Copyright (C) 2012-2015 Tobias Brunner
                      4:  * Copyright (C) 2005-2006 Martin Willi
                      5:  * Copyright (C) 2005 Jan Hutter
                      6:  * HSR Hochschule fuer Technik Rapperswil
                      7:  *
                      8:  * This program is free software; you can redistribute it and/or modify it
                      9:  * under the terms of the GNU General Public License as published by the
                     10:  * Free Software Foundation; either version 2 of the License, or (at your
                     11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     12:  *
                     13:  * This program is distributed in the hope that it will be useful, but
                     14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     16:  * for more details.
                     17:  */
                     18: 
                     19: /**
                     20:  * @defgroup hasher hasher
                     21:  * @{ @ingroup crypto
                     22:  */
                     23: 
                     24: #ifndef HASHER_H_
                     25: #define HASHER_H_
                     26: 
                     27: typedef enum hash_algorithm_t hash_algorithm_t;
                     28: typedef struct hasher_t hasher_t;
                     29: 
                     30: #include <crypto/prfs/prf.h>
                     31: #include <crypto/signers/signer.h>
                     32: #include <credentials/keys/public_key.h>
                     33: 
                     34: /**
                     35:  * Hash algorithms as defined for IKEv2
                     36:  */
                     37: enum hash_algorithm_t {
                     38:        /* RFC 7427 */
                     39:        HASH_SHA1                       = 1,
                     40:        HASH_SHA256                     = 2,
                     41:        HASH_SHA384                     = 3,
                     42:        HASH_SHA512                     = 4,
                     43:        /* RFC 8420 */
                     44:        HASH_IDENTITY           = 5,
                     45:        /* use private use range for algorithms not defined/permitted by RFC 7427 */
                     46:        HASH_UNKNOWN            = 1024,
                     47:        HASH_MD2                        = 1025,
                     48:        HASH_MD4                        = 1026,
                     49:        HASH_MD5                        = 1027,
                     50:        HASH_SHA224                     = 1028,
                     51:        HASH_SHA3_224           = 1029,
                     52:        HASH_SHA3_256           = 1030,
                     53:        HASH_SHA3_384           = 1031,
                     54:        HASH_SHA3_512           = 1032
                     55: };
                     56: 
                     57: #define HASH_SIZE_MD2          16
                     58: #define HASH_SIZE_MD4          16
                     59: #define HASH_SIZE_MD5          16
                     60: #define HASH_SIZE_SHA1         20
                     61: #define HASH_SIZE_SHA224       28
                     62: #define HASH_SIZE_SHA256       32
                     63: #define HASH_SIZE_SHA384       48
                     64: #define HASH_SIZE_SHA512       64
                     65: 
                     66: /**
                     67:  * enum names for hash_algorithm_t.
                     68:  */
                     69: extern enum_name_t *hash_algorithm_names;
                     70: 
                     71: /**
                     72:  * Short names for hash_algorithm_names
                     73:  */
                     74: extern enum_name_t *hash_algorithm_short_names;
                     75: 
                     76: /**
                     77:  * Uppercase short names for hash_algorithm_names
                     78:  */
                     79: extern enum_name_t *hash_algorithm_short_names_upper;
                     80: 
                     81: /**
                     82:  * Generic interface for all hash functions.
                     83:  */
                     84: struct hasher_t {
                     85: 
                     86:        /**
                     87:         * Hash data and write it in the buffer.
                     88:         *
                     89:         * If the parameter hash is NULL, no result is written back
                     90:         * and more data can be appended to already hashed data.
                     91:         * If not, the result is written back and the hasher is reset.
                     92:         *
                     93:         * The hash output parameter must hold at least
                     94:         * hash_t.get_block_size() bytes.
                     95:         *
                     96:         * @param data          data to hash
                     97:         * @param hash          pointer where the hash will be written
                     98:         * @return                      TRUE if hash created successfully
                     99:         */
                    100:        bool (*get_hash)(hasher_t *this, chunk_t data,
                    101:                                         uint8_t *hash) __attribute__((warn_unused_result));
                    102: 
                    103:        /**
                    104:         * Hash data and allocate space for the hash.
                    105:         *
                    106:         * If the parameter hash is NULL, no result is written back
                    107:         * and more data can be appended to already hashed data.
                    108:         * If not, the result is written back and the hasher is reset.
                    109:         *
                    110:         * @param data          chunk with data to hash
                    111:         * @param hash          chunk which will hold allocated hash
                    112:         * @return                      TRUE if hash allocated successfully
                    113:         */
                    114:        bool (*allocate_hash)(hasher_t *this, chunk_t data,
                    115:                                                  chunk_t *hash) __attribute__((warn_unused_result));
                    116: 
                    117:        /**
                    118:         * Get the size of the resulting hash.
                    119:         *
                    120:         * @return                      hash size in bytes
                    121:         */
                    122:        size_t (*get_hash_size)(hasher_t *this);
                    123: 
                    124:        /**
                    125:         * Resets the hasher's state.
                    126:         *
                    127:         * @return                      TRUE if hasher reset successfully
                    128:         */
                    129:        bool (*reset)(hasher_t *this) __attribute__((warn_unused_result));
                    130: 
                    131:        /**
                    132:         * Destroys a hasher object.
                    133:         */
                    134:        void (*destroy)(hasher_t *this);
                    135: };
                    136: 
                    137: /**
                    138:  * Returns the size of the hash for the given algorithm.
                    139:  *
                    140:  * @param alg                  hash algorithm
                    141:  * @return                             size of hash or 0 if unknown
                    142:  */
                    143: size_t hasher_hash_size(hash_algorithm_t alg);
                    144: 
                    145: /**
                    146:  * Conversion of ASN.1 OID to hash algorithm.
                    147:  *
                    148:  * @param oid                  ASN.1 OID
                    149:  * @return                             hash algorithm, HASH_UNKNOWN if OID unsupported
                    150:  */
                    151: hash_algorithm_t hasher_algorithm_from_oid(int oid);
                    152: 
                    153: /**
                    154:  * Conversion of PRF algorithm to hash algorithm (if based on one).
                    155:  *
                    156:  * @param alg                  prf algorithm
                    157:  * @return                             hash algorithm, HASH_UNKNOWN if not based on a hash
                    158:  */
                    159: hash_algorithm_t hasher_algorithm_from_prf(pseudo_random_function_t alg);
                    160: 
                    161: /**
                    162:  * Conversion of integrity algorithm to hash algorithm (if based on one).
                    163:  *
                    164:  * If length is not NULL the length of the resulting signature is returned,
                    165:  * which might be smaller than the output size of the underlying hash.
                    166:  *
                    167:  * @param alg                  integrity algorithm
                    168:  * @param length               returns signature length, if not NULL
                    169:  * @return                             hash algorithm, HASH_UNKNOWN if not based on a hash
                    170:  */
                    171: hash_algorithm_t hasher_algorithm_from_integrity(integrity_algorithm_t alg,
                    172:                                                                                                 size_t *length);
                    173: 
                    174: /**
                    175:  * Conversion of hash algorithm to integrity algorithm (if based on a hash).
                    176:  *
                    177:  * @param alg                  hash algorithm
                    178:  * @param length               length of the signature
                    179:  * @return                             integrity algorithm, AUTH_UNDEFINED if none is known
                    180:  *                                             based on the given hash function
                    181:  */
                    182: integrity_algorithm_t hasher_algorithm_to_integrity(hash_algorithm_t alg,
                    183:                                                                                                        size_t length);
                    184: 
                    185: /**
                    186:  * Check if the given algorithm may be used for IKEv2 signature authentication.
                    187:  *
                    188:  * @param alg                  hash algorithm
                    189:  * @return                             TRUE if algorithm may be used, FALSE otherwise
                    190:  */
                    191: bool hasher_algorithm_for_ikev2(hash_algorithm_t alg);
                    192: 
                    193: /**
                    194:  * Conversion of hash algorithm into ASN.1 OID.
                    195:  *
                    196:  * @param alg                  hash algorithm
                    197:  * @return                             ASN.1 OID, or OID_UNKNOW
                    198:  */
                    199: int hasher_algorithm_to_oid(hash_algorithm_t alg);
                    200: 
                    201: /**
                    202:  * Conversion of hash signature algorithm into ASN.1 OID.
                    203:  *
                    204:  * @param alg                  hash algorithm
                    205:  * @param key                  public key type
                    206:  * @return                             ASN.1 OID if, or OID_UNKNOW
                    207:  */
                    208: int hasher_signature_algorithm_to_oid(hash_algorithm_t alg, key_type_t key);
                    209: 
                    210: /**
                    211:  * Determine the hash algorithm associated with a given signature scheme.
                    212:  *
                    213:  * @param scheme               signature scheme
                    214:  * @param params               optional parameters
                    215:  * @return                             hash algorithm (could be HASH_UNKNOWN)
                    216:  */
                    217: hash_algorithm_t hasher_from_signature_scheme(signature_scheme_t scheme,
                    218:                                                                                          void *params);
                    219: 
                    220: #endif /** HASHER_H_ @}*/

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