source: uKadecot/trunk/uip/apps/webserver/base64.c@ 108

Last change on this file since 108 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 3.1 KB
Line 
1/*
2 * Copyright(c) 2010, Norio Kobota, All rights reserved.
3 */
4
5#include <string.h>
6#include <stdlib.h>
7
8#include "base64.h"
9
10static const char base64_encode_chars[] =
11 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
12 "abcdefghijklmnopqrstuvwxyz"
13 "0123456789+/";
14
15static const signed char base64_decode_chars[] = {
16 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
17 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
18 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
19 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
20 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
21 - 1, - 1, - 1, 62, - 1, - 1, - 1, 63,
22 52, 53, 54, 55, 56, 57, 58, 59,
23 60, 61, - 1, - 1, - 1, 0, - 1, - 1,
24 - 1, 0, 1, 2, 3, 4, 5, 6,
25 7, 8, 9, 10, 11, 12, 13, 14,
26 15, 16, 17, 18, 19, 20, 21, 22,
27 23, 24, 25, - 1, - 1, - 1, - 1, - 1,
28 - 1, 26, 27, 28, 29, 30, 31, 32,
29 33, 34, 35, 36, 37, 38, 39, 40,
30 41, 42, 43, 44, 45, 46, 47, 48,
31 49, 50, 51, - 1, - 1, - 1, - 1, - 1,
32 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
33 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
34 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
35 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
36 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
37 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
38 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
39 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
40 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
41 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
42 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
43 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
44 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
45 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
46 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,
47 - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1};
48
49int base64_encode(unsigned char *dst, size_t dstsiz, const unsigned char *src, size_t srcsiz) {
50 unsigned long x = 0UL;
51 int i = 0, l = 0;
52 unsigned char *pdst;
53
54 pdst = dst;
55 for (; srcsiz > 0; src++, srcsiz--) {
56 x = x << 8 | *src;
57 for (l += 8; l >= 6; l -= 6) {
58 if (i >= dstsiz)
59 return -1;
60 pdst[i++] = base64_encode_chars[(x >> (l - 6)) & 0x3f];
61 }
62 }
63 if (l > 0) {
64 x <<= 6 - l;
65 if (i >= dstsiz)
66 return -1;
67 pdst[i++] = base64_encode_chars[x & 0x3f];
68 }
69 for (; i % 4;) {
70 if (i >= dstsiz)
71 return -1;
72 pdst[i++] = '=';
73 }
74 if (i >= dstsiz)
75 return -1;
76 pdst[i] = '\0';
77 return i;
78}
79
80int base64_decode(unsigned char *dst, size_t dstsiz, const unsigned char *src) {
81 union {
82 unsigned long x;
83 char c[4];
84 } base64;
85 unsigned char *pdst;
86 int i, j = 0, k = 0;
87 size_t srcsiz = strlen((const char *)src);
88
89 if ((srcsiz % 4) != 0) {
90 return -1;
91 }
92 base64.x = 0UL;
93 pdst = dst;
94 for (; srcsiz > 0; src+=4, srcsiz-=4) {
95 for (i = 0; i < 4; i++) {
96 if (base64_decode_chars[src[i]] == -1) {
97 return -1;
98 }
99 base64.x = base64.x << 6 | base64_decode_chars[src[i]];
100 j += (src[i] == '=');
101 }
102 for (i = 3; i > j; i--, k++) {
103 if (k >= dstsiz)
104 return -1;
105 *pdst++ = base64.c[i - 1];
106 }
107 }
108 if (k >= dstsiz)
109 return -1;
110 *pdst = '\0';
111 return 0;
112}
Note: See TracBrowser for help on using the repository browser.