Clean up base64_{encode,decode} pointer types

Allow any pointer to be used as source for encoding and use char * as
the return value from encoding and input value for decoding to reduce
number of type casts needed in the callers.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
Jouni Malinen 2019-11-27 15:55:33 +02:00 committed by Jouni Malinen
parent b22608423b
commit 8e5e36a184
19 changed files with 72 additions and 84 deletions

View file

@ -158,7 +158,7 @@ int est_load_cacerts(struct hs20_osu_client *ctx, const char *url)
return -1; return -1;
} }
pkcs7 = base64_decode((unsigned char *) resp, resp_len, &pkcs7_len); pkcs7 = base64_decode(resp, resp_len, &pkcs7_len);
if (pkcs7 && pkcs7_len < resp_len / 2) { if (pkcs7 && pkcs7_len < resp_len / 2) {
wpa_printf(MSG_INFO, "Too short base64 decode (%u bytes; downloaded %u bytes) - assume this was binary", wpa_printf(MSG_INFO, "Too short base64 decode (%u bytes; downloaded %u bytes) - assume this was binary",
(unsigned int) pkcs7_len, (unsigned int) resp_len); (unsigned int) pkcs7_len, (unsigned int) resp_len);
@ -639,8 +639,7 @@ int est_build_csr(struct hs20_osu_client *ctx, const char *url)
return -1; return -1;
} }
attrs = base64_decode((unsigned char *) resp, resp_len, attrs = base64_decode(resp, resp_len, &attrs_len);
&attrs_len);
os_free(resp); os_free(resp);
if (attrs == NULL) { if (attrs == NULL) {
@ -734,7 +733,7 @@ int est_simple_enroll(struct hs20_osu_client *ctx, const char *url,
} }
wpa_printf(MSG_DEBUG, "EST simpleenroll response: %s", resp); wpa_printf(MSG_DEBUG, "EST simpleenroll response: %s", resp);
pkcs7 = base64_decode((unsigned char *) resp, resp_len, &pkcs7_len); pkcs7 = base64_decode(resp, resp_len, &pkcs7_len);
if (pkcs7 == NULL) { if (pkcs7 == NULL) {
wpa_printf(MSG_INFO, "EST workaround - Could not decode base64, assume this is DER encoded PKCS7"); wpa_printf(MSG_INFO, "EST workaround - Could not decode base64, assume this is DER encoded PKCS7");
pkcs7 = os_malloc(resp_len); pkcs7 = os_malloc(resp_len);

View file

@ -310,7 +310,7 @@ static int download_cert(struct hs20_osu_client *ctx, xml_node_t *params,
size_t len; size_t len;
u8 digest1[SHA256_MAC_LEN], digest2[SHA256_MAC_LEN]; u8 digest1[SHA256_MAC_LEN], digest2[SHA256_MAC_LEN];
int res; int res;
unsigned char *b64; char *b64;
FILE *f; FILE *f;
url_node = get_node(ctx->xml, params, "CertURL"); url_node = get_node(ctx->xml, params, "CertURL");
@ -364,7 +364,7 @@ static int download_cert(struct hs20_osu_client *ctx, xml_node_t *params,
return -1; return -1;
} }
b64 = base64_encode((unsigned char *) cert, len, NULL); b64 = base64_encode(cert, len, NULL);
os_free(cert); os_free(cert);
if (b64 == NULL) if (b64 == NULL)
return -1; return -1;

View file

@ -633,7 +633,7 @@ static xml_node_t * build_username_password(struct hs20_svc *ctx,
add_text_node(ctx, node, "Username", user); add_text_node(ctx, node, "Username", user);
b64 = (char *) base64_encode((unsigned char *) pw, strlen(pw), NULL); b64 = base64_encode(pw, strlen(pw), NULL);
if (b64 == NULL) if (b64 == NULL)
return NULL; return NULL;
len = os_strlen(b64); len = os_strlen(b64);
@ -1602,8 +1602,7 @@ static xml_node_t * spp_exec_get_certificate(struct hs20_svc *ctx,
xml_node_create_text(ctx->xml, enroll, ns, "estUserID", user); xml_node_create_text(ctx->xml, enroll, ns, "estUserID", user);
b64 = (char *) base64_encode((unsigned char *) password, b64 = base64_encode(password, strlen(password), NULL);
strlen(password), NULL);
if (b64 == NULL) { if (b64 == NULL) {
xml_node_free(ctx->xml, spp_node); xml_node_free(ctx->xml, spp_node);
return NULL; return NULL;

View file

@ -1007,8 +1007,7 @@ static int dpp_parse_uri_pk(struct dpp_bootstrap_info *bi, const char *info)
if (!end) if (!end)
return -1; return -1;
data = base64_decode((const unsigned char *) info, end - info, data = base64_decode(info, end - info, &data_len);
&data_len);
if (!data) { if (!data) {
wpa_printf(MSG_DEBUG, wpa_printf(MSG_DEBUG,
"DPP: Invalid base64 encoding on URI public-key"); "DPP: Invalid base64 encoding on URI public-key");
@ -1482,7 +1481,7 @@ int dpp_bootstrap_key_hash(struct dpp_bootstrap_info *bi)
char * dpp_keygen(struct dpp_bootstrap_info *bi, const char *curve, char * dpp_keygen(struct dpp_bootstrap_info *bi, const char *curve,
const u8 *privkey, size_t privkey_len) const u8 *privkey, size_t privkey_len)
{ {
unsigned char *base64 = NULL; char *base64 = NULL;
char *pos, *end; char *pos, *end;
size_t len; size_t len;
struct wpabuf *der = NULL; struct wpabuf *der = NULL;
@ -1528,7 +1527,7 @@ char * dpp_keygen(struct dpp_bootstrap_info *bi, const char *curve,
der = NULL; der = NULL;
if (!base64) if (!base64)
goto fail; goto fail;
pos = (char *) base64; pos = base64;
end = pos + len; end = pos + len;
for (;;) { for (;;) {
pos = os_strchr(pos, '\n'); pos = os_strchr(pos, '\n');
@ -1536,7 +1535,7 @@ char * dpp_keygen(struct dpp_bootstrap_info *bi, const char *curve,
break; break;
os_memmove(pos, pos + 1, end - pos); os_memmove(pos, pos + 1, end - pos);
} }
return (char *) base64; return base64;
fail: fail:
os_free(base64); os_free(base64);
wpabuf_free(der); wpabuf_free(der);

View file

@ -144,7 +144,7 @@ static TNC_Result TNC_TNCC_SendMessage(
TNC_MessageType messageType) TNC_MessageType messageType)
{ {
struct tnc_if_imc *imc; struct tnc_if_imc *imc;
unsigned char *b64; char *b64;
size_t b64len; size_t b64len;
wpa_printf(MSG_DEBUG, "TNC: TNC_TNCC_SendMessage(imcID=%lu " wpa_printf(MSG_DEBUG, "TNC: TNC_TNCC_SendMessage(imcID=%lu "
@ -629,8 +629,7 @@ static unsigned char * tncc_get_base64(char *start, size_t *decoded_len)
return NULL; return NULL;
*pos2 = '\0'; *pos2 = '\0';
decoded = base64_decode((unsigned char *) pos, os_strlen(pos), decoded = base64_decode(pos, os_strlen(pos), decoded_len);
decoded_len);
*pos2 = '<'; *pos2 = '<';
if (decoded == NULL) { if (decoded == NULL) {
wpa_printf(MSG_DEBUG, "TNC: Failed to decode Base64 data"); wpa_printf(MSG_DEBUG, "TNC: Failed to decode Base64 data");

View file

@ -179,7 +179,7 @@ static TNC_Result TNC_TNCS_SendMessage(
TNC_MessageType messageType) TNC_MessageType messageType)
{ {
struct tncs_data *tncs; struct tncs_data *tncs;
unsigned char *b64; char *b64;
size_t b64len; size_t b64len;
wpa_printf(MSG_DEBUG, "TNC: TNC_TNCS_SendMessage(imvID=%lu " wpa_printf(MSG_DEBUG, "TNC: TNC_TNCS_SendMessage(imvID=%lu "
@ -678,8 +678,7 @@ static unsigned char * tncs_get_base64(char *start, size_t *decoded_len)
return NULL; return NULL;
*pos2 = '\0'; *pos2 = '\0';
decoded = base64_decode((unsigned char *) pos, os_strlen(pos), decoded = base64_decode(pos, os_strlen(pos), decoded_len);
decoded_len);
*pos2 = '<'; *pos2 = '<';
if (decoded == NULL) { if (decoded == NULL) {
wpa_printf(MSG_DEBUG, "TNC: Failed to decode Base64 data"); wpa_printf(MSG_DEBUG, "TNC: Failed to decode Base64 data");

View file

@ -130,7 +130,7 @@ static int tlsv1_add_cert(struct x509_certificate **chain,
return -1; return -1;
} }
der = base64_decode(pos, end - pos, &der_len); der = base64_decode((const char *) pos, end - pos, &der_len);
if (der == NULL) { if (der == NULL) {
wpa_printf(MSG_INFO, "TLSv1: Could not decode PEM " wpa_printf(MSG_INFO, "TLSv1: Could not decode PEM "
"certificate"); "certificate");
@ -293,7 +293,7 @@ static struct crypto_private_key * tlsv1_set_key_pem(const u8 *key, size_t len)
} }
} }
der = base64_decode(pos, end - pos, &der_len); der = base64_decode((const char *) pos, end - pos, &der_len);
if (!der) if (!der)
return NULL; return NULL;
pkey = crypto_private_key_import(der, der_len, NULL); pkey = crypto_private_key_import(der, der_len, NULL);
@ -321,7 +321,7 @@ static struct crypto_private_key * tlsv1_set_key_enc_pem(const u8 *key,
if (!end) if (!end)
return NULL; return NULL;
der = base64_decode(pos, end - pos, &der_len); der = base64_decode((const char *) pos, end - pos, &der_len);
if (!der) if (!der)
return NULL; return NULL;
pkey = crypto_private_key_import(der, der_len, passwd); pkey = crypto_private_key_import(der, der_len, passwd);
@ -1225,7 +1225,7 @@ static int tlsv1_set_dhparams_blob(struct tlsv1_credentials *cred,
return -1; return -1;
} }
der = base64_decode(pos, end - pos, &der_len); der = base64_decode((const char *) pos, end - pos, &der_len);
if (der == NULL) { if (der == NULL) {
wpa_printf(MSG_INFO, "TLSv1: Could not decode PEM dhparams"); wpa_printf(MSG_INFO, "TLSv1: Could not decode PEM dhparams");
return -1; return -1;

View file

@ -12,18 +12,16 @@
#include "os.h" #include "os.h"
#include "base64.h" #include "base64.h"
static const unsigned char base64_table[65] = static const char base64_table[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const unsigned char base64_url_table[65] = static const char base64_url_table[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
static unsigned char * base64_gen_encode(const unsigned char *src, size_t len, static char * base64_gen_encode(const unsigned char *src, size_t len,
size_t *out_len, size_t *out_len, const char *table, int add_pad)
const unsigned char *table,
int add_pad)
{ {
unsigned char *out, *pos; char *out, *pos;
const unsigned char *end, *in; const unsigned char *end, *in;
size_t olen; size_t olen;
int line_len; int line_len;
@ -83,9 +81,8 @@ static unsigned char * base64_gen_encode(const unsigned char *src, size_t len,
} }
static unsigned char * base64_gen_decode(const unsigned char *src, size_t len, static unsigned char * base64_gen_decode(const char *src, size_t len,
size_t *out_len, size_t *out_len, const char *table)
const unsigned char *table)
{ {
unsigned char dtable[256], *out, *pos, block[4], tmp; unsigned char dtable[256], *out, *pos, block[4], tmp;
size_t i, count, olen; size_t i, count, olen;
@ -94,12 +91,12 @@ static unsigned char * base64_gen_decode(const unsigned char *src, size_t len,
os_memset(dtable, 0x80, 256); os_memset(dtable, 0x80, 256);
for (i = 0; i < sizeof(base64_table) - 1; i++) for (i = 0; i < sizeof(base64_table) - 1; i++)
dtable[table[i]] = (unsigned char) i; dtable[(unsigned char) table[i]] = (unsigned char) i;
dtable['='] = 0; dtable['='] = 0;
count = 0; count = 0;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
if (dtable[src[i]] != 0x80) if (dtable[(unsigned char) src[i]] != 0x80)
count++; count++;
} }
@ -165,8 +162,7 @@ static unsigned char * base64_gen_decode(const unsigned char *src, size_t len,
* nul terminated to make it easier to use as a C string. The nul terminator is * nul terminated to make it easier to use as a C string. The nul terminator is
* not included in out_len. * not included in out_len.
*/ */
unsigned char * base64_encode(const unsigned char *src, size_t len, char * base64_encode(const void *src, size_t len, size_t *out_len)
size_t *out_len)
{ {
return base64_gen_encode(src, len, out_len, base64_table, 1); return base64_gen_encode(src, len, out_len, base64_table, 1);
} }
@ -174,8 +170,7 @@ unsigned char * base64_encode(const unsigned char *src, size_t len,
char * base64_url_encode(const void *src, size_t len, size_t *out_len) char * base64_url_encode(const void *src, size_t len, size_t *out_len)
{ {
return (char *) base64_gen_encode(src, len, out_len, base64_url_table, return base64_gen_encode(src, len, out_len, base64_url_table, 0);
0);
} }
@ -189,8 +184,7 @@ char * base64_url_encode(const void *src, size_t len, size_t *out_len)
* *
* Caller is responsible for freeing the returned buffer. * Caller is responsible for freeing the returned buffer.
*/ */
unsigned char * base64_decode(const unsigned char *src, size_t len, unsigned char * base64_decode(const char *src, size_t len, size_t *out_len)
size_t *out_len)
{ {
return base64_gen_decode(src, len, out_len, base64_table); return base64_gen_decode(src, len, out_len, base64_table);
} }
@ -198,6 +192,5 @@ unsigned char * base64_decode(const unsigned char *src, size_t len,
unsigned char * base64_url_decode(const char *src, size_t len, size_t *out_len) unsigned char * base64_url_decode(const char *src, size_t len, size_t *out_len)
{ {
return base64_gen_decode((const unsigned char *) src, len, out_len, return base64_gen_decode(src, len, out_len, base64_url_table);
base64_url_table);
} }

View file

@ -9,10 +9,8 @@
#ifndef BASE64_H #ifndef BASE64_H
#define BASE64_H #define BASE64_H
unsigned char * base64_encode(const unsigned char *src, size_t len, char * base64_encode(const void *src, size_t len, size_t *out_len);
size_t *out_len); unsigned char * base64_decode(const char *src, size_t len, size_t *out_len);
unsigned char * base64_decode(const unsigned char *src, size_t len,
size_t *out_len);
char * base64_url_encode(const void *src, size_t len, size_t *out_len); char * base64_url_encode(const void *src, size_t len, size_t *out_len);
unsigned char * base64_url_decode(const char *src, size_t len, size_t *out_len); unsigned char * base64_url_decode(const char *src, size_t len, size_t *out_len);

View file

@ -296,52 +296,53 @@ static int base64_tests(void)
{ {
int errors = 0; int errors = 0;
unsigned char *res; unsigned char *res;
char *res2;
size_t res_len; size_t res_len;
wpa_printf(MSG_INFO, "base64 tests"); wpa_printf(MSG_INFO, "base64 tests");
res = base64_encode((const unsigned char *) "", ~0, &res_len); res2 = base64_encode("", ~0, &res_len);
if (res2) {
errors++;
os_free(res2);
}
res2 = base64_encode("=", 1, &res_len);
if (!res2 || res_len != 5 || res2[0] != 'P' || res2[1] != 'Q' ||
res2[2] != '=' || res2[3] != '=' || res2[4] != '\n')
errors++;
os_free(res2);
res2 = base64_encode("=", 1, NULL);
if (!res2 || res2[0] != 'P' || res2[1] != 'Q' ||
res2[2] != '=' || res2[3] != '=' || res2[4] != '\n')
errors++;
os_free(res2);
res = base64_decode("", 0, &res_len);
if (res) { if (res) {
errors++; errors++;
os_free(res); os_free(res);
} }
res = base64_encode((const unsigned char *) "=", 1, &res_len); res = base64_decode("a", 1, &res_len);
if (!res || res_len != 5 || res[0] != 'P' || res[1] != 'Q' ||
res[2] != '=' || res[3] != '=' || res[4] != '\n')
errors++;
os_free(res);
res = base64_encode((const unsigned char *) "=", 1, NULL);
if (!res || res[0] != 'P' || res[1] != 'Q' ||
res[2] != '=' || res[3] != '=' || res[4] != '\n')
errors++;
os_free(res);
res = base64_decode((const unsigned char *) "", 0, &res_len);
if (res) { if (res) {
errors++; errors++;
os_free(res); os_free(res);
} }
res = base64_decode((const unsigned char *) "a", 1, &res_len); res = base64_decode("====", 4, &res_len);
if (res) { if (res) {
errors++; errors++;
os_free(res); os_free(res);
} }
res = base64_decode((const unsigned char *) "====", 4, &res_len); res = base64_decode("PQ==", 4, &res_len);
if (res) {
errors++;
os_free(res);
}
res = base64_decode((const unsigned char *) "PQ==", 4, &res_len);
if (!res || res_len != 1 || res[0] != '=') if (!res || res_len != 1 || res[0] != '=')
errors++; errors++;
os_free(res); os_free(res);
res = base64_decode((const unsigned char *) "P.Q-=!=*", 8, &res_len); res = base64_decode("P.Q-=!=*", 8, &res_len);
if (!res || res_len != 1 || res[0] != '=') if (!res || res_len != 1 || res[0] != '=')
errors++; errors++;
os_free(res); os_free(res);

View file

@ -409,7 +409,7 @@ char * xml_node_get_base64_text(struct xml_node_ctx *ctx, xml_node_t *node,
if (txt == NULL) if (txt == NULL)
return NULL; return NULL;
ret = base64_decode((unsigned char *) txt, strlen(txt), &len); ret = base64_decode(txt, strlen(txt), &len);
if (ret_len) if (ret_len)
*ret_len = len; *ret_len = len;
xml_node_get_text_free(ctx, txt); xml_node_get_text_free(ctx, txt);

View file

@ -235,7 +235,7 @@ struct wpabuf * xml_get_base64_item(const char *data, const char *name,
return NULL; return NULL;
} }
decoded = base64_decode((unsigned char *) msg, os_strlen(msg), &len); decoded = base64_decode(msg, os_strlen(msg), &len);
os_free(msg); os_free(msg);
if (decoded == NULL) { if (decoded == NULL) {
*ret = UPNP_OUT_OF_MEMORY; *ret = UPNP_OUT_OF_MEMORY;

View file

@ -897,7 +897,7 @@ static struct wpabuf * wps_er_soap_hdr(const struct wpabuf *msg,
const struct sockaddr_in *dst, const struct sockaddr_in *dst,
char **len_ptr, char **body_ptr) char **len_ptr, char **body_ptr)
{ {
unsigned char *encoded; char *encoded;
size_t encoded_len; size_t encoded_len;
struct wpabuf *buf; struct wpabuf *buf;
@ -939,7 +939,7 @@ static struct wpabuf * wps_er_soap_hdr(const struct wpabuf *msg,
wpabuf_put_str(buf, "\">\n"); wpabuf_put_str(buf, "\">\n");
if (encoded) { if (encoded) {
wpabuf_printf(buf, "<%s>%s</%s>\n", wpabuf_printf(buf, "<%s>%s</%s>\n",
arg_name, (char *) encoded, arg_name); arg_name, encoded, arg_name);
os_free(encoded); os_free(encoded);
} }

View file

@ -1745,7 +1745,8 @@ int wps_build_cred(struct wps_data *wps, struct wpabuf *msg)
return -1; return -1;
} }
os_free(wps->new_psk); os_free(wps->new_psk);
wps->new_psk = base64_encode(r, sizeof(r), &wps->new_psk_len); wps->new_psk = (u8 *) base64_encode(r, sizeof(r),
&wps->new_psk_len);
if (wps->new_psk == NULL) if (wps->new_psk == NULL)
return -1; return -1;
wps->new_psk_len--; /* remove newline */ wps->new_psk_len--; /* remove newline */

View file

@ -647,7 +647,7 @@ static int subscription_first_event(struct subscription *s)
"initial WLANEvent"); "initial WLANEvent");
msg = build_fake_wsc_ack(); msg = build_fake_wsc_ack();
if (msg) { if (msg) {
s->sm->wlanevent = (char *) s->sm->wlanevent =
base64_encode(wpabuf_head(msg), base64_encode(wpabuf_head(msg),
wpabuf_len(msg), NULL); wpabuf_len(msg), NULL);
wpabuf_free(msg); wpabuf_free(msg);
@ -822,7 +822,7 @@ int upnp_wps_device_send_wlan_event(struct upnp_wps_device_sm *sm,
} }
raw_len = pos; raw_len = pos;
val = (char *) base64_encode(raw, raw_len, &val_len); val = base64_encode(raw, raw_len, &val_len);
if (val == NULL) if (val == NULL)
goto fail; goto fail;

View file

@ -765,8 +765,8 @@ static void web_connection_send_reply(struct http_request *req,
if (reply) { if (reply) {
size_t len; size_t len;
replydata = (char *) base64_encode(wpabuf_head(reply), replydata = base64_encode(wpabuf_head(reply), wpabuf_len(reply),
wpabuf_len(reply), &len); &len);
} else } else
replydata = NULL; replydata = NULL;

View file

@ -296,7 +296,7 @@ static struct wpa_config_blob * wpa_config_read_blob(FILE *f, int *line,
{ {
struct wpa_config_blob *blob; struct wpa_config_blob *blob;
char buf[256], *pos; char buf[256], *pos;
unsigned char *encoded = NULL, *nencoded; char *encoded = NULL, *nencoded;
int end = 0; int end = 0;
size_t encoded_len = 0, len; size_t encoded_len = 0, len;
@ -1098,7 +1098,7 @@ static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred)
#ifndef CONFIG_NO_CONFIG_BLOBS #ifndef CONFIG_NO_CONFIG_BLOBS
static int wpa_config_write_blob(FILE *f, struct wpa_config_blob *blob) static int wpa_config_write_blob(FILE *f, struct wpa_config_blob *blob)
{ {
unsigned char *encoded; char *encoded;
encoded = base64_encode(blob->data, blob->len, NULL); encoded = base64_encode(blob->data, blob->len, NULL);
if (encoded == NULL) if (encoded == NULL)

View file

@ -439,7 +439,7 @@ static void eapol_sm_cb(struct eapol_sm *eapol, enum eapol_supp_result result,
static void eapol_test_write_cert(FILE *f, const char *subject, static void eapol_test_write_cert(FILE *f, const char *subject,
const struct wpabuf *cert) const struct wpabuf *cert)
{ {
unsigned char *encoded; char *encoded;
encoded = base64_encode(wpabuf_head(cert), wpabuf_len(cert), NULL); encoded = base64_encode(wpabuf_head(cert), wpabuf_len(cert), NULL);
if (encoded == NULL) if (encoded == NULL)

View file

@ -340,7 +340,7 @@ int hs20_get_icon(struct wpa_supplicant *wpa_s, const u8 *bssid,
{ {
struct icon_entry *icon; struct icon_entry *icon;
size_t out_size; size_t out_size;
unsigned char *b64; char *b64;
size_t b64_size; size_t b64_size;
int reply_size; int reply_size;