/ OSX / libsecurity_mds / lib / MDSAttrStrings.cpp
MDSAttrStrings.cpp
  1  /*
  2   * Copyright (c) 2000-2001,2011-2012,2014 Apple Inc. All Rights Reserved.
  3   * 
  4   * The contents of this file constitute Original Code as defined in and are
  5   * subject to the Apple Public Source License Version 1.2 (the 'License').
  6   * You may not use this file except in compliance with the License. Please obtain
  7   * a copy of the License at http://www.apple.com/publicsource and read it before
  8   * using this file.
  9   * 
 10   * This Original Code and all software distributed under the License are
 11   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
 12   * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
 13   * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 14   * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
 15   * specific language governing rights and limitations under the License.
 16   */
 17  
 18  
 19  /*
 20     File:      MDSAttrStrings.cpp
 21  
 22     Contains:  Static tables to map attribute names to numeric values.
 23  
 24     Copyright (c) 2001,2011-2012,2014 Apple Inc. All Rights Reserved.
 25  */
 26  
 27  #include "MDSAttrStrings.h"
 28  #include "MDSAttrUtils.h"
 29  #include <Security/cssmapple.h>
 30  #include <Security/mds_schema.h>
 31  #include <Security/cssmkrapi.h> 	// CSSM_KR_POLICY_TYPE
 32  #include <ctype.h>			// isDigit
 33  #include <strings.h>		// strcmp 
 34  #include <stdlib.h>			// atoi
 35  
 36  namespace Security
 37  {
 38  
 39  /* declare one entry in a table of MDSNameValuePairs */
 40  #define MNVP(attr)		{attr, #attr}
 41  
 42  /* the NULL entry which terminates all MDSNameValuePair tables */
 43  #define MNVP_END		{0, NULL}
 44  
 45  /***
 46   *** common attributes
 47   ***/
 48  
 49  /* CSSM_SERVICE_MASK */
 50  const MDSNameValuePair MDSServiceNames[] =
 51  {
 52  	MNVP(CSSM_SERVICE_CSSM),
 53  	MNVP(CSSM_SERVICE_CSP),
 54  	MNVP(CSSM_SERVICE_DL),
 55  	MNVP(CSSM_SERVICE_CL),
 56  	MNVP(CSSM_SERVICE_TP),
 57  	MNVP(CSSM_SERVICE_AC),
 58  	MNVP(CSSM_SERVICE_KR),
 59  	MNVP_END
 60  };
 61  
 62  /* CSSM_ACL_SUBJECT_TYPE */
 63  const MDSNameValuePair MDSAclSubjectTypeNames[] =
 64  {
 65  	MNVP(CSSM_ACL_SUBJECT_TYPE_ANY),
 66  	MNVP(CSSM_ACL_SUBJECT_TYPE_THRESHOLD),
 67  	MNVP(CSSM_ACL_SUBJECT_TYPE_PASSWORD),
 68  	MNVP(CSSM_ACL_SUBJECT_TYPE_PROTECTED_PASSWORD),
 69  	MNVP(CSSM_ACL_SUBJECT_TYPE_PROMPTED_PASSWORD),
 70  	MNVP(CSSM_ACL_SUBJECT_TYPE_PUBLIC_KEY),
 71  	MNVP(CSSM_ACL_SUBJECT_TYPE_HASHED_SUBJECT),
 72  	MNVP(CSSM_ACL_SUBJECT_TYPE_BIOMETRIC),
 73  	MNVP(CSSM_ACL_SUBJECT_TYPE_PROTECTED_BIOMETRIC),
 74  	MNVP(CSSM_ACL_SUBJECT_TYPE_PROMPTED_BIOMETRIC),
 75  	MNVP(CSSM_ACL_SUBJECT_TYPE_LOGIN_NAME),
 76  	MNVP(CSSM_ACL_SUBJECT_TYPE_EXT_PAM_NAME),
 77  	/* from cssmapple.h */
 78  	MNVP(CSSM_ACL_SUBJECT_TYPE_KEYCHAIN_PROMPT),
 79  	MNVP(CSSM_ACL_SUBJECT_TYPE_PROCESS),
 80  	MNVP(CSSM_ACL_SUBJECT_TYPE_CODE_SIGNATURE),
 81  	MNVP(CSSM_ACL_SUBJECT_TYPE_COMMENT),
 82  	MNVP_END
 83  };
 84  
 85  /* CSSM_ACL_AUTHORIZATION_TAG */
 86  const MDSNameValuePair MDSAclAuthTagNames[] =
 87  {
 88  	MNVP(CSSM_ACL_AUTHORIZATION_ANY),
 89  	MNVP(CSSM_ACL_AUTHORIZATION_LOGIN),
 90  	MNVP(CSSM_ACL_AUTHORIZATION_GENKEY),
 91  	MNVP(CSSM_ACL_AUTHORIZATION_DELETE),
 92  	MNVP(CSSM_ACL_AUTHORIZATION_EXPORT_WRAPPED),
 93  	MNVP(CSSM_ACL_AUTHORIZATION_EXPORT_CLEAR),
 94  	MNVP(CSSM_ACL_AUTHORIZATION_IMPORT_WRAPPED),
 95  	MNVP(CSSM_ACL_AUTHORIZATION_IMPORT_CLEAR),
 96  	MNVP(CSSM_ACL_AUTHORIZATION_SIGN),
 97  	MNVP(CSSM_ACL_AUTHORIZATION_ENCRYPT),
 98  	MNVP(CSSM_ACL_AUTHORIZATION_DECRYPT),
 99  	MNVP(CSSM_ACL_AUTHORIZATION_MAC),
100  	MNVP(CSSM_ACL_AUTHORIZATION_DERIVE),
101  	MNVP(CSSM_ACL_AUTHORIZATION_DBS_CREATE),
102  	MNVP(CSSM_ACL_AUTHORIZATION_DBS_DELETE),
103  	MNVP(CSSM_ACL_AUTHORIZATION_DB_READ),
104  	MNVP(CSSM_ACL_AUTHORIZATION_DB_INSERT),
105  	MNVP(CSSM_ACL_AUTHORIZATION_DB_MODIFY),
106  	MNVP(CSSM_ACL_AUTHORIZATION_DB_DELETE),
107  	/* from cssmapple.h */
108  	MNVP(CSSM_ACL_AUTHORIZATION_CHANGE_ACL),
109  	MNVP(CSSM_ACL_AUTHORIZATION_CHANGE_OWNER),
110  	MNVP_END
111  };
112  
113  /***
114   *** CSP attributes 
115   ***/
116  
117  /* CSSM_CONTEXT_TYPE */
118  const MDSNameValuePair MDSContextTypeNames[] =
119  {
120  	MNVP(CSSM_ALGCLASS_NONE),
121  	MNVP(CSSM_ALGCLASS_CUSTOM),
122  	MNVP(CSSM_ALGCLASS_SIGNATURE),
123  	MNVP(CSSM_ALGCLASS_SYMMETRIC),
124  	MNVP(CSSM_ALGCLASS_DIGEST),
125  	MNVP(CSSM_ALGCLASS_RANDOMGEN),
126  	MNVP(CSSM_ALGCLASS_UNIQUEGEN),
127  	MNVP(CSSM_ALGCLASS_MAC),
128  	MNVP(CSSM_ALGCLASS_ASYMMETRIC),
129  	MNVP(CSSM_ALGCLASS_KEYGEN),
130  	MNVP(CSSM_ALGCLASS_DERIVEKEY),
131  	MNVP(CSSM_ALGCLASS_NONE),
132  	MNVP_END
133  };
134  
135  /* CSSM_ATTRIBUTE_TYPE */
136  const MDSNameValuePair MDSAttributeTypeNames[] = 
137  {
138  	MNVP(CSSM_ATTRIBUTE_NONE),
139  	MNVP(CSSM_ATTRIBUTE_CUSTOM),
140  	MNVP(CSSM_ATTRIBUTE_DESCRIPTION),
141  	MNVP(CSSM_ATTRIBUTE_KEY),
142  	MNVP(CSSM_ATTRIBUTE_INIT_VECTOR),
143  	MNVP(CSSM_ATTRIBUTE_SALT),
144  	MNVP(CSSM_ATTRIBUTE_PADDING),
145  	MNVP(CSSM_ATTRIBUTE_RANDOM),
146  	MNVP(CSSM_ATTRIBUTE_SEED),
147  	MNVP(CSSM_ATTRIBUTE_PASSPHRASE),
148  	MNVP(CSSM_ATTRIBUTE_KEY_LENGTH),
149  	MNVP(CSSM_ATTRIBUTE_KEY_LENGTH_RANGE),
150  	MNVP(CSSM_ATTRIBUTE_BLOCK_SIZE),
151  	MNVP(CSSM_ATTRIBUTE_OUTPUT_SIZE),
152  	MNVP(CSSM_ATTRIBUTE_ROUNDS),
153  	MNVP(CSSM_ATTRIBUTE_IV_SIZE),
154  	MNVP(CSSM_ATTRIBUTE_ALG_PARAMS),
155  	MNVP(CSSM_ATTRIBUTE_LABEL),
156  	MNVP(CSSM_ATTRIBUTE_KEY_TYPE),
157  	MNVP(CSSM_ATTRIBUTE_MODE),
158  	MNVP(CSSM_ATTRIBUTE_EFFECTIVE_BITS),
159  	MNVP(CSSM_ATTRIBUTE_START_DATE),
160  	MNVP(CSSM_ATTRIBUTE_END_DATE),
161  	MNVP(CSSM_ATTRIBUTE_KEYUSAGE),
162  	MNVP(CSSM_ATTRIBUTE_KEYATTR),
163  	MNVP(CSSM_ATTRIBUTE_VERSION),
164  	MNVP(CSSM_ATTRIBUTE_PRIME),
165  	MNVP(CSSM_ATTRIBUTE_SUBPRIME),
166  	MNVP(CSSM_ATTRIBUTE_ALG_ID),
167  	MNVP(CSSM_ATTRIBUTE_ITERATION_COUNT),
168  	MNVP(CSSM_ATTRIBUTE_ROUNDS_RANGE),
169  	MNVP(CSSM_ATTRIBUTE_KRPROFILE_LOCAL),
170  	MNVP(CSSM_ATTRIBUTE_KRPROFILE_REMOTE),
171  	MNVP(CSSM_ATTRIBUTE_CSP_HANDLE),
172  	MNVP(CSSM_ATTRIBUTE_DL_DB_HANDLE),
173  	MNVP(CSSM_ATTRIBUTE_ACCESS_CREDENTIALS),
174  	MNVP(CSSM_ATTRIBUTE_PUBLIC_KEY_FORMAT),
175  	MNVP(CSSM_ATTRIBUTE_PRIVATE_KEY_FORMAT),
176  	MNVP(CSSM_ATTRIBUTE_SYMMETRIC_KEY_FORMAT),
177  	MNVP(CSSM_ATTRIBUTE_WRAPPED_KEY_FORMAT),
178  	MNVP_END
179  };
180  
181  /* CSSM_PADDING */
182  const MDSNameValuePair MDSPaddingNames[] = 
183  {
184  	MNVP(CSSM_PADDING_NONE),
185  	MNVP(CSSM_PADDING_CUSTOM),
186  	MNVP(CSSM_PADDING_ZERO),
187  	MNVP(CSSM_PADDING_ONE),
188  	MNVP(CSSM_PADDING_ALTERNATE),
189  	MNVP(CSSM_PADDING_FF),
190  	MNVP(CSSM_PADDING_PKCS5),
191  	MNVP(CSSM_PADDING_PKCS7),
192  	MNVP(CSSM_PADDING_CIPHERSTEALING),
193  	MNVP(CSSM_PADDING_RANDOM),
194  	MNVP(CSSM_PADDING_PKCS1),
195  	MNVP_END
196  };
197  
198  /* CSSM_CSP_FLAGS */
199  const MDSNameValuePair MDSCspFlagsNames[] = 
200  {
201  	MNVP(CSSM_CSP_TOK_WRITE_PROTECTED),
202  	MNVP(CSSM_CSP_TOK_LOGIN_REQUIRED),
203  	MNVP(CSSM_CSP_TOK_USER_PIN_INITIALIZED),
204  	MNVP(CSSM_CSP_TOK_PROT_AUTHENTICATION),
205  	MNVP(CSSM_CSP_TOK_USER_PIN_EXPIRED),
206  	MNVP(CSSM_CSP_TOK_SESSION_KEY_PASSWORD),
207  	MNVP(CSSM_CSP_TOK_PRIVATE_KEY_PASSWORD),
208  	MNVP(CSSM_CSP_STORES_PRIVATE_KEYS),
209  	MNVP(CSSM_CSP_STORES_PUBLIC_KEYS),
210  	MNVP(CSSM_CSP_STORES_SESSION_KEYS),
211  	MNVP(CSSM_CSP_STORES_CERTIFICATES),
212  	MNVP(CSSM_CSP_STORES_GENERIC),
213  	MNVP_END
214  };
215  
216  /* CSSM_ALGORITHMS */
217  const MDSNameValuePair MDSAlgorithmNames[] = 
218  {
219  	MNVP(CSSM_ALGID_NONE),
220  	MNVP(CSSM_ALGID_CUSTOM),
221  	MNVP(CSSM_ALGID_DH),
222  	MNVP(CSSM_ALGID_PH),
223  	MNVP(CSSM_ALGID_KEA),
224  	MNVP(CSSM_ALGID_MD2),
225  	MNVP(CSSM_ALGID_MD4),
226  	MNVP(CSSM_ALGID_MD5),
227  	MNVP(CSSM_ALGID_SHA1),
228  	MNVP(CSSM_ALGID_NHASH),
229  	MNVP(CSSM_ALGID_HAVAL),
230  	MNVP(CSSM_ALGID_RIPEMD),
231  	MNVP(CSSM_ALGID_IBCHASH),
232  	MNVP(CSSM_ALGID_RIPEMAC),
233  	MNVP(CSSM_ALGID_DES),
234  	MNVP(CSSM_ALGID_DESX),
235  	MNVP(CSSM_ALGID_RDES),
236  	MNVP(CSSM_ALGID_3DES_3KEY_EDE),
237  	MNVP(CSSM_ALGID_3DES_2KEY_EDE),
238  	MNVP(CSSM_ALGID_3DES_1KEY_EEE),
239  	MNVP(CSSM_ALGID_3DES_3KEY),
240  	MNVP(CSSM_ALGID_3DES_3KEY_EEE),
241  	MNVP(CSSM_ALGID_3DES_2KEY),
242  	MNVP(CSSM_ALGID_3DES_2KEY_EEE),
243  	MNVP(CSSM_ALGID_3DES_1KEY),
244  	MNVP(CSSM_ALGID_IDEA),
245  	MNVP(CSSM_ALGID_RC2),
246  	MNVP(CSSM_ALGID_RC5),
247  	MNVP(CSSM_ALGID_RC4),
248  	MNVP(CSSM_ALGID_SEAL),
249  	MNVP(CSSM_ALGID_CAST),
250  	MNVP(CSSM_ALGID_BLOWFISH),
251  	MNVP(CSSM_ALGID_SKIPJACK),
252  	MNVP(CSSM_ALGID_LUCIFER),
253  	MNVP(CSSM_ALGID_MADRYGA),
254  	MNVP(CSSM_ALGID_FEAL),
255  	MNVP(CSSM_ALGID_REDOC),
256  	MNVP(CSSM_ALGID_REDOC3),
257  	MNVP(CSSM_ALGID_LOKI),
258  	MNVP(CSSM_ALGID_KHUFU),
259  	MNVP(CSSM_ALGID_KHAFRE),
260  	MNVP(CSSM_ALGID_MMB),
261  	MNVP(CSSM_ALGID_GOST),
262  	MNVP(CSSM_ALGID_SAFER),
263  	MNVP(CSSM_ALGID_CRAB),
264  	MNVP(CSSM_ALGID_RSA),
265  	MNVP(CSSM_ALGID_DSA),
266  	MNVP(CSSM_ALGID_MD5WithRSA),
267  	MNVP(CSSM_ALGID_MD2WithRSA),
268  	MNVP(CSSM_ALGID_ElGamal),
269  	MNVP(CSSM_ALGID_MD2Random),
270  	MNVP(CSSM_ALGID_MD5Random),
271  	MNVP(CSSM_ALGID_SHARandom),
272  	MNVP(CSSM_ALGID_DESRandom),
273  	MNVP(CSSM_ALGID_SHA1WithRSA),
274  	MNVP(CSSM_ALGID_CDMF),
275  	MNVP(CSSM_ALGID_CAST3),
276  	MNVP(CSSM_ALGID_CAST5),
277  	MNVP(CSSM_ALGID_GenericSecret),
278  	MNVP(CSSM_ALGID_ConcatBaseAndKey),
279  	MNVP(CSSM_ALGID_ConcatKeyAndBase),
280  	MNVP(CSSM_ALGID_ConcatBaseAndData),
281  	MNVP(CSSM_ALGID_ConcatDataAndBase),
282  	MNVP(CSSM_ALGID_XORBaseAndData),
283  	MNVP(CSSM_ALGID_ExtractFromKey),
284  	MNVP(CSSM_ALGID_SSL3PreMasterGen),
285  	MNVP(CSSM_ALGID_SSL3MasterDerive),
286  	MNVP(CSSM_ALGID_SSL3KeyAndMacDerive),
287  	MNVP(CSSM_ALGID_SSL3MD5_MAC),
288  	MNVP(CSSM_ALGID_SSL3SHA1_MAC),
289  	MNVP(CSSM_ALGID_PKCS5_PBKDF1_MD5),
290  	MNVP(CSSM_ALGID_PKCS5_PBKDF1_MD2),
291  	MNVP(CSSM_ALGID_PKCS5_PBKDF1_SHA1),
292  	MNVP(CSSM_ALGID_WrapLynks),
293  	MNVP(CSSM_ALGID_WrapSET_OAEP),
294  	MNVP(CSSM_ALGID_BATON),
295  	MNVP(CSSM_ALGID_ECDSA),
296  	MNVP(CSSM_ALGID_MAYFLY),
297  	MNVP(CSSM_ALGID_JUNIPER),
298  	MNVP(CSSM_ALGID_FASTHASH),
299  	MNVP(CSSM_ALGID_3DES),
300  	MNVP(CSSM_ALGID_SSL3MD5),
301  	MNVP(CSSM_ALGID_SSL3SHA1),
302  	MNVP(CSSM_ALGID_FortezzaTimestamp),
303  	MNVP(CSSM_ALGID_SHA1WithDSA),
304  	MNVP(CSSM_ALGID_SHA1WithECDSA),
305  	MNVP(CSSM_ALGID_DSA_BSAFE),
306  	MNVP(CSSM_ALGID_ECDH),
307  	MNVP(CSSM_ALGID_ECMQV),
308  	MNVP(CSSM_ALGID_PKCS12_SHA1_PBE),
309  	MNVP(CSSM_ALGID_ECNRA),
310  	MNVP(CSSM_ALGID_SHA1WithECNRA),
311  	MNVP(CSSM_ALGID_ECES),
312  	MNVP(CSSM_ALGID_ECAES),
313  	MNVP(CSSM_ALGID_SHA1HMAC),
314  	MNVP(CSSM_ALGID_FIPS186Random),
315  	MNVP(CSSM_ALGID_ECC),
316  	MNVP(CSSM_ALGID_MQV),
317  	MNVP(CSSM_ALGID_NRA),
318  	MNVP(CSSM_ALGID_IntelPlatformRandom),
319  	MNVP(CSSM_ALGID_UTC),
320  	MNVP(CSSM_ALGID_HAVAL3),
321  	MNVP(CSSM_ALGID_HAVAL4),
322  	MNVP(CSSM_ALGID_HAVAL5),
323  	MNVP(CSSM_ALGID_TIGER),
324  	MNVP(CSSM_ALGID_MD5HMAC),
325  	MNVP(CSSM_ALGID_PKCS5_PBKDF2),
326  	MNVP(CSSM_ALGID_RUNNING_COUNTER),
327  	
328  	/* from cssmapple.h */
329  	MNVP(CSSM_ALGID_APPLE_YARROW),
330  	MNVP(CSSM_ALGID_AES),
331  	MNVP(CSSM_ALGID_FEE),
332  	MNVP(CSSM_ALGID_FEE_MD5),
333  	MNVP(CSSM_ALGID_FEE_SHA1),
334  	MNVP(CSSM_ALGID_FEED),
335  	MNVP(CSSM_ALGID_FEEDEXP),
336  	MNVP(CSSM_ALGID_ASC),
337  	MNVP(CSSM_ALGID_SHA1HMAC_LEGACY),
338  	MNVP_END
339  };
340  
341  /* CSSM_ENCRYPT_MODE */
342  const MDSNameValuePair MDSEncryptModeNames[] = 
343  {
344  	MNVP(CSSM_ALGMODE_NONE),
345  	MNVP(CSSM_ALGMODE_CUSTOM),
346  	MNVP(CSSM_ALGMODE_ECB),
347  	MNVP(CSSM_ALGMODE_ECBPad),
348  	MNVP(CSSM_ALGMODE_CBC),
349  	MNVP(CSSM_ALGMODE_CBC_IV8),
350  	MNVP(CSSM_ALGMODE_CBCPadIV8),
351  	MNVP(CSSM_ALGMODE_CFB),
352  	MNVP(CSSM_ALGMODE_CFB_IV8),
353  	MNVP(CSSM_ALGMODE_CFBPadIV8),
354  	MNVP(CSSM_ALGMODE_OFB),
355  	MNVP(CSSM_ALGMODE_OFB_IV8),
356  	MNVP(CSSM_ALGMODE_OFBPadIV8),
357  	MNVP(CSSM_ALGMODE_COUNTER),
358  	MNVP(CSSM_ALGMODE_BC),
359  	MNVP(CSSM_ALGMODE_PCBC),
360  	MNVP(CSSM_ALGMODE_CBCC),
361  	MNVP(CSSM_ALGMODE_OFBNLF),
362  	MNVP(CSSM_ALGMODE_PBC),
363  	MNVP(CSSM_ALGMODE_PFB),
364  	MNVP(CSSM_ALGMODE_CBCPD),
365  	MNVP(CSSM_ALGMODE_PUBLIC_KEY),
366  	MNVP(CSSM_ALGMODE_PRIVATE_KEY),
367  	MNVP(CSSM_ALGMODE_SHUFFLE),
368  	MNVP(CSSM_ALGMODE_ECB64),
369  	MNVP(CSSM_ALGMODE_CBC64),
370  	MNVP(CSSM_ALGMODE_OFB64),
371  	MNVP(CSSM_ALGMODE_CFB32),
372  	MNVP(CSSM_ALGMODE_CFB16),
373  	MNVP(CSSM_ALGMODE_CFB8),
374  	MNVP(CSSM_ALGMODE_WRAP),
375  	MNVP(CSSM_ALGMODE_PRIVATE_WRAP),
376  	MNVP(CSSM_ALGMODE_RELAYX),
377  	MNVP(CSSM_ALGMODE_ECB128),
378  	MNVP(CSSM_ALGMODE_ECB96),
379  	MNVP(CSSM_ALGMODE_CBC128),
380  	MNVP(CSSM_ALGMODE_OAEP_HASH),
381  	MNVP(CSSM_ALGMODE_PKCS1_EME_V15),
382  	MNVP(CSSM_ALGMODE_PKCS1_EME_OAEP),
383  	MNVP(CSSM_ALGMODE_PKCS1_EMSA_V15),
384  	MNVP(CSSM_ALGMODE_ISO_9796),
385  	MNVP(CSSM_ALGMODE_X9_31),
386  	MNVP_END
387  };
388  
389  /* CSSM_CSPTYPE */
390  const MDSNameValuePair MDSCspTypeNames[] = 
391  {
392  	MNVP(CSSM_CSP_SOFTWARE),
393  	MNVP(CSSM_CSP_HARDWARE),
394  	MNVP(CSSM_CSP_HYBRID),
395  	MNVP_END
396  };
397  
398  /* CSSM_USEE_TAG */
399  const MDSNameValuePair MDSUseeTagsNames[] = 
400  {
401  	MNVP(CSSM_USEE_NONE),
402  	MNVP(CSSM_USEE_DOMESTIC),
403  	MNVP(CSSM_USEE_FINANCIAL),
404  	MNVP(CSSM_USEE_KRLE),
405  	MNVP(CSSM_USEE_KRENT),
406  	MNVP(CSSM_USEE_SSL),
407  	MNVP(CSSM_USEE_AUTHENTICATION),
408  	MNVP(CSSM_USEE_KEYEXCH),
409  	MNVP(CSSM_USEE_MEDICAL),
410  	MNVP(CSSM_USEE_INSURANCE),
411  	MNVP(CSSM_USEE_WEAK),
412  	MNVP_END
413  };
414  
415  /* CSSM_CSP_READER_FLAGS */
416  const MDSNameValuePair MDSCspReaderFlagsNames[] = 
417  {
418  	MNVP(CSSM_CSP_RDR_TOKENPRESENT),
419  	MNVP(CSSM_CSP_RDR_EXISTS),
420  	MNVP(CSSM_CSP_RDR_HW),
421  	MNVP_END
422  };
423  
424  /* CSSM_SC_FLAGS */
425  const MDSNameValuePair MDSCspScFlagsNames[] = 
426  {
427  	MNVP(CSSM_CSP_TOK_RNG),
428  	MNVP(CSSM_CSP_TOK_CLOCK_EXISTS),
429  	MNVP_END
430  };
431  
432  /* CSSM_SAMPLE_TYPE */
433  const MDSNameValuePair MDSSampleTypeNames[] = 
434  {
435  	MNVP(CSSM_SAMPLE_TYPE_PASSWORD),
436  	MNVP(CSSM_SAMPLE_TYPE_HASHED_PASSWORD),
437  	MNVP(CSSM_SAMPLE_TYPE_PROTECTED_PASSWORD),
438  	MNVP(CSSM_SAMPLE_TYPE_PROMPTED_PASSWORD),
439  	MNVP(CSSM_SAMPLE_TYPE_SIGNED_NONCE),
440  	MNVP(CSSM_SAMPLE_TYPE_SIGNED_SECRET),
441  	MNVP(CSSM_SAMPLE_TYPE_BIOMETRIC),
442  	MNVP(CSSM_SAMPLE_TYPE_PROTECTED_BIOMETRIC),
443  	MNVP(CSSM_SAMPLE_TYPE_PROMPTED_BIOMETRIC),
444  	MNVP(CSSM_SAMPLE_TYPE_THRESHOLD),
445  	/* from cssmapple.h */
446  	MNVP(CSSM_SAMPLE_TYPE_KEYCHAIN_PROMPT),
447  	MNVP(CSSM_SAMPLE_TYPE_KEYCHAIN_LOCK),
448  	MNVP(CSSM_SAMPLE_TYPE_KEYCHAIN_CHANGE_LOCK),
449  	MNVP(CSSM_SAMPLE_TYPE_PROCESS),
450  	MNVP(CSSM_SAMPLE_TYPE_COMMENT),
451  	MNVP(CSSM_SAMPLE_TYPE_RETRY_ID),
452  	MNVP_END
453  };
454  
455  /* CSSM_CERT_TYPE, CSSM_CERT_ENCODING (cert type in high 16 bits) */
456  const MDSNameValuePair MDSCertTypeNames[] = 
457  {
458  	/* CSSM_CERT_TYPE */
459  	MNVP(CSSM_CERT_UNKNOWN),
460  	MNVP(CSSM_CERT_X_509v1),
461  	MNVP(CSSM_CERT_X_509v2),
462  	MNVP(CSSM_CERT_X_509v3),
463  	MNVP(CSSM_CERT_PGP),
464  	MNVP(CSSM_CERT_PGP),
465  	MNVP(CSSM_CERT_SDSIv1),
466  	MNVP(CSSM_CERT_Intel),
467  	MNVP(CSSM_CERT_X_509_ATTRIBUTE),
468  	MNVP(CSSM_CERT_X9_ATTRIBUTE),
469  	MNVP(CSSM_CERT_TUPLE),
470  	MNVP(CSSM_CERT_ACL_ENTRY),
471  	MNVP(CSSM_CERT_MULTIPLE),
472  	/* CSSM_CERT_ENCODING */
473  	MNVP(CSSM_CERT_ENCODING_UNKNOWN),
474  	MNVP(CSSM_CERT_ENCODING_CUSTOM),
475  	MNVP(CSSM_CERT_ENCODING_BER),
476  	MNVP(CSSM_CERT_ENCODING_DER),
477  	MNVP(CSSM_CERT_ENCODING_NDR),
478  	MNVP(CSSM_CERT_ENCODING_SEXPR),
479  	MNVP(CSSM_CERT_ENCODING_PGP),
480  	MNVP(CSSM_CERT_ENCODING_MULTIPLE),
481  	MNVP_END
482  };
483  
484  /* CSSM_CRL_TYPE, CSSM_CRL_ENCODING (CRL type in high 16 bits) */
485  const MDSNameValuePair MDSCrlTypeNames[] = 
486  {
487  	/* CSSM_CRL_TYPE */
488  	MNVP(CSSM_CRL_TYPE_UNKNOWN),
489  	MNVP(CSSM_CRL_TYPE_X_509v1),
490  	MNVP(CSSM_CRL_TYPE_X_509v2),
491  	MNVP(CSSM_CRL_TYPE_SPKI),
492  	MNVP(CSSM_CRL_TYPE_MULTIPLE),
493  	/* CSSM_CRL_ENCODING */
494  	MNVP(CSSM_CRL_ENCODING_UNKNOWN),
495  	MNVP(CSSM_CRL_ENCODING_CUSTOM),
496  	MNVP(CSSM_CRL_ENCODING_BER),
497  	MNVP(CSSM_CRL_ENCODING_DER),
498  	MNVP(CSSM_CRL_ENCODING_BLOOM),
499  	MNVP(CSSM_CRL_ENCODING_SEXPR),
500  	MNVP(CSSM_CRL_ENCODING_MULTIPLE),
501  	MNVP_END
502  };
503  
504  /* CSSM_CERT_BUNDLE_TYPE, CSSM_CERT_BUNDLE_ENCODING (bundle type in high 16 bits) */
505  const MDSNameValuePair MDSCertBundleTypeNames[] = 
506  {
507  	/* CSSM_CERT_BUNDLE_TYPE */
508  	MNVP(CSSM_CERT_BUNDLE_UNKNOWN),
509  	MNVP(CSSM_CERT_BUNDLE_CUSTOM),
510  	MNVP(CSSM_CERT_BUNDLE_PKCS7_SIGNED_DATA),
511  	MNVP(CSSM_CERT_BUNDLE_PKCS7_SIGNED_ENVELOPED_DATA),
512  	MNVP(CSSM_CERT_BUNDLE_PKCS12),
513  	MNVP(CSSM_CERT_BUNDLE_PFX),
514  	MNVP(CSSM_CERT_BUNDLE_SPKI_SEQUENCE),
515  	MNVP(CSSM_CERT_BUNDLE_PGP_KEYRING),
516  	/* CSSM_CERT_BUNDLE_ENCODING */
517  	MNVP(CSSM_CERT_BUNDLE_ENCODING_UNKNOWN),
518  	MNVP(CSSM_CERT_BUNDLE_ENCODING_CUSTOM),
519  	MNVP(CSSM_CERT_BUNDLE_ENCODING_BER),
520  	MNVP(CSSM_CERT_BUNDLE_ENCODING_DER),
521  	MNVP(CSSM_CERT_BUNDLE_ENCODING_SEXPR),
522  	MNVP(CSSM_CERT_BUNDLE_PFX),
523  	MNVP(CSSM_CERT_BUNDLE_ENCODING_PGP),
524  	MNVP_END
525  };
526  
527  /* CSSM_CL_TEMPLATE_TYPE */
528  const MDSNameValuePair MDSCertTemplateTypeNames[] = 
529  {
530  	MNVP(CSSM_CL_TEMPLATE_INTERMEDIATE_CERT),
531  	MNVP(CSSM_CL_TEMPLATE_PKIX_CERTTEMPLATE),
532  	MNVP_END
533  };
534  
535  /* CSSM_TP_AUTHORITY_REQUEST_CERTISSUE */
536  const MDSNameValuePair MDSTpAuthRequestNames[] = 
537  {
538  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTISSUE),
539  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTREVOKE),
540  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTSUSPEND),
541  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTRESUME),
542  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTVERIFY),
543  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTNOTARIZE),
544  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CERTUSERECOVER),
545  	MNVP(CSSM_TP_AUTHORITY_REQUEST_CRLISSUE),
546  	MNVP_END
547  };
548  
549  /* CSSM_DLTYPE */
550  const MDSNameValuePair MDSDlTypeNames[] = 
551  {
552  	MNVP(CSSM_DL_UNKNOWN),
553  	MNVP(CSSM_DL_CUSTOM),
554  	MNVP(CSSM_DL_LDAP),
555  	MNVP(CSSM_DL_ODBC),
556  	MNVP(CSSM_DL_PKCS11),
557  	MNVP(CSSM_DL_FFS),
558  	MNVP(CSSM_DL_MEMORY),
559  	MNVP(CSSM_DL_REMOTEDIR),
560  	MNVP_END
561  };
562  
563  /* CSSM_DB_CONJUNCTIVE */
564  const MDSNameValuePair MDSDbConjunctiveNames[] = 
565  {
566  	MNVP(CSSM_DB_NONE),
567  	MNVP(CSSM_DB_AND),
568  	MNVP(CSSM_DB_OR),
569  	MNVP_END
570  };
571  
572  /* CSSM_DB_OPERATOR */
573  const MDSNameValuePair MDSDbOperatorNames[] = 
574  {
575  	MNVP(CSSM_DB_EQUAL),
576  	MNVP(CSSM_DB_NOT_EQUAL),
577  	MNVP(CSSM_DB_LESS_THAN),
578  	MNVP(CSSM_DB_GREATER_THAN),
579  	MNVP(CSSM_DB_CONTAINS),
580  	MNVP(CSSM_DB_CONTAINS_INITIAL_SUBSTRING),
581  	MNVP(CSSM_DB_CONTAINS_FINAL_SUBSTRING),
582  	MNVP_END
583  };
584  
585  /* CSSM_NET_PROTOCOL */
586  const MDSNameValuePair MDSNetProtocolNames[] = 
587  {
588  	MNVP(CSSM_NET_PROTO_NONE),
589  	MNVP(CSSM_NET_PROTO_CUSTOM),
590  	MNVP(CSSM_NET_PROTO_UNSPECIFIED),
591  	MNVP(CSSM_NET_PROTO_LDAP),
592  	MNVP(CSSM_NET_PROTO_LDAPS),
593  	MNVP(CSSM_NET_PROTO_LDAPNS),
594  	MNVP(CSSM_NET_PROTO_X500DAP),
595  	MNVP(CSSM_NET_PROTO_FTP),
596  	MNVP(CSSM_NET_PROTO_FTPS),
597  	MNVP(CSSM_NET_PROTO_OCSP),
598  	MNVP(CSSM_NET_PROTO_CMP),
599  	MNVP(CSSM_NET_PROTO_CMPS),
600  	MNVP_END
601  };
602  
603  /* CSSM_DB_RETRIEVAL_MODES */
604  const MDSNameValuePair MDSDbRetrievalModeNames[] = 
605  {
606  	MNVP(CSSM_DB_TRANSACTIONAL_MODE),
607  	MNVP(CSSM_DB_FILESYSTEMSCAN_MODE),
608  	MNVP_END
609  };
610  
611  /* CSSM_KR_POLICY_TYPE */
612  /* FIXME the spec is kind of ambiguous - do we want 
613   * CSSM_KR_POLICY_TYPE or CSSM_KR_POLICY_FLAGS? */
614  const MDSNameValuePair MDSKrPolicyTypeNames[] = 
615  {
616  	MNVP(CSSM_KR_INDIV_POLICY),
617  	MNVP(CSSM_KR_ENT_POLICY),
618  	MNVP(CSSM_KR_LE_MAN_POLICY),
619  	MNVP(CSSM_KR_LE_USE_POLICY),
620  	MNVP_END
621  };
622  
623  
624  static bool isNumericStr(
625  	const char *str,
626  	bool hexOK)
627  {
628  	while(*str) {
629  		char c = *str++;
630  		if(isdigit(c)) {
631  			continue;
632  		}
633  		if(hexOK) {
634  			if((c >= 'a') && (c <= 'f')) {
635  				continue;
636  			}
637  			if((c >= 'A') && (c <= 'F')) {
638  				continue;
639  			}
640  		}
641  		return false;
642  	}
643  	return true;
644  }
645  
646  /* convert ASCII hex digit - assumed validated already */
647  static unsigned char hexDigit(
648  	unsigned char d)
649  {
650  	if((d >= '0') && (d <= '9')) {
651  		return d - '0';
652  	}
653  	else if((d >= 'a') && (d <= 'f')) {
654  		return d - 'a' + 10;
655  	}
656  	else {
657  		return d - 'A' + 10;
658  	}
659  }
660  
661  static unsigned strToHex(
662  	const char *str)
663  {
664  	unsigned rtn = 0;
665  	while(*str) {
666  		rtn <<= 4;
667  		rtn |= hexDigit(*str++);
668  	}
669  	return rtn;
670  }
671  
672  /*
673   * Core routine to convert a single string token to a uint32. Incoming token can
674   * be in the form of a string from the specified MDSNameValuePair table or a literal
675   * number, either in hex (prefix "0x") or decimal. Tokens in any form may be 
676   * prefixed by "<<" indicating the value is to be shifted left by 16 bits. 
677   */
678  CSSM_RETURN MDSAttrNameToValue(
679  	const char *name,
680  	const MDSNameValuePair *table,	// optional, string must be decimal or hex if NULL
681  	uint32 &value)					// RETURNED
682  {
683  	if(name == NULL) {
684  		return CSSMERR_CSSM_MDS_ERROR;
685  	}
686  	if(*name == '\0') {
687  		/* empty string, legal */
688  		value = 0;
689  		return CSSM_OK;
690  	}
691  	
692  	/* prefixed by "<<"? */
693  	bool shiftBy16 = false;
694  	if((name != NULL) && (name[0] == '<') && (name[1] == '<')) {
695  		shiftBy16 = true;
696  		name += 2;
697  	}
698  	
699  	/* attempt to find the string in lookup table */
700  	if(table != NULL) {
701  		while(table->name != NULL) {
702  			if(!strcmp(table->name, name)) {
703  				value = table->value;
704  				if(shiftBy16) {
705  					value <<= 16;
706  				}
707  				return CSSM_OK;
708  			}
709  			table++;
710  		}
711  	}
712  	
713  	/* not found - is the string a number? */
714  	if(isdigit(name[0])) {
715  		bool isNum;
716  		bool isHex = false;
717  		if((name[0] == '0') && (name[1] == 'x')) {
718  			/* hex - skip first two chars */
719  			isHex = true;
720  			name += 2;
721  			isNum = isNumericStr(name, true);
722  		}
723  		else {
724  			isNum = isNumericStr(name, false);
725  		}
726  		if(!isNum) {
727  			return CSSMERR_CSSM_MDS_ERROR;
728  		}
729  		if(isHex) {
730  			value = strToHex(name);
731  		}
732  		else {
733  			value = atoi(name);
734  		}
735  		if(shiftBy16) {
736  			value <<= 16;
737  		}
738  		return CSSM_OK;
739  	}
740  	else {
741  		/* not a number */
742  		return CSSMERR_CSSM_MDS_ERROR;
743  	}
744  }
745  
746  
747  } // end namespace Security