Jump to content
Eric Winfly

TSslCertTools for generate CSR

Recommended Posts

This is what i try before but my content i need to sign text like this

 

100000000120250815090926+000000000.25+000000000.50+000000005.75567891234RT00015678912340TQ0001FACOPE======================================================================================== 

 

And when i use your code you specify i obtain Base64Encoded String of length of 96 but her specification need a length of 88 (i use IcsBase64EncodeTB after SignDigest) ?

 

Now i have try :

 

	TSslCertTools *Tool = new TSslCertTools(NULL);
	AnsiString DataEnc, Digest, Secret;
	TBytes SigTB, DataTB = IcsStringToTBytes(Data), SecretTB, DigestTB;

	//Tool->PrivateKeyLoadFromPemFile("Certificat.pem");

	//DataEnc = IcsAsymSignDigest(Data, Tool->PrivateKey, Digest_sha256);
	//DataEnc = IcsBase64Encode(DataEnc);

	//DataEnc = IcsAsymSignDigest(Data, Tool->PrivateKey, Digest_sha256);
	//DataEnc = IcsBase64Encode(DataEnc);

	delete Tool;

	//return (DataEnc);

	//Configuration->FieldByName("CertificatKEY")->AsString;

	Secret = Configuration->FieldByName("CertificatKEY")->AsString;
	DataTB = IcsStringToTBytes(Data);
	SecretTB = IcsStringToTBytes(Secret);

	DigestTB = IcsHMACDigestTB(DataTB, SecretTB, Digest_sha512);
	DataEnc = IcsBase64EncodeTB(DigestTB);

With this last call i obtain 88 of length but the server tell me this is not sign with the FingerPrint of the last cert ???

 

Note : i put Digest_sha512 because this give me 88 of length !

Share this post


Link to post

Sha256 and Sha512 give different length digests, and HMAC is not using a private key.  Private keys are not strings.  

 

Digests are binary, there are lots of ways of converting binary to text, variations of bas64, hex, etc.  You need to work which version gives you the length you need.  

 

ASN is the binary format of X509 certificates, never heard of p1363.  Signing gives a digest, nothing more. 

 

Angus

 

Share this post


Link to post
2 hours ago, Angus Robertson said:

Sha256 and Sha512 give different length digests, and HMAC is not using a private key.  Private keys are not strings.  

 

Digests are binary, there are lots of ways of converting binary to text, variations of bas64, hex, etc.  You need to work which version gives you the length you need.  

 

ASN is the binary format of X509 certificates, never heard of p1363.  Signing gives a digest, nothing more. 

 

Angus

 

So 

IcsAsymSignDigest

Return only sign digest base on asn.1, i need to convert to ieee p1363 ? Nothing do this in Ics Library ?

Share this post


Link to post

Thanks Angus i found and it work now, there is my code if you need in futur :

 

String SignData(String Data)
{
	TSslCertTools *Tool = new TSslCertTools(NULL);
	AnsiString DataEnc;
	TBytes SignTB, DataTB;

	Tool->PrivateKeyLoadFromText(Configuration->FieldByName("CertificatKey")->AsString, "");

	DataTB = IcsStringToTBytes(Data);
	SignTB = IcsAsymSignDigestTB(DataTB, Tool->PrivateKey, Digest_sha256);
	SignTB = ConvertASNToP1363(SignTB);

	DataEnc = IcsBase64EncodeTB(SignTB);
	delete Tool;

	return (DataEnc);
}

TBytes ConvertASNToP1363(TBytes SignatureTB)
{
	TBytes bSignature;
	bSignature.Length = 64;

	TBytes bR = ExtraireR(SignatureTB);
	TBytes bS = ExtraireS(SignatureTB);

	System::Move(&bR[0], &bSignature[0], 32);
	System::Move(&bS[0], &bSignature[32], 32);

	return(bSignature);
}

TBytes ExtraireR(TBytes Signature)
{
	int debutR = (Signature[1] & 0x80) != 0 ? 3 : 2;
	int longueurR = Signature[debutR + 1];

	TBytes bR;
	bR.Length = 32;

	TBytes bTemp;
	bTemp.Length = longueurR;

	System::Move(&Signature[debutR + 2], &bTemp[0], longueurR);

	if (bTemp.Length == 33)
		System::Move(&bTemp[1], &bR[0], 32);
	else if (bTemp.Length <= 32)
		System::Move(&bTemp[0], &bR[32 - bTemp.Length], bTemp.Length);

	return(bR);
}

TBytes ExtraireS(TBytes Signature)
{
	int debutR = (Signature[1] & 0x80) != 0 ? 3 : 2;
	int longueurR = Signature[debutR + 1];
	int debutS = debutR + 2 + longueurR;
	int longueurS = Signature[debutS + 1];

	TBytes bS;
	bS.Length = 32;

	TBytes bTemp;
	bTemp.Length = longueurS;

	System::Move(&Signature[debutS + 2], &bTemp[0], longueurS);

	if (bTemp.Length == 33)
		System::Move(&bTemp[1], &bS[0], 32);
	else if (bTemp.Length <= 32)
		System::Move(&bTemp[0], &bS[32 - bTemp.Length], bTemp.Length);

	return(bS);
}

Eric

Share this post


Link to post

Adding the three functions to convert the ASN.1 signature to the simpler IEEE version would be good, but I need Delphi code for ICS. 

 

Angus

 

Share this post


Link to post
4 hours ago, Angus Robertson said:

Adding the three functions to convert the ASN.1 signature to the simpler IEEE version would be good, but I need Delphi code for ICS. 

 

Angus

 

I have done in my source code and i send to you for algorytm. It in C++ but i think its usefull for you also its fully tested and debugged :) Cheers !

Share this post


Link to post

Now i need to Encrypt with RSA public Key but the function StrEncRsa make fault on libcrypto-3.dll with the sample IcsPemTool this is normal

 

i take a look at source code and this function make a first call to EncryptPublicRSA with OutBuf = nil this could be the problem ?

 

i also try to make call directly to EncryptPublicRSA but C++ dont want to find a good declaration of this func ??

Share this post


Link to post

Those ICS encryption functions were written 15 years ago by another developer, I've never used them not aware anyone else has either, so untested. 

 

But you may have hit a change in latest version, make sure OverbyteDefs.inc has {$DEFINE OpenSSL_Deprecated}

 

Angus

 

Share this post


Link to post
52 minutes ago, Angus Robertson said:

Those ICS encryption functions were written 15 years ago by another developer, I've never used them not aware anyone else has either, so untested. 

 

But you may have hit a change in latest version, make sure OverbyteDefs.inc has {$DEFINE OpenSSL_Deprecated}

 

Angus

 

Thanks, you know if i can use it with a pem file contening only cert with only public key ?

 

The gouv only returning Cert with public key ?

 

He use X509Certificat to add to Windows Store and after he reload it for calling RSA Encrypt with PublicKey but whatever i search over internet and all openssl pkeyutl cmd i try always tell me 

 

openssl pkeyutl -encrypt -inkey CertificatPSI.pem -pubin -in pass.txt -out pass.enc
Could not find private key of public key from CertificatPSI.pem
pkeyutl: Error loading key

 

Im afraid about all about certificat :classic_blink:

Edited by Eric Winfly

Share this post


Link to post
1 hour ago, Eric Winfly said:

Thanks, you know if i can use it with a pem file contening only cert with only public key ?

 

The gouv only returning Cert with public key ?

 

He use X509Certificat to add to Windows Store and after he reload it for calling RSA Encrypt with PublicKey but whatever i search over internet and all openssl pkeyutl cmd i try always tell me 

 

openssl pkeyutl -encrypt -inkey CertificatPSI.pem -pubin -in pass.txt -out pass.enc
Could not find private key of public key from CertificatPSI.pem
pkeyutl: Error loading key

 

Im afraid about all about certificat :classic_blink:

Angus could you please find me a solution to Encrypt RSA Text from public key with Ics because i always receive libcrypto-3.dll access violation. I have try your new version 9.5 with deprectec_openssl activate but this not work, i have update openssl dll to the lastest 2.5.2 but always have acces violation ?

 

If i need to use an older version for Ics or OpenSsl for EncryptRsaPublic work, tell me, im very bad and i need to produce this project for the next week :classic_wacko:

 

Many thanks for all, Eric !

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×