source: box/trunk/lib/httpserver/cencode.cpp @ 2442

Revision 2442, 2.5 KB checked in by chris, 3 years ago (diff)

Add Amazon S3 signature checking to simulator.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-c++src
Line 
1/*
2cencoder.c - c source to a base64 encoding algorithm implementation
3
4This is part of the libb64 project, and has been placed in the public domain.
5For details, see http://sourceforge.net/projects/libb64
6*/
7
8extern "C"
9{
10
11#include "cencode.h"
12
13const int CHARS_PER_LINE = 72;
14
15void base64_init_encodestate(base64_encodestate* state_in)
16{
17        state_in->step = step_A;
18        state_in->result = 0;
19        state_in->stepcount = 0;
20}
21
22char base64_encode_value(char value_in)
23{
24        static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
25        if (value_in > 63) return '=';
26        return encoding[(int)value_in];
27}
28
29int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in)
30{
31        const char* plainchar = plaintext_in;
32        const char* const plaintextend = plaintext_in + length_in;
33        char* codechar = code_out;
34        char result;
35        char fragment;
36       
37        result = state_in->result;
38       
39        switch (state_in->step)
40        {
41                while (1)
42                {
43        case step_A:
44                        if (plainchar == plaintextend)
45                        {
46                                state_in->result = result;
47                                state_in->step = step_A;
48                                return codechar - code_out;
49                        }
50                        fragment = *plainchar++;
51                        result = (fragment & 0x0fc) >> 2;
52                        *codechar++ = base64_encode_value(result);
53                        result = (fragment & 0x003) << 4;
54        case step_B:
55                        if (plainchar == plaintextend)
56                        {
57                                state_in->result = result;
58                                state_in->step = step_B;
59                                return codechar - code_out;
60                        }
61                        fragment = *plainchar++;
62                        result |= (fragment & 0x0f0) >> 4;
63                        *codechar++ = base64_encode_value(result);
64                        result = (fragment & 0x00f) << 2;
65        case step_C:
66                        if (plainchar == plaintextend)
67                        {
68                                state_in->result = result;
69                                state_in->step = step_C;
70                                return codechar - code_out;
71                        }
72                        fragment = *plainchar++;
73                        result |= (fragment & 0x0c0) >> 6;
74                        *codechar++ = base64_encode_value(result);
75                        result  = (fragment & 0x03f) >> 0;
76                        *codechar++ = base64_encode_value(result);
77                       
78                        ++(state_in->stepcount);
79                        if (state_in->stepcount == CHARS_PER_LINE/4)
80                        {
81                                *codechar++ = '\n';
82                                state_in->stepcount = 0;
83                        }
84                }
85        }
86        /* control should not reach here */
87        return codechar - code_out;
88}
89
90int base64_encode_blockend(char* code_out, base64_encodestate* state_in)
91{
92        char* codechar = code_out;
93       
94        switch (state_in->step)
95        {
96        case step_B:
97                *codechar++ = base64_encode_value(state_in->result);
98                *codechar++ = '=';
99                *codechar++ = '=';
100                break;
101        case step_C:
102                *codechar++ = base64_encode_value(state_in->result);
103                *codechar++ = '=';
104                break;
105        case step_A:
106                break;
107        }
108        *codechar++ = '\n';
109       
110        return codechar - code_out;
111}
112
113}
Note: See TracBrowser for help on using the repository browser.