Mercurial > hg > nginx-quic
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 |