147e946e7SWyllys Ingersoll /*
247e946e7SWyllys Ingersoll * The Initial Developer of the Original Code is International
347e946e7SWyllys Ingersoll * Business Machines Corporation. Portions created by IBM
447e946e7SWyllys Ingersoll * Corporation are Copyright (C) 2005 International Business
547e946e7SWyllys Ingersoll * Machines Corporation. All Rights Reserved.
647e946e7SWyllys Ingersoll *
747e946e7SWyllys Ingersoll * This program is free software; you can redistribute it and/or modify
847e946e7SWyllys Ingersoll * it under the terms of the Common Public License as published by
947e946e7SWyllys Ingersoll * IBM Corporation; either version 1 of the License, or (at your option)
1047e946e7SWyllys Ingersoll * any later version.
1147e946e7SWyllys Ingersoll *
1247e946e7SWyllys Ingersoll * This program is distributed in the hope that it will be useful,
1347e946e7SWyllys Ingersoll * but WITHOUT ANY WARRANTY; without even the implied warranty of
1447e946e7SWyllys Ingersoll * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1547e946e7SWyllys Ingersoll * Common Public License for more details.
1647e946e7SWyllys Ingersoll *
1747e946e7SWyllys Ingersoll * You should have received a copy of the Common Public License
1847e946e7SWyllys Ingersoll * along with this program; if not, a copy can be viewed at
1947e946e7SWyllys Ingersoll * http://www.opensource.org/licenses/cpl1.0.php.
2047e946e7SWyllys Ingersoll */
2147e946e7SWyllys Ingersoll
2247e946e7SWyllys Ingersoll /* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */
2347e946e7SWyllys Ingersoll /*
2447e946e7SWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2547e946e7SWyllys Ingersoll * Use is subject to license terms.
2647e946e7SWyllys Ingersoll */
2747e946e7SWyllys Ingersoll
2847e946e7SWyllys Ingersoll #include "tpmtok_int.h"
2947e946e7SWyllys Ingersoll
3047e946e7SWyllys Ingersoll CK_RV
verify_mgr_init(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_MECHANISM * mech,CK_BBOOL recover_mode,CK_OBJECT_HANDLE key)3147e946e7SWyllys Ingersoll verify_mgr_init(SESSION * sess,
3247e946e7SWyllys Ingersoll SIGN_VERIFY_CONTEXT * ctx,
3347e946e7SWyllys Ingersoll CK_MECHANISM * mech,
3447e946e7SWyllys Ingersoll CK_BBOOL recover_mode,
3547e946e7SWyllys Ingersoll CK_OBJECT_HANDLE key)
3647e946e7SWyllys Ingersoll {
3747e946e7SWyllys Ingersoll OBJECT * key_obj = NULL;
3847e946e7SWyllys Ingersoll CK_ATTRIBUTE * attr = NULL;
3947e946e7SWyllys Ingersoll CK_KEY_TYPE keytype;
4047e946e7SWyllys Ingersoll CK_OBJECT_CLASS class;
4147e946e7SWyllys Ingersoll CK_BBOOL flag;
4247e946e7SWyllys Ingersoll CK_RV rc;
4347e946e7SWyllys Ingersoll
4447e946e7SWyllys Ingersoll
4547e946e7SWyllys Ingersoll if (! sess || ! ctx) {
4647e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
4747e946e7SWyllys Ingersoll }
4847e946e7SWyllys Ingersoll if (ctx->active != FALSE) {
4947e946e7SWyllys Ingersoll return (CKR_OPERATION_ACTIVE);
5047e946e7SWyllys Ingersoll }
5147e946e7SWyllys Ingersoll
5247e946e7SWyllys Ingersoll // key usage restrictions
5347e946e7SWyllys Ingersoll //
5447e946e7SWyllys Ingersoll rc = object_mgr_find_in_map1(sess->hContext, key, &key_obj);
5547e946e7SWyllys Ingersoll if (rc != CKR_OK) {
5647e946e7SWyllys Ingersoll return (CKR_KEY_HANDLE_INVALID);
5747e946e7SWyllys Ingersoll }
5847e946e7SWyllys Ingersoll // is key allowed to verify signatures?
5947e946e7SWyllys Ingersoll //
6047e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template, CKA_VERIFY, &attr);
6147e946e7SWyllys Ingersoll if (rc == FALSE) {
6247e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
6347e946e7SWyllys Ingersoll } else {
6447e946e7SWyllys Ingersoll flag = *(CK_BBOOL *)attr->pValue;
6547e946e7SWyllys Ingersoll if (flag != TRUE) {
6647e946e7SWyllys Ingersoll return (CKR_KEY_FUNCTION_NOT_PERMITTED);
6747e946e7SWyllys Ingersoll }
6847e946e7SWyllys Ingersoll }
6947e946e7SWyllys Ingersoll
7047e946e7SWyllys Ingersoll switch (mech->mechanism) {
7147e946e7SWyllys Ingersoll case CKM_RSA_PKCS:
7247e946e7SWyllys Ingersoll {
7347e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
7447e946e7SWyllys Ingersoll CKA_KEY_TYPE, &attr);
7547e946e7SWyllys Ingersoll if (rc == FALSE) {
7647e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
7747e946e7SWyllys Ingersoll } else {
7847e946e7SWyllys Ingersoll keytype = *(CK_KEY_TYPE *)attr->pValue;
7947e946e7SWyllys Ingersoll if (keytype != CKK_RSA) {
8047e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
8147e946e7SWyllys Ingersoll }
8247e946e7SWyllys Ingersoll }
8347e946e7SWyllys Ingersoll
8447e946e7SWyllys Ingersoll flag = template_attribute_find(key_obj->template,
8547e946e7SWyllys Ingersoll CKA_CLASS, &attr);
8647e946e7SWyllys Ingersoll if (flag == FALSE) {
8747e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
8847e946e7SWyllys Ingersoll }
8947e946e7SWyllys Ingersoll else
9047e946e7SWyllys Ingersoll class = *(CK_OBJECT_CLASS *)attr->pValue;
9147e946e7SWyllys Ingersoll
9247e946e7SWyllys Ingersoll if (class != CKO_PUBLIC_KEY) {
9347e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
9447e946e7SWyllys Ingersoll }
9547e946e7SWyllys Ingersoll // PKCS #11 doesn't allow multi - part RSA operations
9647e946e7SWyllys Ingersoll ctx->context_len = 0;
9747e946e7SWyllys Ingersoll ctx->context = NULL;
9847e946e7SWyllys Ingersoll }
9947e946e7SWyllys Ingersoll break;
10047e946e7SWyllys Ingersoll
10147e946e7SWyllys Ingersoll case CKM_MD5_RSA_PKCS:
10247e946e7SWyllys Ingersoll case CKM_SHA1_RSA_PKCS:
10347e946e7SWyllys Ingersoll {
10447e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
10547e946e7SWyllys Ingersoll CKA_KEY_TYPE, &attr);
10647e946e7SWyllys Ingersoll if (rc == FALSE) {
10747e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
10847e946e7SWyllys Ingersoll } else {
10947e946e7SWyllys Ingersoll keytype = *(CK_KEY_TYPE *)attr->pValue;
11047e946e7SWyllys Ingersoll if (keytype != CKK_RSA) {
11147e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
11247e946e7SWyllys Ingersoll }
11347e946e7SWyllys Ingersoll }
11447e946e7SWyllys Ingersoll
11547e946e7SWyllys Ingersoll flag = template_attribute_find(key_obj->template,
11647e946e7SWyllys Ingersoll CKA_CLASS, &attr);
11747e946e7SWyllys Ingersoll if (flag == FALSE) {
11847e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
11947e946e7SWyllys Ingersoll }
12047e946e7SWyllys Ingersoll else
12147e946e7SWyllys Ingersoll class = *(CK_OBJECT_CLASS *)attr->pValue;
12247e946e7SWyllys Ingersoll
12347e946e7SWyllys Ingersoll if (class != CKO_PUBLIC_KEY) {
12447e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
12547e946e7SWyllys Ingersoll }
12647e946e7SWyllys Ingersoll ctx->context_len = sizeof (RSA_DIGEST_CONTEXT);
12747e946e7SWyllys Ingersoll ctx->context = (CK_BYTE *)malloc(
12847e946e7SWyllys Ingersoll sizeof (RSA_DIGEST_CONTEXT));
12947e946e7SWyllys Ingersoll if (! ctx->context) {
13047e946e7SWyllys Ingersoll return (CKR_HOST_MEMORY);
13147e946e7SWyllys Ingersoll }
13247e946e7SWyllys Ingersoll (void) memset(ctx->context, 0x0,
13347e946e7SWyllys Ingersoll sizeof (RSA_DIGEST_CONTEXT));
13447e946e7SWyllys Ingersoll }
13547e946e7SWyllys Ingersoll break;
13647e946e7SWyllys Ingersoll
13747e946e7SWyllys Ingersoll case CKM_MD5_HMAC:
13847e946e7SWyllys Ingersoll case CKM_SHA_1_HMAC:
13947e946e7SWyllys Ingersoll {
14047e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
14147e946e7SWyllys Ingersoll CKA_KEY_TYPE, &attr);
14247e946e7SWyllys Ingersoll if (rc == FALSE) {
14347e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
14447e946e7SWyllys Ingersoll } else {
14547e946e7SWyllys Ingersoll keytype = *(CK_KEY_TYPE *)attr->pValue;
14647e946e7SWyllys Ingersoll if (keytype != CKK_GENERIC_SECRET) {
14747e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
14847e946e7SWyllys Ingersoll }
14947e946e7SWyllys Ingersoll }
15047e946e7SWyllys Ingersoll
15147e946e7SWyllys Ingersoll // PKCS #11 doesn't allow multi - part HMAC operations
15247e946e7SWyllys Ingersoll ctx->context_len = 0;
15347e946e7SWyllys Ingersoll ctx->context = NULL;
15447e946e7SWyllys Ingersoll }
15547e946e7SWyllys Ingersoll break;
15647e946e7SWyllys Ingersoll
15747e946e7SWyllys Ingersoll case CKM_MD5_HMAC_GENERAL:
15847e946e7SWyllys Ingersoll case CKM_SHA_1_HMAC_GENERAL:
15947e946e7SWyllys Ingersoll {
16047e946e7SWyllys Ingersoll CK_MAC_GENERAL_PARAMS *param =
16147e946e7SWyllys Ingersoll (CK_MAC_GENERAL_PARAMS *)mech->pParameter;
16247e946e7SWyllys Ingersoll
16347e946e7SWyllys Ingersoll if (mech->ulParameterLen !=
16447e946e7SWyllys Ingersoll sizeof (CK_MAC_GENERAL_PARAMS)) {
16547e946e7SWyllys Ingersoll return (CKR_MECHANISM_PARAM_INVALID);
16647e946e7SWyllys Ingersoll }
16747e946e7SWyllys Ingersoll if ((mech->mechanism == CKM_MD5_HMAC_GENERAL) &&
16847e946e7SWyllys Ingersoll (*param > 16)) {
16947e946e7SWyllys Ingersoll return (CKR_MECHANISM_PARAM_INVALID);
17047e946e7SWyllys Ingersoll }
17147e946e7SWyllys Ingersoll if ((mech->mechanism == CKM_SHA_1_HMAC_GENERAL) &&
17247e946e7SWyllys Ingersoll (*param > 20)) {
17347e946e7SWyllys Ingersoll return (CKR_MECHANISM_PARAM_INVALID);
17447e946e7SWyllys Ingersoll }
17547e946e7SWyllys Ingersoll rc = template_attribute_find(key_obj->template,
17647e946e7SWyllys Ingersoll CKA_KEY_TYPE, &attr);
17747e946e7SWyllys Ingersoll if (rc == FALSE) {
17847e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
17947e946e7SWyllys Ingersoll } else {
18047e946e7SWyllys Ingersoll keytype = *(CK_KEY_TYPE *)attr->pValue;
18147e946e7SWyllys Ingersoll if (keytype != CKK_GENERIC_SECRET) {
18247e946e7SWyllys Ingersoll return (CKR_KEY_TYPE_INCONSISTENT);
18347e946e7SWyllys Ingersoll }
18447e946e7SWyllys Ingersoll }
18547e946e7SWyllys Ingersoll
18647e946e7SWyllys Ingersoll ctx->context_len = 0;
18747e946e7SWyllys Ingersoll ctx->context = NULL;
18847e946e7SWyllys Ingersoll }
18947e946e7SWyllys Ingersoll break;
19047e946e7SWyllys Ingersoll
19147e946e7SWyllys Ingersoll default:
19247e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
19347e946e7SWyllys Ingersoll }
19447e946e7SWyllys Ingersoll
19547e946e7SWyllys Ingersoll
19647e946e7SWyllys Ingersoll ctx->key = key;
19747e946e7SWyllys Ingersoll ctx->mech.ulParameterLen = mech->ulParameterLen;
19847e946e7SWyllys Ingersoll ctx->mech.mechanism = mech->mechanism;
199*ab8176c2SWyllys Ingersoll ctx->mech.pParameter = mech->pParameter;
20047e946e7SWyllys Ingersoll ctx->multi = FALSE;
20147e946e7SWyllys Ingersoll ctx->active = TRUE;
20247e946e7SWyllys Ingersoll ctx->recover = recover_mode;
20347e946e7SWyllys Ingersoll
20447e946e7SWyllys Ingersoll return (CKR_OK);
20547e946e7SWyllys Ingersoll }
20647e946e7SWyllys Ingersoll
20747e946e7SWyllys Ingersoll CK_RV
verify_mgr_cleanup(SIGN_VERIFY_CONTEXT * ctx)20847e946e7SWyllys Ingersoll verify_mgr_cleanup(SIGN_VERIFY_CONTEXT *ctx)
20947e946e7SWyllys Ingersoll {
21047e946e7SWyllys Ingersoll if (! ctx) {
21147e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
21247e946e7SWyllys Ingersoll }
21347e946e7SWyllys Ingersoll ctx->key = 0;
21447e946e7SWyllys Ingersoll ctx->mech.ulParameterLen = 0;
21547e946e7SWyllys Ingersoll ctx->mech.mechanism = 0;
21647e946e7SWyllys Ingersoll ctx->multi = FALSE;
21747e946e7SWyllys Ingersoll ctx->active = FALSE;
21847e946e7SWyllys Ingersoll ctx->recover = FALSE;
21947e946e7SWyllys Ingersoll ctx->context_len = 0;
22047e946e7SWyllys Ingersoll ctx->mech.pParameter = NULL;
22147e946e7SWyllys Ingersoll
22247e946e7SWyllys Ingersoll if (ctx->context) {
22347e946e7SWyllys Ingersoll free(ctx->context);
22447e946e7SWyllys Ingersoll ctx->context = NULL;
22547e946e7SWyllys Ingersoll }
22647e946e7SWyllys Ingersoll
22747e946e7SWyllys Ingersoll return (CKR_OK);
22847e946e7SWyllys Ingersoll }
22947e946e7SWyllys Ingersoll
23047e946e7SWyllys Ingersoll CK_RV
verify_mgr_verify(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_BYTE * in_data,CK_ULONG in_data_len,CK_BYTE * signature,CK_ULONG sig_len)23147e946e7SWyllys Ingersoll verify_mgr_verify(SESSION * sess,
23247e946e7SWyllys Ingersoll SIGN_VERIFY_CONTEXT * ctx,
23347e946e7SWyllys Ingersoll CK_BYTE * in_data,
23447e946e7SWyllys Ingersoll CK_ULONG in_data_len,
23547e946e7SWyllys Ingersoll CK_BYTE * signature,
23647e946e7SWyllys Ingersoll CK_ULONG sig_len)
23747e946e7SWyllys Ingersoll {
23847e946e7SWyllys Ingersoll if (! sess || ! ctx) {
23947e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
24047e946e7SWyllys Ingersoll }
24147e946e7SWyllys Ingersoll if (ctx->active == FALSE) {
24247e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
24347e946e7SWyllys Ingersoll }
24447e946e7SWyllys Ingersoll if (ctx->recover == TRUE) {
24547e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
24647e946e7SWyllys Ingersoll }
24747e946e7SWyllys Ingersoll
24847e946e7SWyllys Ingersoll if (! in_data || ! signature) {
24947e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
25047e946e7SWyllys Ingersoll }
25147e946e7SWyllys Ingersoll if (ctx->multi == TRUE) {
25247e946e7SWyllys Ingersoll return (CKR_OPERATION_ACTIVE);
25347e946e7SWyllys Ingersoll }
25447e946e7SWyllys Ingersoll
25547e946e7SWyllys Ingersoll switch (ctx->mech.mechanism) {
25647e946e7SWyllys Ingersoll case CKM_RSA_PKCS:
25747e946e7SWyllys Ingersoll return (rsa_pkcs_verify(sess, ctx,
25847e946e7SWyllys Ingersoll in_data, in_data_len,
25947e946e7SWyllys Ingersoll signature, sig_len));
26047e946e7SWyllys Ingersoll case CKM_MD5_RSA_PKCS:
26147e946e7SWyllys Ingersoll case CKM_SHA1_RSA_PKCS:
26247e946e7SWyllys Ingersoll return (rsa_hash_pkcs_verify(sess, ctx,
26347e946e7SWyllys Ingersoll in_data, in_data_len,
26447e946e7SWyllys Ingersoll signature, sig_len));
26547e946e7SWyllys Ingersoll
26647e946e7SWyllys Ingersoll case CKM_MD5_HMAC:
26747e946e7SWyllys Ingersoll case CKM_MD5_HMAC_GENERAL:
26847e946e7SWyllys Ingersoll return (md5_hmac_verify(sess, ctx,
26947e946e7SWyllys Ingersoll in_data, in_data_len,
27047e946e7SWyllys Ingersoll signature, sig_len));
27147e946e7SWyllys Ingersoll case CKM_SHA_1_HMAC:
27247e946e7SWyllys Ingersoll case CKM_SHA_1_HMAC_GENERAL:
27347e946e7SWyllys Ingersoll return (sha1_hmac_verify(sess, ctx,
27447e946e7SWyllys Ingersoll in_data, in_data_len,
27547e946e7SWyllys Ingersoll signature, sig_len));
27647e946e7SWyllys Ingersoll default:
27747e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
27847e946e7SWyllys Ingersoll }
27947e946e7SWyllys Ingersoll }
28047e946e7SWyllys Ingersoll
28147e946e7SWyllys Ingersoll CK_RV
verify_mgr_verify_update(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_BYTE * in_data,CK_ULONG in_data_len)28247e946e7SWyllys Ingersoll verify_mgr_verify_update(SESSION * sess,
28347e946e7SWyllys Ingersoll SIGN_VERIFY_CONTEXT * ctx,
28447e946e7SWyllys Ingersoll CK_BYTE * in_data,
28547e946e7SWyllys Ingersoll CK_ULONG in_data_len)
28647e946e7SWyllys Ingersoll {
28747e946e7SWyllys Ingersoll if (! sess || ! ctx || ! in_data) {
28847e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
28947e946e7SWyllys Ingersoll }
29047e946e7SWyllys Ingersoll if (ctx->active == FALSE) {
29147e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
29247e946e7SWyllys Ingersoll }
29347e946e7SWyllys Ingersoll if (ctx->recover == TRUE) {
29447e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
29547e946e7SWyllys Ingersoll }
29647e946e7SWyllys Ingersoll ctx->multi = TRUE;
29747e946e7SWyllys Ingersoll
29847e946e7SWyllys Ingersoll
29947e946e7SWyllys Ingersoll switch (ctx->mech.mechanism) {
30047e946e7SWyllys Ingersoll case CKM_MD5_RSA_PKCS:
30147e946e7SWyllys Ingersoll case CKM_SHA1_RSA_PKCS:
30247e946e7SWyllys Ingersoll return (rsa_hash_pkcs_verify_update(sess, ctx,
30347e946e7SWyllys Ingersoll in_data, in_data_len));
30447e946e7SWyllys Ingersoll default:
30547e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
30647e946e7SWyllys Ingersoll }
30747e946e7SWyllys Ingersoll }
30847e946e7SWyllys Ingersoll
30947e946e7SWyllys Ingersoll CK_RV
verify_mgr_verify_final(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_BYTE * signature,CK_ULONG sig_len)31047e946e7SWyllys Ingersoll verify_mgr_verify_final(SESSION * sess,
31147e946e7SWyllys Ingersoll SIGN_VERIFY_CONTEXT * ctx,
31247e946e7SWyllys Ingersoll CK_BYTE * signature,
31347e946e7SWyllys Ingersoll CK_ULONG sig_len)
31447e946e7SWyllys Ingersoll {
31547e946e7SWyllys Ingersoll if (! sess || ! ctx) {
31647e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
31747e946e7SWyllys Ingersoll }
31847e946e7SWyllys Ingersoll if (ctx->active == FALSE) {
31947e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
32047e946e7SWyllys Ingersoll }
32147e946e7SWyllys Ingersoll if (ctx->recover == TRUE) {
32247e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
32347e946e7SWyllys Ingersoll }
32447e946e7SWyllys Ingersoll switch (ctx->mech.mechanism) {
32547e946e7SWyllys Ingersoll case CKM_MD5_RSA_PKCS:
32647e946e7SWyllys Ingersoll case CKM_SHA1_RSA_PKCS:
32747e946e7SWyllys Ingersoll return (rsa_hash_pkcs_verify_final(sess, ctx,
32847e946e7SWyllys Ingersoll signature, sig_len));
32947e946e7SWyllys Ingersoll default:
33047e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
33147e946e7SWyllys Ingersoll }
33247e946e7SWyllys Ingersoll }
33347e946e7SWyllys Ingersoll
33447e946e7SWyllys Ingersoll CK_RV
verify_mgr_verify_recover(SESSION * sess,CK_BBOOL length_only,SIGN_VERIFY_CONTEXT * ctx,CK_BYTE * signature,CK_ULONG sig_len,CK_BYTE * out_data,CK_ULONG * out_len)33547e946e7SWyllys Ingersoll verify_mgr_verify_recover(SESSION * sess,
33647e946e7SWyllys Ingersoll CK_BBOOL length_only,
33747e946e7SWyllys Ingersoll SIGN_VERIFY_CONTEXT * ctx,
33847e946e7SWyllys Ingersoll CK_BYTE * signature,
33947e946e7SWyllys Ingersoll CK_ULONG sig_len,
34047e946e7SWyllys Ingersoll CK_BYTE * out_data,
34147e946e7SWyllys Ingersoll CK_ULONG * out_len)
34247e946e7SWyllys Ingersoll {
34347e946e7SWyllys Ingersoll if (! sess || ! ctx) {
34447e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
34547e946e7SWyllys Ingersoll }
34647e946e7SWyllys Ingersoll if (ctx->active == FALSE) {
34747e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
34847e946e7SWyllys Ingersoll }
34947e946e7SWyllys Ingersoll if (ctx->recover == FALSE) {
35047e946e7SWyllys Ingersoll return (CKR_OPERATION_NOT_INITIALIZED);
35147e946e7SWyllys Ingersoll }
35247e946e7SWyllys Ingersoll
35347e946e7SWyllys Ingersoll if (! signature || ! out_len) {
35447e946e7SWyllys Ingersoll return (CKR_FUNCTION_FAILED);
35547e946e7SWyllys Ingersoll }
35647e946e7SWyllys Ingersoll if (ctx->multi == TRUE) {
35747e946e7SWyllys Ingersoll return (CKR_OPERATION_ACTIVE);
35847e946e7SWyllys Ingersoll }
35947e946e7SWyllys Ingersoll
36047e946e7SWyllys Ingersoll switch (ctx->mech.mechanism) {
36147e946e7SWyllys Ingersoll case CKM_RSA_PKCS:
36247e946e7SWyllys Ingersoll return (rsa_pkcs_verify_recover(sess, length_only,
36347e946e7SWyllys Ingersoll ctx, signature, sig_len, out_data, out_len));
36447e946e7SWyllys Ingersoll default:
36547e946e7SWyllys Ingersoll return (CKR_MECHANISM_INVALID);
36647e946e7SWyllys Ingersoll }
36747e946e7SWyllys Ingersoll }
368