~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ceph/armor.c

Version: ~ [ linux-6.3-rc3 ] ~ [ linux-6.2.7 ] ~ [ linux-6.1.20 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.103 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.175 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.237 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.278 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.310 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 
  2 #include <linux/errno.h>
  3 
  4 int ceph_armor(char *dst, const char *src, const char *end);
  5 int ceph_unarmor(char *dst, const char *src, const char *end);
  6 
  7 /*
  8  * base64 encode/decode.
  9  */
 10 
 11 static const char *pem_key =
 12         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 13 
 14 static int encode_bits(int c)
 15 {
 16         return pem_key[c];
 17 }
 18 
 19 static 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 >= '' && c <= '9')
 26                 return c - '' + 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 
 36 int 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 
 74 int 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 }
106 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp