diff options
author | Koichiro IWAO <meta@vmeta.jp> | 2017-07-13 17:22:04 +0900 |
---|---|---|
committer | metalefty <meta@vmeta.jp> | 2017-08-01 08:40:30 +0900 |
commit | 04187945a8abc17f68daeda6b41b21ba8d174ab2 (patch) | |
tree | 7c21a9f87d5a076107b0c74dc682b5c918021391 /common/base64.c | |
parent | c40baf03e608fcf64820297dfbb223cc7ad7fa82 (diff) | |
download | xrdp-proprietary-04187945a8abc17f68daeda6b41b21ba8d174ab2.tar.gz xrdp-proprietary-04187945a8abc17f68daeda6b41b21ba8d174ab2.zip |
move base64 functions to base64.c
Diffstat (limited to 'common/base64.c')
-rw-r--r-- | common/base64.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/common/base64.c b/common/base64.c new file mode 100644 index 00000000..4c177f49 --- /dev/null +++ b/common/base64.c @@ -0,0 +1,80 @@ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Koichiro Iwao 2017 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Base64 encoder / decoder + */ + +#if defined(HAVE_CONFIG_H) +#include <config_ac.h> +#endif + +#include "os_calls.h" + +#include <openssl/bio.h> +#include <openssl/evp.h> + +size_t +base64_decoded_bytes(const char *src) +{ + size_t len; + size_t padding; + + len = g_strlen(src); + padding = 0; + + if (src[len - 1] == '=') + { + padding++; + + if (src[len - 2] == '=') + { + padding++; + } + } + + return len * 3 / 4 - padding; +} + +/*****************************************************************************/ +char * +base64_decode(char *dst, const char *src, size_t len) +{ + BIO *b64; + BIO *bio; + char *b64str; + size_t estimated_decoded_bytes; + size_t decoded_bytes; + + b64str = g_strdup(src); + estimated_decoded_bytes = base64_decoded_bytes(b64str); + dst[estimated_decoded_bytes] = '\0'; + + b64 = BIO_new(BIO_f_base64()); + bio = BIO_new_mem_buf(b64str, len); + bio = BIO_push(b64, bio); + BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); + decoded_bytes = BIO_read(bio , dst, len); + BIO_free_all(bio); + + /* if input is corrupt, return empty string */ + if (estimated_decoded_bytes != decoded_bytes) + { + g_strncpy(dst, "", sizeof("")); + } + + return dst; +} |