2 * Copyright (C) 2012 Tobias Brunner
3 * HSR Hochschule fuer Technik Rapperswil
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>.
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
17 * Copyright (C) 2012 Aleksandr Grinberg
19 * Permission is hereby granted, free of charge, to any person obtaining a copy
20 * of this software and associated documentation files (the "Software"), to deal
21 * in the Software without restriction, including without limitation the rights
22 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23 * copies of the Software, and to permit persons to whom the Software is
24 * furnished to do so, subject to the following conditions:
26 * The above copyright notice and this permission notice shall be included in
27 * all copies or substantial portions of the Software.
29 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
38 #include <openssl/opensslconf.h>
40 #ifndef OPENSSL_NO_HMAC
42 #include <openssl/evp.h>
43 #include <openssl/hmac.h>
45 #include "openssl_hmac.h"
47 #include <crypto/mac.h>
48 #include <crypto/prfs/mac_prf.h>
49 #include <crypto/signers/mac_signer.h>
51 typedef struct private_mac_t private_mac_t
;
54 * Private data of a mac_t object.
56 struct private_mac_t
{
69 * Current HMAC context
73 #if OPENSSL_VERSION_NUMBER < 0x10100000L
75 * Static context for OpenSSL < 1.1.0
81 * Key set on HMAC_CTX?
86 METHOD(mac_t
, set_key
, bool,
87 private_mac_t
*this, chunk_t key
)
89 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
90 if (HMAC_Init_ex(this->hmac
, key
.ptr
, key
.len
, this->hasher
, NULL
))
96 #else /* OPENSSL_VERSION_NUMBER < 1.0 */
97 HMAC_Init_ex(this->hmac
, key
.ptr
, key
.len
, this->hasher
, NULL
);
103 METHOD(mac_t
, get_mac
, bool,
104 private_mac_t
*this, chunk_t data
, uint8_t *out
)
110 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
111 if (!HMAC_Update(this->hmac
, data
.ptr
, data
.len
))
119 if (!HMAC_Final(this->hmac
, out
, NULL
))
123 #else /* OPENSSL_VERSION_NUMBER < 1.0 */
124 HMAC_Update(this->hmac
, data
.ptr
, data
.len
);
129 HMAC_Final(this->hmac
, out
, NULL
);
131 return set_key(this, chunk_empty
);
134 METHOD(mac_t
, get_mac_size
, size_t,
137 return EVP_MD_size(this->hasher
);
140 METHOD(mac_t
, destroy
, void,
143 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
144 HMAC_CTX_free(this->hmac
);
146 HMAC_CTX_cleanup(&this->hmac_ctx
);
152 * Create an OpenSSL-backed implementation of the mac_t interface
154 static mac_t
*hmac_create(hash_algorithm_t algo
)
159 name
= enum_to_name(hash_algorithm_short_names
, algo
);
168 .get_mac_size
= _get_mac_size
,
172 .hasher
= EVP_get_digestbyname(name
),
181 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
182 this->hmac
= HMAC_CTX_new();
184 HMAC_CTX_init(&this->hmac_ctx
);
185 this->hmac
= &this->hmac_ctx
;
188 /* make sure the underlying hash algorithm is supported */
189 if (!set_key(this, chunk_from_str("")))
194 return &this->public;
198 * Described in header
200 prf_t
*openssl_hmac_prf_create(pseudo_random_function_t algo
)
204 hmac
= hmac_create(hasher_algorithm_from_prf(algo
));
207 return mac_prf_create(hmac
);
213 * Described in header
215 signer_t
*openssl_hmac_signer_create(integrity_algorithm_t algo
)
220 hmac
= hmac_create(hasher_algorithm_from_integrity(algo
, &trunc
));
223 return mac_signer_create(hmac
, trunc
);
228 #endif /* OPENSSL_NO_HMAC */