2 * Copyright (C) 2010 Martin Willi
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
16 #include "openssl_sha1_prf.h"
18 #include <openssl/sha.h>
20 typedef struct private_openssl_sha1_prf_t private_openssl_sha1_prf_t
;
23 * Private data of an openssl_sha1_prf_t object.
25 struct private_openssl_sha1_prf_t
{
28 * Public openssl_sha1_prf_t interface.
30 openssl_sha1_prf_t
public;
38 METHOD(prf_t
, get_bytes
, bool,
39 private_openssl_sha1_prf_t
*this, chunk_t seed
, u_int8_t
*bytes
)
41 SHA1_Update(&this->ctx
, seed
.ptr
, seed
.len
);
45 u_int32_t
*hash
= (u_int32_t
*)bytes
;
47 hash
[0] = htonl(this->ctx
.h0
);
48 hash
[1] = htonl(this->ctx
.h1
);
49 hash
[2] = htonl(this->ctx
.h2
);
50 hash
[3] = htonl(this->ctx
.h3
);
51 hash
[4] = htonl(this->ctx
.h4
);
57 METHOD(prf_t
, get_block_size
, size_t,
58 private_openssl_sha1_prf_t
*this)
60 return HASH_SIZE_SHA1
;
63 METHOD(prf_t
, allocate_bytes
, bool,
64 private_openssl_sha1_prf_t
*this, chunk_t seed
, chunk_t
*chunk
)
68 *chunk
= chunk_alloc(HASH_SIZE_SHA1
);
69 return get_bytes(this, seed
, chunk
->ptr
);
71 return get_bytes(this, seed
, NULL
);
74 METHOD(prf_t
, get_key_size
, size_t,
75 private_openssl_sha1_prf_t
*this)
77 return HASH_SIZE_SHA1
;
80 METHOD(prf_t
, set_key
, bool,
81 private_openssl_sha1_prf_t
*this, chunk_t key
)
83 SHA1_Init(&this->ctx
);
91 this->ctx
.h0
^= untoh32(key
.ptr
);
95 this->ctx
.h1
^= untoh32(key
.ptr
+ 4);
99 this->ctx
.h2
^= untoh32(key
.ptr
+ 8);
103 this->ctx
.h3
^= untoh32(key
.ptr
+ 12);
107 this->ctx
.h4
^= untoh32(key
.ptr
+ 16);
112 METHOD(prf_t
, destroy
, void,
113 private_openssl_sha1_prf_t
*this)
121 openssl_sha1_prf_t
*openssl_sha1_prf_create(pseudo_random_function_t algo
)
123 private_openssl_sha1_prf_t
*this;
125 if (algo
!= PRF_KEYED_SHA1
)
133 .get_block_size
= _get_block_size
,
134 .get_bytes
= _get_bytes
,
135 .allocate_bytes
= _allocate_bytes
,
136 .get_key_size
= _get_key_size
,
143 return &this->public;