Hello,

attached is the missing patch. It removes the RSA faking, but leaves
everything else as is.

BTW: Is the source code of that applet publicly available. If so, it
shouldn't be that hard to add the cryptographic operations. With or
without hardware-support.

Regards
Andre

On Wed, 2010-12-08 at 08:35 +0100, francois.lebl...@cev-sa.com wrote:
> Hello,
> 
> For know I don't have patch for removing software operation on westcos,
> 
> This is needed until westcos with cryptographics becomes available...
> 
> But like I make my own build, I use openssl, you can build without openssl
> 
> I will provide one for westcos user...
> 
> It is ok for you  this way?
> 
> François.
> 
> 
> 
> De :
> Martin Paljak <mar...@paljak.pri.ee>
> A:
> Andre Zepezauer <andre.zepeza...@student.uni-halle.de>
> Cc :
> opensc-devel <opensc-devel@lists.opensc-project.org>
> Date:
> 07/12/2010 19:38
> Objet :
> Re: [opensc-devel] westcos still fakes crypto hardware
> Envoyé par :
> opensc-devel-boun...@lists.opensc-project.org
> 
> 
> 
> Hello,
> On Dec 7, 2010, at 8:25 PM, Andre Zepezauer wrote:
> 
> > Hello,
> > 
> > the westcos driver still fakes crypto-hardware. It first extracts the
> > key material from the card and than performs the crypto operations in
> > software. Following that schema, then every card could easily support
> > every crypto-algorithm. OpenSSL would make it possible. What would be
> > the next thing in OpenSC, support for GSM/UMTS SIM cards?
> Do you know LGPL compatible A5/1 libraries ? :)
> 
> Seriously though, a patch that removes the software operations would be 
> useful.
> 
> François, do you have one or will it break anything?
> 
> Password encryption in key importing is also still present. I would really 
> like to do a test to see if native exportable keys are supported by some 
> cards. I know this can be done with JavaCards but don't know if any applet 
> implements it.
> 
Index: src/libopensc/card-westcos.c
===================================================================
--- src/libopensc/card-westcos.c	(revision 4943)
+++ src/libopensc/card-westcos.c	(working copy)
@@ -31,11 +31,6 @@
 
 #ifdef ENABLE_OPENSSL
 #include <openssl/des.h>
-#include <openssl/rsa.h>
-#include <openssl/evp.h>
-#include <openssl/pem.h>
-#include <openssl/err.h>
-#include <openssl/bio.h>
 #endif
 
 #ifndef min
@@ -50,23 +45,7 @@
 #define WESTCOS_RSA_NO_HASH_NO_PAD		(0x20)
 #define WESTCOS_RSA_NO_HASH_PAD_PKCS1	(0x21)
 
-#ifdef ENABLE_OPENSSL
-#define DEBUG_SSL
-#ifdef DEBUG_SSL
-static void print_openssl_error(void)
-{
-	static int charge = 0;
-	long r;
 
-	if (!charge) {
-		ERR_load_crypto_strings();
-		charge = 1;
-	}
-	while ((r = ERR_get_error()) != 0)
-		fprintf(stderr, "%s\n", ERR_error_string(r, NULL));
-}
-#endif
-#endif
 
 typedef struct {
 	sc_security_env_t env;
@@ -1099,14 +1078,8 @@
 {
 	int r;
 	int idx = 0;
-	u8 buf[180];
 	sc_file_t *keyfile = sc_file_new();
 	priv_data_t *priv_data = NULL;
-	int pad;
-#ifdef ENABLE_OPENSSL
-	RSA *rsa = NULL;
-	BIO *mem = BIO_new(BIO_s_mem());
-#endif
 
 	if (card == NULL)
 		return SC_ERROR_INVALID_ARGUMENTS;
@@ -1138,103 +1111,7 @@
 		goto out2;
 	}
 	
-#ifndef ENABLE_OPENSSL
 	r = SC_ERROR_NOT_SUPPORTED;
-#else
-	if (keyfile == NULL || mem == NULL || priv_data == NULL) {
-		r = SC_ERROR_OUT_OF_MEMORY;
-		goto out;
-	}
-	if ((priv_data->env.flags) & SC_ALGORITHM_RSA_PAD_PKCS1)
-		pad = RSA_PKCS1_PADDING;
-
-	else if ((priv_data->env.flags) & SC_ALGORITHM_RSA_RAW)
-		pad = RSA_NO_PADDING;
-
-	else {
-		r = SC_ERROR_INVALID_ARGUMENTS;
-		goto out;
-	}
-	r = sc_select_file(card, &(priv_data->env.file_ref), &keyfile);
-	if (r)
-		goto out;
-
-	do {
-		int alire;
-		alire = min(((keyfile->size) - idx), sizeof(buf));
-		if (alire <= 0)
-			break;
-		sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL,
-			"idx = %d, alire=%d\n", idx, alire);
-		r = sc_read_binary(card, idx, buf, alire, 0);
-		if (r < 0)
-			goto out;
-		BIO_write(mem, buf, r);
-		idx += r;
-	} while (1);
-	BIO_set_mem_eof_return(mem, -1);
-	if (!d2i_RSAPrivateKey_bio(mem, &rsa)) {
-		sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL,
-			"RSA key invalid, %d\n", ERR_get_error());
-		r = SC_ERROR_UNKNOWN;
-		goto out;
-	}
-
-	/* pkcs11 reset openssl functions */
-	rsa->meth = RSA_PKCS1_SSLeay();
-	if (RSA_size(rsa) > outlen) {
-		sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Buffer too small\n");
-		r = SC_ERROR_OUT_OF_MEMORY;
-		goto out;
-	}
-#if 1
-	if (mode) {		/* decipher */
-		r = RSA_private_decrypt(data_len, data, out, rsa, pad);
-		if (r == -1) {
-
-#ifdef DEBUG_SSL
-			print_openssl_error();
-
-#endif
-			sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL,
-				"Decipher error %d\n", ERR_get_error());
-			r = SC_ERROR_UNKNOWN;
-			goto out;
-		}
-	}
-
-	else {			/* sign */
-
-		r = RSA_private_encrypt(data_len, data, out, rsa, pad);
-		if (r == -1) {
-
-#ifdef DEBUG_SSL
-			print_openssl_error();
-
-#endif
-			sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL,
-				"Signature error %d\n", ERR_get_error());
-			r = SC_ERROR_UNKNOWN;
-			goto out;
-		}
-	}
-
-#else
-	if (RSA_sign(nid, data, data_len, out, &outlen, rsa) != 1) {
-		sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL,
-			"RSA_sign error %d \n", ERR_get_error());
-		r = SC_ERROR_UNKNOWN;
-		goto out;
-	}
-	r = outlen;
-
-#endif
-out:
-	if (mem)
-		BIO_free(mem);
-	if (rsa)
-		RSA_free(rsa);
-#endif /* ENABLE_OPENSSL */
 out2:
 	if (keyfile)
 		sc_file_free(keyfile);
_______________________________________________
opensc-devel mailing list
opensc-devel@lists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to