]>
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 int B64Decode(const std::string
& src
, std::string
& dst
)
37 int dlen
= ( src
.length() * 6 + 7 ) / 8 ;
39 boost::scoped_array
<unsigned char> d( new unsigned char[dlen
] );
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
, d
.get(), 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");
53 dst
= std::string( reinterpret_cast<const char*>(d
.get()), olen
);
59 std::string
Base64Encode(const std::string
& src
)
64 b64
= BIO_new(BIO_f_base64());
65 bio
= BIO_new(BIO_s_mem());
66 bio
= BIO_push(b64
, bio
);
67 BIO_set_flags(bio
, BIO_FLAGS_BASE64_NO_NL
);
68 int bioWriteRet
= BIO_write(bio
, src
.c_str(), src
.length());
69 if (bioWriteRet
< 0 || (size_t) bioWriteRet
!= src
.length()) {
71 throw std::runtime_error("BIO_write failed to write all data to memory buffer");
76 olen
= BIO_get_mem_data(bio
, &pp
);
78 out
= std::string(pp
, olen
);
89 std::string in
= "PowerDNS Test String 1";
90 std::string out
= Base64Encode(in
);
91 std::cout
<< out
<< std::endl
;
92 if (out
!= "UG93ZXJETlMgVGVzdCBTdHJpbmcgMQ==") {
93 std::cerr
<< "output did not match expected data" << std::endl
;
95 std::string roundtrip
;
96 B64Decode(out
, roundtrip
);
97 std::cout
<< roundtrip
<< std::endl
;
98 if (roundtrip
!= in
) {
99 std::cerr
<< "roundtripped data did not match input data" << std::endl
;