Annotation of embedaddon/strongswan/src/libstrongswan/plugins/openssl/openssl_sha1_prf.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2010 Martin Willi
3: * HSR Hochschule fuer Technik Rapperswil
4: *
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>.
9: *
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
13: * for more details.
14: */
15:
16: #include <openssl/opensslconf.h>
17:
18: #ifndef OPENSSL_NO_SHA1
19:
20: #include "openssl_sha1_prf.h"
21:
22: #include <openssl/sha.h>
23: #include <crypto/hashers/hasher.h>
24:
25: typedef struct private_openssl_sha1_prf_t private_openssl_sha1_prf_t;
26:
27: /**
28: * Private data of an openssl_sha1_prf_t object.
29: */
30: struct private_openssl_sha1_prf_t {
31:
32: /**
33: * Public openssl_sha1_prf_t interface.
34: */
35: openssl_sha1_prf_t public;
36:
37: /**
38: * SHA1 context
39: */
40: SHA_CTX ctx;
41: };
42:
43: METHOD(prf_t, get_bytes, bool,
44: private_openssl_sha1_prf_t *this, chunk_t seed, uint8_t *bytes)
45: {
46: #if OPENSSL_VERSION_NUMBER >= 0x10000000L
47: if (!SHA1_Update(&this->ctx, seed.ptr, seed.len))
48: {
49: return FALSE;
50: }
51: #else /* OPENSSL_VERSION_NUMBER < 1.0 */
52: SHA1_Update(&this->ctx, seed.ptr, seed.len);
53: #endif
54:
55: if (bytes)
56: {
57: uint32_t *hash = (uint32_t*)bytes;
58:
59: hash[0] = htonl(this->ctx.h0);
60: hash[1] = htonl(this->ctx.h1);
61: hash[2] = htonl(this->ctx.h2);
62: hash[3] = htonl(this->ctx.h3);
63: hash[4] = htonl(this->ctx.h4);
64: }
65:
66: return TRUE;
67: }
68:
69: METHOD(prf_t, get_block_size, size_t,
70: private_openssl_sha1_prf_t *this)
71: {
72: return HASH_SIZE_SHA1;
73: }
74:
75: METHOD(prf_t, allocate_bytes, bool,
76: private_openssl_sha1_prf_t *this, chunk_t seed, chunk_t *chunk)
77: {
78: if (chunk)
79: {
80: *chunk = chunk_alloc(HASH_SIZE_SHA1);
81: return get_bytes(this, seed, chunk->ptr);
82: }
83: return get_bytes(this, seed, NULL);
84: }
85:
86: METHOD(prf_t, get_key_size, size_t,
87: private_openssl_sha1_prf_t *this)
88: {
89: return HASH_SIZE_SHA1;
90: }
91:
92: METHOD(prf_t, set_key, bool,
93: private_openssl_sha1_prf_t *this, chunk_t key)
94: {
95: #if OPENSSL_VERSION_NUMBER >= 0x10000000L
96: if (!SHA1_Init(&this->ctx))
97: {
98: return FALSE;
99: }
100: #else /* OPENSSL_VERSION_NUMBER < 1.0 */
101: SHA1_Init(&this->ctx);
102: #endif
103:
104: if (key.len % 4)
105: {
106: return FALSE;
107: }
108: if (key.len >= 4)
109: {
110: this->ctx.h0 ^= untoh32(key.ptr);
111: }
112: if (key.len >= 8)
113: {
114: this->ctx.h1 ^= untoh32(key.ptr + 4);
115: }
116: if (key.len >= 12)
117: {
118: this->ctx.h2 ^= untoh32(key.ptr + 8);
119: }
120: if (key.len >= 16)
121: {
122: this->ctx.h3 ^= untoh32(key.ptr + 12);
123: }
124: if (key.len >= 20)
125: {
126: this->ctx.h4 ^= untoh32(key.ptr + 16);
127: }
128: return TRUE;
129: }
130:
131: METHOD(prf_t, destroy, void,
132: private_openssl_sha1_prf_t *this)
133: {
134: free(this);
135: }
136:
137: /**
138: * See header
139: */
140: openssl_sha1_prf_t *openssl_sha1_prf_create(pseudo_random_function_t algo)
141: {
142: private_openssl_sha1_prf_t *this;
143:
144: if (algo != PRF_KEYED_SHA1)
145: {
146: return NULL;
147: }
148:
149: INIT(this,
150: .public = {
151: .prf = {
152: .get_block_size = _get_block_size,
153: .get_bytes = _get_bytes,
154: .allocate_bytes = _allocate_bytes,
155: .get_key_size = _get_key_size,
156: .set_key = _set_key,
157: .destroy = _destroy,
158: },
159: },
160: );
161:
162: return &this->public;
163: }
164:
165: #endif /* OPENSSL_NO_SHA1 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>