LCOV - code coverage report
Current view: top level - src/util - base64.cpp (source / functions) Hit Total Coverage
Test: report Lines: 31 59 52.5 %
Date: 2015-07-11 18:23:49 Functions: 4 6 66.7 %

          Line data    Source code
       1             : /*
       2             : base64.cpp and base64.h
       3             : 
       4             : Copyright (C) 2004-2008 René Nyffenegger
       5             : 
       6             : This source code is provided 'as-is', without any express or implied
       7             : warranty. In no event will the author be held liable for any damages
       8             : arising from the use of this software.
       9             : 
      10             : Permission is granted to anyone to use this software for any purpose,
      11             : including commercial applications, and to alter it and redistribute it
      12             : freely, subject to the following restrictions:
      13             : 
      14             : 1. The origin of this source code must not be misrepresented; you must not
      15             :    claim that you wrote the original source code. If you use this source code
      16             :    in a product, an acknowledgment in the product documentation would be
      17             :    appreciated but is not required.
      18             : 
      19             : 2. Altered source versions must be plainly marked as such, and must not be
      20             :    misrepresented as being the original source code.
      21             : 
      22             : 3. This notice may not be removed or altered from any source distribution.
      23             : 
      24             : René Nyffenegger rene.nyffenegger@adp-gmbh.ch
      25             : 
      26             : */
      27             : 
      28             : #include "base64.h"
      29             : #include <iostream>
      30             : 
      31           1 : static const std::string base64_chars =
      32             :                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      33             :                 "abcdefghijklmnopqrstuvwxyz"
      34             :                 "0123456789+/";
      35             : 
      36             : 
      37       71145 : static inline bool is_base64(unsigned char c) {
      38       71145 :         return (isalnum(c) || (c == '+') || (c == '/'));
      39             : }
      40             : 
      41           0 : bool base64_is_valid(std::string const& s)
      42             : {
      43           0 :         for(size_t i=0; i<s.size(); i++)
      44           0 :                 if(!is_base64(s[i])) return false;
      45           0 :         return true;
      46             : }
      47             : 
      48           0 : std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
      49           0 :         std::string ret;
      50           0 :         int i = 0;
      51           0 :         int j = 0;
      52             :         unsigned char char_array_3[3];
      53             :         unsigned char char_array_4[4];
      54             : 
      55           0 :         while (in_len--) {
      56           0 :                 char_array_3[i++] = *(bytes_to_encode++);
      57           0 :                 if (i == 3) {
      58           0 :                         char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      59           0 :                         char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      60           0 :                         char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      61           0 :                         char_array_4[3] = char_array_3[2] & 0x3f;
      62             : 
      63           0 :                         for(i = 0; (i <4) ; i++)
      64           0 :                                 ret += base64_chars[char_array_4[i]];
      65           0 :                         i = 0;
      66             :                 }
      67             :         }
      68             : 
      69           0 :         if (i)
      70             :         {
      71           0 :                 for(j = i; j < 3; j++)
      72           0 :                         char_array_3[j] = '\0';
      73             : 
      74           0 :                 char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      75           0 :                 char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      76           0 :                 char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      77           0 :                 char_array_4[3] = char_array_3[2] & 0x3f;
      78             : 
      79           0 :                 for (j = 0; (j < i + 1); j++)
      80           0 :                         ret += base64_chars[char_array_4[j]];
      81             : 
      82             :         // Don't pad it with =
      83             :                 /*while((i++ < 3))
      84             :                         ret += '=';*/
      85             : 
      86             :         }
      87             : 
      88           0 :         return ret;
      89             : 
      90             : }
      91             : 
      92        2635 : std::string base64_decode(std::string const& encoded_string) {
      93        2635 :         int in_len = encoded_string.size();
      94        2635 :         int i = 0;
      95        2635 :         int j = 0;
      96        2635 :         int in_ = 0;
      97             :         unsigned char char_array_4[4], char_array_3[3];
      98        2635 :         std::string ret;
      99             : 
     100      144925 :         while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
     101       71145 :                 char_array_4[i++] = encoded_string[in_]; in_++;
     102       71145 :                 if (i ==4) {
     103       79050 :                         for (i = 0; i <4; i++)
     104       63240 :                                 char_array_4[i] = base64_chars.find(char_array_4[i]);
     105             : 
     106       15810 :                         char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
     107       15810 :                         char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
     108       15810 :                         char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
     109             : 
     110       63240 :                         for (i = 0; (i < 3); i++)
     111       47430 :                                 ret += char_array_3[i];
     112       15810 :                         i = 0;
     113             :                 }
     114             :         }
     115             : 
     116        2635 :         if (i) {
     117        5270 :                 for (j = i; j <4; j++)
     118        2635 :                         char_array_4[j] = 0;
     119             : 
     120       13175 :                 for (j = 0; j <4; j++)
     121       10540 :                         char_array_4[j] = base64_chars.find(char_array_4[j]);
     122             : 
     123        2635 :                 char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
     124        2635 :                 char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
     125        2635 :                 char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
     126             : 
     127        2635 :                 for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
     128             :         }
     129             : 
     130        2635 :         return ret;
     131           3 : }

Generated by: LCOV version 1.11