summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
6a7393e)
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.
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 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);
/*
* 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
/*
* 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
-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;
{
unsigned int tarindex, state;
int ch;
pos = strchr(Base64, ch);
if (pos == 0) /* A non-base64 character. */
pos = strchr(Base64, ch);
if (pos == 0) /* A non-base64 character. */
switch (state) {
case 0:
if (target) {
if (tarindex >= targsize)
switch (state) {
case 0:
if (target) {
if (tarindex >= targsize)
target[tarindex] = (pos - Base64) << 2;
}
state = 1;
target[tarindex] = (pos - Base64) << 2;
}
state = 1;
case 1:
if (target) {
if (tarindex + 1 >= targsize)
case 1:
if (target) {
if (tarindex + 1 >= targsize)
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex+1] = ((pos - Base64) & 0x0f)
<< 4 ;
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex+1] = ((pos - Base64) & 0x0f)
<< 4 ;
case 2:
if (target) {
if (tarindex + 1 >= targsize)
case 2:
if (target) {
if (tarindex + 1 >= targsize)
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex+1] = ((pos - Base64) & 0x03)
<< 6;
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex+1] = ((pos - Base64) & 0x03)
<< 6;
case 3:
if (target) {
if (tarindex >= targsize)
case 3:
if (target) {
if (tarindex >= targsize)
target[tarindex] |= (pos - Base64);
}
tarindex++;
target[tarindex] |= (pos - Base64);
}
tarindex++;
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
*/
for (; ch != '\0'; ch = *src++)
if (!isspace(ch))
*/
for (; ch != '\0'; ch = *src++)
if (!isspace(ch))
/*
* Now make sure for cases 2 and 3 that the "extra"
/*
* Now make sure for cases 2 and 3 that the "extra"
* subliminal channel.
*/
if (target && target[tarindex] != 0)
* subliminal channel.
*/
if (target && target[tarindex] != 0)
* have no partial bytes lying around.
*/
if (state != 0)
* have no partial bytes lying around.
*/
if (state != 0)
}
int uudecode(const char *src, unsigned char *target, size_t targsize)
}
int uudecode(const char *src, unsigned char *target, size_t targsize)
*p = '\0';
len = base64_decode(encoded, target, targsize);
free(encoded);
*p = '\0';
len = base64_decode(encoded, target, targsize);
free(encoded);
- return len >= 0? len : -E_BASE64;