1/*
2 * Copyright (c) 2000-2004 Apple Computer, Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25/*
26 * oidsalg.c - OIDs defining crypto algorithms
27 */
28
29#include <Security/oidsbase.h>
30#include <Security/cssmtype.h>
31#include "cssmapple.h"
32#include <Security/oidsalg.h>
33#include <string.h>
34
35#pragma mark ----- CSSM_OID <--> CSSM_ALGORITHMS -----
36
37typedef struct {
38	const CSSM_OID 	*oid;
39	CSSM_ALGORITHMS	alg;
40} OidToAlgEnt;
41
42static const OidToAlgEnt oidToAlgMap[] =
43{
44	{&CSSMOID_RSA, CSSM_ALGID_RSA },
45	{&CSSMOID_MD2WithRSA, CSSM_ALGID_MD2WithRSA },
46	{&CSSMOID_MD5WithRSA, CSSM_ALGID_MD5WithRSA },
47	{&CSSMOID_SHA1WithRSA, CSSM_ALGID_SHA1WithRSA },
48	{&CSSMOID_SHA1WithRSA_OIW, CSSM_ALGID_SHA1WithRSA },
49	{&CSSMOID_SHA1, CSSM_ALGID_SHA1},
50	{&CSSMOID_MD5, CSSM_ALGID_MD5 },
51	/*
52	 * These OIDs have three variants - one for BSAFE, CMS, and JDK 1.1.
53	 * On the oid-to-alg map, we'll handle either one, mapping to
54	 * the same CSSM alg. When we map from alg to OID, we'll use
55	 * the CMS variant (being first in the list).
56	 */
57	{&CSSMOID_DSA_CMS, CSSM_ALGID_DSA },
58	{&CSSMOID_DSA, CSSM_ALGID_DSA },
59	{&CSSMOID_DSA_JDK, CSSM_ALGID_DSA },
60	{&CSSMOID_SHA1WithDSA_CMS, CSSM_ALGID_SHA1WithDSA },
61	{&CSSMOID_SHA1WithDSA, CSSM_ALGID_SHA1WithDSA },
62	{&CSSMOID_SHA1WithDSA_JDK, CSSM_ALGID_SHA1WithDSA },
63	/*
64	 * Multiple entries for Diffie-Hellman. We favor the PKCS3 version for
65	 * mapping alg to OID.
66	 */
67	{&CSSMOID_DH, CSSM_ALGID_DH},
68	{&CSSMOID_ANSI_DH_PUB_NUMBER, CSSM_ALGID_DH},
69	{&CSSMOID_ANSI_DH_STATIC, CSSM_ALGID_DH},
70	{&CSSMOID_ANSI_DH_ONE_FLOW, CSSM_ALGID_DH},
71	{&CSSMOID_ANSI_DH_EPHEM, CSSM_ALGID_DH},
72	{&CSSMOID_ANSI_DH_HYBRID1, CSSM_ALGID_DH},
73	{&CSSMOID_ANSI_DH_HYBRID2, CSSM_ALGID_DH},
74	{&CSSMOID_ANSI_DH_HYBRID_ONEFLOW, CSSM_ALGID_DH},
75	{&CSSMOID_APPLE_FEE, CSSM_ALGID_FEE },
76	{&CSSMOID_APPLE_ASC, CSSM_ALGID_ASC },
77	{&CSSMOID_APPLE_FEE_MD5, CSSM_ALGID_FEE_MD5 },
78	{&CSSMOID_APPLE_FEE_SHA1, CSSM_ALGID_FEE_SHA1 },
79	{&CSSMOID_APPLE_FEED, CSSM_ALGID_FEED },
80	{&CSSMOID_APPLE_FEEDEXP, CSSM_ALGID_FEEDEXP },
81	/* the current valid alg --> OID mapping */
82	{&CSSMOID_ECDSA_WithSHA1, CSSM_ALGID_SHA1WithECDSA},
83	/* for backwards compatibility */
84	{&CSSMOID_APPLE_ECDSA, CSSM_ALGID_SHA1WithECDSA },
85	{&CSSMOID_SHA224, CSSM_ALGID_SHA224},
86	{&CSSMOID_SHA256, CSSM_ALGID_SHA256},
87	{&CSSMOID_SHA384, CSSM_ALGID_SHA384},
88	{&CSSMOID_SHA512, CSSM_ALGID_SHA512},
89	{&CSSMOID_SHA224WithRSA, CSSM_ALGID_SHA224WithRSA },
90	{&CSSMOID_SHA256WithRSA, CSSM_ALGID_SHA256WithRSA },
91	{&CSSMOID_SHA384WithRSA, CSSM_ALGID_SHA384WithRSA },
92	{&CSSMOID_SHA512WithRSA, CSSM_ALGID_SHA512WithRSA },
93	{&CSSMOID_RSAWithOAEP, CSSM_ALGMODE_PKCS1_EME_OAEP },
94	{&CSSMOID_ECDSA_WithSHA224, CSSM_ALGID_SHA224WithECDSA },
95	{&CSSMOID_ECDSA_WithSHA256, CSSM_ALGID_SHA256WithECDSA },
96	{&CSSMOID_ECDSA_WithSHA384, CSSM_ALGID_SHA384WithECDSA },
97	{&CSSMOID_ECDSA_WithSHA512, CSSM_ALGID_SHA512WithECDSA },
98	/* AlgId.algorithm for ECDSA public key */
99	{&CSSMOID_ecPublicKey, CSSM_ALGID_ECDSA },
100	/* This OID is accompanied by an additional digest OID in AlgId.parameters */
101	{&CSSMOID_ECDSA_WithSpecified, CSSM_ALGID_ECDSA_SPECIFIED },
102	{NULL, 0}
103};
104
105#define NUM_OID_TO_ALGS	(sizeof(oidToAlgMap) / sizeof(oidToAlgMap[0]))
106
107/*
108 * Compare two CSSM_DATAs (or two CSSM_OIDs), return true if identical.
109 */
110static bool compareCssmData(
111	const CSSM_DATA *data1,
112	const CSSM_DATA *data2)
113{
114	if((data1 == NULL) || (data1->Data == NULL) ||
115	   (data2 == NULL) || (data2->Data == NULL) ||
116	   (data1->Length != data2->Length)) {
117		return false;
118	}
119	if(data1->Length != data2->Length) {
120		return false;
121	}
122	if(memcmp(data1->Data, data2->Data, data1->Length) == 0) {
123		return true;
124	}
125	else {
126		return false;
127	}
128}
129
130bool cssmOidToAlg(
131	const CSSM_OID *oid,
132	CSSM_ALGORITHMS *alg)		// RETURNED
133{
134	const OidToAlgEnt *ent;
135
136	for(ent=oidToAlgMap; ent->oid; ent++) {
137		if(compareCssmData(ent->oid, oid)) {
138			*alg = ent->alg;
139			return true;
140		}
141	}
142	return false;
143}
144
145const CSSM_OID *cssmAlgToOid(
146	CSSM_ALGORITHMS algId)
147{
148	const OidToAlgEnt *ent;
149
150	for(ent=oidToAlgMap; ent->oid; ent++) {
151		if(ent->alg == algId) {
152			return ent->oid;
153		}
154	}
155	return NULL;
156}
157
158
159