|
Boost : |
From: Vyacheslav E. Andrejev (mortituris_at_[hidden])
Date: 2008-06-09 05:16:47
Hello,
Code that pads base64 output with '=' looks in basic_text_oprimitive.ipp
like following:
std::size_t padding = 2 - count % 3;
if(padding > 1)
*oi = '=';
if(padding > 2)
*oi = '=';
It will give the following transformations of a few simple strings:
"012" -> "MDEy="
"0123" -> "MDEyMw"
"01234" -> "MDEyMzQ"
"012345" -> "MDEyMzQ1="
Which violates the principle of the base 64 that the encoded output length
is multiple of 4 bytes. Right output for the samples above should be:
"012" -> "MDEy"
"0123" -> "MDEyMw=="
"01234" -> "MDEyMzQ="
"012345" -> "MDEyMzQ1"
The problem with the code above is that the condition (padding > 2) is never
satisfied. I think that the proper code should look like
std::size_t padding = 2 - count % 3;
if (padding < 2) {
*oi = '=';
if (padding > 0)
*oi = '=';
}
-- -- Vyacheslav Andrejev -- System Architect, Optech International, Inc.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk