Annotation of embedaddon/strongswan/src/libimcv/pts/pts_meas_algo.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011-2014 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 "pts_meas_algo.h"
17:
18: #include <utils/debug.h>
19:
20: ENUM_BEGIN(pts_meas_algorithm_names, PTS_MEAS_ALGO_NONE, PTS_MEAS_ALGO_NONE,
21: "None");
22: ENUM_NEXT(pts_meas_algorithm_names, PTS_MEAS_ALGO_SHA384, PTS_MEAS_ALGO_SHA384,
23: PTS_MEAS_ALGO_NONE,
24: "SHA384");
25: ENUM_NEXT(pts_meas_algorithm_names, PTS_MEAS_ALGO_SHA256, PTS_MEAS_ALGO_SHA256,
26: PTS_MEAS_ALGO_SHA384,
27: "SHA256");
28: ENUM_NEXT(pts_meas_algorithm_names, PTS_MEAS_ALGO_SHA1, PTS_MEAS_ALGO_SHA1,
29: PTS_MEAS_ALGO_SHA256,
30: "SHA1");
31: ENUM_END(pts_meas_algorithm_names, PTS_MEAS_ALGO_SHA1);
32:
33: /**
34: * Described in header.
35: */
36: bool pts_meas_algo_probe(pts_meas_algorithms_t *algorithms)
37: {
38: enumerator_t *enumerator;
39: hash_algorithm_t hash_alg;
40: const char *plugin_name;
41: char format1[] = " %s PTS measurement algorithm %N[%s] available";
42: char format2[] = " %s PTS measurement algorithm %N not available";
43:
44: *algorithms = 0;
45:
46: enumerator = lib->crypto->create_hasher_enumerator(lib->crypto);
47: while (enumerator->enumerate(enumerator, &hash_alg, &plugin_name))
48: {
49: if (hash_alg == HASH_SHA1)
50: {
51: *algorithms |= PTS_MEAS_ALGO_SHA1;
52: DBG2(DBG_PTS, format1, "mandatory", hash_algorithm_names, hash_alg,
53: plugin_name);
54: }
55: else if (hash_alg == HASH_SHA256)
56: {
57: *algorithms |= PTS_MEAS_ALGO_SHA256;
58: DBG2(DBG_PTS, format1, "mandatory", hash_algorithm_names, hash_alg,
59: plugin_name);
60: }
61: else if (hash_alg == HASH_SHA384)
62: {
63: *algorithms |= PTS_MEAS_ALGO_SHA384;
64: DBG2(DBG_PTS, format1, "optional ", hash_algorithm_names, hash_alg,
65: plugin_name);
66: }
67: }
68: enumerator->destroy(enumerator);
69:
70: if (!(*algorithms & PTS_MEAS_ALGO_SHA384))
71: {
72: DBG1(DBG_PTS, format2, "optional ", hash_algorithm_names, HASH_SHA384);
73: }
74: if ((*algorithms & PTS_MEAS_ALGO_SHA1) &&
75: (*algorithms & PTS_MEAS_ALGO_SHA256))
76: {
77: return TRUE;
78: }
79: if (!(*algorithms & PTS_MEAS_ALGO_SHA1))
80: {
81: DBG1(DBG_PTS, format2, "mandatory", hash_algorithm_names, HASH_SHA1);
82: }
83: if (!(*algorithms & PTS_MEAS_ALGO_SHA256))
84: {
85: DBG1(DBG_PTS, format2, "mandatory", hash_algorithm_names, HASH_SHA256);
86: }
87: return FALSE;
88: }
89:
90: /**
91: * Described in header.
92: */
93: bool pts_meas_algo_update(char *hash_alg, pts_meas_algorithms_t *algorithms)
94: {
95: if (strcaseeq(hash_alg, "sha384") || strcaseeq(hash_alg, "sha2_384"))
96: {
97: /* nothing to update, all algorithms are supported */
98: return TRUE;
99: }
100: if (strcaseeq(hash_alg, "sha256") || strcaseeq(hash_alg, "sha2_256"))
101: {
102: /* remove SHA384algorithm */
103: *algorithms &= ~PTS_MEAS_ALGO_SHA384;
104: return TRUE;
105: }
106: if (strcaseeq(hash_alg, "sha1"))
107: {
108: /* remove SHA384 and SHA256 algorithms */
109: *algorithms &= ~(PTS_MEAS_ALGO_SHA384 | PTS_MEAS_ALGO_SHA256);
110: return TRUE;
111: }
112: DBG1(DBG_PTS, "unknown hash algorithm '%s' configured", hash_alg);
113: return FALSE;
114: }
115:
116: /**
117: * Described in header.
118: */
119: pts_meas_algorithms_t pts_meas_algo_select(pts_meas_algorithms_t supported_algos,
120: pts_meas_algorithms_t offered_algos)
121: {
122: if ((supported_algos & PTS_MEAS_ALGO_SHA384) &&
123: (offered_algos & PTS_MEAS_ALGO_SHA384))
124: {
125: return PTS_MEAS_ALGO_SHA384;
126: }
127: if ((supported_algos & PTS_MEAS_ALGO_SHA256) &&
128: (offered_algos & PTS_MEAS_ALGO_SHA256))
129: {
130: return PTS_MEAS_ALGO_SHA256;
131: }
132: if ((supported_algos & PTS_MEAS_ALGO_SHA1) &&
133: (offered_algos & PTS_MEAS_ALGO_SHA1))
134: {
135: return PTS_MEAS_ALGO_SHA1;
136: }
137: return PTS_MEAS_ALGO_NONE;
138: }
139:
140: /**
141: * Described in header.
142: */
143: hash_algorithm_t pts_meas_algo_to_hash(pts_meas_algorithms_t algorithm)
144: {
145: switch (algorithm)
146: {
147: case PTS_MEAS_ALGO_SHA1:
148: return HASH_SHA1;
149: case PTS_MEAS_ALGO_SHA256:
150: return HASH_SHA256;
151: case PTS_MEAS_ALGO_SHA384:
152: return HASH_SHA384;
153: default:
154: return HASH_UNKNOWN;
155: }
156: }
157:
158: /**
159: * Described in header.
160: */
161: pts_meas_algorithms_t pts_meas_algo_from_hash(hash_algorithm_t algorithm)
162: {
163: switch (algorithm)
164: {
165: case HASH_SHA1:
166: return PTS_MEAS_ALGO_SHA1;
167: case HASH_SHA256:
168: return PTS_MEAS_ALGO_SHA256;
169: case HASH_SHA384:
170: return PTS_MEAS_ALGO_SHA384;
171: default:
172: return PTS_MEAS_ALGO_NONE;
173: }
174: }
175:
176: /**
177: * Described in header.
178: */
179: size_t pts_meas_algo_hash_size(pts_meas_algorithms_t algorithm)
180: {
181: switch (algorithm)
182: {
183: case PTS_MEAS_ALGO_SHA1:
184: return HASH_SIZE_SHA1;
185: case PTS_MEAS_ALGO_SHA256:
186: return HASH_SIZE_SHA256;
187: case PTS_MEAS_ALGO_SHA384:
188: return HASH_SIZE_SHA384;
189: case PTS_MEAS_ALGO_NONE:
190: default:
191: return 0;
192: }
193: }
194:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>