xref: /onnv-gate/usr/src/lib/pkcs11/pkcs11_tpm/common/verify_mgr.c (revision 9453:f0534026bc38)
19126SWyllys.Ingersoll@Sun.COM /*
29126SWyllys.Ingersoll@Sun.COM  * The Initial Developer of the Original Code is International
39126SWyllys.Ingersoll@Sun.COM  * Business Machines Corporation. Portions created by IBM
49126SWyllys.Ingersoll@Sun.COM  * Corporation are Copyright (C) 2005 International Business
59126SWyllys.Ingersoll@Sun.COM  * Machines Corporation. All Rights Reserved.
69126SWyllys.Ingersoll@Sun.COM  *
79126SWyllys.Ingersoll@Sun.COM  * This program is free software; you can redistribute it and/or modify
89126SWyllys.Ingersoll@Sun.COM  * it under the terms of the Common Public License as published by
99126SWyllys.Ingersoll@Sun.COM  * IBM Corporation; either version 1 of the License, or (at your option)
109126SWyllys.Ingersoll@Sun.COM  * any later version.
119126SWyllys.Ingersoll@Sun.COM  *
129126SWyllys.Ingersoll@Sun.COM  * This program is distributed in the hope that it will be useful,
139126SWyllys.Ingersoll@Sun.COM  * but WITHOUT ANY WARRANTY; without even the implied warranty of
149126SWyllys.Ingersoll@Sun.COM  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
159126SWyllys.Ingersoll@Sun.COM  * Common Public License for more details.
169126SWyllys.Ingersoll@Sun.COM  *
179126SWyllys.Ingersoll@Sun.COM  * You should have received a copy of the Common Public License
189126SWyllys.Ingersoll@Sun.COM  * along with this program; if not, a copy can be viewed at
199126SWyllys.Ingersoll@Sun.COM  * http://www.opensource.org/licenses/cpl1.0.php.
209126SWyllys.Ingersoll@Sun.COM  */
219126SWyllys.Ingersoll@Sun.COM 
229126SWyllys.Ingersoll@Sun.COM /* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */
239126SWyllys.Ingersoll@Sun.COM /*
249126SWyllys.Ingersoll@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
259126SWyllys.Ingersoll@Sun.COM  * Use is subject to license terms.
269126SWyllys.Ingersoll@Sun.COM  */
279126SWyllys.Ingersoll@Sun.COM 
289126SWyllys.Ingersoll@Sun.COM #include "tpmtok_int.h"
299126SWyllys.Ingersoll@Sun.COM 
309126SWyllys.Ingersoll@Sun.COM CK_RV
verify_mgr_init(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_MECHANISM * mech,CK_BBOOL recover_mode,CK_OBJECT_HANDLE key)319126SWyllys.Ingersoll@Sun.COM verify_mgr_init(SESSION		* sess,
329126SWyllys.Ingersoll@Sun.COM 	SIGN_VERIFY_CONTEXT * ctx,
339126SWyllys.Ingersoll@Sun.COM 	CK_MECHANISM	* mech,
349126SWyllys.Ingersoll@Sun.COM 	CK_BBOOL		recover_mode,
359126SWyllys.Ingersoll@Sun.COM 	CK_OBJECT_HANDLE	key)
369126SWyllys.Ingersoll@Sun.COM {
379126SWyllys.Ingersoll@Sun.COM 	OBJECT	  * key_obj = NULL;
389126SWyllys.Ingersoll@Sun.COM 	CK_ATTRIBUTE    * attr    = NULL;
399126SWyllys.Ingersoll@Sun.COM 	CK_KEY_TYPE	keytype;
409126SWyllys.Ingersoll@Sun.COM 	CK_OBJECT_CLASS   class;
419126SWyllys.Ingersoll@Sun.COM 	CK_BBOOL	  flag;
429126SWyllys.Ingersoll@Sun.COM 	CK_RV		rc;
439126SWyllys.Ingersoll@Sun.COM 
449126SWyllys.Ingersoll@Sun.COM 
459126SWyllys.Ingersoll@Sun.COM 	if (! sess || ! ctx) {
469126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
479126SWyllys.Ingersoll@Sun.COM 	}
489126SWyllys.Ingersoll@Sun.COM 	if (ctx->active != FALSE) {
499126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_ACTIVE);
509126SWyllys.Ingersoll@Sun.COM 	}
519126SWyllys.Ingersoll@Sun.COM 
529126SWyllys.Ingersoll@Sun.COM 	// key usage restrictions
539126SWyllys.Ingersoll@Sun.COM 	//
549126SWyllys.Ingersoll@Sun.COM 	rc = object_mgr_find_in_map1(sess->hContext, key, &key_obj);
559126SWyllys.Ingersoll@Sun.COM 	if (rc != CKR_OK) {
569126SWyllys.Ingersoll@Sun.COM 		return (CKR_KEY_HANDLE_INVALID);
579126SWyllys.Ingersoll@Sun.COM 	}
589126SWyllys.Ingersoll@Sun.COM 	// is key allowed to verify signatures?
599126SWyllys.Ingersoll@Sun.COM 	//
609126SWyllys.Ingersoll@Sun.COM 	rc = template_attribute_find(key_obj->template, CKA_VERIFY, &attr);
619126SWyllys.Ingersoll@Sun.COM 	if (rc == FALSE) {
629126SWyllys.Ingersoll@Sun.COM 		return (CKR_KEY_TYPE_INCONSISTENT);
639126SWyllys.Ingersoll@Sun.COM 	} else {
649126SWyllys.Ingersoll@Sun.COM 		flag = *(CK_BBOOL *)attr->pValue;
659126SWyllys.Ingersoll@Sun.COM 		if (flag != TRUE) {
669126SWyllys.Ingersoll@Sun.COM 			return (CKR_KEY_FUNCTION_NOT_PERMITTED);
679126SWyllys.Ingersoll@Sun.COM 		}
689126SWyllys.Ingersoll@Sun.COM 	}
699126SWyllys.Ingersoll@Sun.COM 
709126SWyllys.Ingersoll@Sun.COM 	switch (mech->mechanism) {
719126SWyllys.Ingersoll@Sun.COM 		case CKM_RSA_PKCS:
729126SWyllys.Ingersoll@Sun.COM 		{
739126SWyllys.Ingersoll@Sun.COM 			rc = template_attribute_find(key_obj->template,
749126SWyllys.Ingersoll@Sun.COM 			    CKA_KEY_TYPE, &attr);
759126SWyllys.Ingersoll@Sun.COM 			if (rc == FALSE) {
769126SWyllys.Ingersoll@Sun.COM 				return (CKR_KEY_TYPE_INCONSISTENT);
779126SWyllys.Ingersoll@Sun.COM 			} else {
789126SWyllys.Ingersoll@Sun.COM 				keytype = *(CK_KEY_TYPE *)attr->pValue;
799126SWyllys.Ingersoll@Sun.COM 				if (keytype != CKK_RSA) {
809126SWyllys.Ingersoll@Sun.COM 					return (CKR_KEY_TYPE_INCONSISTENT);
819126SWyllys.Ingersoll@Sun.COM 				}
829126SWyllys.Ingersoll@Sun.COM 			}
839126SWyllys.Ingersoll@Sun.COM 
849126SWyllys.Ingersoll@Sun.COM 			flag = template_attribute_find(key_obj->template,
859126SWyllys.Ingersoll@Sun.COM 			    CKA_CLASS, &attr);
869126SWyllys.Ingersoll@Sun.COM 			if (flag == FALSE) {
879126SWyllys.Ingersoll@Sun.COM 				return (CKR_FUNCTION_FAILED);
889126SWyllys.Ingersoll@Sun.COM 			}
899126SWyllys.Ingersoll@Sun.COM 			else
909126SWyllys.Ingersoll@Sun.COM 				class = *(CK_OBJECT_CLASS *)attr->pValue;
919126SWyllys.Ingersoll@Sun.COM 
929126SWyllys.Ingersoll@Sun.COM 			if (class != CKO_PUBLIC_KEY) {
939126SWyllys.Ingersoll@Sun.COM 				return (CKR_FUNCTION_FAILED);
949126SWyllys.Ingersoll@Sun.COM 			}
959126SWyllys.Ingersoll@Sun.COM 			// PKCS #11 doesn't allow multi - part RSA operations
969126SWyllys.Ingersoll@Sun.COM 			ctx->context_len = 0;
979126SWyllys.Ingersoll@Sun.COM 			ctx->context	= NULL;
989126SWyllys.Ingersoll@Sun.COM 		}
999126SWyllys.Ingersoll@Sun.COM 		break;
1009126SWyllys.Ingersoll@Sun.COM 
1019126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_RSA_PKCS:
1029126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA1_RSA_PKCS:
1039126SWyllys.Ingersoll@Sun.COM 		{
1049126SWyllys.Ingersoll@Sun.COM 			rc = template_attribute_find(key_obj->template,
1059126SWyllys.Ingersoll@Sun.COM 			    CKA_KEY_TYPE, &attr);
1069126SWyllys.Ingersoll@Sun.COM 			if (rc == FALSE) {
1079126SWyllys.Ingersoll@Sun.COM 				return (CKR_KEY_TYPE_INCONSISTENT);
1089126SWyllys.Ingersoll@Sun.COM 			} else {
1099126SWyllys.Ingersoll@Sun.COM 				keytype = *(CK_KEY_TYPE *)attr->pValue;
1109126SWyllys.Ingersoll@Sun.COM 				if (keytype != CKK_RSA) {
1119126SWyllys.Ingersoll@Sun.COM 					return (CKR_KEY_TYPE_INCONSISTENT);
1129126SWyllys.Ingersoll@Sun.COM 				}
1139126SWyllys.Ingersoll@Sun.COM 			}
1149126SWyllys.Ingersoll@Sun.COM 
1159126SWyllys.Ingersoll@Sun.COM 			flag = template_attribute_find(key_obj->template,
1169126SWyllys.Ingersoll@Sun.COM 			    CKA_CLASS, &attr);
1179126SWyllys.Ingersoll@Sun.COM 			if (flag == FALSE) {
1189126SWyllys.Ingersoll@Sun.COM 				return (CKR_FUNCTION_FAILED);
1199126SWyllys.Ingersoll@Sun.COM 			}
1209126SWyllys.Ingersoll@Sun.COM 			else
1219126SWyllys.Ingersoll@Sun.COM 				class = *(CK_OBJECT_CLASS *)attr->pValue;
1229126SWyllys.Ingersoll@Sun.COM 
1239126SWyllys.Ingersoll@Sun.COM 			if (class != CKO_PUBLIC_KEY) {
1249126SWyllys.Ingersoll@Sun.COM 				return (CKR_FUNCTION_FAILED);
1259126SWyllys.Ingersoll@Sun.COM 			}
1269126SWyllys.Ingersoll@Sun.COM 			ctx->context_len = sizeof (RSA_DIGEST_CONTEXT);
1279126SWyllys.Ingersoll@Sun.COM 			ctx->context = (CK_BYTE *)malloc(
1289126SWyllys.Ingersoll@Sun.COM 			    sizeof (RSA_DIGEST_CONTEXT));
1299126SWyllys.Ingersoll@Sun.COM 			if (! ctx->context) {
1309126SWyllys.Ingersoll@Sun.COM 				return (CKR_HOST_MEMORY);
1319126SWyllys.Ingersoll@Sun.COM 			}
1329126SWyllys.Ingersoll@Sun.COM 			(void) memset(ctx->context, 0x0,
1339126SWyllys.Ingersoll@Sun.COM 			    sizeof (RSA_DIGEST_CONTEXT));
1349126SWyllys.Ingersoll@Sun.COM 		}
1359126SWyllys.Ingersoll@Sun.COM 		break;
1369126SWyllys.Ingersoll@Sun.COM 
1379126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_HMAC:
1389126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA_1_HMAC:
1399126SWyllys.Ingersoll@Sun.COM 		{
1409126SWyllys.Ingersoll@Sun.COM 			rc = template_attribute_find(key_obj->template,
1419126SWyllys.Ingersoll@Sun.COM 			    CKA_KEY_TYPE, &attr);
1429126SWyllys.Ingersoll@Sun.COM 			if (rc == FALSE) {
1439126SWyllys.Ingersoll@Sun.COM 				return (CKR_KEY_TYPE_INCONSISTENT);
1449126SWyllys.Ingersoll@Sun.COM 			} else {
1459126SWyllys.Ingersoll@Sun.COM 				keytype = *(CK_KEY_TYPE *)attr->pValue;
1469126SWyllys.Ingersoll@Sun.COM 				if (keytype != CKK_GENERIC_SECRET) {
1479126SWyllys.Ingersoll@Sun.COM 					return (CKR_KEY_TYPE_INCONSISTENT);
1489126SWyllys.Ingersoll@Sun.COM 				}
1499126SWyllys.Ingersoll@Sun.COM 			}
1509126SWyllys.Ingersoll@Sun.COM 
1519126SWyllys.Ingersoll@Sun.COM 			// PKCS #11 doesn't allow multi - part HMAC operations
1529126SWyllys.Ingersoll@Sun.COM 			ctx->context_len = 0;
1539126SWyllys.Ingersoll@Sun.COM 			ctx->context	= NULL;
1549126SWyllys.Ingersoll@Sun.COM 		}
1559126SWyllys.Ingersoll@Sun.COM 		break;
1569126SWyllys.Ingersoll@Sun.COM 
1579126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_HMAC_GENERAL:
1589126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA_1_HMAC_GENERAL:
1599126SWyllys.Ingersoll@Sun.COM 		{
1609126SWyllys.Ingersoll@Sun.COM 			CK_MAC_GENERAL_PARAMS *param =
1619126SWyllys.Ingersoll@Sun.COM 			    (CK_MAC_GENERAL_PARAMS *)mech->pParameter;
1629126SWyllys.Ingersoll@Sun.COM 
1639126SWyllys.Ingersoll@Sun.COM 			if (mech->ulParameterLen !=
1649126SWyllys.Ingersoll@Sun.COM 			    sizeof (CK_MAC_GENERAL_PARAMS)) {
1659126SWyllys.Ingersoll@Sun.COM 				return (CKR_MECHANISM_PARAM_INVALID);
1669126SWyllys.Ingersoll@Sun.COM 			}
1679126SWyllys.Ingersoll@Sun.COM 			if ((mech->mechanism == CKM_MD5_HMAC_GENERAL) &&
1689126SWyllys.Ingersoll@Sun.COM 			    (*param > 16)) {
1699126SWyllys.Ingersoll@Sun.COM 				return (CKR_MECHANISM_PARAM_INVALID);
1709126SWyllys.Ingersoll@Sun.COM 			}
1719126SWyllys.Ingersoll@Sun.COM 			if ((mech->mechanism == CKM_SHA_1_HMAC_GENERAL) &&
1729126SWyllys.Ingersoll@Sun.COM 			    (*param > 20)) {
1739126SWyllys.Ingersoll@Sun.COM 				return (CKR_MECHANISM_PARAM_INVALID);
1749126SWyllys.Ingersoll@Sun.COM 			}
1759126SWyllys.Ingersoll@Sun.COM 			rc = template_attribute_find(key_obj->template,
1769126SWyllys.Ingersoll@Sun.COM 			    CKA_KEY_TYPE, &attr);
1779126SWyllys.Ingersoll@Sun.COM 			if (rc == FALSE) {
1789126SWyllys.Ingersoll@Sun.COM 				return (CKR_KEY_TYPE_INCONSISTENT);
1799126SWyllys.Ingersoll@Sun.COM 			} else {
1809126SWyllys.Ingersoll@Sun.COM 				keytype = *(CK_KEY_TYPE *)attr->pValue;
1819126SWyllys.Ingersoll@Sun.COM 				if (keytype != CKK_GENERIC_SECRET) {
1829126SWyllys.Ingersoll@Sun.COM 					return (CKR_KEY_TYPE_INCONSISTENT);
1839126SWyllys.Ingersoll@Sun.COM 				}
1849126SWyllys.Ingersoll@Sun.COM 			}
1859126SWyllys.Ingersoll@Sun.COM 
1869126SWyllys.Ingersoll@Sun.COM 			ctx->context_len = 0;
1879126SWyllys.Ingersoll@Sun.COM 			ctx->context	= NULL;
1889126SWyllys.Ingersoll@Sun.COM 		}
1899126SWyllys.Ingersoll@Sun.COM 		break;
1909126SWyllys.Ingersoll@Sun.COM 
1919126SWyllys.Ingersoll@Sun.COM 		default:
1929126SWyllys.Ingersoll@Sun.COM 		return (CKR_MECHANISM_INVALID);
1939126SWyllys.Ingersoll@Sun.COM 	}
1949126SWyllys.Ingersoll@Sun.COM 
1959126SWyllys.Ingersoll@Sun.COM 
1969126SWyllys.Ingersoll@Sun.COM 	ctx->key		 = key;
1979126SWyllys.Ingersoll@Sun.COM 	ctx->mech.ulParameterLen = mech->ulParameterLen;
1989126SWyllys.Ingersoll@Sun.COM 	ctx->mech.mechanism	= mech->mechanism;
199*9453SWyllys.Ingersoll@Sun.COM 	ctx->mech.pParameter	= mech->pParameter;
2009126SWyllys.Ingersoll@Sun.COM 	ctx->multi		= FALSE;
2019126SWyllys.Ingersoll@Sun.COM 	ctx->active		= TRUE;
2029126SWyllys.Ingersoll@Sun.COM 	ctx->recover		= recover_mode;
2039126SWyllys.Ingersoll@Sun.COM 
2049126SWyllys.Ingersoll@Sun.COM 	return (CKR_OK);
2059126SWyllys.Ingersoll@Sun.COM }
2069126SWyllys.Ingersoll@Sun.COM 
2079126SWyllys.Ingersoll@Sun.COM CK_RV
verify_mgr_cleanup(SIGN_VERIFY_CONTEXT * ctx)2089126SWyllys.Ingersoll@Sun.COM verify_mgr_cleanup(SIGN_VERIFY_CONTEXT *ctx)
2099126SWyllys.Ingersoll@Sun.COM {
2109126SWyllys.Ingersoll@Sun.COM 	if (! ctx) {
2119126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
2129126SWyllys.Ingersoll@Sun.COM 	}
2139126SWyllys.Ingersoll@Sun.COM 	ctx->key		 = 0;
2149126SWyllys.Ingersoll@Sun.COM 	ctx->mech.ulParameterLen = 0;
2159126SWyllys.Ingersoll@Sun.COM 	ctx->mech.mechanism	= 0;
2169126SWyllys.Ingersoll@Sun.COM 	ctx->multi		= FALSE;
2179126SWyllys.Ingersoll@Sun.COM 	ctx->active		= FALSE;
2189126SWyllys.Ingersoll@Sun.COM 	ctx->recover		= FALSE;
2199126SWyllys.Ingersoll@Sun.COM 	ctx->context_len	 = 0;
220*9453SWyllys.Ingersoll@Sun.COM 	ctx->mech.pParameter = NULL;
2219126SWyllys.Ingersoll@Sun.COM 
2229126SWyllys.Ingersoll@Sun.COM 	if (ctx->context) {
2239126SWyllys.Ingersoll@Sun.COM 		free(ctx->context);
2249126SWyllys.Ingersoll@Sun.COM 		ctx->context = NULL;
2259126SWyllys.Ingersoll@Sun.COM 	}
2269126SWyllys.Ingersoll@Sun.COM 
2279126SWyllys.Ingersoll@Sun.COM 	return (CKR_OK);
2289126SWyllys.Ingersoll@Sun.COM }
2299126SWyllys.Ingersoll@Sun.COM 
2309126SWyllys.Ingersoll@Sun.COM 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)2319126SWyllys.Ingersoll@Sun.COM verify_mgr_verify(SESSION		* sess,
2329126SWyllys.Ingersoll@Sun.COM 	SIGN_VERIFY_CONTEXT * ctx,
2339126SWyllys.Ingersoll@Sun.COM 	CK_BYTE		* in_data,
2349126SWyllys.Ingersoll@Sun.COM 	CK_ULONG		in_data_len,
2359126SWyllys.Ingersoll@Sun.COM 	CK_BYTE		* signature,
2369126SWyllys.Ingersoll@Sun.COM 	CK_ULONG		sig_len)
2379126SWyllys.Ingersoll@Sun.COM {
2389126SWyllys.Ingersoll@Sun.COM 	if (! sess || ! ctx) {
2399126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
2409126SWyllys.Ingersoll@Sun.COM 	}
2419126SWyllys.Ingersoll@Sun.COM 	if (ctx->active == FALSE) {
2429126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
2439126SWyllys.Ingersoll@Sun.COM 	}
2449126SWyllys.Ingersoll@Sun.COM 	if (ctx->recover == TRUE) {
2459126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
2469126SWyllys.Ingersoll@Sun.COM 	}
2479126SWyllys.Ingersoll@Sun.COM 
2489126SWyllys.Ingersoll@Sun.COM 	if (! in_data || ! signature) {
2499126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
2509126SWyllys.Ingersoll@Sun.COM 	}
2519126SWyllys.Ingersoll@Sun.COM 	if (ctx->multi == TRUE) {
2529126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_ACTIVE);
2539126SWyllys.Ingersoll@Sun.COM 	}
2549126SWyllys.Ingersoll@Sun.COM 
2559126SWyllys.Ingersoll@Sun.COM 	switch (ctx->mech.mechanism) {
2569126SWyllys.Ingersoll@Sun.COM 		case CKM_RSA_PKCS:
2579126SWyllys.Ingersoll@Sun.COM 		return (rsa_pkcs_verify(sess,	ctx,
2589126SWyllys.Ingersoll@Sun.COM 		    in_data,   in_data_len,
2599126SWyllys.Ingersoll@Sun.COM 		    signature, sig_len));
2609126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_RSA_PKCS:
2619126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA1_RSA_PKCS:
2629126SWyllys.Ingersoll@Sun.COM 			return (rsa_hash_pkcs_verify(sess,	ctx,
2639126SWyllys.Ingersoll@Sun.COM 			    in_data,   in_data_len,
2649126SWyllys.Ingersoll@Sun.COM 			    signature, sig_len));
2659126SWyllys.Ingersoll@Sun.COM 
2669126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_HMAC:
2679126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_HMAC_GENERAL:
2689126SWyllys.Ingersoll@Sun.COM 			return (md5_hmac_verify(sess,	ctx,
2699126SWyllys.Ingersoll@Sun.COM 			    in_data,   in_data_len,
2709126SWyllys.Ingersoll@Sun.COM 			    signature, sig_len));
2719126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA_1_HMAC:
2729126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA_1_HMAC_GENERAL:
2739126SWyllys.Ingersoll@Sun.COM 			return (sha1_hmac_verify(sess,	ctx,
2749126SWyllys.Ingersoll@Sun.COM 			    in_data,   in_data_len,
2759126SWyllys.Ingersoll@Sun.COM 			    signature, sig_len));
2769126SWyllys.Ingersoll@Sun.COM 		default:
2779126SWyllys.Ingersoll@Sun.COM 		return (CKR_MECHANISM_INVALID);
2789126SWyllys.Ingersoll@Sun.COM 	}
2799126SWyllys.Ingersoll@Sun.COM }
2809126SWyllys.Ingersoll@Sun.COM 
2819126SWyllys.Ingersoll@Sun.COM CK_RV
verify_mgr_verify_update(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_BYTE * in_data,CK_ULONG in_data_len)2829126SWyllys.Ingersoll@Sun.COM verify_mgr_verify_update(SESSION * sess,
2839126SWyllys.Ingersoll@Sun.COM 	SIGN_VERIFY_CONTEXT * ctx,
2849126SWyllys.Ingersoll@Sun.COM 	CK_BYTE		* in_data,
2859126SWyllys.Ingersoll@Sun.COM 	CK_ULONG		in_data_len)
2869126SWyllys.Ingersoll@Sun.COM {
2879126SWyllys.Ingersoll@Sun.COM 	if (! sess || ! ctx || ! in_data) {
2889126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
2899126SWyllys.Ingersoll@Sun.COM 	}
2909126SWyllys.Ingersoll@Sun.COM 	if (ctx->active == FALSE) {
2919126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
2929126SWyllys.Ingersoll@Sun.COM 	}
2939126SWyllys.Ingersoll@Sun.COM 	if (ctx->recover == TRUE) {
2949126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
2959126SWyllys.Ingersoll@Sun.COM 	}
2969126SWyllys.Ingersoll@Sun.COM 	ctx->multi = TRUE;
2979126SWyllys.Ingersoll@Sun.COM 
2989126SWyllys.Ingersoll@Sun.COM 
2999126SWyllys.Ingersoll@Sun.COM 	switch (ctx->mech.mechanism) {
3009126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_RSA_PKCS:
3019126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA1_RSA_PKCS:
3029126SWyllys.Ingersoll@Sun.COM 			return (rsa_hash_pkcs_verify_update(sess, ctx,
3039126SWyllys.Ingersoll@Sun.COM 			    in_data, in_data_len));
3049126SWyllys.Ingersoll@Sun.COM 		default:
3059126SWyllys.Ingersoll@Sun.COM 			return (CKR_MECHANISM_INVALID);
3069126SWyllys.Ingersoll@Sun.COM 	}
3079126SWyllys.Ingersoll@Sun.COM }
3089126SWyllys.Ingersoll@Sun.COM 
3099126SWyllys.Ingersoll@Sun.COM CK_RV
verify_mgr_verify_final(SESSION * sess,SIGN_VERIFY_CONTEXT * ctx,CK_BYTE * signature,CK_ULONG sig_len)3109126SWyllys.Ingersoll@Sun.COM verify_mgr_verify_final(SESSION		* sess,
3119126SWyllys.Ingersoll@Sun.COM 	SIGN_VERIFY_CONTEXT * ctx,
3129126SWyllys.Ingersoll@Sun.COM 	CK_BYTE		* signature,
3139126SWyllys.Ingersoll@Sun.COM 	CK_ULONG		sig_len)
3149126SWyllys.Ingersoll@Sun.COM {
3159126SWyllys.Ingersoll@Sun.COM 	if (! sess || ! ctx) {
3169126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
3179126SWyllys.Ingersoll@Sun.COM 	}
3189126SWyllys.Ingersoll@Sun.COM 	if (ctx->active == FALSE) {
3199126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
3209126SWyllys.Ingersoll@Sun.COM 	}
3219126SWyllys.Ingersoll@Sun.COM 	if (ctx->recover == TRUE) {
3229126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
3239126SWyllys.Ingersoll@Sun.COM 	}
3249126SWyllys.Ingersoll@Sun.COM 	switch (ctx->mech.mechanism) {
3259126SWyllys.Ingersoll@Sun.COM 		case CKM_MD5_RSA_PKCS:
3269126SWyllys.Ingersoll@Sun.COM 		case CKM_SHA1_RSA_PKCS:
3279126SWyllys.Ingersoll@Sun.COM 			return (rsa_hash_pkcs_verify_final(sess, ctx,
3289126SWyllys.Ingersoll@Sun.COM 			    signature, sig_len));
3299126SWyllys.Ingersoll@Sun.COM 		default:
3309126SWyllys.Ingersoll@Sun.COM 			return (CKR_MECHANISM_INVALID);
3319126SWyllys.Ingersoll@Sun.COM 	}
3329126SWyllys.Ingersoll@Sun.COM }
3339126SWyllys.Ingersoll@Sun.COM 
3349126SWyllys.Ingersoll@Sun.COM 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)3359126SWyllys.Ingersoll@Sun.COM verify_mgr_verify_recover(SESSION		* sess,
3369126SWyllys.Ingersoll@Sun.COM 	CK_BBOOL		length_only,
3379126SWyllys.Ingersoll@Sun.COM 	SIGN_VERIFY_CONTEXT * ctx,
3389126SWyllys.Ingersoll@Sun.COM 	CK_BYTE		* signature,
3399126SWyllys.Ingersoll@Sun.COM 	CK_ULONG		sig_len,
3409126SWyllys.Ingersoll@Sun.COM 	CK_BYTE		* out_data,
3419126SWyllys.Ingersoll@Sun.COM 	CK_ULONG	    * out_len)
3429126SWyllys.Ingersoll@Sun.COM {
3439126SWyllys.Ingersoll@Sun.COM 	if (! sess || ! ctx) {
3449126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
3459126SWyllys.Ingersoll@Sun.COM 	}
3469126SWyllys.Ingersoll@Sun.COM 	if (ctx->active == FALSE) {
3479126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
3489126SWyllys.Ingersoll@Sun.COM 	}
3499126SWyllys.Ingersoll@Sun.COM 	if (ctx->recover == FALSE) {
3509126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_NOT_INITIALIZED);
3519126SWyllys.Ingersoll@Sun.COM 	}
3529126SWyllys.Ingersoll@Sun.COM 
3539126SWyllys.Ingersoll@Sun.COM 	if (! signature || ! out_len) {
3549126SWyllys.Ingersoll@Sun.COM 		return (CKR_FUNCTION_FAILED);
3559126SWyllys.Ingersoll@Sun.COM 	}
3569126SWyllys.Ingersoll@Sun.COM 	if (ctx->multi == TRUE) {
3579126SWyllys.Ingersoll@Sun.COM 		return (CKR_OPERATION_ACTIVE);
3589126SWyllys.Ingersoll@Sun.COM 	}
3599126SWyllys.Ingersoll@Sun.COM 
3609126SWyllys.Ingersoll@Sun.COM 	switch (ctx->mech.mechanism) {
3619126SWyllys.Ingersoll@Sun.COM 		case CKM_RSA_PKCS:
3629126SWyllys.Ingersoll@Sun.COM 		return (rsa_pkcs_verify_recover(sess,	length_only,
3639126SWyllys.Ingersoll@Sun.COM 		    ctx, signature, sig_len, out_data,  out_len));
3649126SWyllys.Ingersoll@Sun.COM 		default:
3659126SWyllys.Ingersoll@Sun.COM 			return (CKR_MECHANISM_INVALID);
3669126SWyllys.Ingersoll@Sun.COM 	}
3679126SWyllys.Ingersoll@Sun.COM }
368