Annotation of embedaddon/strongswan/src/libstrongswan/plugins/af_alg/af_alg_hasher.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2010 Martin Willi
3: * Copyright (C) 2010 revosec AG
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 "af_alg_hasher.h"
17: #include "af_alg_ops.h"
18:
19: typedef struct private_af_alg_hasher_t private_af_alg_hasher_t;
20:
21: /**
22: * Private data of af_alg_hasher_t
23: */
24: struct private_af_alg_hasher_t {
25:
26: /**
27: * Public part of this class.
28: */
29: af_alg_hasher_t public;
30:
31: /**
32: * AF_ALG operations
33: */
34: af_alg_ops_t *ops;
35:
36: /**
37: * Size of the hash
38: */
39: size_t size;
40: };
41:
42: /**
43: * Algorithm database
44: */
45: static struct {
46: hash_algorithm_t id;
47: char *name;
48: size_t size;
49: } algs[AF_ALG_HASHER] = {
50: {HASH_MD4, "md4", HASH_SIZE_MD4 },
51: {HASH_MD5, "md5", HASH_SIZE_MD5 },
52: {HASH_SHA1, "sha1", HASH_SIZE_SHA1 },
53: {HASH_SHA224, "sha224", HASH_SIZE_SHA224 },
54: {HASH_SHA256, "sha256", HASH_SIZE_SHA256 },
55: {HASH_SHA384, "sha384", HASH_SIZE_SHA384 },
56: {HASH_SHA512, "sha512", HASH_SIZE_SHA512 },
57: };
58:
59: /**
60: * See header.
61: */
62: void af_alg_hasher_probe(plugin_feature_t *features, int *pos)
63: {
64: af_alg_ops_t *ops;
65: int i;
66:
67: for (i = 0; i < countof(algs); i++)
68: {
69: ops = af_alg_ops_create("hash", algs[i].name);
70: if (ops)
71: {
72: ops->destroy(ops);
73: features[(*pos)++] = PLUGIN_PROVIDE(HASHER, algs[i].id);
74: }
75: }
76: }
77:
78: /**
79: * Get the kernel algorithm string and hash size for our identifier
80: */
81: static size_t lookup_alg(hash_algorithm_t algo, char **name)
82: {
83: int i;
84:
85: for (i = 0; i < countof(algs); i++)
86: {
87: if (algs[i].id == algo)
88: {
89: *name = algs[i].name;
90: return algs[i].size;
91: }
92: }
93: return 0;
94: }
95:
96: METHOD(hasher_t, get_hash_size, size_t,
97: private_af_alg_hasher_t *this)
98: {
99: return this->size;
100: }
101:
102: METHOD(hasher_t, reset, bool,
103: private_af_alg_hasher_t *this)
104: {
105: this->ops->reset(this->ops);
106: return TRUE;
107: }
108:
109: METHOD(hasher_t, get_hash, bool,
110: private_af_alg_hasher_t *this, chunk_t chunk, uint8_t *hash)
111: {
112: return this->ops->hash(this->ops, chunk, hash, this->size);
113: }
114:
115: METHOD(hasher_t, allocate_hash, bool,
116: private_af_alg_hasher_t *this, chunk_t chunk, chunk_t *hash)
117: {
118: if (hash)
119: {
120: *hash = chunk_alloc(get_hash_size(this));
121: return get_hash(this, chunk, hash->ptr);
122: }
123: return get_hash(this, chunk, NULL);
124: }
125:
126: METHOD(hasher_t, destroy, void,
127: private_af_alg_hasher_t *this)
128: {
129: this->ops->destroy(this->ops);
130: free(this);
131: }
132:
133: /*
134: * Described in header
135: */
136: af_alg_hasher_t *af_alg_hasher_create(hash_algorithm_t algo)
137: {
138: private_af_alg_hasher_t *this;
139: char *name;
140: size_t size;
141:
142: size = lookup_alg(algo, &name);
143: if (!size)
144: { /* not supported by kernel */
145: return NULL;
146: }
147:
148: INIT(this,
149: .public = {
150: .hasher = {
151: .get_hash = _get_hash,
152: .allocate_hash = _allocate_hash,
153: .get_hash_size = _get_hash_size,
154: .reset = _reset,
155: .destroy = _destroy,
156: },
157: },
158: .ops = af_alg_ops_create("hash", name),
159: .size = size,
160: );
161: if (!this->ops)
162: {
163: free(this);
164: return NULL;
165: }
166: return &this->public;
167: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>