1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel (at) haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 #include "curlcheck.h" 23 24 #include "urldata.h" 25 #include "url.h" /* for Curl_safefree */ 26 #include "curl_base64.h" 27 #include "memdebug.h" /* LAST include file */ 28 29 static struct Curl_easy *data; 30 31 static CURLcode unit_setup(void) 32 { 33 int res = CURLE_OK; 34 35 global_init(CURL_GLOBAL_ALL); 36 data = curl_easy_init(); 37 if(!data) 38 return CURLE_OUT_OF_MEMORY; 39 return res; 40 } 41 42 static void unit_stop(void) 43 { 44 curl_easy_cleanup(data); 45 curl_global_cleanup(); 46 } 47 48 UNITTEST_START 49 50 char *output; 51 unsigned char *decoded; 52 size_t size = 0; 53 unsigned char anychar = 'x'; 54 CURLcode rc; 55 56 rc = Curl_base64_encode(data, "i", 1, &output, &size); 57 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 58 fail_unless(size == 4, "size should be 4"); 59 verify_memory(output, "aQ==", 4); 60 Curl_safefree(output); 61 62 rc = Curl_base64_encode(data, "ii", 2, &output, &size); 63 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 64 fail_unless(size == 4, "size should be 4"); 65 verify_memory(output, "aWk=", 4); 66 Curl_safefree(output); 67 68 rc = Curl_base64_encode(data, "iii", 3, &output, &size); 69 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 70 fail_unless(size == 4, "size should be 4"); 71 verify_memory(output, "aWlp", 4); 72 Curl_safefree(output); 73 74 rc = Curl_base64_encode(data, "iiii", 4, &output, &size); 75 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 76 fail_unless(size == 8, "size should be 8"); 77 verify_memory(output, "aWlpaQ==", 8); 78 Curl_safefree(output); 79 80 rc = Curl_base64_encode(data, "\xff\x01\xfe\x02", 4, &output, &size); 81 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 82 fail_unless(size == 8, "size should be 8"); 83 verify_memory(output, "/wH+Ag==", 8); 84 Curl_safefree(output); 85 86 rc = Curl_base64url_encode(data, "\xff\x01\xfe\x02", 4, &output, &size); 87 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 88 fail_unless(size == 8, "size should be 8"); 89 verify_memory(output, "_wH-Ag==", 8); 90 Curl_safefree(output); 91 92 rc = Curl_base64url_encode(data, "iiii", 4, &output, &size); 93 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 94 fail_unless(size == 8, "size should be 8"); 95 verify_memory(output, "aWlpaQ==", 8); 96 Curl_safefree(output); 97 98 /* 0 length makes it do strlen() */ 99 rc = Curl_base64_encode(data, "iiii", 0, &output, &size); 100 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 101 fail_unless(size == 8, "size should be 8"); 102 verify_memory(output, "aWlpaQ==", 8); 103 Curl_safefree(output); 104 105 rc = Curl_base64_decode("aWlpaQ==", &decoded, &size); 106 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 107 fail_unless(size == 4, "size should be 4"); 108 verify_memory(decoded, "iiii", 4); 109 Curl_safefree(decoded); 110 111 rc = Curl_base64_decode("aWlp", &decoded, &size); 112 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 113 fail_unless(size == 3, "size should be 3"); 114 verify_memory(decoded, "iii", 3); 115 Curl_safefree(decoded); 116 117 rc = Curl_base64_decode("aWk=", &decoded, &size); 118 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 119 fail_unless(size == 2, "size should be 2"); 120 verify_memory(decoded, "ii", 2); 121 Curl_safefree(decoded); 122 123 rc = Curl_base64_decode("aQ==", &decoded, &size); 124 fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 125 fail_unless(size == 1, "size should be 1"); 126 verify_memory(decoded, "i", 2); 127 Curl_safefree(decoded); 128 129 /* This is illegal input as the data is too short */ 130 size = 1; /* not zero */ 131 decoded = &anychar; /* not NULL */ 132 rc = Curl_base64_decode("aQ", &decoded, &size); 133 fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, 134 "return code should be CURLE_BAD_CONTENT_ENCODING"); 135 fail_unless(size == 0, "size should be 0"); 136 fail_if(decoded, "returned pointer should be NULL"); 137 138 /* This is illegal input as it contains three padding characters */ 139 size = 1; /* not zero */ 140 decoded = &anychar; /* not NULL */ 141 rc = Curl_base64_decode("a===", &decoded, &size); 142 fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, 143 "return code should be CURLE_BAD_CONTENT_ENCODING"); 144 fail_unless(size == 0, "size should be 0"); 145 fail_if(decoded, "returned pointer should be NULL"); 146 147 /* This is illegal input as it contains a padding character mid input */ 148 size = 1; /* not zero */ 149 decoded = &anychar; /* not NULL */ 150 rc = Curl_base64_decode("a=Q=", &decoded, &size); 151 fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, 152 "return code should be CURLE_BAD_CONTENT_ENCODING"); 153 fail_unless(size == 0, "size should be 0"); 154 fail_if(decoded, "returned pointer should be NULL"); 155 156 /* This is garbage input as it contains an illegal base64 character */ 157 size = 1; /* not zero */ 158 decoded = &anychar; /* not NULL */ 159 rc = Curl_base64_decode("a\x1f==", &decoded, &size); 160 fail_unless(rc == CURLE_BAD_CONTENT_ENCODING, 161 "return code should be CURLE_BAD_CONTENT_ENCODING"); 162 fail_unless(size == 0, "size should be 0"); 163 fail_if(decoded, "returned pointer should be NULL"); 164 165 UNITTEST_STOP 166