Initial commit
[pwdhash.git] / b64-cl.c
1 #include "b64-cl.h"
2
3 const char b64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
4
5 u32 b64_encode (u8 *base64_hash, const u32 len, const u8 *base64_plain)
6 {
7 u8 *out_ptr = (u8 *) base64_hash;
8 u8 *in_ptr = (u8 *) base64_plain;
9
10 u32 i;
11
12 for (i = 0; i < (len - 2); i += 3)
13 {
14 char out_val0 = b64_table [ ((in_ptr[0] >> 2) & 0x3f)];
15 char out_val1 = b64_table [((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)];
16 char out_val2 = b64_table [((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03)];
17 char out_val3 = b64_table [ ((in_ptr[2] >> 0) & 0x3f)];
18
19 out_ptr[0] = out_val0 & 0x7f;
20 out_ptr[1] = out_val1 & 0x7f;
21 out_ptr[2] = out_val2 & 0x7f;
22 out_ptr[3] = out_val3 & 0x7f;
23
24 in_ptr += 3;
25 out_ptr += 4;
26 }
27 if (i == (len - 1)) {
28 char out_val0 = b64_table [ ((in_ptr[0] >> 2) & 0x3f)];
29 char out_val1 = b64_table [((in_ptr[0] << 4) & 0x30) ];
30
31 out_ptr[0] = out_val0 & 0x7f;
32 out_ptr[1] = out_val1 & 0x7f;
33 out_ptr[2] = '=';
34 out_ptr[3] = '=';
35
36 in_ptr += 3;
37 out_ptr += 4;
38 }
39 if (i == (len - 2)) {
40 char out_val0 = b64_table [ ((in_ptr[0] >> 2) & 0x3f)];
41 char out_val1 = b64_table [((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)];
42 char out_val2 = b64_table [((in_ptr[1] << 2) & 0x3c) ];
43
44 out_ptr[0] = out_val0 & 0x7f;
45 out_ptr[1] = out_val1 & 0x7f;
46 out_ptr[2] = out_val2 & 0x7f;
47 out_ptr[3] = '=';
48
49 in_ptr += 3;
50 out_ptr += 4;
51 }
52
53 return (out_ptr - base64_hash + 0);
54 }
55