Request missing SWID tags in a directed PA-TNC message
[strongswan.git] / src / libimcv / pts / pts_meas_algo.c
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 size_t pts_meas_algo_hash_size(pts_meas_algorithms_t algorithm)
162 {
163 switch (algorithm)
164 {
165 case PTS_MEAS_ALGO_SHA1:
166 return HASH_SIZE_SHA1;
167 case PTS_MEAS_ALGO_SHA256:
168 return HASH_SIZE_SHA256;
169 case PTS_MEAS_ALGO_SHA384:
170 return HASH_SIZE_SHA384;
171 case PTS_MEAS_ALGO_NONE:
172 default:
173 return 0;
174 }
175 }
176