]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
armor: make armor encoding match libssl's base64
authorSage Weil <sage@newdream.net>
Thu, 10 Sep 2009 22:58:21 +0000 (15:58 -0700)
committerSage Weil <sage@newdream.net>
Thu, 10 Sep 2009 22:58:21 +0000 (15:58 -0700)
src/common/armor.c

index cb22d220dc62d88c39223e642a0c3d7bd8a0d5ba..73cc74e5670b06bc9340c2f7187b1a804f218b13 100644 (file)
@@ -24,38 +24,45 @@ static int decode_bits(char c)
                return 62;
        if (c == '/')
                return 63;
+       if (c == '=')
+               return 0; /* just non-negative, please */
        return -EINVAL; 
 }
 
 int ceph_armor(char *dst, const char *src, const char *end)
 {
        int olen = 0;
-       int tailzero = 0;
+       int line = 0;
 
        while (src < end) {
                unsigned char a, b, c;
 
                a = *src++;
+               *dst++ = encode_bits(a >> 2);
                if (src < end) {
                        b = *src++;
+                       *dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
                        if (src < end) {
                                c = *src++;
+                               *dst++ = encode_bits(((b & 15) << 2) | (c >> 6));
+                               *dst++ = encode_bits(c & 63);
                        } else {
-                               tailzero = 1;
-                               c = 0;
+                               *dst++ = encode_bits((b & 15) << 2);
+                               *dst++ = '=';                           
                        }
                } else {
-                       b = c = 0;
-                       tailzero = 2;
+                       *dst++ = encode_bits(((a & 3) << 4));
+                       *dst++ = '=';
+                       *dst++ = '=';
                }
-               *dst++ = encode_bits(a >> 2);
-               *dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
-               *dst++ = encode_bits(((b & 15) << 2) | (c >> 6));
-               *dst++ = encode_bits(c & 63);
                olen += 4;
+               line += 4;
+               if (line == 64) {
+                       line = 0;
+                       *(dst++) = '\n';
+                       olen++;
+               }
        }
-       while (tailzero--)
-               *(--dst) = '=';
        return olen;
 }
 
@@ -66,6 +73,8 @@ int ceph_unarmor(char *dst, const char *src, const char *end)
        while (src < end) {
                int a, b, c, d;
 
+               if (src < end && src[0] == '\n')
+                       src++;
                if (src + 4 > end)
                        return -EINVAL;
                a = decode_bits(src[0]);
@@ -78,10 +87,10 @@ int ceph_unarmor(char *dst, const char *src, const char *end)
                *dst++ = (a << 2) | (b >> 4);
                if (src[2] == '=')
                        return olen + 1;
-               *dst++ = (b << 4) | (c >> 4);
+               *dst++ = ((b & 15) << 4) | (c >> 2);
                if (src[3] == '=')
                        return olen + 2;
-               *dst++ = (c << 6) | d;
+               *dst++ = ((c & 3) << 6) | d;
                olen += 3;
                src += 4;
        }