1*47e946e7SWyllys Ingersoll /*
2*47e946e7SWyllys Ingersoll * The Initial Developer of the Original Code is International
3*47e946e7SWyllys Ingersoll * Business Machines Corporation. Portions created by IBM
4*47e946e7SWyllys Ingersoll * Corporation are Copyright (C) 2005 International Business
5*47e946e7SWyllys Ingersoll * Machines Corporation. All Rights Reserved.
6*47e946e7SWyllys Ingersoll *
7*47e946e7SWyllys Ingersoll * This program is free software; you can redistribute it and/or modify
8*47e946e7SWyllys Ingersoll * it under the terms of the Common Public License as published by
9*47e946e7SWyllys Ingersoll * IBM Corporation; either version 1 of the License, or (at your option)
10*47e946e7SWyllys Ingersoll * any later version.
11*47e946e7SWyllys Ingersoll *
12*47e946e7SWyllys Ingersoll * This program is distributed in the hope that it will be useful,
13*47e946e7SWyllys Ingersoll * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*47e946e7SWyllys Ingersoll * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*47e946e7SWyllys Ingersoll * Common Public License for more details.
16*47e946e7SWyllys Ingersoll *
17*47e946e7SWyllys Ingersoll * You should have received a copy of the Common Public License
18*47e946e7SWyllys Ingersoll * along with this program; if not, a copy can be viewed at
19*47e946e7SWyllys Ingersoll * http://www.opensource.org/licenses/cpl1.0.php.
20*47e946e7SWyllys Ingersoll */
21*47e946e7SWyllys Ingersoll
22*47e946e7SWyllys Ingersoll /* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */
23*47e946e7SWyllys Ingersoll /*
24*47e946e7SWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
25*47e946e7SWyllys Ingersoll * Use is subject to license terms.
26*47e946e7SWyllys Ingersoll */
27*47e946e7SWyllys Ingersoll
28*47e946e7SWyllys Ingersoll
29*47e946e7SWyllys Ingersoll #include "tpmtok_int.h"
30*47e946e7SWyllys Ingersoll
31*47e946e7SWyllys Ingersoll CK_RV
decr_mgr_init(SESSION * sess,ENCR_DECR_CONTEXT * ctx,CK_ULONG operation,CK_MECHANISM * mech,CK_OBJECT_HANDLE key_handle)32*47e946e7SWyllys Ingersoll decr_mgr_init(
33*47e946e7SWyllys Ingersoll SESSION *sess,
34*47e946e7SWyllys Ingersoll ENCR_DECR_CONTEXT *ctx,
35*47e946e7SWyllys Ingersoll CK_ULONG operation,
36*47e946e7SWyllys Ingersoll CK_MECHANISM *mech,
37*47e946e7SWyllys Ingersoll CK_OBJECT_HANDLE key_handle)
38*47e946e7SWyllys Ingersoll {
39*47e946e7SWyllys Ingersoll OBJECT * key_obj = NULL;
40*47e946e7SWyllys Ingersoll CK_ATTRIBUTE * attr = NULL;
41*47e946e7SWyllys Ingersoll CK_BYTE *ptr = NULL;
42*47e946e7SWyllys Ingersoll CK_KEY_TYPE keytype;
43*47e946e7SWyllys Ingersoll CK_BBOOL flag;
44*47e946e7SWyllys Ingersoll CK_RV rc;
45*47e946e7SWyllys Ingersoll
46*47e946e7SWyllys Ingersoll if (! sess) {
47*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
48*47e946e7SWyllys Ingersoll }
49*47e946e7SWyllys Ingersoll if (ctx->active != FALSE) {
50*47e946e7SWyllys Ingersoll return (CKR_OPERATION_ACTIVE);
51*47e946e7SWyllys Ingersoll }
52*47e946e7SWyllys Ingersoll
53*47e946e7SWyllys Ingersoll if (operation == OP_DECRYPT_INIT) {
54*47e946e7SWyllys Ingersoll rc = object_mgr_find_in_map1(sess->hContext, key_handle,
55*47e946e7SWyllys Ingersoll &key_obj);
56*47e946e7SWyllys Ingersoll if (rc != CKR_OK) {
57*47e946e7SWyllys Ingersoll return (CKR_KEY_HANDLE_INVALID);
58*47e946e7SWyllys Ingersoll }
59*47e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
60*47e946e7SWyllys Ingersoll CKA_DECRYPT, &attr);
61*47e946e7SWyllys Ingersoll if (rc == FALSE) {
62*47e946e7SWyllys Ingersoll return (CKR_KEY_FUNCTION_NOT_PERMITTED);
63*47e946e7SWyllys Ingersoll } else {
64*47e946e7SWyllys Ingersoll flag = *(CK_BBOOL *)attr->pValue;
65*47e946e7SWyllys Ingersoll if (flag != TRUE) {
66*47e946e7SWyllys Ingersoll return (CKR_KEY_FUNCTION_NOT_PERMITTED);
67*47e946e7SWyllys Ingersoll }
68*47e946e7SWyllys Ingersoll }
69*47e946e7SWyllys Ingersoll } else if (operation == OP_UNWRAP) {
70*47e946e7SWyllys Ingersoll rc = object_mgr_find_in_map1(sess->hContext, key_handle,
71*47e946e7SWyllys Ingersoll &key_obj);
72*47e946e7SWyllys Ingersoll if (rc != CKR_OK) {
73*47e946e7SWyllys Ingersoll return (CKR_WRAPPING_KEY_HANDLE_INVALID);
74*47e946e7SWyllys Ingersoll }
75*47e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
76*47e946e7SWyllys Ingersoll CKA_UNWRAP, &attr);
77*47e946e7SWyllys Ingersoll if (rc == FALSE) {
78*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
79*47e946e7SWyllys Ingersoll } else {
80*47e946e7SWyllys Ingersoll flag = *(CK_BBOOL *)(attr->pValue);
81*47e946e7SWyllys Ingersoll if (flag == FALSE) {
82*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
83*47e946e7SWyllys Ingersoll }
84*47e946e7SWyllys Ingersoll }
85*47e946e7SWyllys Ingersoll } else {
86*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
87*47e946e7SWyllys Ingersoll }
88*47e946e7SWyllys Ingersoll switch (mech->mechanism) {
89*47e946e7SWyllys Ingersoll case CKM_RSA_PKCS:
90*47e946e7SWyllys Ingersoll {
91*47e946e7SWyllys Ingersoll if (mech->ulParameterLen != 0)
92*47e946e7SWyllys Ingersoll return (CKR_MECHANISM_PARAM_INVALID);
93*47e946e7SWyllys Ingersoll
94*47e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
95*47e946e7SWyllys Ingersoll CKA_KEY_TYPE, &attr);
96*47e946e7SWyllys Ingersoll if (rc == FALSE) {
97*47e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
98*47e946e7SWyllys Ingersoll } else {
99*47e946e7SWyllys Ingersoll keytype = *(CK_KEY_TYPE *)attr->pValue;
100*47e946e7SWyllys Ingersoll if (keytype != CKK_RSA) {
101*47e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
102*47e946e7SWyllys Ingersoll }
103*47e946e7SWyllys Ingersoll }
104*47e946e7SWyllys Ingersoll
105*47e946e7SWyllys Ingersoll ctx->context_len = 0;
106*47e946e7SWyllys Ingersoll ctx->context = NULL;
107*47e946e7SWyllys Ingersoll
108*47e946e7SWyllys Ingersoll }
109*47e946e7SWyllys Ingersoll break;
110*47e946e7SWyllys Ingersoll default:
111*47e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
112*47e946e7SWyllys Ingersoll }
113*47e946e7SWyllys Ingersoll
114*47e946e7SWyllys Ingersoll
115*47e946e7SWyllys Ingersoll if (mech->ulParameterLen > 0) {
116*47e946e7SWyllys Ingersoll ptr = (CK_BYTE *)malloc(mech->ulParameterLen);
117*47e946e7SWyllys Ingersoll if (! ptr) {
118*47e946e7SWyllys Ingersoll return (CKR_HOST_MEMORY);
119*47e946e7SWyllys Ingersoll }
120*47e946e7SWyllys Ingersoll (void) memcpy(ptr, mech->pParameter, mech->ulParameterLen);
121*47e946e7SWyllys Ingersoll }
122*47e946e7SWyllys Ingersoll
123*47e946e7SWyllys Ingersoll ctx->key = key_handle;
124*47e946e7SWyllys Ingersoll ctx->mech.ulParameterLen = mech->ulParameterLen;
125*47e946e7SWyllys Ingersoll ctx->mech.mechanism = mech->mechanism;
126*47e946e7SWyllys Ingersoll ctx->mech.pParameter = ptr;
127*47e946e7SWyllys Ingersoll ctx->multi = FALSE;
128*47e946e7SWyllys Ingersoll ctx->active = TRUE;
129*47e946e7SWyllys Ingersoll
130*47e946e7SWyllys Ingersoll return (CKR_OK);
131*47e946e7SWyllys Ingersoll }
132*47e946e7SWyllys Ingersoll
133*47e946e7SWyllys Ingersoll CK_RV
decr_mgr_cleanup(ENCR_DECR_CONTEXT * ctx)134*47e946e7SWyllys Ingersoll decr_mgr_cleanup(ENCR_DECR_CONTEXT *ctx)
135*47e946e7SWyllys Ingersoll {
136*47e946e7SWyllys Ingersoll if (! ctx) {
137*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
138*47e946e7SWyllys Ingersoll }
139*47e946e7SWyllys Ingersoll ctx->key = 0;
140*47e946e7SWyllys Ingersoll ctx->mech.ulParameterLen = 0;
141*47e946e7SWyllys Ingersoll ctx->mech.mechanism = 0;
142*47e946e7SWyllys Ingersoll ctx->multi = FALSE;
143*47e946e7SWyllys Ingersoll ctx->active = FALSE;
144*47e946e7SWyllys Ingersoll ctx->context_len = 0;
145*47e946e7SWyllys Ingersoll
146*47e946e7SWyllys Ingersoll if (ctx->mech.pParameter) {
147*47e946e7SWyllys Ingersoll free(ctx->mech.pParameter);
148*47e946e7SWyllys Ingersoll ctx->mech.pParameter = NULL;
149*47e946e7SWyllys Ingersoll }
150*47e946e7SWyllys Ingersoll
151*47e946e7SWyllys Ingersoll if (ctx->context) {
152*47e946e7SWyllys Ingersoll free(ctx->context);
153*47e946e7SWyllys Ingersoll ctx->context = NULL;
154*47e946e7SWyllys Ingersoll }
155*47e946e7SWyllys Ingersoll
156*47e946e7SWyllys Ingersoll return (CKR_OK);
157*47e946e7SWyllys Ingersoll }
158*47e946e7SWyllys Ingersoll
159*47e946e7SWyllys Ingersoll CK_RV
decr_mgr_decrypt(SESSION * sess,CK_BBOOL length_only,ENCR_DECR_CONTEXT * ctx,CK_BYTE * in_data,CK_ULONG in_data_len,CK_BYTE * out_data,CK_ULONG * out_data_len)160*47e946e7SWyllys Ingersoll decr_mgr_decrypt(SESSION *sess,
161*47e946e7SWyllys Ingersoll CK_BBOOL length_only,
162*47e946e7SWyllys Ingersoll ENCR_DECR_CONTEXT *ctx,
163*47e946e7SWyllys Ingersoll CK_BYTE *in_data,
164*47e946e7SWyllys Ingersoll CK_ULONG in_data_len,
165*47e946e7SWyllys Ingersoll CK_BYTE *out_data,
166*47e946e7SWyllys Ingersoll CK_ULONG *out_data_len)
167*47e946e7SWyllys Ingersoll {
168*47e946e7SWyllys Ingersoll if (! sess || ! ctx) {
169*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
170*47e946e7SWyllys Ingersoll }
171*47e946e7SWyllys Ingersoll if (ctx->active == FALSE) {
172*47e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
173*47e946e7SWyllys Ingersoll }
174*47e946e7SWyllys Ingersoll if ((length_only == FALSE) && (! in_data || ! out_data)) {
175*47e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
176*47e946e7SWyllys Ingersoll }
177*47e946e7SWyllys Ingersoll if (ctx->multi == TRUE) {
178*47e946e7SWyllys Ingersoll return (CKR_OPERATION_ACTIVE);
179*47e946e7SWyllys Ingersoll }
180*47e946e7SWyllys Ingersoll switch (ctx->mech.mechanism) {
181*47e946e7SWyllys Ingersoll case CKM_RSA_PKCS:
182*47e946e7SWyllys Ingersoll return (rsa_pkcs_decrypt(sess, length_only,
183*47e946e7SWyllys Ingersoll ctx, in_data, in_data_len, out_data,
184*47e946e7SWyllys Ingersoll out_data_len));
185*47e946e7SWyllys Ingersoll
186*47e946e7SWyllys Ingersoll default:
187*47e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
188*47e946e7SWyllys Ingersoll }
189*47e946e7SWyllys Ingersoll }
190