mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Merge branch 'tor-github/pr/611'
This commit is contained in:
commit
7fbfdf2af7
4
changes/ticket28913
Normal file
4
changes/ticket28913
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
o Code simplification and refactoring:
|
||||||
|
- Make the base32_decode() API return the number of bytes written,
|
||||||
|
for consistency with base64_decode().
|
||||||
|
Closes ticket 28913.
|
@ -4444,7 +4444,8 @@ handle_control_hsfetch(control_connection_t *conn, uint32_t len,
|
|||||||
} else if (strcmpstart(arg1, v2_str) == 0 &&
|
} else if (strcmpstart(arg1, v2_str) == 0 &&
|
||||||
rend_valid_descriptor_id(arg1 + v2_str_len) &&
|
rend_valid_descriptor_id(arg1 + v2_str_len) &&
|
||||||
base32_decode(digest, sizeof(digest), arg1 + v2_str_len,
|
base32_decode(digest, sizeof(digest), arg1 + v2_str_len,
|
||||||
REND_DESC_ID_V2_LEN_BASE32) == 0) {
|
REND_DESC_ID_V2_LEN_BASE32) ==
|
||||||
|
REND_DESC_ID_V2_LEN_BASE32) {
|
||||||
/* We have a well formed version 2 descriptor ID. Keep the decoded value
|
/* We have a well formed version 2 descriptor ID. Keep the decoded value
|
||||||
* of the id. */
|
* of the id. */
|
||||||
desc_id = digest;
|
desc_id = digest;
|
||||||
|
@ -1561,7 +1561,10 @@ parse_auth_file_content(const char *client_key_str)
|
|||||||
auth = tor_malloc_zero(sizeof(hs_client_service_authorization_t));
|
auth = tor_malloc_zero(sizeof(hs_client_service_authorization_t));
|
||||||
if (base32_decode((char *) auth->enc_seckey.secret_key,
|
if (base32_decode((char *) auth->enc_seckey.secret_key,
|
||||||
sizeof(auth->enc_seckey.secret_key),
|
sizeof(auth->enc_seckey.secret_key),
|
||||||
seckey_b32, strlen(seckey_b32)) < 0) {
|
seckey_b32, strlen(seckey_b32)) !=
|
||||||
|
sizeof(auth->enc_seckey.secret_key)) {
|
||||||
|
log_warn(LD_REND, "Client authorization encoded base32 private key "
|
||||||
|
"can't be decoded: %s", seckey_b32);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
strncpy(auth->onion_address, onion_address, HS_SERVICE_ADDR_LEN_BASE32);
|
strncpy(auth->onion_address, onion_address, HS_SERVICE_ADDR_LEN_BASE32);
|
||||||
|
@ -926,7 +926,8 @@ hs_parse_address(const char *address, ed25519_public_key_t *key_out,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Decode address so we can extract needed fields. */
|
/* Decode address so we can extract needed fields. */
|
||||||
if (base32_decode(decoded, sizeof(decoded), address, strlen(address)) < 0) {
|
if (base32_decode(decoded, sizeof(decoded), address, strlen(address))
|
||||||
|
!= sizeof(decoded)) {
|
||||||
log_warn(LD_REND, "Service address %s can't be decoded.",
|
log_warn(LD_REND, "Service address %s can't be decoded.",
|
||||||
escaped_safe_str(address));
|
escaped_safe_str(address));
|
||||||
goto invalid;
|
goto invalid;
|
||||||
|
@ -1179,7 +1179,8 @@ parse_authorized_client(const char *client_key_str)
|
|||||||
client = tor_malloc_zero(sizeof(hs_service_authorized_client_t));
|
client = tor_malloc_zero(sizeof(hs_service_authorized_client_t));
|
||||||
if (base32_decode((char *) client->client_pk.public_key,
|
if (base32_decode((char *) client->client_pk.public_key,
|
||||||
sizeof(client->client_pk.public_key),
|
sizeof(client->client_pk.public_key),
|
||||||
pubkey_b32, strlen(pubkey_b32)) < 0) {
|
pubkey_b32, strlen(pubkey_b32)) !=
|
||||||
|
sizeof(client->client_pk.public_key)) {
|
||||||
log_warn(LD_REND, "Client authorization public key cannot be decoded: %s",
|
log_warn(LD_REND, "Client authorization public key cannot be decoded: %s",
|
||||||
pubkey_b32);
|
pubkey_b32);
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -593,10 +593,10 @@ rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc)
|
|||||||
char desc_id_digest[DIGEST_LEN];
|
char desc_id_digest[DIGEST_LEN];
|
||||||
tor_assert(rend_cache_v2_dir);
|
tor_assert(rend_cache_v2_dir);
|
||||||
if (base32_decode(desc_id_digest, DIGEST_LEN,
|
if (base32_decode(desc_id_digest, DIGEST_LEN,
|
||||||
desc_id, REND_DESC_ID_V2_LEN_BASE32) < 0) {
|
desc_id, REND_DESC_ID_V2_LEN_BASE32) != DIGEST_LEN) {
|
||||||
log_fn(LOG_PROTOCOL_WARN, LD_REND,
|
log_fn(LOG_PROTOCOL_WARN, LD_REND,
|
||||||
"Rejecting v2 rendezvous descriptor request -- descriptor ID "
|
"Rejecting v2 rendezvous descriptor request -- descriptor ID "
|
||||||
"contains illegal characters: %s",
|
"has wrong length or illegal characters: %s",
|
||||||
safe_str(desc_id));
|
safe_str(desc_id));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -854,7 +854,8 @@ rend_cache_store_v2_desc_as_client(const char *desc,
|
|||||||
*entry = NULL;
|
*entry = NULL;
|
||||||
}
|
}
|
||||||
if (base32_decode(want_desc_id, sizeof(want_desc_id),
|
if (base32_decode(want_desc_id, sizeof(want_desc_id),
|
||||||
desc_id_base32, strlen(desc_id_base32)) != 0) {
|
desc_id_base32, strlen(desc_id_base32)) !=
|
||||||
|
sizeof(want_desc_id)) {
|
||||||
log_warn(LD_BUG, "Couldn't decode base32 %s for descriptor id.",
|
log_warn(LD_BUG, "Couldn't decode base32 %s for descriptor id.",
|
||||||
escaped_safe_str_client(desc_id_base32));
|
escaped_safe_str_client(desc_id_base32));
|
||||||
goto err;
|
goto err;
|
||||||
@ -1005,4 +1006,3 @@ rend_cache_store_v2_desc_as_client(const char *desc,
|
|||||||
tor_free(intro_content);
|
tor_free(intro_content);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,9 +171,10 @@ rend_compute_v2_desc_id(char *desc_id_out, const char *service_id,
|
|||||||
}
|
}
|
||||||
/* Convert service ID to binary. */
|
/* Convert service ID to binary. */
|
||||||
if (base32_decode(service_id_binary, REND_SERVICE_ID_LEN,
|
if (base32_decode(service_id_binary, REND_SERVICE_ID_LEN,
|
||||||
service_id, REND_SERVICE_ID_LEN_BASE32) < 0) {
|
service_id, REND_SERVICE_ID_LEN_BASE32) !=
|
||||||
|
REND_SERVICE_ID_LEN) {
|
||||||
log_warn(LD_REND, "Could not compute v2 descriptor ID: "
|
log_warn(LD_REND, "Could not compute v2 descriptor ID: "
|
||||||
"Illegal characters in service ID: %s",
|
"Illegal characters or wrong length for service ID: %s",
|
||||||
safe_str_client(service_id));
|
safe_str_client(service_id));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -143,8 +143,9 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (base32_decode(desc_id_out, DIGEST_LEN,
|
if (base32_decode(desc_id_out, DIGEST_LEN,
|
||||||
tok->args[0], REND_DESC_ID_V2_LEN_BASE32) < 0) {
|
tok->args[0], REND_DESC_ID_V2_LEN_BASE32) != DIGEST_LEN) {
|
||||||
log_warn(LD_REND, "Descriptor ID contains illegal characters: %s",
|
log_warn(LD_REND,
|
||||||
|
"Descriptor ID has wrong length or illegal characters: %s",
|
||||||
tok->args[0]);
|
tok->args[0]);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -174,8 +175,10 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
|
|||||||
log_warn(LD_REND, "Invalid secret ID part: '%s'", tok->args[0]);
|
log_warn(LD_REND, "Invalid secret ID part: '%s'", tok->args[0]);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (base32_decode(secret_id_part, DIGEST_LEN, tok->args[0], 32) < 0) {
|
if (base32_decode(secret_id_part, DIGEST_LEN, tok->args[0], 32) !=
|
||||||
log_warn(LD_REND, "Secret ID part contains illegal characters: %s",
|
DIGEST_LEN) {
|
||||||
|
log_warn(LD_REND,
|
||||||
|
"Secret ID part has wrong length or illegal characters: %s",
|
||||||
tok->args[0]);
|
tok->args[0]);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -429,8 +432,10 @@ rend_parse_introduction_points(rend_service_descriptor_t *parsed,
|
|||||||
/* Parse identifier. */
|
/* Parse identifier. */
|
||||||
tok = find_by_keyword(tokens, R_IPO_IDENTIFIER);
|
tok = find_by_keyword(tokens, R_IPO_IDENTIFIER);
|
||||||
if (base32_decode(info->identity_digest, DIGEST_LEN,
|
if (base32_decode(info->identity_digest, DIGEST_LEN,
|
||||||
tok->args[0], REND_INTRO_POINT_ID_LEN_BASE32) < 0) {
|
tok->args[0], REND_INTRO_POINT_ID_LEN_BASE32) !=
|
||||||
log_warn(LD_REND, "Identity digest contains illegal characters: %s",
|
DIGEST_LEN) {
|
||||||
|
log_warn(LD_REND,
|
||||||
|
"Identity digest has wrong length or illegal characters: %s",
|
||||||
tok->args[0]);
|
tok->args[0]);
|
||||||
rend_intro_point_free(intro);
|
rend_intro_point_free(intro);
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -84,7 +84,7 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Implements base32 decoding as in RFC 4648.
|
/** Implements base32 decoding as in RFC 4648.
|
||||||
* Returns 0 if successful, -1 otherwise.
|
* Return the number of bytes decoded if successful; -1 otherwise.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
base32_decode(char *dest, size_t destlen, const char *src, size_t srclen)
|
base32_decode(char *dest, size_t destlen, const char *src, size_t srclen)
|
||||||
@ -147,7 +147,7 @@ base32_decode(char *dest, size_t destlen, const char *src, size_t srclen)
|
|||||||
memset(tmp, 0, srclen); /* on the heap, this should be safe */
|
memset(tmp, 0, srclen); /* on the heap, this should be safe */
|
||||||
tor_free(tmp);
|
tor_free(tmp);
|
||||||
tmp = NULL;
|
tmp = NULL;
|
||||||
return 0;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BASE64_OPENSSL_LINELEN 64
|
#define BASE64_OPENSSL_LINELEN 64
|
||||||
|
@ -86,15 +86,13 @@ b16_enc(const chunk_t *inp)
|
|||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static chunk_t *
|
static chunk_t *
|
||||||
b32_dec(const chunk_t *inp)
|
b32_dec(const chunk_t *inp)
|
||||||
{
|
{
|
||||||
chunk_t *ch = chunk_new(inp->len);//XXXX
|
chunk_t *ch = chunk_new(inp->len);//XXXX
|
||||||
int r = base32_decode((char *)ch->buf, ch->len, (char *)inp->buf, inp->len);
|
int r = base32_decode((char *)ch->buf, ch->len, (char *)inp->buf, inp->len);
|
||||||
if (r >= 0) {
|
if (r >= 0) {
|
||||||
ch->len = r; // XXXX we need some way to get the actual length of
|
ch->len = r;
|
||||||
// XXXX the output here.
|
|
||||||
} else {
|
} else {
|
||||||
chunk_free(ch);
|
chunk_free(ch);
|
||||||
}
|
}
|
||||||
@ -108,7 +106,6 @@ b32_enc(const chunk_t *inp)
|
|||||||
ch->len = strlen((char *) ch->buf);
|
ch->len = strlen((char *) ch->buf);
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static chunk_t *
|
static chunk_t *
|
||||||
b64_dec(const chunk_t *inp)
|
b64_dec(const chunk_t *inp)
|
||||||
@ -222,10 +219,7 @@ fuzz_main(const uint8_t *stdin_buf, size_t data_size)
|
|||||||
ENCODE_ROUNDTRIP(b16_enc, b16_dec, chunk_free_);
|
ENCODE_ROUNDTRIP(b16_enc, b16_dec, chunk_free_);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
/*
|
|
||||||
XXXX see notes above about our base-32 functions.
|
|
||||||
ENCODE_ROUNDTRIP(b32_enc, b32_dec, chunk_free_);
|
ENCODE_ROUNDTRIP(b32_enc, b32_dec, chunk_free_);
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ENCODE_ROUNDTRIP(b64_enc, b64_dec, chunk_free_);
|
ENCODE_ROUNDTRIP(b64_enc, b64_dec, chunk_free_);
|
||||||
|
@ -1703,13 +1703,13 @@ test_crypto_base32_decode(void *arg)
|
|||||||
/* Encode and decode a random string. */
|
/* Encode and decode a random string. */
|
||||||
base32_encode(encoded, 96 + 1, plain, 60);
|
base32_encode(encoded, 96 + 1, plain, 60);
|
||||||
res = base32_decode(decoded, 60, encoded, 96);
|
res = base32_decode(decoded, 60, encoded, 96);
|
||||||
tt_int_op(res,OP_EQ, 0);
|
tt_int_op(res, OP_EQ, 60);
|
||||||
tt_mem_op(plain,OP_EQ, decoded, 60);
|
tt_mem_op(plain,OP_EQ, decoded, 60);
|
||||||
/* Encode, uppercase, and decode a random string. */
|
/* Encode, uppercase, and decode a random string. */
|
||||||
base32_encode(encoded, 96 + 1, plain, 60);
|
base32_encode(encoded, 96 + 1, plain, 60);
|
||||||
tor_strupper(encoded);
|
tor_strupper(encoded);
|
||||||
res = base32_decode(decoded, 60, encoded, 96);
|
res = base32_decode(decoded, 60, encoded, 96);
|
||||||
tt_int_op(res,OP_EQ, 0);
|
tt_int_op(res, OP_EQ, 60);
|
||||||
tt_mem_op(plain,OP_EQ, decoded, 60);
|
tt_mem_op(plain,OP_EQ, decoded, 60);
|
||||||
/* Change encoded string and decode. */
|
/* Change encoded string and decode. */
|
||||||
if (encoded[0] == 'A' || encoded[0] == 'a')
|
if (encoded[0] == 'A' || encoded[0] == 'a')
|
||||||
@ -1717,12 +1717,12 @@ test_crypto_base32_decode(void *arg)
|
|||||||
else
|
else
|
||||||
encoded[0] = 'A';
|
encoded[0] = 'A';
|
||||||
res = base32_decode(decoded, 60, encoded, 96);
|
res = base32_decode(decoded, 60, encoded, 96);
|
||||||
tt_int_op(res,OP_EQ, 0);
|
tt_int_op(res, OP_EQ, 60);
|
||||||
tt_mem_op(plain,OP_NE, decoded, 60);
|
tt_mem_op(plain,OP_NE, decoded, 60);
|
||||||
/* Bad encodings. */
|
/* Bad encodings. */
|
||||||
encoded[0] = '!';
|
encoded[0] = '!';
|
||||||
res = base32_decode(decoded, 60, encoded, 96);
|
res = base32_decode(decoded, 60, encoded, 96);
|
||||||
tt_int_op(0, OP_GT, res);
|
tt_int_op(res, OP_LT, 0);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
;
|
;
|
||||||
|
@ -346,7 +346,7 @@ test_util_format_base32_decode(void *arg)
|
|||||||
const char *src = "mjwgc2dcnrswqmjs";
|
const char *src = "mjwgc2dcnrswqmjs";
|
||||||
|
|
||||||
ret = base32_decode(dst, strlen(expected), src, strlen(src));
|
ret = base32_decode(dst, strlen(expected), src, strlen(src));
|
||||||
tt_int_op(ret, OP_EQ, 0);
|
tt_int_op(ret, OP_EQ, 10);
|
||||||
tt_str_op(expected, OP_EQ, dst);
|
tt_str_op(expected, OP_EQ, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +357,7 @@ test_util_format_base32_decode(void *arg)
|
|||||||
const char *src = "mjwgc2dcnrswq";
|
const char *src = "mjwgc2dcnrswq";
|
||||||
|
|
||||||
ret = base32_decode(dst, strlen(expected), src, strlen(src));
|
ret = base32_decode(dst, strlen(expected), src, strlen(src));
|
||||||
tt_int_op(ret, OP_EQ, 0);
|
tt_int_op(ret, OP_EQ, 8);
|
||||||
tt_mem_op(expected, OP_EQ, dst, strlen(expected));
|
tt_mem_op(expected, OP_EQ, dst, strlen(expected));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user