About time somebody did it. ;)
> On Jun 30, 2015, at 23:12 , Jeffrey Walton <[email protected]> wrote: > > Is anyone opposed to committing Base64URLEncoder and Base64URLDecoder classes? > > They are useful when interop'ing with web based gear, like JSON Web Keys > (JWKs). > > The patch is below. The documentation is available at > http://www.cryptopp.com/wiki/Base64URLEncoder. > > ********** > > Index: base64.h > =================================================================== > --- base64.h (revision 541) > +++ base64.h (working copy) > @@ -5,7 +5,8 @@ > > NAMESPACE_BEGIN(CryptoPP) > > -//! Base64 Encoder Class > +//! Base64 Encoder Class > +// https://tools.ietf.org/html/rfc4648#section-4 > class Base64Encoder : public SimpleProxyFilter > { > public: > @@ -14,19 +15,47 @@ > { > IsolatedInitialize(MakeParameters(Name::InsertLineBreaks(), > insertLineBreaks)(Name::MaxLineLength(), maxLineLength)); > } > - > + > void IsolatedInitialize(const NameValuePairs ¶meters); > }; > > -//! Base64 Decoder Class > +//! Base64 Decoder Class > +// https://tools.ietf.org/html/rfc4648#section-4 > class Base64Decoder : public BaseN_Decoder > { > public: > Base64Decoder(BufferedTransformation *attachment = NULL) > : BaseN_Decoder(GetDecodingLookupArray(), 6, attachment) {} > + > + void IsolatedInitialize(const NameValuePairs ¶meters) {} > + > +private: > + static const int * CRYPTOPP_API GetDecodingLookupArray(); > +}; > > +//! Base64 URL Encoder Class > +// https://tools.ietf.org/html/rfc4648#section-5 > +class Base64URLEncoder : public SimpleProxyFilter > +{ > +public: > + Base64URLEncoder(BufferedTransformation *attachment = NULL, bool > insertLineBreaks = false, int maxLineLength = -1) > + : SimpleProxyFilter(new BaseN_Encoder(new Grouper), attachment) > + { > + IsolatedInitialize(MakeParameters(Name::InsertLineBreaks(), > insertLineBreaks)(Name::MaxLineLength(), maxLineLength)); > + } > + > + void IsolatedInitialize(const NameValuePairs ¶meters); > +}; > + > +//! Base64 URL Decoder Class > +class Base64URLDecoder : public BaseN_Decoder > +{ > +public: > + Base64URLDecoder(BufferedTransformation *attachment = NULL) > + : BaseN_Decoder(GetDecodingLookupArray(), 6, attachment) {} > + > void IsolatedInitialize(const NameValuePairs ¶meters) {} > - > + > private: > static const int * CRYPTOPP_API GetDecodingLookupArray(); > }; > Index: base64.cpp > =================================================================== > --- base64.cpp (revision 541) > +++ base64.cpp (working copy) > @@ -5,8 +5,13 @@ > > NAMESPACE_BEGIN(CryptoPP) > > -static const byte s_vec[] = > - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; > + > +// Base64 > +static const byte s_vec1[] = > + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; > +// Base64URL > +static const byte s_vec2[] = > + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; > static const byte s_padding = '='; > > void Base64Encoder::IsolatedInitialize(const NameValuePairs ¶meters) > @@ -18,7 +23,7 @@ > > m_filter->Initialize(CombinedNameValuePairs( > parameters, > - MakeParameters(Name::EncodingLookupArray(), &s_vec[0], false) > + MakeParameters(Name::EncodingLookupArray(), &s_vec1[0], false) > (Name::PaddingByte(), s_padding) > (Name::GroupSize(), insertLineBreaks ? maxLineLength : 0) > (Name::Separator(), ConstByteArrayParameter(lineBreak)) > @@ -26,14 +31,44 @@ > (Name::Log2Base(), 6, true))); > } > > +void Base64URLEncoder::IsolatedInitialize(const NameValuePairs ¶meters) > +{ > + bool insertLineBreaks = > parameters.GetValueWithDefault(Name::InsertLineBreaks(), true); > + int maxLineLength = > parameters.GetIntValueWithDefault(Name::MaxLineLength(), 72); > + > + const char *lineBreak = insertLineBreaks ? "\n" : ""; > + > + m_filter->Initialize(CombinedNameValuePairs( > + parameters, > + MakeParameters(Name::EncodingLookupArray(), &s_vec2[0], false) > + (Name::PaddingByte(), s_padding) > + (Name::GroupSize(), insertLineBreaks ? maxLineLength : 0) > + (Name::Separator(), ConstByteArrayParameter(lineBreak)) > + (Name::Terminator(), ConstByteArrayParameter(lineBreak)) > + (Name::Log2Base(), 6, true))); > +} > + > const int *Base64Decoder::GetDecodingLookupArray() > { > static volatile bool s_initialized = false; > static int s_array[256]; > + > + if (!s_initialized) > + { > + InitializeDecodingLookupArray(s_array, s_vec1, 64, false); > + s_initialized = true; > + } > + return s_array; > +} > > +const int *Base64URLDecoder::GetDecodingLookupArray() > +{ > + static volatile bool s_initialized = false; > + static int s_array[256]; > + > if (!s_initialized) > { > - InitializeDecodingLookupArray(s_array, s_vec, 64, false); > + InitializeDecodingLookupArray(s_array, s_vec2, 64, false); > s_initialized = true; > } > return s_array; > > > -- > -- > You received this message because you are subscribed to the "Crypto++ Users" > Google Group. > To unsubscribe, send an email to [email protected]. > More information about Crypto++ and this group is available at > http://www.cryptopp.com <http://www.cryptopp.com/>. > --- > You received this message because you are subscribed to the Google Groups > "Crypto++ Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] > <mailto:[email protected]>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- -- You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to [email protected]. More information about Crypto++ and this group is available at http://www.cryptopp.com. --- You received this message because you are subscribed to the Google Groups "Crypto++ Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
