| 72 | } |
| 73 | |
| 74 | bool Base64Decode(const uint8_t* src, uint32_t src_len, uint8_t* dst, uint32_t* dst_len) |
| 75 | { |
| 76 | size_t out_len = 0; |
| 77 | |
| 78 | uint32_t padding_needed = (4 - (src_len % 4)) % 4; |
| 79 | uint8_t* padded_src = 0; |
| 80 | |
| 81 | if (padding_needed > 0 && src_len > 0) |
| 82 | { |
| 83 | padded_src = new uint8_t[src_len + padding_needed]; |
| 84 | memcpy(padded_src, src, src_len); |
| 85 | memset(padded_src + src_len, '=', padding_needed); |
| 86 | src_len = src_len + padding_needed; |
| 87 | src = padded_src; |
| 88 | } |
| 89 | |
| 90 | int r = mbedtls_base64_decode(dst, *dst_len, &out_len, src, src_len); |
| 91 | |
| 92 | if (padded_src) |
| 93 | { |
| 94 | delete[] padded_src; |
| 95 | } |
| 96 | |
| 97 | if (r != 0) |
| 98 | { |
| 99 | if (*dst_len == 0) |
| 100 | { |
| 101 | *dst_len = (uint32_t)out_len; |
| 102 | } |
| 103 | else |
| 104 | { |
| 105 | *dst_len = 0xFFFFFFFF; |
| 106 | } |
| 107 | return false; |
| 108 | } |
| 109 | *dst_len = (uint32_t)out_len; |
| 110 | return true; |
| 111 | } |
| 112 | } |