RE: Problem about the private key signing with SFL

"Colestock, Robert" <[email protected]>
Newsgroups gmane.ietf.sfl
Message-ID <[email protected]>
Gianluca:

Sorry about not responding earlier (very busy here with the new release).  I
am in the process of integrating a direct PKCS12 read into the sm_free3 CTIL
using the open-ssl library.  The code has been partially integrated in this
release; I have built some preliminary test code to convince myself it
should work, but I have not tested it in the CTIL yet.  This requires
testing on this end.  We have several goups interested in direct PKCS12
input to the CTILs.

I was hoping to get preliminary results this week, but it will probably be
next week; I can send you the updated files (mostly just sm_free3.cpp/h) and
my updates to the open-ssl (mostly just the pkcs12 utility program) as well
as the open-ssl visual C++ project(s) when I get the basic integration
together.

Bob Colestock
VDA.

-----Original Message-----
From: Gianluca Ramunno [mailto:[email protected]]
Sent: Thursday, July 06, 2000 3:42 AM
To: [email protected]
Subject: R: Problem about the private key signing with SFL


Hi all,
I did some steps around the problem.
I compiled free3 again but with right options so now
I can debug into CSM_Free3::SMTI_Sign.

This way I was able to understand the cause of the problem.
Free3 recognized EncryptedPrivateKeyInfo SEQUENCE
(the most external structure for PKCS#8) and the value
used for EncryptionAlgorithmIdentifier, member of that
structure. In fact, looking inside Free3 while debugging,
I seen that if PKCS#8 was created using PBE-MD5-DES
(openssl pkcs8 -in keytemp.pem -inform pem -topk8
-v1 PBE-MD5-DES -outform der -out privkey.p8)

or PBE-MD5-RC2

(openssl pkcs8 -in keytemp.pem -inform pem -topk8
-v1 PBE-MD5-RC2 -outform der -out privkey.p8).

the Free3 recognized the algorithm.
If PKCS#8 was created another (e.g PBE-MD2-DES)
Free3 printed out:
"unsupported password encryption"

So the problem is: even if Free3 recognize PBE algorithm
identifier, it doesn't decrypt correctly the encoded
data for PKCS#8 PrivateKeyInfo SEQUENCE.

(I don't know if the problem is on the openssl side,
on the Free3 side or both)

In fact I uncommented the line

// for debug only - to be taken out
bufEncodedPrivateKey.ConvertMemoryToFile(".\\decryptedPrivateKey.log");

in CSM_Free3::DecryptPrivateKey source code
in order to write to a file containing decrypted
PKCS#8 PrivateKeyInfo SEQUENCE.

I created a PKCS#8 only with not encrypted internal
PrivateKeyInfo SEQUENCE.

(openssl pkcs8 -in keytemp.pem -inform pem -topk8
-v1 PBE-MD5-RC2 - nocrypt -outform der -out privkey.p8).

Then I binary compared the PKCS#8 file and
file containing data decrypted by Free3.
This test failed: they are different.

I also used 'openssl asn1parse' command to view
the tagged structure of DER encoded files:
PKCS#8 unencrypted file produced by openssl
is a good PKCS#8 encoded file, instead
'openssl asn1parse'  doesn't recognize as
valid ASN.1 encoded data the file containing
Free3 decrypted PrivateKeyInfo SEQUENCE.

So I did another test. I modified
CSM_Free3::DecryptPrivateKey source code
from:

*********************************************
   // get the key to be decrypted
   CSM_Buffer bufEncryptedKey((char*)(snaccEncryptedX.encryptedData),
            snaccEncryptedX.encryptedData.Len());
   CSM_Buffer bufEncodedPrivateKey;

   SME(RawDecrypt(&bufEncryptedKey, &bufEncodedPrivateKey, cbc_decryption,
blocksize));

   // for debug only - to be taken out
   //
bufEncodedPrivateKey.ConvertMemoryToFile(".\\decryptedPrivateKey.log");

   // ASN.1 decode the private key
   DECODE_BUF((&snaccX), bufEncodedPrivateKey);
*********************************************

to:

*********************************************
   // get the key to be decrypted
   CSM_Buffer bufEncryptedKey((char*)(snaccEncryptedX.encryptedData),
            snaccEncryptedX.encryptedData.Len());
   //CSM_Buffer bufEncodedPrivateKey; //TO BE UNCOMMENTED FOR RELEASE
VERSION

   // ES: the following statement is only for debug (by GR)
   CSM_Buffer bufEncodedPrivateKey(".\\grkeynocrypt2.p8");
   bufEncodedPrivateKey.ConvertFileToMemory();

   //TO BE UNCOMMENTED FOR RELEASE VERSION
   //SME(RawDecrypt(&bufEncryptedKey, &bufEncodedPrivateKey, cbc_decryption,
blocksize));

   // for debug only - to be taken out
   //
bufEncodedPrivateKey.ConvertMemoryToFile(".\\decryptedPrivateKey.log");

   // ASN.1 decode the private key
   DECODE_BUF((&snaccX), bufEncodedPrivateKey);
*********************************************

in order to make Free3::Sign use the previously
created  file containing encoded PrivateKeyInfo
STRUCTURE instead of Free3 decrypted data.

Finally this test gave me a positive result:
CMS object with SignedData was produced
(and also I successfully tried the code for
signature verification)!!!

For the moment using this workaround (trial private key
not encrypted) I can develop and test various features
of my application but I need to solve the problem.
Has anyone a solution?

Or, intermediate solution, has anyone (Bob? Jonathan?)
a free tool tested with SFL&Free3 CTIL for extracting
a private key from a PKCS#12 and putting it
into a PKCS#8?

Thank's
Gianluca

> -----Messaggio originale-----
> Da:
> Inviato:	30 June 2000 13:27
> A:	'[email protected]'
> Oggetto:	Problem about the private key signing with SFL
>
> Hi all,
> another problem. About private key.
>
> As I wrote, the goal of my application is
> * sign a blob
> * verify the signature over this blob
> (very innovative ...  :-))
>
> I want to use Crypto++ 3.1 free token library, md5RSA or sha1RSA
> signature over that blob and produce a CMS object with or
> without ContentInfo,
> with or without signer's certificate, with or without
> certification path certificates
> Platform: Win32, Compiler VisualC++ 6.0 (within VisualStudio)
> Professional with SP3
> SFL version 1.6 (Free3 CTIL compiled with
> SM_FREE3_RSA_INCLUDED define)
>
> In order to try the application with a standard certificate,
> I got a trial certificate from Verisign
> (with automatic enrollment to the Microsoft
> Enhanced Cryptographic Service Provider, the one
> released with a High Encryption Pack for IE)
> Main features are:
> * Version3
> * Public key algorithm: RSA
> * Public key length: 1024 bit
> * Certificate Signature Algorithm: md5RSA
>
> Then I exported the certificate with a private key from MS
> local repository
> to a PKCS#12 object.
> Finally using openSSL 0.95a I performed following steps:
>
> 1) extraction of the private key from PKCS#12 to PEM format
> (I think base64 encoded RSA format, it is not specified in
> openSSL docs).
> The command used is:
>
> openssl pkcs12 -in mypkcs12.p12 -nocerts -out keytemp.pem
>
> Openssl requested password to open pkcs12 object and password
> to protect pem format private key file
>
>
> * transcoding from PEM format to PKCS#8 (protected with PKCS#5)
> DER encoded.
> The command used is:
>
> openssl pkcs8 -in keytemp.pem -inform pem -topk8 -outform der
> -out privkey.p8
>
> Openssl requested password to pem format key and password
> to protect PKCS#8 object
>
>
> **********************************
> Now the application. Some key source code line:
>
> * For login:
> 	SME(pES_AppLogin= (CSM_AppLogin *) new
> CSM_AppLogin(FREE3_DLL_NAME,DLLBuildParam));
> 	pCSMIME = (CSMIME *)pES_AppLogin;
>
> Following previous mails between Bob and Jonathan (about
> default alg - DSA - for
> Free3 CTIL) I added following code
>
> 	pCSMIME->m_pCSInsts->SetCurrToFirst();
> 	pCurr_CSInst=pCSMIME->m_pCSInsts->Curr();
> 	pDigestAlgOID = new CSM_OID(md5);
> 	pDig_EncAlgOID = new CSM_OID(md5WithRSAEncryption);
> 	pCurr_CSInst->SetPreferredCSInstAlgs(pDigestAlgOID ,
> 		pDig_EncAlgOID , NULL, NULL);
>
> Because of the fact that the application had produced a PKCS#7 object
> containing SignedData without SignerInfos/SignerInfo data, I
> debugged the code
> and I saw that before calling SMTI_Sign method it was controlled that
> Applicable bit value within CSM_CInst instance was true.
> So I added following code:
>
> 	pCurr_CSInst->SetApplicable(true);
>
>
> * For instancing and preparing CSM_MsgToSign object
>
>
> 	CSM_Buffer *p;
>
> 	p= new CSM_Buffer(DATA_TO_BE_SIGNED_FILENAME);
> 	m_pESSignMsg= (CSM_MsgToSign *) new CSM_MsgToSign(p);
>
> 	// CMS (RFC 2630) OID definition for SignedData type
> 	m_pESSignMsg->setContentType(CSM_OID("1.2.840.113549.1.7.2"));
>
> 	m_pESSignMsg->SetIncludeOrigCertsFlag(true);
> 	m_pESSignMsg->m_bIssOrSki = false;
> //Usa IssuerAndSerialNumber
>
> 	// for the following flag: true->enveloping signature
> 	// false->detached signature
> 	m_pESSignMsg->SetIncludeContentFlag(true);
>
>
> * For signing
>
> 	if ((ret=m_pESSignMsg->Sign(pCSMIME))==SM_NO_ERROR)
> 	{
> 		CSM_Buffer
> *pbufContent=m_pESSignMsg->GetEncodedContentInfo();
> 		pbufContent->ConvertMemoryToFile(SIGNED_DATA_FILENAME);
> 		delete pbufContent;
> 	}
>
> *******************************************************
>
> The problem:
>
>
> The application return to me following exception:
>
> F:\Tesi\es\escmd\lib>escmd
> ERROR INFORMATION AND STACK:
>
>  ERROR INFORMATION: PrivateKeyInfo::BDec: ERROR - wrong tag
>
>         ERROR CODE: 34  SOURCE LINE NUMBER: 3054
>         FILE: f:\tesi\smimer1.6\alg_libs\sm_free3\sm_free3.cpp
>         FUNCTION: CSM_Free3::DecryptPrivateKey
>
> CSM_Free3::SMTI_Sign IN
> f:\tesi\smimer1.6\alg_libs\sm_free3\sm_free3.cpp, line 8
> 1.
> CSM_SignBuf::SignBuf IN
> f:\tesi\smimer1.6\libcert\src\sm_signbuf.cpp, line 193.
> ProduceSignerInfo IN
> F:\Tesi\smimeR1.6\libsrc\hilevel\sm_Sign.cpp, line 301.
> UpdateSignedDataSIs IN
> F:\Tesi\smimeR1.6\libsrc\hilevel\sm_Sign.cpp, line 195.
> Sign IN F:\Tesi\smimeR1.6\libsrc\hilevel\sm_Sign.cpp, line -1.
> sign IN f:\tesi\es\escmd\src\escmd.cpp, line -1.
>
>
>
> I can't debug the application within SMTI_Sign (CSM_TokenInterface
> class or, better, CSM_Free3 class) method because
> for the following code in sm_SignBuf.cpp
>
>     {
>          SME(tmpTokenIF->SMTI_Sign(pSigContentBuf,
>              pSigBuf,                // returned result
>              pDigest));               // data digest (Hash of Content)
>     }
>
> the behavior of F11(step into) debug command is similar to
> F10 (step over),
> so I can't see values of various structures within the
> objects (from CSM_AppLogin and
> CSM_MsgToSign classes) just before exception is generated.
>
> I thinked I have compiled SFL with bad options, so
> I tried to verify key management
> using command
> auto_hid.exe lolevel\crypto.cfg:
> it returned to me no message (The meaning is:
> Test passed?).
> I tried to change randomly password in
> a free3 section of the crypto.cfg file
> ant it returned to me no message ...
> So I can't understand if SFL libraries have been built
> correctly
>
> Finally trying to generate a certificate using
> CertificateBuilder:
> 1) Using dialog box I can generate
> certificate only with DSA public key
> (which way for storing generated private key?)
> 2) Using a config file (e.g. DaisyRSA.cfg included
> in SFL package) CertificateBuilder returns an error
> (in libcert)
>
> *****************************************************************
>
> Now the questions:
>
> 1) Is my usage of pCurr_CSInst->SetApplicable(true)
> method correct or the use it's not mandatory (and I
> had to use it because I forgot something else?)
>
> 2) Did I do something wrong while estracting private key
> from PKCS#12 and converting to PKCS#8? Which is the
> right way for obtaining a private key file suitable for
> SFL Free3 CTIL ?
> There is some requirement for the password
> (length and others)?
>
> 3) Which way can I generate a couple private-public key
> RSA and a public key certificate signed using md5RSA
> or sha1RSA algorithms using CertificateBuilder (either
> using dialog windows or config file)?
> I tried to do the above operations but I wasn't able to force
> CertificateBuilder to use RSA algorithm and store private
> key somewhere into a file.
>
>
> The following questions aren't related to private key problem
>
> 3) Using the constructor
> CSM_AppLogin(FREE3_DLL_NAME,DLLBuildParam))
> (with DLLBuildParam="SM_FREE3DLL certsign.der keysign.p8
> password sm_FREE3")
> the last parameter, token ID (sm_FREE3), is ininfluent,
> because is the
>
> *CSM_Free3::AddLoginStatic method which copies ID string
> (FREE3) to a buffer
> pointed by the pointer passed as parameter, in the above case
> pointer to "sm_FREE3"
> parameter.
>
> The only need is passing a string with length equal or
> greather than FREE3
> in order to allocate string buffer memory large enough for th
> copy made
> by AddLoginStatic method
>
> It's true? If yes, why?
>
> 4) What's the difference between sha_1WithRSAEncryption
> and sha_1WithRSAEncryption_ALT AsnOid contants?
>
> 5) Have you (Wang) planned a CTIL for a MSCryptoAPI?
> Someone else had developed it?
>
> Thank's
> Gianluca
>
> ---------------------------------------------------------------------
> Gianluca Ramunno ([email protected])
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.