Linux Audio

Check our new training course

Loading...
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0
  2
  3#include <linux/errno.h>
  4
  5int ceph_armor(char *dst, const char *src, const char *end);
  6int ceph_unarmor(char *dst, const char *src, const char *end);
  7
  8/*
  9 * base64 encode/decode.
 10 */
 11
 12static const char *pem_key =
 13	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 14
 15static int encode_bits(int c)
 16{
 17	return pem_key[c];
 18}
 19
 20static int decode_bits(char c)
 21{
 22	if (c >= 'A' && c <= 'Z')
 23		return c - 'A';
 24	if (c >= 'a' && c <= 'z')
 25		return c - 'a' + 26;
 26	if (c >= '0' && c <= '9')
 27		return c - '0' + 52;
 28	if (c == '+')
 29		return 62;
 30	if (c == '/')
 31		return 63;
 32	if (c == '=')
 33		return 0; /* just non-negative, please */
 34	return -EINVAL;
 35}
 36
 37int ceph_armor(char *dst, const char *src, const char *end)
 38{
 39	int olen = 0;
 40	int line = 0;
 41
 42	while (src < end) {
 43		unsigned char a, b, c;
 44
 45		a = *src++;
 46		*dst++ = encode_bits(a >> 2);
 47		if (src < end) {
 48			b = *src++;
 49			*dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
 50			if (src < end) {
 51				c = *src++;
 52				*dst++ = encode_bits(((b & 15) << 2) |
 53						     (c >> 6));
 54				*dst++ = encode_bits(c & 63);
 55			} else {
 56				*dst++ = encode_bits((b & 15) << 2);
 57				*dst++ = '=';
 58			}
 59		} else {
 60			*dst++ = encode_bits(((a & 3) << 4));
 61			*dst++ = '=';
 62			*dst++ = '=';
 63		}
 64		olen += 4;
 65		line += 4;
 66		if (line == 64) {
 67			line = 0;
 68			*(dst++) = '\n';
 69			olen++;
 70		}
 71	}
 72	return olen;
 73}
 74
 75int ceph_unarmor(char *dst, const char *src, const char *end)
 76{
 77	int olen = 0;
 78
 79	while (src < end) {
 80		int a, b, c, d;
 81
 82		if (src[0] == '\n') {
 83			src++;
 84			continue;
 85		}
 86		if (src + 4 > end)
 87			return -EINVAL;
 88		a = decode_bits(src[0]);
 89		b = decode_bits(src[1]);
 90		c = decode_bits(src[2]);
 91		d = decode_bits(src[3]);
 92		if (a < 0 || b < 0 || c < 0 || d < 0)
 93			return -EINVAL;
 94
 95		*dst++ = (a << 2) | (b >> 4);
 96		if (src[2] == '=')
 97			return olen + 1;
 98		*dst++ = ((b & 15) << 4) | (c >> 2);
 99		if (src[3] == '=')
100			return olen + 2;
101		*dst++ = ((c & 3) << 6) | d;
102		olen += 3;
103		src += 4;
104	}
105	return olen;
106}
v4.6
 
  1
  2#include <linux/errno.h>
  3
  4int ceph_armor(char *dst, const char *src, const char *end);
  5int ceph_unarmor(char *dst, const char *src, const char *end);
  6
  7/*
  8 * base64 encode/decode.
  9 */
 10
 11static const char *pem_key =
 12	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 13
 14static int encode_bits(int c)
 15{
 16	return pem_key[c];
 17}
 18
 19static int decode_bits(char c)
 20{
 21	if (c >= 'A' && c <= 'Z')
 22		return c - 'A';
 23	if (c >= 'a' && c <= 'z')
 24		return c - 'a' + 26;
 25	if (c >= '0' && c <= '9')
 26		return c - '0' + 52;
 27	if (c == '+')
 28		return 62;
 29	if (c == '/')
 30		return 63;
 31	if (c == '=')
 32		return 0; /* just non-negative, please */
 33	return -EINVAL;
 34}
 35
 36int ceph_armor(char *dst, const char *src, const char *end)
 37{
 38	int olen = 0;
 39	int line = 0;
 40
 41	while (src < end) {
 42		unsigned char a, b, c;
 43
 44		a = *src++;
 45		*dst++ = encode_bits(a >> 2);
 46		if (src < end) {
 47			b = *src++;
 48			*dst++ = encode_bits(((a & 3) << 4) | (b >> 4));
 49			if (src < end) {
 50				c = *src++;
 51				*dst++ = encode_bits(((b & 15) << 2) |
 52						     (c >> 6));
 53				*dst++ = encode_bits(c & 63);
 54			} else {
 55				*dst++ = encode_bits((b & 15) << 2);
 56				*dst++ = '=';
 57			}
 58		} else {
 59			*dst++ = encode_bits(((a & 3) << 4));
 60			*dst++ = '=';
 61			*dst++ = '=';
 62		}
 63		olen += 4;
 64		line += 4;
 65		if (line == 64) {
 66			line = 0;
 67			*(dst++) = '\n';
 68			olen++;
 69		}
 70	}
 71	return olen;
 72}
 73
 74int ceph_unarmor(char *dst, const char *src, const char *end)
 75{
 76	int olen = 0;
 77
 78	while (src < end) {
 79		int a, b, c, d;
 80
 81		if (src[0] == '\n') {
 82			src++;
 83			continue;
 84		}
 85		if (src + 4 > end)
 86			return -EINVAL;
 87		a = decode_bits(src[0]);
 88		b = decode_bits(src[1]);
 89		c = decode_bits(src[2]);
 90		d = decode_bits(src[3]);
 91		if (a < 0 || b < 0 || c < 0 || d < 0)
 92			return -EINVAL;
 93
 94		*dst++ = (a << 2) | (b >> 4);
 95		if (src[2] == '=')
 96			return olen + 1;
 97		*dst++ = ((b & 15) << 4) | (c >> 2);
 98		if (src[3] == '=')
 99			return olen + 2;
100		*dst++ = ((c & 3) << 6) | d;
101		olen += 3;
102		src += 4;
103	}
104	return olen;
105}