Print this page
5031131 perf: pkcs11_kernel can benefit from a more efficient pkcs11_mech2str()
4947627 improve libcrypto string/mechanism conversion functions in edge cases
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/lib/libcryptoutil/common/mechstr.c
+++ new/usr/src/lib/libcryptoutil/common/mechstr.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
|
↓ open down ↓ |
15 lines elided |
↑ open up ↑ |
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 23 * Use is subject to license terms.
24 24 */
25 25
26 -#pragma ident "@(#)mechstr.c 1.6 08/01/07 SMI"
26 +#pragma ident "@(#)mechstr.c 1.7 08/06/30 SMI"
27 27
28 28 /*
29 29 * Convert Algorithm names as strings to PKCS#11 Mech numbers and vice versa.
30 30 */
31 31
32 +#include <limits.h>
32 33 #include <string.h>
33 34 #include <stdlib.h>
34 35 #include <stdio.h>
35 36 #include <security/cryptoki.h>
36 37 #include <security/pkcs11t.h>
37 38
38 39 #include <cryptoutil.h>
39 40
40 41 /*
41 42 * This table is a one-to-one mapping between mechanism names and numbers.
42 43 * As such, it should not contain deprecated mechanism names (aliases).
43 44 */
44 -static const struct {
45 - const char *str;
46 - CK_MECHANISM_TYPE mech;
47 -} mapping[] = {
45 +typedef struct {
46 + const char *str;
47 + CK_MECHANISM_TYPE mech;
48 +} pkcs11_mapping_t;
49 +
50 +/*
51 + * Note: elements in this table MUST be in numeric order,
52 + * since bsearch(3C) is used to search this table.
53 + */
54 +static const pkcs11_mapping_t mapping[] = {
48 55 { "CKM_RSA_PKCS_KEY_PAIR_GEN", CKM_RSA_PKCS_KEY_PAIR_GEN },
49 56 { "CKM_RSA_PKCS", CKM_RSA_PKCS },
50 57 { "CKM_RSA_9796", CKM_RSA_9796 },
51 58 { "CKM_RSA_X_509", CKM_RSA_X_509 },
52 59 { "CKM_MD2_RSA_PKCS", CKM_MD2_RSA_PKCS },
53 60 { "CKM_MD5_RSA_PKCS", CKM_MD5_RSA_PKCS },
54 61 { "CKM_SHA1_RSA_PKCS", CKM_SHA1_RSA_PKCS },
55 62 { "CKM_RIPEMD128_RSA_PKCS", CKM_RIPEMD128_RSA_PKCS },
56 63 { "CKM_RIPEMD160_RSA_PKCS", CKM_RIPEMD160_RSA_PKCS },
57 64 { "CKM_RSA_PKCS_OAEP", CKM_RSA_PKCS_OAEP },
58 65 { "CKM_RSA_X9_31_KEY_PAIR_GEN", CKM_RSA_X9_31_KEY_PAIR_GEN },
59 66 { "CKM_RSA_X9_31", CKM_RSA_X9_31 },
60 67 { "CKM_SHA1_RSA_X9_31", CKM_SHA1_RSA_X9_31 },
61 68 { "CKM_RSA_PKCS_PSS", CKM_RSA_PKCS_PSS },
62 69 { "CKM_SHA1_RSA_PKCS_PSS", CKM_SHA1_RSA_PKCS_PSS },
63 70 { "CKM_DSA_KEY_PAIR_GEN", CKM_DSA_KEY_PAIR_GEN },
64 71 { "CKM_DSA", CKM_DSA },
65 72 { "CKM_DSA_SHA1", CKM_DSA_SHA1 },
66 73 { "CKM_DH_PKCS_KEY_PAIR_GEN", CKM_DH_PKCS_KEY_PAIR_GEN },
67 74 { "CKM_DH_PKCS_DERIVE", CKM_DH_PKCS_DERIVE },
68 75 { "CKM_X9_42_DH_KEY_PAIR_GEN", CKM_X9_42_DH_KEY_PAIR_GEN },
69 76 { "CKM_X9_42_DH_DERIVE", CKM_X9_42_DH_DERIVE },
70 77 { "CKM_X9_42_DH_HYBRID_DERIVE", CKM_X9_42_DH_HYBRID_DERIVE },
71 78 { "CKM_X9_42_MQV_DERIVE", CKM_X9_42_MQV_DERIVE },
72 79 { "CKM_SHA256_RSA_PKCS", CKM_SHA256_RSA_PKCS },
73 80 { "CKM_SHA384_RSA_PKCS", CKM_SHA384_RSA_PKCS },
74 81 { "CKM_SHA512_RSA_PKCS", CKM_SHA512_RSA_PKCS },
75 82 { "CKM_SHA256_RSA_PKCS_PSS", CKM_SHA256_RSA_PKCS_PSS },
76 83 { "CKM_SHA384_RSA_PKCS_PSS", CKM_SHA384_RSA_PKCS_PSS },
77 84 { "CKM_SHA512_RSA_PKCS_PSS", CKM_SHA512_RSA_PKCS_PSS },
78 85 { "CKM_SHA224_RSA_PKCS", CKM_SHA224_RSA_PKCS },
79 86 { "CKM_SHA224_RSA_PKCS_PSS", CKM_SHA224_RSA_PKCS_PSS },
80 87 { "CKM_RC2_KEY_GEN", CKM_RC2_KEY_GEN },
81 88 { "CKM_RC2_ECB", CKM_RC2_ECB },
82 89 { "CKM_RC2_CBC", CKM_RC2_CBC },
83 90 { "CKM_RC2_MAC", CKM_RC2_MAC },
84 91 { "CKM_RC2_MAC_GENERAL", CKM_RC2_MAC_GENERAL },
85 92 { "CKM_RC2_CBC_PAD", CKM_RC2_CBC_PAD },
86 93 { "CKM_RC4_KEY_GEN", CKM_RC4_KEY_GEN },
87 94 { "CKM_RC4", CKM_RC4 },
88 95 { "CKM_DES_KEY_GEN", CKM_DES_KEY_GEN },
89 96 { "CKM_DES_ECB", CKM_DES_ECB },
90 97 { "CKM_DES_CBC", CKM_DES_CBC },
91 98 { "CKM_DES_MAC", CKM_DES_MAC },
92 99 { "CKM_DES_MAC_GENERAL", CKM_DES_MAC_GENERAL },
93 100 { "CKM_DES_CBC_PAD", CKM_DES_CBC_PAD },
94 101 { "CKM_DES2_KEY_GEN", CKM_DES2_KEY_GEN },
95 102 { "CKM_DES3_KEY_GEN", CKM_DES3_KEY_GEN },
96 103 { "CKM_DES3_ECB", CKM_DES3_ECB },
97 104 { "CKM_DES3_CBC", CKM_DES3_CBC },
98 105 { "CKM_DES3_MAC", CKM_DES3_MAC },
99 106 { "CKM_DES3_MAC_GENERAL", CKM_DES3_MAC_GENERAL },
100 107 { "CKM_DES3_CBC_PAD", CKM_DES3_CBC_PAD },
101 108 { "CKM_CDMF_KEY_GEN", CKM_CDMF_KEY_GEN },
102 109 { "CKM_CDMF_ECB", CKM_CDMF_ECB },
103 110 { "CKM_CDMF_CBC", CKM_CDMF_CBC },
104 111 { "CKM_CDMF_MAC", CKM_CDMF_MAC },
105 112 { "CKM_CDMF_MAC_GENERAL", CKM_CDMF_MAC_GENERAL },
106 113 { "CKM_CDMF_CBC_PAD", CKM_CDMF_CBC_PAD },
107 114 { "CKM_DES_OFB64", CKM_DES_OFB64 },
108 115 { "CKM_DES_OFB8", CKM_DES_OFB8 },
109 116 { "CKM_DES_CFB64", CKM_DES_CFB64 },
110 117 { "CKM_DES_CFB8", CKM_DES_CFB8 },
111 118 { "CKM_MD2", CKM_MD2 },
112 119 { "CKM_MD2_HMAC", CKM_MD2_HMAC },
113 120 { "CKM_MD2_HMAC_GENERAL", CKM_MD2_HMAC_GENERAL },
114 121 { "CKM_MD5", CKM_MD5 },
115 122 { "CKM_MD5_HMAC", CKM_MD5_HMAC },
116 123 { "CKM_MD5_HMAC_GENERAL", CKM_MD5_HMAC_GENERAL },
117 124 { "CKM_SHA_1", CKM_SHA_1 },
118 125 { "CKM_SHA_1_HMAC", CKM_SHA_1_HMAC },
119 126 { "CKM_SHA_1_HMAC_GENERAL", CKM_SHA_1_HMAC_GENERAL },
120 127 { "CKM_RIPEMD128", CKM_RIPEMD128 },
121 128 { "CKM_RIPEMD128_HMAC", CKM_RIPEMD128_HMAC },
122 129 { "CKM_RIPEMD128_HMAC_GENERAL", CKM_RIPEMD128_HMAC_GENERAL },
123 130 { "CKM_RIPEMD160", CKM_RIPEMD160 },
124 131 { "CKM_RIPEMD160_HMAC", CKM_RIPEMD160_HMAC },
125 132 { "CKM_RIPEMD160_HMAC_GENERAL", CKM_RIPEMD160_HMAC_GENERAL },
126 133 { "CKM_SHA256", CKM_SHA256 },
127 134 { "CKM_SHA256_HMAC", CKM_SHA256_HMAC },
128 135 { "CKM_SHA256_HMAC_GENERAL", CKM_SHA256_HMAC_GENERAL },
129 136 { "CKM_SHA224", CKM_SHA224 },
130 137 { "CKM_SHA224_HMAC", CKM_SHA224_HMAC },
131 138 { "CKM_SHA224_HMAC_GENERAL", CKM_SHA224_HMAC_GENERAL },
132 139 { "CKM_SHA384", CKM_SHA384 },
133 140 { "CKM_SHA384_HMAC", CKM_SHA384_HMAC },
134 141 { "CKM_SHA384_HMAC_GENERAL", CKM_SHA384_HMAC_GENERAL },
135 142 { "CKM_SHA512", CKM_SHA512 },
136 143 { "CKM_SHA512_HMAC", CKM_SHA512_HMAC },
137 144 { "CKM_SHA512_HMAC_GENERAL", CKM_SHA512_HMAC_GENERAL },
138 145 { "CKM_SECURID_KEY_GEN", CKM_SECURID_KEY_GEN },
139 146 { "CKM_SECURID", CKM_SECURID },
140 147 { "CKM_HOTP_KEY_GEN", CKM_HOTP_KEY_GEN },
141 148 { "CKM_HOTP", CKM_HOTP },
142 149 { "CKM_ACTI", CKM_ACTI },
143 150 { "CKM_ACTI_KEY_GEN", CKM_ACTI_KEY_GEN },
144 151 { "CKM_CAST_KEY_GEN", CKM_CAST_KEY_GEN },
145 152 { "CKM_CAST_ECB", CKM_CAST_ECB },
146 153 { "CKM_CAST_CBC", CKM_CAST_CBC },
147 154 { "CKM_CAST_MAC", CKM_CAST_MAC },
148 155 { "CKM_CAST_MAC_GENERAL", CKM_CAST_MAC_GENERAL },
149 156 { "CKM_CAST_CBC_PAD", CKM_CAST_CBC_PAD },
150 157 { "CKM_CAST3_KEY_GEN", CKM_CAST3_KEY_GEN },
151 158 { "CKM_CAST3_ECB", CKM_CAST3_ECB },
152 159 { "CKM_CAST3_CBC", CKM_CAST3_CBC },
153 160 { "CKM_CAST3_MAC", CKM_CAST3_MAC },
154 161 { "CKM_CAST3_MAC_GENERAL", CKM_CAST3_MAC_GENERAL },
155 162 { "CKM_CAST3_CBC_PAD", CKM_CAST3_CBC_PAD },
156 163 { "CKM_CAST5_KEY_GEN", CKM_CAST5_KEY_GEN },
157 164 { "CKM_CAST128_KEY_GEN", CKM_CAST128_KEY_GEN },
158 165 { "CKM_CAST5_ECB", CKM_CAST5_ECB },
159 166 { "CKM_CAST128_ECB", CKM_CAST128_ECB },
160 167 { "CKM_CAST5_CBC", CKM_CAST5_CBC },
161 168 { "CKM_CAST128_CBC", CKM_CAST128_CBC },
162 169 { "CKM_CAST5_MAC", CKM_CAST5_MAC },
163 170 { "CKM_CAST128_MAC", CKM_CAST128_MAC },
164 171 { "CKM_CAST5_MAC_GENERAL", CKM_CAST5_MAC_GENERAL },
165 172 { "CKM_CAST128_MAC_GENERAL", CKM_CAST128_MAC_GENERAL },
166 173 { "CKM_CAST5_CBC_PAD", CKM_CAST5_CBC_PAD },
167 174 { "CKM_CAST128_CBC_PAD", CKM_CAST128_CBC_PAD },
168 175 { "CKM_RC5_KEY_GEN", CKM_RC5_KEY_GEN },
169 176 { "CKM_RC5_ECB", CKM_RC5_ECB },
170 177 { "CKM_RC5_CBC", CKM_RC5_CBC },
171 178 { "CKM_RC5_MAC", CKM_RC5_MAC },
172 179 { "CKM_RC5_MAC_GENERAL", CKM_RC5_MAC_GENERAL },
173 180 { "CKM_RC5_CBC_PAD", CKM_RC5_CBC_PAD },
174 181 { "CKM_IDEA_KEY_GEN", CKM_IDEA_KEY_GEN },
175 182 { "CKM_IDEA_ECB", CKM_IDEA_ECB },
176 183 { "CKM_IDEA_CBC", CKM_IDEA_CBC },
177 184 { "CKM_IDEA_MAC", CKM_IDEA_MAC },
178 185 { "CKM_IDEA_MAC_GENERAL", CKM_IDEA_MAC_GENERAL },
179 186 { "CKM_IDEA_CBC_PAD", CKM_IDEA_CBC_PAD },
180 187 { "CKM_GENERIC_SECRET_KEY_GEN", CKM_GENERIC_SECRET_KEY_GEN },
181 188 { "CKM_CONCATENATE_BASE_AND_KEY", CKM_CONCATENATE_BASE_AND_KEY },
182 189 { "CKM_CONCATENATE_BASE_AND_DATA", CKM_CONCATENATE_BASE_AND_DATA },
183 190 { "CKM_CONCATENATE_DATA_AND_BASE", CKM_CONCATENATE_DATA_AND_BASE },
184 191 { "CKM_XOR_BASE_AND_DATA", CKM_XOR_BASE_AND_DATA },
185 192 { "CKM_EXTRACT_KEY_FROM_KEY", CKM_EXTRACT_KEY_FROM_KEY },
186 193 { "CKM_SSL3_PRE_MASTER_KEY_GEN", CKM_SSL3_PRE_MASTER_KEY_GEN },
187 194 { "CKM_SSL3_MASTER_KEY_DERIVE", CKM_SSL3_MASTER_KEY_DERIVE },
188 195 { "CKM_SSL3_KEY_AND_MAC_DERIVE", CKM_SSL3_KEY_AND_MAC_DERIVE },
189 196 { "CKM_SSL3_MASTER_KEY_DERIVE_DH", CKM_SSL3_MASTER_KEY_DERIVE_DH },
190 197 { "CKM_TLS_PRE_MASTER_KEY_GEN", CKM_TLS_PRE_MASTER_KEY_GEN },
191 198 { "CKM_TLS_MASTER_KEY_DERIVE", CKM_TLS_MASTER_KEY_DERIVE },
192 199 { "CKM_TLS_KEY_AND_MAC_DERIVE", CKM_TLS_KEY_AND_MAC_DERIVE },
193 200 { "CKM_TLS_MASTER_KEY_DERIVE_DH", CKM_TLS_MASTER_KEY_DERIVE_DH },
194 201 { "CKM_TLS_PRF", CKM_TLS_PRF },
195 202 { "CKM_SSL3_MD5_MAC", CKM_SSL3_MD5_MAC },
196 203 { "CKM_SSL3_SHA1_MAC", CKM_SSL3_SHA1_MAC },
197 204 { "CKM_MD5_KEY_DERIVATION", CKM_MD5_KEY_DERIVATION },
198 205 { "CKM_MD2_KEY_DERIVATION", CKM_MD2_KEY_DERIVATION },
199 206 { "CKM_SHA1_KEY_DERIVATION", CKM_SHA1_KEY_DERIVATION },
200 207 { "CKM_SHA256_KEY_DERIVATION", CKM_SHA256_KEY_DERIVATION },
201 208 { "CKM_SHA384_KEY_DERIVATION", CKM_SHA384_KEY_DERIVATION },
202 209 { "CKM_SHA512_KEY_DERIVATION", CKM_SHA512_KEY_DERIVATION },
203 210 { "CKM_SHA224_KEY_DERIVATION", CKM_SHA224_KEY_DERIVATION },
204 211 { "CKM_PBE_MD2_DES_CBC", CKM_PBE_MD2_DES_CBC },
205 212 { "CKM_PBE_MD5_DES_CBC", CKM_PBE_MD5_DES_CBC },
206 213 { "CKM_PBE_MD5_CAST_CBC", CKM_PBE_MD5_CAST_CBC },
207 214 { "CKM_PBE_MD5_CAST3_CBC", CKM_PBE_MD5_CAST3_CBC },
208 215 { "CKM_PBE_MD5_CAST5_CBC", CKM_PBE_MD5_CAST5_CBC },
209 216 { "CKM_PBE_MD5_CAST128_CBC", CKM_PBE_MD5_CAST128_CBC },
210 217 { "CKM_PBE_SHA1_CAST5_CBC", CKM_PBE_SHA1_CAST5_CBC },
211 218 { "CKM_PBE_SHA1_CAST128_CBC", CKM_PBE_SHA1_CAST128_CBC },
212 219 { "CKM_PBE_SHA1_RC4_128", CKM_PBE_SHA1_RC4_128 },
213 220 { "CKM_PBE_SHA1_RC4_40", CKM_PBE_SHA1_RC4_40 },
214 221 { "CKM_PBE_SHA1_DES3_EDE_CBC", CKM_PBE_SHA1_DES3_EDE_CBC },
215 222 { "CKM_PBE_SHA1_DES2_EDE_CBC", CKM_PBE_SHA1_DES2_EDE_CBC },
216 223 { "CKM_PBE_SHA1_RC2_128_CBC", CKM_PBE_SHA1_RC2_128_CBC },
217 224 { "CKM_PBE_SHA1_RC2_40_CBC", CKM_PBE_SHA1_RC2_40_CBC },
218 225 { "CKM_PKCS5_PBKD2", CKM_PKCS5_PBKD2 },
219 226 { "CKM_PBA_SHA1_WITH_SHA1_HMAC", CKM_PBA_SHA1_WITH_SHA1_HMAC },
220 227 { "CKM_KEY_WRAP_LYNKS", CKM_KEY_WRAP_LYNKS },
221 228 { "CKM_KEY_WRAP_SET_OAEP", CKM_KEY_WRAP_SET_OAEP },
222 229 { "CKM_KIP_DERIVE", CKM_KIP_DERIVE },
223 230 { "CKM_KIP_WRAP", CKM_KIP_WRAP },
224 231 { "CKM_KIP_MAC", CKM_KIP_MAC },
225 232 { "CKM_CAMELLIA_KEY_GEN", CKM_CAMELLIA_KEY_GEN },
226 233 { "CKM_CAMELLIA_ECB", CKM_CAMELLIA_ECB },
227 234 { "CKM_CAMELLIA_CBC", CKM_CAMELLIA_CBC },
228 235 { "CKM_CAMELLIA_MAC", CKM_CAMELLIA_MAC },
229 236 { "CKM_CAMELLIA_MAC_GENERAL", CKM_CAMELLIA_MAC_GENERAL },
230 237 { "CKM_CAMELLIA_CBC_PAD", CKM_CAMELLIA_CBC_PAD },
231 238 { "CKM_CAMELLIA_ECB_ENCRYPT_DATA", CKM_CAMELLIA_ECB_ENCRYPT_DATA },
232 239 { "CKM_CAMELLIA_CBC_ENCRYPT_DATA", CKM_CAMELLIA_CBC_ENCRYPT_DATA },
233 240 { "CKM_CAMELLIA_CTR", CKM_CAMELLIA_CTR },
234 241 { "CKM_ARIA_KEY_GEN", CKM_ARIA_KEY_GEN },
235 242 { "CKM_ARIA_ECB", CKM_ARIA_ECB },
236 243 { "CKM_ARIA_CBC", CKM_ARIA_CBC },
237 244 { "CKM_ARIA_MAC", CKM_ARIA_MAC },
238 245 { "CKM_ARIA_MAC_GENERAL", CKM_ARIA_MAC_GENERAL },
239 246 { "CKM_ARIA_CBC_PAD", CKM_ARIA_CBC_PAD },
240 247 { "CKM_ARIA_ECB_ENCRYPT_DATA", CKM_ARIA_ECB_ENCRYPT_DATA },
241 248 { "CKM_ARIA_CBC_ENCRYPT_DATA", CKM_ARIA_CBC_ENCRYPT_DATA },
242 249 { "CKM_SKIPJACK_KEY_GEN", CKM_SKIPJACK_KEY_GEN },
243 250 { "CKM_SKIPJACK_ECB64", CKM_SKIPJACK_ECB64 },
244 251 { "CKM_SKIPJACK_CBC64", CKM_SKIPJACK_CBC64 },
245 252 { "CKM_SKIPJACK_OFB64", CKM_SKIPJACK_OFB64 },
246 253 { "CKM_SKIPJACK_CFB64", CKM_SKIPJACK_CFB64 },
247 254 { "CKM_SKIPJACK_CFB32", CKM_SKIPJACK_CFB32 },
248 255 { "CKM_SKIPJACK_CFB16", CKM_SKIPJACK_CFB16 },
249 256 { "CKM_SKIPJACK_CFB8", CKM_SKIPJACK_CFB8 },
250 257 { "CKM_SKIPJACK_WRAP", CKM_SKIPJACK_WRAP },
251 258 { "CKM_SKIPJACK_PRIVATE_WRAP", CKM_SKIPJACK_PRIVATE_WRAP },
252 259 { "CKM_SKIPJACK_RELAYX", CKM_SKIPJACK_RELAYX },
253 260 { "CKM_KEA_KEY_PAIR_GEN", CKM_KEA_KEY_PAIR_GEN },
254 261 { "CKM_KEA_KEY_DERIVE", CKM_KEA_KEY_DERIVE },
255 262 { "CKM_FORTEZZA_TIMESTAMP", CKM_FORTEZZA_TIMESTAMP },
256 263 { "CKM_BATON_KEY_GEN", CKM_BATON_KEY_GEN },
257 264 { "CKM_BATON_ECB128", CKM_BATON_ECB128 },
258 265 { "CKM_BATON_ECB96", CKM_BATON_ECB96 },
259 266 { "CKM_BATON_CBC128", CKM_BATON_CBC128 },
260 267 { "CKM_BATON_COUNTER", CKM_BATON_COUNTER },
261 268 { "CKM_BATON_SHUFFLE", CKM_BATON_SHUFFLE },
262 269 { "CKM_BATON_WRAP", CKM_BATON_WRAP },
263 270 { "CKM_EC_KEY_PAIR_GEN", CKM_EC_KEY_PAIR_GEN },
264 271 { "CKM_ECDSA", CKM_ECDSA },
265 272 { "CKM_ECDSA_SHA1", CKM_ECDSA_SHA1 },
266 273 { "CKM_ECDH1_DERIVE", CKM_ECDH1_DERIVE },
267 274 { "CKM_ECDH1_COFACTOR_DERIVE", CKM_ECDH1_COFACTOR_DERIVE },
268 275 { "CKM_ECMQV_DERIVE", CKM_ECMQV_DERIVE },
269 276 { "CKM_JUNIPER_KEY_GEN", CKM_JUNIPER_KEY_GEN },
270 277 { "CKM_JUNIPER_ECB128", CKM_JUNIPER_ECB128 },
271 278 { "CKM_JUNIPER_CBC128", CKM_JUNIPER_CBC128 },
272 279 { "CKM_JUNIPER_COUNTER", CKM_JUNIPER_COUNTER },
273 280 { "CKM_JUNIPER_SHUFFLE", CKM_JUNIPER_SHUFFLE },
274 281 { "CKM_JUNIPER_WRAP", CKM_JUNIPER_WRAP },
275 282 { "CKM_FASTHASH", CKM_FASTHASH },
276 283 { "CKM_AES_KEY_GEN", CKM_AES_KEY_GEN },
277 284 { "CKM_AES_ECB", CKM_AES_ECB },
278 285 { "CKM_AES_CBC", CKM_AES_CBC },
279 286 { "CKM_AES_MAC", CKM_AES_MAC },
280 287 { "CKM_AES_MAC_GENERAL", CKM_AES_MAC_GENERAL },
281 288 { "CKM_AES_CBC_PAD", CKM_AES_CBC_PAD },
282 289 { "CKM_AES_CTR", CKM_AES_CTR },
283 290 { "CKM_BLOWFISH_KEY_GEN", CKM_BLOWFISH_KEY_GEN },
284 291 { "CKM_BLOWFISH_CBC", CKM_BLOWFISH_CBC },
285 292 { "CKM_TWOFISH_KEY_GEN", CKM_TWOFISH_KEY_GEN },
|
↓ open down ↓ |
228 lines elided |
↑ open up ↑ |
286 293 { "CKM_TWOFISH_CBC", CKM_TWOFISH_CBC },
287 294 { "CKM_DES_ECB_ENCRYPT_DATA", CKM_DES_ECB_ENCRYPT_DATA },
288 295 { "CKM_DES_CBC_ENCRYPT_DATA", CKM_DES_CBC_ENCRYPT_DATA },
289 296 { "CKM_DES3_ECB_ENCRYPT_DATA", CKM_DES3_ECB_ENCRYPT_DATA },
290 297 { "CKM_DES3_CBC_ENCRYPT_DATA", CKM_DES3_CBC_ENCRYPT_DATA },
291 298 { "CKM_AES_ECB_ENCRYPT_DATA", CKM_AES_ECB_ENCRYPT_DATA },
292 299 { "CKM_AES_CBC_ENCRYPT_DATA", CKM_AES_CBC_ENCRYPT_DATA },
293 300 { "CKM_DSA_PARAMETER_GEN", CKM_DSA_PARAMETER_GEN },
294 301 { "CKM_DH_PKCS_PARAMETER_GEN", CKM_DH_PKCS_PARAMETER_GEN },
295 302 { "CKM_X9_42_DH_PARAMETER_GEN", CKM_X9_42_DH_PARAMETER_GEN },
296 - { "CKM_VENDOR_DEFINED", CKM_VENDOR_DEFINED },
303 + /*
304 + * Values above 0x8000000 (CKM_VENDOR_DEFINED) are represented
305 + * as strings with hexadecimal numbers (e.g., "0x8123456").
306 + */
297 307 { NULL, 0 }
298 308 };
299 309
310 +
300 311 /*
312 + * pkcs11_mech_comp - compare two pkcs11_mapping_t structures
313 + *
314 + * Return a strcmp-like result (positive, zero, or negative).
315 + * For use with bsearch(3C) in pkcs11_mech2str().
316 + */
317 +static int
318 +pkcs11_mech_comp(const void *mapping1, const void *mapping2) {
319 + return (((pkcs11_mapping_t *)mapping1)->mech -
320 + ((pkcs11_mapping_t *)mapping2)->mech);
321 +}
322 +
323 +
324 +/*
301 325 * pkcs11_mech2str - convert PKCS#11 mech to a string
302 326 *
303 327 * Anything below CKM_VENDOR_DEFINED that wasn't in the mapping table
304 328 * at build time causes NULL to be returned. Anything above it also
305 - * returns NULL since we have no way to know what its real name is.
329 + * returns NULL since we have no way to know its real name.
306 330 */
307 -char
331 +const char
308 332 *pkcs11_mech2str(CK_MECHANISM_TYPE mech)
309 333 {
310 - int i;
311 - char buf[11]; /* Num chars for representing ulong in ASCII */
334 + pkcs11_mapping_t target;
335 + pkcs11_mapping_t *result = NULL;
312 336
313 337 if (mech > CKM_VENDOR_DEFINED) {
314 - (void) snprintf(buf, sizeof (buf), "%#lx", mech);
315 - return (strdup(buf));
338 + return (NULL);
316 339 }
317 340
318 - for (i = 0; mapping[i].str; i++) {
319 - if (mapping[i].mech == mech)
320 - return (strdup(mapping[i].str));
341 + /* Search for the mechanism number using bsearch(3C) */
342 + target.mech = mech;
343 + target.str = NULL;
344 + result = (pkcs11_mapping_t *)bsearch((void *)&target, (void *)mapping,
345 + (sizeof (mapping) / sizeof (pkcs11_mapping_t)) - 1,
346 + sizeof (pkcs11_mapping_t), pkcs11_mech_comp);
347 + if (result != NULL) {
348 + return (result->str);
321 349 }
322 350
323 351 return (NULL);
324 352 }
325 353
326 354 /*
327 355 * pkcs11_str2mech - convert a string into a PKCS#11 mech number.
328 356 *
329 - * Since there isn't reserved value for an invalid mech we return
357 + * Since there isn't a reserved value for an invalid mech we return
330 358 * CKR_MECHANISM_INVALID for anything we don't recognise.
331 359 * The value in mech isn't meaningful in these cases.
332 360 */
333 361 CK_RV
334 362 pkcs11_str2mech(char *mech_str, CK_MECHANISM_TYPE_PTR mech)
335 363 {
336 - int i;
337 - char *tmech_str;
364 + int i;
365 + int compare_off = 0;
338 366
339 367 if (mech_str == NULL)
340 368 return (CKR_MECHANISM_INVALID);
341 369
342 - if (strncasecmp(mech_str, "0x8", 3) == 0) {
370 + if (strncasecmp(mech_str, "0x", 2) == 0) {
371 + long long llnum;
343 372 cryptodebug("pkcs11_str2mech: hex string passed in: %s",
344 373 mech_str);
345 - *mech = strtoll(mech_str, NULL, 16);
346 - return (CKR_OK);
374 + llnum = strtoll(mech_str, NULL, 16);
375 + if ((llnum >= CKM_VENDOR_DEFINED) && (llnum <= UINT_MAX)) {
376 + *mech = llnum;
377 + return (CKR_OK);
378 + } else {
379 + return (CKR_MECHANISM_INVALID);
380 + }
347 381 }
348 382
383 + /* If there's no CKM_ prefix, then ignore it in comparisons */
349 384 if (strncasecmp(mech_str, "CKM_", 4) != 0) {
350 - size_t tmech_strlen = strlen(mech_str) + 4 + 1;
351 385 cryptodebug("pkcs11_str2mech: no CKM_ prefix: %s", mech_str);
352 - tmech_str = malloc(tmech_strlen * sizeof (char));
353 - (void) snprintf(tmech_str, tmech_strlen, "CKM_%s", mech_str);
354 - cryptodebug("pkcs11_str2mech: with prefix: %s", tmech_str);
355 - } else {
356 - tmech_str = mech_str;
386 + cryptodebug("pkcs11_str2mech: with prefix: CKM_%s", mech_str);
387 + compare_off = 4;
357 388 }
358 389
390 + /* Linear search for a matching string */
359 391 for (i = 0; mapping[i].str; i++) {
360 - if (strcasecmp(mapping[i].str, tmech_str) == 0) {
392 + if (strcasecmp(&mapping[i].str[compare_off], mech_str) == 0) {
361 393 *mech = mapping[i].mech;
362 - if (tmech_str != mech_str)
363 - free(tmech_str);
364 394 return (CKR_OK);
365 395 }
366 396 }
367 - if (tmech_str != mech_str)
368 - free(tmech_str);
369 397
370 398 return (CKR_MECHANISM_INVALID);
371 399 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX