]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Move base64_decode_atom into misc.c.
authorSimon Tatham <anakin@pobox.com>
Tue, 9 Sep 2014 11:46:10 +0000 (11:46 +0000)
committerSimon Tatham <anakin@pobox.com>
Tue, 9 Sep 2014 11:46:10 +0000 (11:46 +0000)
I'm about to need to refer to it from a source file that won't
necessarily always be linked against sshpubk.c, so it needs to live
somewhere less specialist. Now it sits alongside base64_encode_atom
(already in misc.c for another reason), which is neater anyway.

[originally from svn r10218]

misc.c
misc.h
sshpubk.c

diff --git a/misc.c b/misc.c
index d7c32c49db29fc5d188f489df76dfc7e71c65ea8..fb7cc8c2882df5fd2f99170ec84ce1c2545e9c58 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -473,8 +473,7 @@ char *fgetline(FILE *fp)
 }
 
 /* ----------------------------------------------------------------------
- * Base64 encoding routine. This is required in public-key writing
- * but also in HTTP proxy handling, so it's centralised here.
+ * Core base64 encoding and decoding routines.
  */
 
 void base64_encode_atom(unsigned char *data, int n, char *out)
@@ -501,6 +500,54 @@ void base64_encode_atom(unsigned char *data, int n, char *out)
        out[3] = '=';
 }
 
+int base64_decode_atom(char *atom, unsigned char *out)
+{
+    int vals[4];
+    int i, v, len;
+    unsigned word;
+    char c;
+
+    for (i = 0; i < 4; i++) {
+       c = atom[i];
+       if (c >= 'A' && c <= 'Z')
+           v = c - 'A';
+       else if (c >= 'a' && c <= 'z')
+           v = c - 'a' + 26;
+       else if (c >= '0' && c <= '9')
+           v = c - '0' + 52;
+       else if (c == '+')
+           v = 62;
+       else if (c == '/')
+           v = 63;
+       else if (c == '=')
+           v = -1;
+       else
+           return 0;                  /* invalid atom */
+       vals[i] = v;
+    }
+
+    if (vals[0] == -1 || vals[1] == -1)
+       return 0;
+    if (vals[2] == -1 && vals[3] != -1)
+       return 0;
+
+    if (vals[3] != -1)
+       len = 3;
+    else if (vals[2] != -1)
+       len = 2;
+    else
+       len = 1;
+
+    word = ((vals[0] << 18) |
+           (vals[1] << 12) | ((vals[2] & 0x3F) << 6) | (vals[3] & 0x3F));
+    out[0] = (word >> 16) & 0xFF;
+    if (len > 1)
+       out[1] = (word >> 8) & 0xFF;
+    if (len > 2)
+       out[2] = word & 0xFF;
+    return len;
+}
+
 /* ----------------------------------------------------------------------
  * Generic routines to deal with send buffers: a linked list of
  * smallish blocks, with the operations
diff --git a/misc.h b/misc.h
index d6a80bf0e74e5d400b272abfcdbd67b97392f5b4..306b4a1ec4cb299845852b21afcfa1deccb7eb2a 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -44,6 +44,7 @@ int toint(unsigned);
 char *fgetline(FILE *fp);
 
 void base64_encode_atom(unsigned char *data, int n, char *out);
+int base64_decode_atom(char *atom, unsigned char *out);
 
 struct bufchain_granule;
 typedef struct bufchain_tag {
index ac9e0fa7e11e20bbbe1293aa2fa45dc12279b070..cf9e44b365e1da223e4ac369e34a825ca45c3ae0 100644 (file)
--- a/sshpubk.c
+++ b/sshpubk.c
@@ -513,54 +513,6 @@ static char *read_body(FILE * fp)
     }
 }
 
-int base64_decode_atom(char *atom, unsigned char *out)
-{
-    int vals[4];
-    int i, v, len;
-    unsigned word;
-    char c;
-
-    for (i = 0; i < 4; i++) {
-       c = atom[i];
-       if (c >= 'A' && c <= 'Z')
-           v = c - 'A';
-       else if (c >= 'a' && c <= 'z')
-           v = c - 'a' + 26;
-       else if (c >= '0' && c <= '9')
-           v = c - '0' + 52;
-       else if (c == '+')
-           v = 62;
-       else if (c == '/')
-           v = 63;
-       else if (c == '=')
-           v = -1;
-       else
-           return 0;                  /* invalid atom */
-       vals[i] = v;
-    }
-
-    if (vals[0] == -1 || vals[1] == -1)
-       return 0;
-    if (vals[2] == -1 && vals[3] != -1)
-       return 0;
-
-    if (vals[3] != -1)
-       len = 3;
-    else if (vals[2] != -1)
-       len = 2;
-    else
-       len = 1;
-
-    word = ((vals[0] << 18) |
-           (vals[1] << 12) | ((vals[2] & 0x3F) << 6) | (vals[3] & 0x3F));
-    out[0] = (word >> 16) & 0xFF;
-    if (len > 1)
-       out[1] = (word >> 8) & 0xFF;
-    if (len > 2)
-       out[2] = word & 0xFF;
-    return len;
-}
-
 static unsigned char *read_blob(FILE * fp, int nlines, int *bloblen)
 {
     unsigned char *blob;