comparison src/core/ngx_string.c @ 5551:a602e1006579

Core: added ngx_encode_base64url().
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 04 Feb 2014 04:59:21 +0400
parents 72e31d88defa
children d421be0d842a 516d8e299273
comparison
equal deleted inserted replaced
5550:3c5ddf0575d8 5551:a602e1006579
9 #include <ngx_core.h> 9 #include <ngx_core.h>
10 10
11 11
12 static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, 12 static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64,
13 u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width); 13 u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width);
14 static void ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src,
15 const u_char *basis, ngx_uint_t padding);
14 static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src, 16 static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src,
15 const u_char *basis); 17 const u_char *basis);
16 18
17 19
18 void 20 void
1098 1100
1099 1101
1100 void 1102 void
1101 ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src) 1103 ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)
1102 { 1104 {
1105 static u_char basis64[] =
1106 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1107
1108 ngx_encode_base64_internal(dst, src, basis64, 1);
1109 }
1110
1111
1112 void
1113 ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src)
1114 {
1115 static u_char basis64[] =
1116 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
1117
1118 ngx_encode_base64_internal(dst, src, basis64, 0);
1119 }
1120
1121
1122 static void
1123 ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis,
1124 ngx_uint_t padding)
1125 {
1103 u_char *d, *s; 1126 u_char *d, *s;
1104 size_t len; 1127 size_t len;
1105 static u_char basis64[] =
1106 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1107 1128
1108 len = src->len; 1129 len = src->len;
1109 s = src->data; 1130 s = src->data;
1110 d = dst->data; 1131 d = dst->data;
1111 1132
1112 while (len > 2) { 1133 while (len > 2) {
1113 *d++ = basis64[(s[0] >> 2) & 0x3f]; 1134 *d++ = basis[(s[0] >> 2) & 0x3f];
1114 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)]; 1135 *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];
1115 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)]; 1136 *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)];
1116 *d++ = basis64[s[2] & 0x3f]; 1137 *d++ = basis[s[2] & 0x3f];
1117 1138
1118 s += 3; 1139 s += 3;
1119 len -= 3; 1140 len -= 3;
1120 } 1141 }
1121 1142
1122 if (len) { 1143 if (len) {
1123 *d++ = basis64[(s[0] >> 2) & 0x3f]; 1144 *d++ = basis[(s[0] >> 2) & 0x3f];
1124 1145
1125 if (len == 1) { 1146 if (len == 1) {
1126 *d++ = basis64[(s[0] & 3) << 4]; 1147 *d++ = basis[(s[0] & 3) << 4];
1148 if (padding) {
1149 *d++ = '=';
1150 }
1151
1152 } else {
1153 *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)];
1154 *d++ = basis[(s[1] & 0x0f) << 2];
1155 }
1156
1157 if (padding) {
1127 *d++ = '='; 1158 *d++ = '=';
1128 1159 }
1129 } else {
1130 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
1131 *d++ = basis64[(s[1] & 0x0f) << 2];
1132 }
1133
1134 *d++ = '=';
1135 } 1160 }
1136 1161
1137 dst->len = d - dst->data; 1162 dst->len = d - dst->data;
1138 } 1163 }
1139 1164