4 * @brief Implementation of prf_t interface using the
5 * a HMAC algorithm. This simply wraps a hmac in a prf.
10 * Copyright (C) 2005 Jan Hutter, Martin Willi
11 * Hochschule fuer Technik Rapperswil
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU General Public License as published by the
15 * Free Software Foundation; either version 2 of the License, or (at your
16 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
18 * This program is distributed in the hope that it will be useful, but
19 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
20 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 #include "../../utils/allocator.h"
29 typedef struct private_prf_hmac_s private_prf_hmac_t
;
31 struct private_prf_hmac_s
{
33 * public interface for this prf
38 * hmac to use for generation
44 * implementation of prf_t.get_bytes
46 static status_t
get_bytes(private_prf_hmac_t
*this, chunk_t seed
, u_int8_t
*buffer
)
48 return this->hmac
->get_mac(this->hmac
, seed
, buffer
);
52 * implementation of prf_t.allocate_bytes
54 static status_t
allocate_bytes(private_prf_hmac_t
*this, chunk_t seed
, chunk_t
*chunk
)
56 return this->hmac
->allocate_mac(this->hmac
, seed
, chunk
);
60 * implementation of prf_t.get_block_size
62 static size_t get_block_size(private_prf_hmac_t
*this)
64 return this->hmac
->get_block_size(this->hmac
);
68 * implementation of prf_t.set_key
70 static status_t
set_key(private_prf_hmac_t
*this, chunk_t key
)
72 this->hmac
->set_key(this->hmac
, key
);
77 * implementation of prf_t.destroy
79 static status_t
destroy(private_prf_hmac_t
*this)
82 this->hmac
->destroy(this->hmac
);
89 prf_hmac_t
*prf_hmac_create(hash_algorithm_t hash_algorithm
)
91 private_prf_hmac_t
*this = allocator_alloc_thing(private_prf_hmac_t
);
98 this->public.prf_interface
.get_bytes
= (status_t (*) (prf_t
*,chunk_t
,u_int8_t
*))get_bytes
;
99 this->public.prf_interface
.allocate_bytes
= (status_t (*) (prf_t
*,chunk_t
,chunk_t
*))allocate_bytes
;
100 this->public.prf_interface
.get_block_size
= (size_t (*) (prf_t
*))get_block_size
;
101 this->public.prf_interface
.set_key
= (status_t (*) (prf_t
*,chunk_t
))set_key
;
102 this->public.prf_interface
.destroy
= (status_t (*) (prf_t
*))destroy
;
104 this->hmac
= hmac_create(HASH_SHA1
);
105 if (this->hmac
== NULL
)
107 allocator_free(this);
111 return &(this->public);