hardened OpenPGP parser
This commit is contained in:
committed by
Martin Willi
parent
c146b2c8df
commit
9410aa262a
@@ -605,39 +605,47 @@ static gmp_rsa_public_key_t *load_asn1_der(chunk_t blob)
|
|||||||
*/
|
*/
|
||||||
static gmp_rsa_public_key_t* load_pgp(chunk_t blob)
|
static gmp_rsa_public_key_t* load_pgp(chunk_t blob)
|
||||||
{
|
{
|
||||||
chunk_t exponent, modulus;
|
int objectID;
|
||||||
chunk_t packet = blob;
|
chunk_t packet = blob;
|
||||||
private_gmp_rsa_public_key_t *this = gmp_rsa_public_key_create_empty();
|
private_gmp_rsa_public_key_t *this = gmp_rsa_public_key_create_empty();
|
||||||
|
|
||||||
mpz_init(this->n);
|
mpz_init(this->n);
|
||||||
mpz_init(this->e);
|
mpz_init(this->e);
|
||||||
|
|
||||||
/* modulus n */
|
for (objectID = PUB_KEY_MODULUS; objectID <= PUB_KEY_EXPONENT; objectID++)
|
||||||
modulus.len = (pgp_length(&packet, 2) + 7) / BITS_PER_BYTE;
|
|
||||||
modulus.ptr = packet.ptr;
|
|
||||||
if (modulus.len > packet.len)
|
|
||||||
{
|
{
|
||||||
DBG1("OpenPGP public key blob too short for modulus");
|
chunk_t object;
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
packet.ptr += modulus.len;
|
|
||||||
packet.len -= modulus.len;
|
|
||||||
DBG2("L3 - modulus:");
|
|
||||||
DBG3("%B", &modulus);
|
|
||||||
|
|
||||||
/* public exponent e */
|
DBG2("L3 - %s:", pubkeyObjects[objectID].name);
|
||||||
exponent.len = (pgp_length(&packet, 2) + 7) / BITS_PER_BYTE;
|
object.len = pgp_length(&packet, 2);
|
||||||
exponent.ptr = packet.ptr;
|
|
||||||
if (exponent.len > packet.len)
|
if (object.len == PGP_INVALID_LENGTH)
|
||||||
{
|
{
|
||||||
DBG1("OpenPGP public key blob too short for exponent");
|
DBG1("OpenPGP length is invalid");
|
||||||
goto end;
|
goto end;
|
||||||
|
}
|
||||||
|
object.len = (object.len + 7) / BITS_PER_BYTE;
|
||||||
|
if (object.len > packet.len)
|
||||||
|
{
|
||||||
|
DBG1("OpenPGP field is too short");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
object.ptr = packet.ptr;
|
||||||
|
packet.ptr += object.len;
|
||||||
|
packet.len -= object.len;
|
||||||
|
DBG4("%B", &object);
|
||||||
|
|
||||||
|
switch (objectID)
|
||||||
|
{
|
||||||
|
case PUB_KEY_MODULUS:
|
||||||
|
mpz_import(this->n, object.len, 1, 1, 1, 0, object.ptr);
|
||||||
|
break;
|
||||||
|
case PUB_KEY_EXPONENT:
|
||||||
|
mpz_import(this->e, object.len, 1, 1, 1, 0, object.ptr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
DBG2("L3 - public exponent:");
|
|
||||||
DBG3("%B", &exponent);
|
|
||||||
|
|
||||||
mpz_import(this->n, modulus.len, 1, 1, 1, 0, modulus.ptr);
|
|
||||||
mpz_import(this->e, exponent.len, 1, 1, 1, 0, exponent.ptr);
|
|
||||||
this->k = (mpz_sizeinbase(this->n, 2) + 7) / BITS_PER_BYTE;
|
this->k = (mpz_sizeinbase(this->n, 2) + 7) / BITS_PER_BYTE;
|
||||||
free(blob.ptr);
|
free(blob.ptr);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user