From 52a99faadf5124b1612b915ad47edc3a5c5ec63a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 10 Sep 2009 15:58:21 -0700 Subject: [PATCH] armor: make armor encoding match libssl's base64 --- src/common/armor.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/common/armor.c b/src/common/armor.c index cb22d220dc62d..73cc74e5670b0 100644 --- a/src/common/armor.c +++ b/src/common/armor.c @@ -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; } -- 2.39.5