mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Fix base32 implementation; make base32 implementation follow standard; add more tests for base32
svn:r1574
This commit is contained in:
parent
d237692396
commit
aa7cfd93e5
@ -183,10 +183,8 @@ Tor Rendezvous Spec
|
|||||||
1. Let H = H(PK).
|
1. Let H = H(PK).
|
||||||
2. Let H' = the first 80 bits of H, considering each octet from
|
2. Let H' = the first 80 bits of H, considering each octet from
|
||||||
most significant bit to least significant bit.
|
most significant bit to least significant bit.
|
||||||
2. Generate a 16-character encoding of H', taking H' 5 bits at
|
2. Generate a 16-character encoding of H', using base32 as defined
|
||||||
a time, and mapping each 5-bit value to a character as follows:
|
in RFC 3548.
|
||||||
0..25 map to the characters 'a'...'z', respectively.
|
|
||||||
26..31 map to the characters '0'...'5', respectively.
|
|
||||||
|
|
||||||
(We only use 80 bits instead of the 160 bits from SHA1 because we don't
|
(We only use 80 bits instead of the 160 bits from SHA1 because we don't
|
||||||
need to worry about man-in-the-middle attacks, and because it will make
|
need to worry about man-in-the-middle attacks, and because it will make
|
||||||
|
@ -1188,6 +1188,9 @@ base64_decode(char *dest, int destlen, const char *src, int srclen)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Implement base32 encoding as in rfc3548. Limitation: Requires that
|
||||||
|
* srclen is a multiple of 5.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
base32_encode(char *dest, int destlen, const char *src, int srclen)
|
base32_encode(char *dest, int destlen, const char *src, int srclen)
|
||||||
{
|
{
|
||||||
@ -1197,14 +1200,14 @@ base32_encode(char *dest, int destlen, const char *src, int srclen)
|
|||||||
if ((nbits%5) != 0)
|
if ((nbits%5) != 0)
|
||||||
/* We need an even multiple of 5 bits. */
|
/* We need an even multiple of 5 bits. */
|
||||||
return -1;
|
return -1;
|
||||||
if ((nbits/5)+1 < destlen)
|
if ((nbits/5)+1 > destlen)
|
||||||
/* Not enough space. */
|
/* Not enough space. */
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i=0,bit=0; bit < nbits; ++i, bit+=5) {
|
for (i=0,bit=0; bit < nbits; ++i, bit+=5) {
|
||||||
/* set v to the 16-bit value starting at src[bits/8], 0-padded. */
|
/* set v to the 16-bit value starting at src[bits/8], 0-padded. */
|
||||||
v = ((unsigned char)src[bit/8]) << 8;
|
v = ((uint8_t)src[bit/8]) << 8;
|
||||||
if (bit+5<nbits) v += src[(bit/8)+1];
|
if (bit+5<nbits) v += (uint8_t)src[(bit/8)+1];
|
||||||
/* set u to the 5-bit value at the bit'th bit of src. */
|
/* set u to the 5-bit value at the bit'th bit of src. */
|
||||||
u = (v >> (11-(bit%8))) & 0x1F;
|
u = (v >> (11-(bit%8))) & 0x1F;
|
||||||
dest[i] = BASE32_CHARS[u];
|
dest[i] = BASE32_CHARS[u];
|
||||||
|
@ -78,7 +78,7 @@ int crypto_pk_check_fingerprint_syntax(const char *s);
|
|||||||
|
|
||||||
int base64_encode(char *dest, int destlen, const char *src, int srclen);
|
int base64_encode(char *dest, int destlen, const char *src, int srclen);
|
||||||
int base64_decode(char *dest, int destlen, const char *src, int srclen);
|
int base64_decode(char *dest, int destlen, const char *src, int srclen);
|
||||||
#define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz012345"
|
#define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz234567"
|
||||||
int base32_encode(char *dest, int destlen, const char *src, int srclen);
|
int base32_encode(char *dest, int destlen, const char *src, int srclen);
|
||||||
|
|
||||||
/* Key negotiation */
|
/* Key negotiation */
|
||||||
|
@ -446,7 +446,13 @@ test_crypto()
|
|||||||
* By 5s: [00110 10101 10001 10110 10000 11100 10011 10011]
|
* By 5s: [00110 10101 10001 10110 10000 11100 10011 10011]
|
||||||
*/
|
*/
|
||||||
i = base32_encode(data2, 9, data1, 5);
|
i = base32_encode(data2, 9, data1, 5);
|
||||||
test_streq(data2, "gvrwq2tt");
|
test_streq(data2, "gvrwq4tt");
|
||||||
|
|
||||||
|
strcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4");
|
||||||
|
printf("-------\n");
|
||||||
|
i = base32_encode(data2, 30, data1, 10);
|
||||||
|
test_eq(i,0);
|
||||||
|
test_streq(data2, "772w2rfobvomsywe");
|
||||||
|
|
||||||
free(data1);
|
free(data1);
|
||||||
free(data2);
|
free(data2);
|
||||||
|
Loading…
Reference in New Issue
Block a user