]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/base64.cc
2 * This file is part of PowerDNS or dnsdist.
3 * Copyright -- PowerDNS.COM B.V. and its contributors
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * In addition, for the avoidance of any doubt, permission is granted to
10 * link this program with OpenSSL and to (re)distribute the binaries
11 * produced as the result of such linking.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 #include <boost/scoped_array.hpp>
28 #include <openssl/bio.h>
29 #include <openssl/evp.h>
31 template<typename Container
> int B64Decode(const std::string
& src
, Container
& dst
)
37 int dlen
= ( src
.length() * 6 + 7 ) / 8 ;
41 bio
= BIO_new(BIO_s_mem());
42 BIO_write(bio
, src
.c_str(), src
.length());
43 b64
= BIO_new(BIO_f_base64());
44 bio
= BIO_push(b64
, bio
);
45 BIO_set_flags(bio
, BIO_FLAGS_BASE64_NO_NL
);
46 olen
= BIO_read(b64
, &dst
.at(0), dlen
);
47 if ((olen
== 0 || olen
== -1) && BIO_should_retry(bio
)) {
49 throw std::runtime_error("BIO_read failed to read all data from memory buffer");
59 template int B64Decode
<std::string
>(const std::string
& strInput
, std::string
& strOutput
);
61 std::string
Base64Encode(const std::string
& src
)
66 b64
= BIO_new(BIO_f_base64());
67 bio
= BIO_new(BIO_s_mem());
68 bio
= BIO_push(b64
, bio
);
69 BIO_set_flags(bio
, BIO_FLAGS_BASE64_NO_NL
);
70 int bioWriteRet
= BIO_write(bio
, src
.c_str(), src
.length());
71 if (bioWriteRet
< 0 || (size_t) bioWriteRet
!= src
.length()) {
73 throw std::runtime_error("BIO_write failed to write all data to memory buffer");
78 olen
= BIO_get_mem_data(bio
, &pp
);
80 out
= std::string(pp
, olen
);
91 std::string in
= "PowerDNS Test String 1";
92 std::string out
= Base64Encode(in
);
93 std::cout
<< out
<< std::endl
;
94 if (out
!= "UG93ZXJETlMgVGVzdCBTdHJpbmcgMQ==") {
95 std::cerr
<< "output did not match expected data" << std::endl
;
97 std::string roundtrip
;
98 B64Decode(out
, roundtrip
);
99 std::cout
<< roundtrip
<< std::endl
;
100 if (roundtrip
!= in
) {
101 std::cerr
<< "roundtripped data did not match input data" << std::endl
;