… | |
… | |
146 | assert (size < 256); |
146 | assert (size < 256); |
147 | } |
147 | } |
148 | |
148 | |
149 | #define MAX_DEC_LEN 500 |
149 | #define MAX_DEC_LEN 500 |
150 | #define MAX_ENC_LEN (MAX_DEC_LEN * 2) |
150 | #define MAX_ENC_LEN (MAX_DEC_LEN * 2) |
151 | #define MAX_LIMBS ((MAX_DEC_LEN * 8 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS) |
151 | #define MAX_LIMBS ((MAX_DEC_LEN * 8 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS + 1) |
152 | |
152 | |
153 | // ugly. minimum base is 16(!) |
153 | // ugly. minimum base is 16(!) |
154 | struct basecoder |
154 | struct basecoder |
155 | { |
155 | { |
156 | charmap cmap; |
156 | charmap cmap; |
… | |
… | |
167 | }; |
167 | }; |
168 | |
168 | |
169 | basecoder::basecoder (const char *cmap) |
169 | basecoder::basecoder (const char *cmap) |
170 | : cmap (cmap) |
170 | : cmap (cmap) |
171 | { |
171 | { |
|
|
172 | int decn = -1; |
|
|
173 | |
172 | for (unsigned int len = 0; len < MAX_DEC_LEN; ++len) |
174 | for (unsigned int len = 0; len < MAX_DEC_LEN; ++len) |
173 | { |
175 | { |
174 | u8 src [MAX_DEC_LEN]; |
176 | u8 src [MAX_DEC_LEN]; |
175 | u8 dst [MAX_ENC_LEN]; |
177 | u8 dst [MAX_ENC_LEN]; |
176 | |
178 | |
… | |
… | |
180 | mp_size_t n; |
182 | mp_size_t n; |
181 | |
183 | |
182 | n = mpn_set_str (m, src, len, 256); |
184 | n = mpn_set_str (m, src, len, 256); |
183 | n = mpn_get_str (dst, this->cmap.size, m, n); |
185 | n = mpn_get_str (dst, this->cmap.size, m, n); |
184 | |
186 | |
185 | for (int i = 0; !dst [i]; ++i) |
187 | for (int i = 0; n && !dst [i]; ++i, --n) |
186 | n--; |
188 | ; |
187 | |
189 | |
188 | enc_len [len] = n; |
190 | enc_len [len] = n; |
|
|
191 | while (decn < n) |
189 | dec_len [n] = len; |
192 | dec_len [++decn] = len; |
190 | } |
193 | } |
191 | } |
194 | } |
192 | |
195 | |
193 | unsigned int |
196 | unsigned int |
194 | basecoder::encode_len (unsigned int len) const |
197 | basecoder::encode_len (unsigned int len) const |
… | |
… | |
197 | } |
200 | } |
198 | |
201 | |
199 | unsigned int |
202 | unsigned int |
200 | basecoder::decode_len (unsigned int len) const |
203 | basecoder::decode_len (unsigned int len) const |
201 | { |
204 | { |
202 | while (len && !dec_len [len]) |
|
|
203 | --len; |
|
|
204 | |
|
|
205 | return dec_len [len]; |
205 | return dec_len [len]; |
206 | } |
206 | } |
207 | |
207 | |
208 | unsigned int |
208 | unsigned int |
209 | basecoder::encode (char *dst, u8 *src, unsigned int len) const |
209 | basecoder::encode (char *dst, u8 *src, unsigned int len) const |
… | |
… | |
364 | } |
364 | } |
365 | |
365 | |
366 | void |
366 | void |
367 | byte_stream::remove (int count) |
367 | byte_stream::remove (int count) |
368 | { |
368 | { |
369 | if (count > fill) |
|
|
370 | assert (count <= fill); |
369 | assert (count <= fill); |
371 | |
370 | |
372 | memmove (data, data + count, fill -= count); |
371 | memmove (data, data + count, fill -= count); |
373 | } |
372 | } |
374 | |
373 | |
375 | bool |
374 | bool |
… | |
… | |
395 | memcpy (data + fill, pkt->at (0), pkt->len); fill += pkt->len; |
394 | memcpy (data + fill, pkt->at (0), pkt->len); fill += pkt->len; |
396 | |
395 | |
397 | return true; |
396 | return true; |
398 | } |
397 | } |
399 | |
398 | |
|
|
399 | vpn_packet * |
400 | vpn_packet *byte_stream::get () |
400 | byte_stream::get () |
401 | { |
401 | { |
402 | unsigned int len; |
402 | unsigned int len; |
403 | |
403 | |
404 | for (;;) |
404 | for (;;) |
405 | { |
405 | { |
… | |
… | |
410 | |
410 | |
411 | if (len <= MAXSIZE) |
411 | if (len <= MAXSIZE) |
412 | break; |
412 | break; |
413 | |
413 | |
414 | // TODO: handle this better than skipping, e.g. by reset |
414 | // TODO: handle this better than skipping, e.g. by reset |
415 | slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x) stream skipping a byte..."), data [0], data [1]); |
415 | slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x > %d) stream skipping a byte..."), data [0], data [1], MAXSIZE); |
416 | remove (1); |
416 | remove (1); |
417 | } |
417 | } |
418 | |
418 | |
419 | if (fill < len + 2) |
419 | if (fill < len + 2) |
420 | return 0; |
420 | return 0; |