mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Bug #5170 - i2d_RSAPublicKey supports allocating its own output buffer
This commit is contained in:
parent
b235c1c194
commit
2132d036e3
@ -1,2 +1,4 @@
|
|||||||
o Code simplification and refactoring:
|
o Code simplification and refactoring:
|
||||||
- Remove contrib/id_to_fp.c since it wasn't used anywhere.
|
- Remove contrib/id_to_fp.c since it wasn't used anywhere.
|
||||||
|
- Since OpenSSL 0.9.7 i2d_RSAPublicKey supports allocating output buffer.
|
||||||
|
Use this feature to avoid calling this function twice. Fixes #5170.
|
||||||
|
@ -1152,22 +1152,21 @@ int
|
|||||||
crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len)
|
crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
unsigned char *buf, *cp;
|
unsigned char *buf = NULL;
|
||||||
len = i2d_RSAPublicKey(pk->key, NULL);
|
|
||||||
if (len < 0 || (size_t)len > dest_len || dest_len > SIZE_T_CEILING)
|
len = i2d_RSAPublicKey(pk->key, &buf);
|
||||||
|
if (len < 0 || buf == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
cp = buf = tor_malloc(len+1);
|
|
||||||
len = i2d_RSAPublicKey(pk->key, &cp);
|
if ((size_t)len > dest_len || dest_len > SIZE_T_CEILING) {
|
||||||
if (len < 0) {
|
OPENSSL_free(buf);
|
||||||
crypto_log_errors(LOG_WARN,"encoding public key");
|
|
||||||
tor_free(buf);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* We don't encode directly into 'dest', because that would be illegal
|
/* We don't encode directly into 'dest', because that would be illegal
|
||||||
* type-punning. (C99 is smarter than me, C99 is smarter than me...)
|
* type-punning. (C99 is smarter than me, C99 is smarter than me...)
|
||||||
*/
|
*/
|
||||||
memcpy(dest,buf,len);
|
memcpy(dest,buf,len);
|
||||||
tor_free(buf);
|
OPENSSL_free(buf);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1198,24 +1197,17 @@ crypto_pk_asn1_decode(const char *str, size_t len)
|
|||||||
int
|
int
|
||||||
crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out)
|
crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out)
|
||||||
{
|
{
|
||||||
unsigned char *buf, *bufp;
|
unsigned char *buf = NULL;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
len = i2d_RSAPublicKey(pk->key, NULL);
|
len = i2d_RSAPublicKey(pk->key, &buf);
|
||||||
if (len < 0)
|
if (len < 0 || buf == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
buf = bufp = tor_malloc(len+1);
|
|
||||||
len = i2d_RSAPublicKey(pk->key, &bufp);
|
|
||||||
if (len < 0) {
|
|
||||||
crypto_log_errors(LOG_WARN,"encoding public key");
|
|
||||||
tor_free(buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (crypto_digest(digest_out, (char*)buf, len) < 0) {
|
if (crypto_digest(digest_out, (char*)buf, len) < 0) {
|
||||||
tor_free(buf);
|
OPENSSL_free(buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tor_free(buf);
|
OPENSSL_free(buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1224,24 +1216,17 @@ crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out)
|
|||||||
int
|
int
|
||||||
crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out)
|
crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out)
|
||||||
{
|
{
|
||||||
unsigned char *buf, *bufp;
|
unsigned char *buf = NULL;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
len = i2d_RSAPublicKey(pk->key, NULL);
|
len = i2d_RSAPublicKey(pk->key, &buf);
|
||||||
if (len < 0)
|
if (len < 0 || buf == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
buf = bufp = tor_malloc(len+1);
|
|
||||||
len = i2d_RSAPublicKey(pk->key, &bufp);
|
|
||||||
if (len < 0) {
|
|
||||||
crypto_log_errors(LOG_WARN,"encoding public key");
|
|
||||||
tor_free(buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (crypto_digest_all(digests_out, (char*)buf, len) < 0) {
|
if (crypto_digest_all(digests_out, (char*)buf, len) < 0) {
|
||||||
tor_free(buf);
|
OPENSSL_free(buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tor_free(buf);
|
OPENSSL_free(buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user