Annotation of embedaddon/strongswan/src/libstrongswan/plugins/sha3/sha3_shake.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2016 Andreas Steffen
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 "sha3_shake.h"
17: #include "sha3_keccak.h"
18:
19: typedef struct private_sha3_shake_t private_sha3_shake_t;
20:
21:
22: /**
23: * Private data structure with hashing context for SHA-3
24: */
25: struct private_sha3_shake_t {
26:
27: /**
28: * Public interface for this hasher.
29: */
30: sha3_shake_t public;
31:
32: /**
33: * XOF algorithm to be used (XOF_SHAKE_128 or XOF_SHAKE_256)
34: */
35: ext_out_function_t algorithm;
36:
37: /**
38: * SHA-3 Keccak state
39: */
40: sha3_keccak_t *keccak;
41:
42: /**
43: * Capacity in bytes of the SHA-3 Keccak state
44: */
45: u_int capacity;
46:
47: };
48:
49: METHOD(xof_t, get_type, ext_out_function_t,
50: private_sha3_shake_t *this)
51: {
52: return this->algorithm;
53: }
54:
55: METHOD(xof_t, get_bytes, bool,
56: private_sha3_shake_t *this, size_t out_len, uint8_t *buffer)
57: {
58: this->keccak->squeeze(this->keccak, out_len, buffer);
59: return TRUE;
60: }
61:
62: METHOD(xof_t, allocate_bytes, bool,
63: private_sha3_shake_t *this, size_t out_len, chunk_t *chunk)
64: {
65: *chunk = chunk_alloc(out_len);
66: this->keccak->squeeze(this->keccak, out_len, chunk->ptr);
67: return TRUE;
68: }
69:
70: METHOD(xof_t, get_block_size, size_t,
71: private_sha3_shake_t *this)
72: {
73: return this->keccak->get_rate(this->keccak);
74: }
75:
76: METHOD(xof_t, get_seed_size, size_t,
77: private_sha3_shake_t *this)
78: {
79: return this->capacity;
80: }
81:
82: METHOD(xof_t, set_seed, bool,
83: private_sha3_shake_t *this, chunk_t seed)
84: {
85: this->keccak->reset(this->keccak);
86: this->keccak->absorb(this->keccak, seed);
87: this->keccak->finalize(this->keccak);
88: return TRUE;
89: }
90:
91:
92: METHOD(xof_t, destroy, void,
93: private_sha3_shake_t *this)
94: {
95: this->keccak->destroy(this->keccak);
96: free(this);
97: }
98:
99: /*
100: * Described in header.
101: */
102: sha3_shake_t* sha3_shake_create(ext_out_function_t algorithm)
103: {
104: private_sha3_shake_t *this;
105: u_int capacity = 0;
106:
107: switch (algorithm)
108: {
109: case XOF_SHAKE_128:
110: capacity = 32;
111: break;
112: case XOF_SHAKE_256:
113: capacity = 64;
114: break;
115: default:
116: return NULL;
117: }
118:
119: INIT(this,
120: .public = {
121: .xof_interface = {
122: .get_type = _get_type,
123: .get_bytes = _get_bytes,
124: .allocate_bytes = _allocate_bytes,
125: .get_block_size = _get_block_size,
126: .get_seed_size = _get_seed_size,
127: .set_seed = _set_seed,
128: .destroy = _destroy,
129: },
130: },
131: .algorithm = algorithm,
132: .capacity = capacity,
133: );
134:
135: this->keccak = sha3_keccak_create(capacity, 0x1f);
136: if (!this->keccak)
137: {
138: free(this);
139: return NULL;
140: }
141:
142: return &this->public;
143: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>