2 * Copyright (C) 2008 Tobias Brunner
3 * 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
18 #include "openssl_hasher.h"
20 #include <openssl/evp.h>
22 typedef struct private_openssl_hasher_t private_openssl_hasher_t
;
25 * Private data of openssl_hasher_t
27 struct private_openssl_hasher_t
{
30 * Public part of this class.
32 openssl_hasher_t
public;
40 * the current digest context
46 * Mapping from the algorithms defined in IKEv2 to
47 * OpenSSL algorithm names
51 * Identifier specified in IKEv2
56 * Name of the algorithm, as used in OpenSSL
59 } openssl_algorithm_t
;
61 #define END_OF_LIST -1
64 * Algorithms for integrity
66 static openssl_algorithm_t integrity_algs
[] = {
70 {HASH_SHA256
, "sha256"},
71 {HASH_SHA384
, "sha384"},
72 {HASH_SHA512
, "sha512"},
77 * Look up an OpenSSL algorithm name
79 static char* lookup_algorithm(openssl_algorithm_t
*openssl_algo
,
82 while (openssl_algo
->ikev2_id
!= END_OF_LIST
)
84 if (ikev2_algo
== openssl_algo
->ikev2_id
)
86 return openssl_algo
->name
;
94 * Implementation of hasher_t.get_hash_size.
96 static size_t get_hash_size(private_openssl_hasher_t
*this)
98 return this->hasher
->md_size
;
102 * Implementation of hasher_t.reset.
104 static void reset(private_openssl_hasher_t
*this)
106 EVP_DigestInit_ex(this->ctx
, this->hasher
, NULL
);
110 * Implementation of hasher_t.get_hash.
112 static void get_hash(private_openssl_hasher_t
*this, chunk_t chunk
,
115 EVP_DigestUpdate(this->ctx
, chunk
.ptr
, chunk
.len
);
118 EVP_DigestFinal_ex(this->ctx
, hash
, NULL
);
124 * Implementation of hasher_t.allocate_hash.
126 static void allocate_hash(private_openssl_hasher_t
*this, chunk_t chunk
,
131 *hash
= chunk_alloc(get_hash_size(this));
132 get_hash(this, chunk
, hash
->ptr
);
136 get_hash(this, chunk
, NULL
);
141 * Implementation of hasher_t.destroy.
143 static void destroy (private_openssl_hasher_t
*this)
145 EVP_MD_CTX_destroy(this->ctx
);
150 * Described in header
152 openssl_hasher_t
*openssl_hasher_create(hash_algorithm_t algo
)
154 private_openssl_hasher_t
*this;
156 char* name
= lookup_algorithm(integrity_algs
, algo
);
159 /* algo unavailable */
163 this = malloc_thing(private_openssl_hasher_t
);
165 this->hasher
= EVP_get_digestbyname(name
);
168 /* OpenSSL does not support the requested algo */
173 this->public.hasher_interface
.get_hash
= (void (*) (hasher_t
*, chunk_t
, u_int8_t
*))get_hash
;
174 this->public.hasher_interface
.allocate_hash
= (void (*) (hasher_t
*, chunk_t
, chunk_t
*))allocate_hash
;
175 this->public.hasher_interface
.get_hash_size
= (size_t (*) (hasher_t
*))get_hash_size
;
176 this->public.hasher_interface
.reset
= (void (*) (hasher_t
*))reset
;
177 this->public.hasher_interface
.destroy
= (void (*) (hasher_t
*))destroy
;
179 this->ctx
= EVP_MD_CTX_create();
184 return &this->public;