[C++/OpenSSL]kleiner Frage zu EVP

kickerxy123

Erfahrenes Mitglied
Hallo!

Ich habe ein kleineres Problem mit EVP/OpenSSL.

C++:
EVP* t = new EVP();
cout << t->sign(msg, msgLen, &sign, &signLen)<<endl;
cout << t->verify(msg, msgLen, sign, signLen);
unsigned char* pub;
int pubLen;
cout << t->getPublicKey(&pub, &pubLen) << endl;
		
cout << pubLen << endl;
cout << t->setPublicKey(pub, pubLen); //problem here
Kurze Erläuterung: Ich verwende OpenSSL und dort speziell EVP.
Das signieren und verifizieren klappt wunderbar. Wenn ich nun den Pulic Key extrahieren möchte und anschließend einfach wieder setze, dann schlägt es fehl. Konkrete Implementierungen:
C++:
bool class::getPublicKey(unsigned char** outpub, int* outlen)
{ 
	*outlen= i2d_PUBKEY(pKey, NULL); 
	*outpub= (unsigned char*)OPENSSL_malloc(*outlen+ 1);
	i2d_PUBKEY(pKey, outpub);
}
C++:
bool class::setPublicKey(char* pubKey, int pubKeyLen)
{
pKey= d2i_PUBKEY(NULL, (const unsigned char**)&pubKey, pubKeyLen); //pKey: EVP_PKEY* 
if(!pKey)
{

	char error[1024];
	printf("error:%s\n", ERR_error_string(ERR_get_error(), error)); //wird ausgegeben
}
}

Fehlermeldung: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag


Kann mir bitte jemand helfen? Ich sehe den Fehler einfach nicht..
Habe die Codeschnippsel gekürzt auf das wesentliche ohne (hier) irrelevante Errorchecks.
Nach meinem Verständnis sollte ein i2d_PUBKEY gefolgt von d2i_PUBKEY problemlos möglich sein.
Leider kenne ich mich mit OpenSSL noch nicht so gut aus... (Die Dokumentation zu OpenSSL ist ein Witz meiner Meinung nach :( )
Viele Grüße
kickerxy123
 
Zuletzt bearbeitet:
Hi.

Anscheinend inkrementiert die i2d_PUBKEY Funktion den ihr übergebenen Zeiger. Du müßtest eine temporäre Variable verwenden, oder du kannst die Sache vereinfachen:
C++:
bool class::getPublicKey(unsigned char** outpub, int* outlen)
{ 
    *outpub = NULL;
    *outlen = i2d_PUBKEY(pKey, outpub);
}
Siehe http://www.openssl.org/support/faq.html#PROG3
 
Hi,

besten Dank - mit deiner Hilfe kann ich nun den Public und Private Key extrahieren und neu setzen ohne Probleme! Das hat mir vermutlich viel Zeit erspart

vg
kickerxy123
 

Neue Beiträge

Zurück