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>