From 5957ec3c6deb0a5585f979ff470e9a346154ca62 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 7 Mar 2011 08:04:23 +0100 Subject: [PATCH] crypt: Make base64_decode public. gcrypt.c needs this to decode public rsa keys. Public functions should always return proper error codes, so change the return value for errors from -1 to -E_BASE64. --- crypt_backend.h | 1 + crypt_common.c | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/crypt_backend.h b/crypt_backend.h index b362651d..3ea32c20 100644 --- a/crypt_backend.h +++ b/crypt_backend.h @@ -13,3 +13,4 @@ uint32_t read_ssh_u32(const void *vp); int uudecode(const char *src, unsigned char *target, size_t targsize); int check_ssh_key_header(const unsigned char *blob, int blen); int check_key_file(const char *file, bool private_key); +int base64_decode(char const *src, unsigned char *target, size_t targsize); diff --git a/crypt_common.c b/crypt_common.c index 1308af41..3bd603c0 100644 --- a/crypt_common.c +++ b/crypt_common.c @@ -57,10 +57,10 @@ static const char Pad64 = '='; /* * Skips all whitespace anywhere. Converts characters, four at a time, starting * at (or after) src from base - 64 numbers into three 8 bit bytes in the - * target area. it returns the number of data bytes stored at the target, or -1 + * target area. it returns the number of data bytes stored at the target, or -E_BASE64 * on error. */ -static int base64_decode(char const *src, unsigned char *target, size_t targsize) +int base64_decode(char const *src, unsigned char *target, size_t targsize) { unsigned int tarindex, state; int ch; @@ -78,13 +78,13 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize pos = strchr(Base64, ch); if (pos == 0) /* A non-base64 character. */ - return -1; + return -E_BASE64; switch (state) { case 0: if (target) { if (tarindex >= targsize) - return (-1); + return -E_BASE64; target[tarindex] = (pos - Base64) << 2; } state = 1; @@ -92,7 +92,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize case 1: if (target) { if (tarindex + 1 >= targsize) - return (-1); + return -E_BASE64; target[tarindex] |= (pos - Base64) >> 4; target[tarindex+1] = ((pos - Base64) & 0x0f) << 4 ; @@ -103,7 +103,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize case 2: if (target) { if (tarindex + 1 >= targsize) - return (-1); + return -E_BASE64; target[tarindex] |= (pos - Base64) >> 2; target[tarindex+1] = ((pos - Base64) & 0x03) << 6; @@ -114,7 +114,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize case 3: if (target) { if (tarindex >= targsize) - return (-1); + return -E_BASE64; target[tarindex] |= (pos - Base64); } tarindex++; @@ -133,7 +133,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ - return (-1); + return -E_BASE64; case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ @@ -142,7 +142,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) - return (-1); + return -E_BASE64; ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ @@ -154,7 +154,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize */ for (; ch != '\0'; ch = *src++) if (!isspace(ch)) - return (-1); + return -E_BASE64; /* * Now make sure for cases 2 and 3 that the "extra" @@ -163,7 +163,7 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize * subliminal channel. */ if (target && target[tarindex] != 0) - return (-1); + return -E_BASE64; } } else { /* @@ -171,10 +171,10 @@ static int base64_decode(char const *src, unsigned char *target, size_t targsize * have no partial bytes lying around. */ if (state != 0) - return (-1); + return -E_BASE64; } - return (tarindex); + return tarindex; } int uudecode(const char *src, unsigned char *target, size_t targsize) @@ -193,7 +193,7 @@ int uudecode(const char *src, unsigned char *target, size_t targsize) *p = '\0'; len = base64_decode(encoded, target, targsize); free(encoded); - return len >= 0? len : -E_BASE64; + return len; } /* -- 2.39.5