diff --git a/src/base64.c b/src/base64.c index 803d938..9889fb9 100644 --- a/src/base64.c +++ b/src/base64.c @@ -95,9 +95,13 @@ base64_encode(char *buf, size_t *buflen, const void *data, size_t size) } /* how many chars can we encode within the buf */ - maxsize = BLKSIZE_RAW * (*buflen / BLKSIZE_ENC - 1) - 1; + maxsize = BLKSIZE_RAW * (*buflen / BLKSIZE_ENC); /* how big will the encoded data be */ - newsize = BLKSIZE_ENC * (size / BLKSIZE_RAW + 1) + 1; + newsize = BLKSIZE_ENC * (size / BLKSIZE_RAW); + if (size % BLKSIZE_RAW) { + newsize += BLKSIZE_ENC; + } + /* if the buffer is too small, eat some of the data */ if (*buflen < newsize) { size = maxsize; @@ -120,7 +124,7 @@ base64_encode(char *buf, size_t *buflen, const void *data, size_t size) /* store number of bytes from data that was used */ *buflen = size; - return strlen(buf) - 1; + return strlen(buf); } #define DECODE_ERROR 0xffffffff diff --git a/src/iodine.c b/src/iodine.c index cd12d0d..80e7222 100644 --- a/src/iodine.c +++ b/src/iodine.c @@ -140,7 +140,7 @@ build_hostname(char *buf, size_t buflen, size_t space; char *b; - space = MIN(0xFF, buflen) - strlen(topdomain) - 5; + space = MIN(0xFF, buflen) - strlen(topdomain) - 7; if (!encoder->places_dots()) space -= (space / 57); /* space for dots */ diff --git a/tests/base64.c b/tests/base64.c index ccd71c4..bd0e9ce 100644 --- a/tests/base64.c +++ b/tests/base64.c @@ -99,6 +99,48 @@ START_TEST(test_base64_decode) } END_TEST +START_TEST(test_base64_blksize) +{ + size_t rawlen; + size_t enclen; + char *rawbuf; + char *encbuf; + struct encoder *b64; + int i; + int val; + + b64 = get_base64_encoder(); + + rawlen = b64->blocksize_raw(); + enclen = b64->blocksize_encoded(); + + rawbuf = malloc(rawlen + 16); + encbuf = malloc(enclen + 16); + + for (i = 0; i < rawlen; i++) { + rawbuf[i] = 'A'; + } + rawbuf[i] = 0; + + val = b64->encode(encbuf, &enclen, rawbuf, rawlen); + + fail_unless(rawlen == 3, "raw length was %d not 3", rawlen); + fail_unless(enclen == 3, "encoded %d bytes, not 3", enclen); + fail_unless(val == 4, "encoded string %s was length %d", encbuf, val); + + memset(rawbuf, 0, rawlen + 16); + + enclen = val; + val = b64->decode(rawbuf, &rawlen, encbuf, enclen); + + fail_unless(rawlen == 3, "raw length was %d not 3", rawlen); + fail_unless(val == 3); + for (i = 0; i < rawlen; i++) { + fail_unless(rawbuf[i] == 'A'); + } +} +END_TEST + TCase * test_base64_create_tests() { @@ -107,6 +149,7 @@ test_base64_create_tests() tc = tcase_create("Base64"); tcase_add_loop_test(tc, test_base64_encode, 0, TUPLES); tcase_add_loop_test(tc, test_base64_decode, 0, TUPLES); + tcase_add_test(tc, test_base64_blksize); return tc; }