Check-in [a08de24384]
Overview
Comment:Updated to set LOGIN_REQUIRED flag when C_Logout is called

Updated to check all references to a session's slot

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:a08de243846911794ed3b7f061cd7d4ebab2e7fc
User & Date: rkeene on 2010-05-22 21:31:22
Other Links: manifest | tags
Context
2010-05-23
02:59
Updated to retry APDU in some cases

Updated to recognize when a card is logged out without being switched check-in: 9b8b8e3b4a user: rkeene tags: trunk

2010-05-22
21:31
Updated to set LOGIN_REQUIRED flag when C_Logout is called

Updated to check all references to a session's slot check-in: a08de24384 user: rkeene tags: trunk

18:55
CACKey 0.5.8

Updated specfile with data from coolkey check-in: 46cd43db95 user: rkeene tags: trunk, 0.5.8

Changes

Modified cackey.c from [ca30d967da] to [26bb9837f1].

  3857   3857   
  3858   3858   	CACKEY_DEBUG_PRINTF("Returning CKR_FUNCTION_NOT_SUPPORTED (%i)", CKR_FUNCTION_NOT_SUPPORTED);
  3859   3859   
  3860   3860   	return(CKR_FUNCTION_NOT_SUPPORTED);
  3861   3861   }
  3862   3862   
  3863   3863   CK_DEFINE_FUNCTION(CK_RV, C_Login)(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen) {
         3864  +	CK_SLOT_ID slotID;
  3864   3865   	int mutex_retval;
  3865   3866   	int tries_remaining;
  3866   3867   	int login_ret;
  3867   3868   
  3868   3869   	CACKEY_DEBUG_PRINTF("Called.");
  3869   3870   
  3870   3871   	if (!cackey_initialized) {
................................................................................
  3896   3897   		cackey_mutex_unlock(cackey_biglock);
  3897   3898   
  3898   3899   		CACKEY_DEBUG_PRINTF("Error.  Session not active.");
  3899   3900   		
  3900   3901   		return(CKR_SESSION_HANDLE_INVALID);
  3901   3902   	}
  3902   3903   
  3903         -	login_ret = cackey_login(&cackey_slots[cackey_sessions[hSession].slotID], pPin, ulPinLen, &tries_remaining);
         3904  +	slotID = cackey_sessions[hSession].slotID;
         3905  +
         3906  +	if (slotID < 0 || slotID >= (sizeof(cackey_slots) / sizeof(cackey_slots[0]))) {
         3907  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), outside of valid range", slotID);
         3908  +
         3909  +		return(CKR_GENERAL_ERROR);
         3910  +	}
         3911  +
         3912  +	if (cackey_slots[slotID].active == 0) {
         3913  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), slot not currently active", slotID);
         3914  +
         3915  +		cackey_mutex_unlock(cackey_biglock);
         3916  +
         3917  +		return(CKR_GENERAL_ERROR);
         3918  +	}
         3919  +
         3920  +	login_ret = cackey_login(&cackey_slots[slotID], pPin, ulPinLen, &tries_remaining);
  3904   3921   	if (login_ret != CACKEY_PCSC_S_OK) {
  3905   3922   		cackey_mutex_unlock(cackey_biglock);
  3906   3923   
  3907   3924   		if (login_ret == CACKEY_PCSC_E_LOCKED) {
  3908   3925   			CACKEY_DEBUG_PRINTF("Error.  Token is locked.");
  3909   3926   
  3910         -			cackey_slots[cackey_sessions[hSession].slotID].token_flags |= CKF_USER_PIN_LOCKED;
         3927  +			cackey_slots[slotID].token_flags |= CKF_USER_PIN_LOCKED;
  3911   3928   
  3912   3929   			return(CKR_PIN_LOCKED);
  3913   3930   		} else if (login_ret == CACKEY_PCSC_E_BADPIN) {
  3914   3931   			CACKEY_DEBUG_PRINTF("Error.  Invalid PIN.");
  3915   3932   
  3916         -			cackey_slots[cackey_sessions[hSession].slotID].token_flags |= CKF_USER_PIN_COUNT_LOW;
         3933  +			cackey_slots[slotID].token_flags |= CKF_USER_PIN_COUNT_LOW;
  3917   3934   
  3918   3935   			if (tries_remaining == 1) {
  3919         -				cackey_slots[cackey_sessions[hSession].slotID].token_flags |= CKF_USER_PIN_FINAL_TRY;
         3936  +				cackey_slots[slotID].token_flags |= CKF_USER_PIN_FINAL_TRY;
  3920   3937   			}
  3921   3938   
  3922   3939   			return(CKR_PIN_INCORRECT);
  3923   3940   		}
  3924   3941   
  3925   3942   		CACKEY_DEBUG_PRINTF("Error.  Unknown error returned from cackey_login() (%i)", login_ret);
  3926   3943   
  3927   3944   		return(CKR_GENERAL_ERROR);
  3928   3945   	}
  3929   3946   
  3930         -	cackey_slots[cackey_sessions[hSession].slotID].token_flags &= ~(CKF_USER_PIN_LOCKED | CKF_USER_PIN_COUNT_LOW | CKF_LOGIN_REQUIRED | CKF_USER_PIN_FINAL_TRY);
         3947  +	cackey_slots[slotID].token_flags &= ~(CKF_USER_PIN_LOCKED | CKF_USER_PIN_COUNT_LOW | CKF_LOGIN_REQUIRED | CKF_USER_PIN_FINAL_TRY);
  3931   3948   
  3932   3949   	cackey_sessions[hSession].state = CKS_RO_USER_FUNCTIONS;
  3933   3950   
  3934   3951   	mutex_retval = cackey_mutex_unlock(cackey_biglock);
  3935   3952   	if (mutex_retval != 0) {
  3936   3953   		CACKEY_DEBUG_PRINTF("Error.  Unlocking failed.");
  3937   3954   
................................................................................
  3940   3957   
  3941   3958   	CACKEY_DEBUG_PRINTF("Returning CKR_OK (%i)", CKR_OK);
  3942   3959   
  3943   3960   	return(CKR_OK);
  3944   3961   }
  3945   3962   
  3946   3963   CK_DEFINE_FUNCTION(CK_RV, C_Logout)(CK_SESSION_HANDLE hSession) {
         3964  +	CK_SLOT_ID slotID;
  3947   3965   	int mutex_retval;
  3948   3966   
  3949   3967   	CACKEY_DEBUG_PRINTF("Called.");
  3950   3968   
  3951   3969   	if (!cackey_initialized) {
  3952   3970   		CACKEY_DEBUG_PRINTF("Error.  Not initialized.");
  3953   3971   
................................................................................
  3970   3988   	if (!cackey_sessions[hSession].active) {
  3971   3989   		cackey_mutex_unlock(cackey_biglock);
  3972   3990   
  3973   3991   		CACKEY_DEBUG_PRINTF("Error.  Session not active.");
  3974   3992   		
  3975   3993   		return(CKR_SESSION_HANDLE_INVALID);
  3976   3994   	}
         3995  +
         3996  +	slotID = cackey_sessions[hSession].slotID;
         3997  +
         3998  +	if (slotID < 0 || slotID >= (sizeof(cackey_slots) / sizeof(cackey_slots[0]))) {
         3999  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), outside of valid range", slotID);
         4000  +
         4001  +		return(CKR_GENERAL_ERROR);
         4002  +	}
         4003  +
         4004  +	if (cackey_slots[slotID].active == 0) {
         4005  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), slot not currently active", slotID);
         4006  +
         4007  +		cackey_mutex_unlock(cackey_biglock);
         4008  +
         4009  +		return(CKR_GENERAL_ERROR);
         4010  +	}
  3977   4011   
  3978   4012   	cackey_sessions[hSession].state = CKS_RO_PUBLIC_SESSION;
         4013  +	cackey_slots[slotID].token_flags = CKF_LOGIN_REQUIRED;
  3979   4014   
  3980   4015   	mutex_retval = cackey_mutex_unlock(cackey_biglock);
  3981   4016   	if (mutex_retval != 0) {
  3982   4017   		CACKEY_DEBUG_PRINTF("Error.  Unlocking failed.");
  3983   4018   
  3984   4019   		return(CKR_GENERAL_ERROR);
  3985   4020   	}
................................................................................
  4177   4212   
  4178   4213   	CACKEY_DEBUG_PRINTF("Returning CKR_FUNCTION_NOT_SUPPORTED (%i)", CKR_FUNCTION_NOT_SUPPORTED);
  4179   4214   
  4180   4215   	return(CKR_FUNCTION_NOT_SUPPORTED);
  4181   4216   }
  4182   4217   
  4183   4218   CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) {
         4219  +	CK_SLOT_ID slotID;
  4184   4220   	int mutex_retval;
  4185   4221   
  4186   4222   	CACKEY_DEBUG_PRINTF("Called.");
  4187   4223   
  4188   4224   	if (!cackey_initialized) {
  4189   4225   		CACKEY_DEBUG_PRINTF("Error.  Not initialized.");
  4190   4226   
................................................................................
  4216   4252   		cackey_mutex_unlock(cackey_biglock);
  4217   4253   
  4218   4254   		CACKEY_DEBUG_PRINTF("Error.  Search already active.");
  4219   4255   		
  4220   4256   		return(CKR_OPERATION_ACTIVE);
  4221   4257   	}
  4222   4258   
  4223         -	if (cackey_slots[cackey_sessions[hSession].slotID].slot_reset) {
         4259  +	slotID = cackey_sessions[hSession].slotID;
         4260  +
         4261  +	if (slotID < 0 || slotID >= (sizeof(cackey_slots) / sizeof(cackey_slots[0]))) {
         4262  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), outside of valid range", slotID);
         4263  +
         4264  +		return(CKR_GENERAL_ERROR);
         4265  +	}
         4266  +
         4267  +	if (cackey_slots[slotID].active == 0) {
         4268  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), slot not currently active", slotID);
         4269  +
         4270  +		cackey_mutex_unlock(cackey_biglock);
         4271  +
         4272  +		return(CKR_GENERAL_ERROR);
         4273  +	}
         4274  +
         4275  +	if (cackey_slots[slotID].slot_reset) {
  4224   4276   		CACKEY_DEBUG_PRINTF("The slot has been reset since we last looked for identities -- rescanning");
  4225   4277   
  4226   4278   		if (cackey_sessions[hSession].identities != NULL) {
  4227   4279   			cackey_free_identities(cackey_sessions[hSession].identities, cackey_sessions[hSession].identities_count);
  4228   4280   
  4229   4281   			cackey_sessions[hSession].identities = NULL;
  4230   4282   			cackey_sessions[hSession].identities_count = 0;
  4231   4283   		}
  4232   4284   
  4233         -		if (cackey_slots[cackey_sessions[hSession].slotID].label != NULL) {
  4234         -			free(cackey_slots[cackey_sessions[hSession].slotID].label);
  4235         -			cackey_slots[cackey_sessions[hSession].slotID].label = NULL;
         4285  +		if (cackey_slots[slotID].label != NULL) {
         4286  +			free(cackey_slots[slotID].label);
         4287  +			cackey_slots[slotID].label = NULL;
  4236   4288   		}
  4237   4289   
  4238         -		cackey_slots[cackey_sessions[hSession].slotID].slot_reset = 0;
  4239         -		cackey_slots[cackey_sessions[hSession].slotID].token_flags = CKF_LOGIN_REQUIRED;
         4290  +		cackey_slots[slotID].slot_reset = 0;
         4291  +		cackey_slots[slotID].token_flags = CKF_LOGIN_REQUIRED;
  4240   4292   	}
  4241   4293   
  4242   4294   	if (cackey_sessions[hSession].identities == NULL) {
  4243         -		cackey_sessions[hSession].identities = cackey_read_identities(&cackey_slots[cackey_sessions[hSession].slotID], &cackey_sessions[hSession].identities_count);
         4295  +		cackey_sessions[hSession].identities = cackey_read_identities(&cackey_slots[slotID], &cackey_sessions[hSession].identities_count);
  4244   4296   	}
  4245   4297   
  4246   4298   	if (pTemplate != NULL) {
  4247   4299   		if (ulCount != 0) {
  4248   4300   			cackey_sessions[hSession].search_query_count = ulCount;
  4249   4301   			cackey_sessions[hSession].search_query = malloc(ulCount * sizeof(*pTemplate));
  4250   4302   
................................................................................
  4663   4715   
  4664   4716   	return(CKR_OK);
  4665   4717   }
  4666   4718   
  4667   4719   CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen) {
  4668   4720   	static CK_BYTE buf[16384];
  4669   4721   	ssize_t buflen;
         4722  +	CK_SLOT_ID slotID;
  4670   4723   	CK_RV retval = CKR_GENERAL_ERROR;
  4671   4724   	int mutex_retval;
  4672   4725   
  4673   4726   	CACKEY_DEBUG_PRINTF("Called.");
  4674   4727   
  4675   4728   	if (!cackey_initialized) {
  4676   4729   		CACKEY_DEBUG_PRINTF("Error.  Not initialized.");
................................................................................
  4727   4780   	if (!cackey_sessions[hSession].decrypt_active) {
  4728   4781   		cackey_mutex_unlock(cackey_biglock);
  4729   4782   
  4730   4783   		CACKEY_DEBUG_PRINTF("Error.  Decrypt not active.");
  4731   4784   		
  4732   4785   		return(CKR_OPERATION_NOT_INITIALIZED);
  4733   4786   	}
         4787  +
         4788  +	slotID = cackey_sessions[hSession].slotID;
         4789  +
         4790  +	if (slotID < 0 || slotID >= (sizeof(cackey_slots) / sizeof(cackey_slots[0]))) {
         4791  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), outside of valid range", slotID);
         4792  +
         4793  +		return(CKR_GENERAL_ERROR);
         4794  +	}
         4795  +
         4796  +	if (cackey_slots[slotID].active == 0) {
         4797  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), slot not currently active", slotID);
         4798  +
         4799  +		cackey_mutex_unlock(cackey_biglock);
         4800  +
         4801  +		return(CKR_GENERAL_ERROR);
         4802  +	}
  4734   4803   
  4735   4804   	switch (cackey_sessions[hSession].decrypt_mechanism) {
  4736   4805   		case CKM_RSA_PKCS:
  4737   4806   			/* Ask card to decrypt */
  4738         -			buflen = cackey_signdecrypt(&cackey_slots[cackey_sessions[hSession].slotID], cackey_sessions[hSession].decrypt_identity, pEncryptedPart, ulEncryptedPartLen, buf, sizeof(buf), 0, 1);
         4807  +			buflen = cackey_signdecrypt(&cackey_slots[slotID], cackey_sessions[hSession].decrypt_identity, pEncryptedPart, ulEncryptedPartLen, buf, sizeof(buf), 0, 1);
  4739   4808   
  4740   4809   			if (buflen < 0) {
  4741   4810   				/* Decryption failed. */
  4742   4811   				retval = CKR_GENERAL_ERROR;
  4743   4812   			} else if (((unsigned long) buflen) > *pulPartLen && pPart) {
  4744   4813   				/* Decrypted data too large */
  4745   4814   				retval = CKR_BUFFER_TOO_SMALL;
................................................................................
  5133   5202   
  5134   5203   	return(CKR_OK);
  5135   5204   }
  5136   5205   
  5137   5206   CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) {
  5138   5207   	static CK_BYTE sigbuf[1024];
  5139   5208   	ssize_t sigbuflen;
         5209  +	CK_SLOT_ID slotID;
  5140   5210   	CK_RV retval = CKR_GENERAL_ERROR;
  5141   5211   	int terminate_sign = 1;
  5142   5212   	int mutex_retval;
  5143   5213   
  5144   5214   	CACKEY_DEBUG_PRINTF("Called.");
  5145   5215   
  5146   5216   	if (!cackey_initialized) {
................................................................................
  5179   5249   	if (!cackey_sessions[hSession].sign_active) {
  5180   5250   		cackey_mutex_unlock(cackey_biglock);
  5181   5251   
  5182   5252   		CACKEY_DEBUG_PRINTF("Error.  Sign not active.");
  5183   5253   		
  5184   5254   		return(CKR_OPERATION_NOT_INITIALIZED);
  5185   5255   	}
         5256  +
         5257  +	slotID = cackey_sessions[hSession].slotID;
         5258  +
         5259  +	if (slotID < 0 || slotID >= (sizeof(cackey_slots) / sizeof(cackey_slots[0]))) {
         5260  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), outside of valid range", slotID);
         5261  +
         5262  +		return(CKR_GENERAL_ERROR);
         5263  +	}
         5264  +
         5265  +	if (cackey_slots[slotID].active == 0) {
         5266  +		CACKEY_DEBUG_PRINTF("Error. Invalid slot requested (%lu), slot not currently active", slotID);
         5267  +
         5268  +		cackey_mutex_unlock(cackey_biglock);
         5269  +
         5270  +		return(CKR_GENERAL_ERROR);
         5271  +	}
  5186   5272   
  5187   5273   	switch (cackey_sessions[hSession].sign_mechanism) {
  5188   5274   		case CKM_RSA_PKCS:
  5189   5275   			/* Ask card to sign */
  5190   5276   			CACKEY_DEBUG_PRINTF("Asking to sign from identity %p in session %lu", cackey_sessions[hSession].sign_identity, (unsigned long) hSession);
  5191         -			sigbuflen = cackey_signdecrypt(&cackey_slots[cackey_sessions[hSession].slotID], cackey_sessions[hSession].sign_identity, cackey_sessions[hSession].sign_buf, cackey_sessions[hSession].sign_bufused, sigbuf, sizeof(sigbuf), 1, 0);
         5277  +			sigbuflen = cackey_signdecrypt(&cackey_slots[slotID], cackey_sessions[hSession].sign_identity, cackey_sessions[hSession].sign_buf, cackey_sessions[hSession].sign_bufused, sigbuf, sizeof(sigbuf), 1, 0);
  5192   5278   
  5193   5279   			if (sigbuflen < 0) {
  5194   5280   				/* Signing failed. */
  5195   5281   				retval = CKR_GENERAL_ERROR;
  5196   5282   			} else if (((unsigned long) sigbuflen) > *pulSignatureLen && pSignature) {
  5197   5283   				/* Signed data too large */
  5198   5284   				CACKEY_DEBUG_PRINTF("retval = CKR_BUFFER_TOO_SMALL;  sigbuflen = %lu, pulSignatureLen = %lu", (unsigned long) sigbuflen, (unsigned long) *pulSignatureLen);