diff --git a/common/Makefile.am b/common/Makefile.am index bfccca90..3f44dff2 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -31,6 +31,8 @@ module_LTLIBRARIES = \ libcommon_la_SOURCES = \ arch.h \ + base64.h \ + base64.c \ crc16.h \ defines.h \ fifo.c \ 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 +#endif + +#include "os_calls.h" + +#include +#include + +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; +} diff --git a/common/base64.h b/common/base64.h new file mode 100644 index 00000000..269f9f98 --- /dev/null +++ b/common/base64.h @@ -0,0 +1,31 @@ +/** + * 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(SSL_CALLS_H) +#define SSL_CALLS_H + +#include "arch.h" + +size_t +base64_decoded_bytes(const char *src); +char * +base64_decode(char *dst, const char *src, size_t len); + +#endif diff --git a/common/ssl_calls.c b/common/ssl_calls.c index d43ed873..0e12e960 100644 --- a/common/ssl_calls.c +++ b/common/ssl_calls.c @@ -32,8 +32,6 @@ #include #include #include -#include /* needed for base64 */ -#include /* needed for base64 */ #include "os_calls.h" #include "arch.h" @@ -932,55 +930,3 @@ ssl_get_protocols_from_string(const char *str, long *ssl_protocols) return rv; } -/*****************************************************************************/ -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; -} diff --git a/common/ssl_calls.h b/common/ssl_calls.h index a957b994..dc60a23e 100644 --- a/common/ssl_calls.h +++ b/common/ssl_calls.h @@ -114,9 +114,5 @@ const char * ssl_get_cipher_name(const struct ssl_st *ssl); int ssl_get_protocols_from_string(const char *str, long *ssl_protocols); -size_t -base64_decoded_bytes(const char *src); -char * -base64_decode(char *dst, const char *src, size_t len); #endif diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 34cb70ed..ee9ad7f7 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -22,9 +22,9 @@ #include #endif +#include "base64.h" #include "xrdp.h" #include "log.h" -#include "ssl_calls.h" /*****************************************************************************/ /* all login help screen events go here */