summaryrefslogtreecommitdiff
path: root/lib/x509_b64.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2012-07-08 13:13:40 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2012-07-08 13:13:40 +0200
commit1c218b507acfc62d6af742bac192113fef119284 (patch)
tree6a79e0472879cd98075a9db81b5069ae1763ff50 /lib/x509_b64.c
parent54c1e5d81ec42547b1c8d15e50d7263497089d07 (diff)
downloadgnutls-1c218b507acfc62d6af742bac192113fef119284.tar.gz
simplified base64 encoding/decoding functions by using a datum.
Diffstat (limited to 'lib/x509_b64.c')
-rw-r--r--lib/x509_b64.c101
1 files changed, 47 insertions, 54 deletions
diff --git a/lib/x509_b64.c b/lib/x509_b64.c
index 2b72ae8962..8b43011ad0 100644
--- a/lib/x509_b64.c
+++ b/lib/x509_b64.c
@@ -34,7 +34,7 @@
what+=size; \
if (what > max_len) { \
gnutls_assert(); \
- gnutls_free( (*result)); *result = NULL; \
+ gnutls_free( result->data); result->data = NULL; \
return GNUTLS_E_INTERNAL_ERROR; \
} \
} while(0)
@@ -44,7 +44,7 @@
*/
int
_gnutls_fbase64_encode (const char *msg, const uint8_t * data,
- size_t data_size, uint8_t ** result)
+ size_t data_size, gnutls_datum_t * result)
{
int tmp;
unsigned int i;
@@ -74,8 +74,8 @@ _gnutls_fbase64_encode (const char *msg, const uint8_t * data,
max = B64FSIZE (top_len+bottom_len, data_size);
- (*result) = gnutls_calloc (1, max + 1);
- if ((*result) == NULL)
+ result->data = gnutls_malloc (max + 1);
+ if (result->data == NULL)
{
gnutls_assert ();
return GNUTLS_E_MEMORY_ERROR;
@@ -85,7 +85,7 @@ _gnutls_fbase64_encode (const char *msg, const uint8_t * data,
INCR (bytes, top_len, max);
pos = top_len;
- memcpy (*result, top, top_len);
+ memcpy (result->data, top, top_len);
for (i = 0; i < data_size; i += 48)
{
@@ -98,7 +98,7 @@ _gnutls_fbase64_encode (const char *msg, const uint8_t * data,
size = strlen(tmpres);
INCR (bytes, size+1, max);
- ptr = &(*result)[pos];
+ ptr = &result->data[pos];
memcpy(ptr, tmpres, size);
ptr += size;
@@ -109,8 +109,9 @@ _gnutls_fbase64_encode (const char *msg, const uint8_t * data,
INCR (bytes, bottom_len, max);
- memcpy (&(*result)[bytes - bottom_len], bottom, bottom_len);
- (*result)[bytes] = 0;
+ memcpy (&result->data[bytes - bottom_len], bottom, bottom_len);
+ result->data[bytes] = 0;
+ result->size = bytes;
return max + 1;
}
@@ -136,24 +137,24 @@ int
gnutls_pem_base64_encode (const char *msg, const gnutls_datum_t * data,
char *result, size_t * result_size)
{
- uint8_t *ret;
- int size;
+ gnutls_datum_t res;
+ int ret;
- size = _gnutls_fbase64_encode (msg, data->data, data->size, &ret);
- if (size < 0)
- return size;
+ ret = _gnutls_fbase64_encode (msg, data->data, data->size, &res);
+ if (ret < 0)
+ return ret;
- if (result == NULL || *result_size < (unsigned) size)
+ if (result == NULL || *result_size < (unsigned) res.size)
{
- gnutls_free (ret);
- *result_size = size;
+ gnutls_free (res.data);
+ *result_size = res.size + 1;
return GNUTLS_E_SHORT_MEMORY_BUFFER;
}
else
{
- memcpy (result, ret, size);
- gnutls_free (ret);
- *result_size = size - 1;
+ memcpy (result, res.data, res.size);
+ gnutls_free (res.data);
+ *result_size = res.size;
}
return 0;
@@ -180,18 +181,15 @@ gnutls_pem_base64_encode_alloc (const char *msg,
const gnutls_datum_t * data,
gnutls_datum_t * result)
{
- uint8_t *ret;
- int size;
+ int ret;
if (result == NULL)
- return GNUTLS_E_INVALID_REQUEST;
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
- size = _gnutls_fbase64_encode (msg, data->data, data->size, &ret);
- if (size < 0)
- return size;
+ ret = _gnutls_fbase64_encode (msg, data->data, data->size, result);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
- result->data = ret;
- result->size = size - 1;
return 0;
}
@@ -248,7 +246,6 @@ _gnutls_base64_decode (const uint8_t * data, size_t data_size,
if (result->data == NULL)
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
-
pos = 0;
for (i = 0; i < pdata.size; i += 64)
{
@@ -267,11 +264,12 @@ _gnutls_base64_decode (const uint8_t * data, size_t data_size,
ret = GNUTLS_E_PARSING_ERROR;
goto cleanup;
}
- memcpy (&(result->data)[pos], tmpres, tmpres_size);
+ memcpy (&result->data[pos], tmpres, tmpres_size);
pos += tmpres_size;
}
result->size = pos;
+
ret = pos;
cleanup:
@@ -288,12 +286,11 @@ cleanup:
#define ENDSTR "-----"
int
_gnutls_fbase64_decode (const char *header, const uint8_t * data,
- size_t data_size, uint8_t ** result)
+ size_t data_size, gnutls_datum_t* result)
{
int ret;
static const char top[] = "-----BEGIN ";
static const char bottom[] = "-----END ";
- gnutls_datum_t res;
uint8_t *rdata, *kdata;
int rdata_size;
char pem_header[128];
@@ -352,12 +349,11 @@ _gnutls_fbase64_decode (const char *header, const uint8_t * data,
return GNUTLS_E_BASE64_DECODING_ERROR;
}
- if ((ret = _gnutls_base64_decode (rdata, rdata_size, &res)) < 0)
+ if ((ret = _gnutls_base64_decode (rdata, rdata_size, result)) < 0)
{
gnutls_assert ();
return GNUTLS_E_BASE64_DECODING_ERROR;
}
- *result = res.data;
return ret;
}
@@ -383,25 +379,25 @@ gnutls_pem_base64_decode (const char *header,
const gnutls_datum_t * b64_data,
unsigned char *result, size_t * result_size)
{
- uint8_t *ret;
- int size;
+ gnutls_datum_t res;
+ int ret;
- size =
- _gnutls_fbase64_decode (header, b64_data->data, b64_data->size, &ret);
- if (size < 0)
- return size;
+ ret =
+ _gnutls_fbase64_decode (header, b64_data->data, b64_data->size, &res);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
- if (result == NULL || *result_size < (unsigned) size)
+ if (result == NULL || *result_size < (unsigned) res.size)
{
- gnutls_free (ret);
- *result_size = size;
+ gnutls_free (res.data);
+ *result_size = res.size;
return GNUTLS_E_SHORT_MEMORY_BUFFER;
}
else
{
- memcpy (result, ret, size);
- gnutls_free (ret);
- *result_size = size;
+ memcpy (result, res.data, res.size);
+ gnutls_free (res.data);
+ *result_size = res.size;
}
return 0;
@@ -429,18 +425,15 @@ gnutls_pem_base64_decode_alloc (const char *header,
const gnutls_datum_t * b64_data,
gnutls_datum_t * result)
{
- uint8_t *ret;
- int size;
+ int ret;
if (result == NULL)
- return GNUTLS_E_INVALID_REQUEST;
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
- size =
- _gnutls_fbase64_decode (header, b64_data->data, b64_data->size, &ret);
- if (size < 0)
- return size;
+ ret =
+ _gnutls_fbase64_decode (header, b64_data->data, b64_data->size, result);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
- result->data = ret;
- result->size = size;
return 0;
}