Source file src/pkg/encoding/base32/base32.go
1
2
3
4
5
6 package base32
7
8 import (
9 "bytes"
10 "io"
11 "strconv"
12 "strings"
13 )
14
15
18
19
20
21
22
23 type Encoding struct {
24 encode [32]byte
25 decodeMap [256]byte
26 padChar rune
27 }
28
29 const (
30 StdPadding rune = '='
31 NoPadding rune = -1
32 )
33
34 const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
35 const encodeHex = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
36
37
38
39 func NewEncoding(encoder string) *Encoding {
40 if len(encoder) != 32 {
41 panic("encoding alphabet is not 32-bytes long")
42 }
43
44 e := new(Encoding)
45 copy(e.encode[:], encoder)
46 e.padChar = StdPadding
47
48 for i := 0; i < len(e.decodeMap); i++ {
49 e.decodeMap[i] = 0xFF
50 }
51 for i := 0; i < len(encoder); i++ {
52 e.decodeMap[encoder[i]] = byte(i)
53 }
54 return e
55 }
56
57
58
59 var StdEncoding = NewEncoding(encodeStd)
60
61
62
63 var HexEncoding = NewEncoding(encodeHex)
64
65 var removeNewlinesMapper = func(r rune) rune {
66 if r == '\r' || r == '\n' {
67 return -1
68 }
69 return r
70 }
71
72
73
74
75
76
77 func (enc Encoding) WithPadding(padding rune) *Encoding {
78 if padding == '\r' || padding == '\n' || padding > 0xff {
79 panic("invalid padding")
80 }
81
82 for i := 0; i < len(enc.encode); i++ {
83 if rune(enc.encode[i]) == padding {
84 panic("padding contained in alphabet")
85 }
86 }
87
88 enc.padChar = padding
89 return &enc
90 }
91
92
95
96
97
98
99
100
101
102 func (enc *Encoding) Encode(dst, src []byte) {
103 for len(src) > 0 {
104 var b [8]byte
105
106
107
108 switch len(src) {
109 default:
110 b[7] = src[4] & 0x1F
111 b[6] = src[4] >> 5
112 fallthrough
113 case 4:
114 b[6] |= (src[3] << 3) & 0x1F
115 b[5] = (src[3] >> 2) & 0x1F
116 b[4] = src[3] >> 7
117 fallthrough
118 case 3:
119 b[4] |= (src[2] << 1) & 0x1F
120 b[3] = (src[2] >> 4) & 0x1F
121 fallthrough
122 case 2:
123 b[3] |= (src[1] << 4) & 0x1F
124 b[2] = (src[1] >> 1) & 0x1F
125 b[1] = (src[1] >> 6) & 0x1F
126 fallthrough
127 case 1:
128 b[1] |= (src[0] << 2) & 0x1F
129 b[0] = src[0] >> 3
130 }
131
132
133 size := len(dst)
134 if size >= 8 {
135
136 dst[0] = enc.encode[b[0]&31]
137 dst[1] = enc.encode[b[1]&31]
138 dst[2] = enc.encode[b[2]&31]
139 dst[3] = enc.encode[b[3]&31]
140 dst[4] = enc.encode[b[4]&31]
141 dst[5] = enc.encode[b[5]&31]
142 dst[6] = enc.encode[b[6]&31]
143 dst[7] = enc.encode[b[7]&31]
144 } else {
145 for i := 0; i < size; i++ {
146 dst[i] = enc.encode[b[i]&31]
147 }
148 }
149
150
151 if len(src) < 5 {
152 if enc.padChar == NoPadding {
153 break
154 }
155
156 dst[7] = byte(enc.padChar)
157 if len(src) < 4 {
158 dst[6] = byte(enc.padChar)
159 dst[5] = byte(enc.padChar)
160 if len(src) < 3 {
161 dst[4] = byte(enc.padChar)
162 if len(src) < 2 {
163 dst[3] = byte(enc.padChar)
164 dst[2] = byte(enc.padChar)
165 }
166 }
167 }
168
169 break
170 }
171
172 src = src[5:]
173 dst = dst[8:]
174 }
175 }
176
177
178 func (enc *Encoding) EncodeToString(src []byte) string {
179 buf := make([]byte, enc.EncodedLen(len(src)))
180 enc.Encode(buf, src)
181 return string(buf)
182 }
183
184 type encoder struct {
185 err error
186 enc *Encoding
187 w io.Writer
188 buf [5]byte
189 nbuf int
190 out [1024]byte
191 }
192
193 func (e *encoder) Write(p []byte) (n int, err error) {
194 if e.err != nil {
195 return 0, e.err
196 }
197
198
199 if e.nbuf > 0 {
200 var i int
201 for i = 0; i < len(p) && e.nbuf < 5; i++ {
202 e.buf[e.nbuf] = p[i]
203 e.nbuf++
204 }
205 n += i
206 p = p[i:]
207 if e.nbuf < 5 {
208 return
209 }
210 e.enc.Encode(e.out[0:], e.buf[0:])
211 if _, e.err = e.w.Write(e.out[0:8]); e.err != nil {
212 return n, e.err
213 }
214 e.nbuf = 0
215 }
216
217
218 for len(p) >= 5 {
219 nn := len(e.out) / 8 * 5
220 if nn > len(p) {
221 nn = len(p)
222 nn -= nn % 5
223 }
224 e.enc.Encode(e.out[0:], p[0:nn])
225 if _, e.err = e.w.Write(e.out[0 : nn/5*8]); e.err != nil {
226 return n, e.err
227 }
228 n += nn
229 p = p[nn:]
230 }
231
232
233 for i := 0; i < len(p); i++ {
234 e.buf[i] = p[i]
235 }
236 e.nbuf = len(p)
237 n += len(p)
238 return
239 }
240
241
242
243 func (e *encoder) Close() error {
244
245 if e.err == nil && e.nbuf > 0 {
246 e.enc.Encode(e.out[0:], e.buf[0:e.nbuf])
247 encodedLen := e.enc.EncodedLen(e.nbuf)
248 e.nbuf = 0
249 _, e.err = e.w.Write(e.out[0:encodedLen])
250 }
251 return e.err
252 }
253
254
255
256
257
258
259 func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser {
260 return &encoder{enc: enc, w: w}
261 }
262
263
264
265 func (enc *Encoding) EncodedLen(n int) int {
266 if enc.padChar == NoPadding {
267 return (n*8 + 4) / 5
268 }
269 return (n + 4) / 5 * 8
270 }
271
272
275
276 type CorruptInputError int64
277
278 func (e CorruptInputError) Error() string {
279 return "illegal base32 data at input byte " + strconv.FormatInt(int64(e), 10)
280 }
281
282
283
284
285
286 func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
287
288 _ = enc.decodeMap
289
290 dsti := 0
291 olen := len(src)
292
293 for len(src) > 0 && !end {
294
295 var dbuf [8]byte
296 dlen := 8
297
298 for j := 0; j < 8; {
299
300 if len(src) == 0 {
301 if enc.padChar != NoPadding {
302
303 return n, false, CorruptInputError(olen - len(src) - j)
304 }
305
306 dlen, end = j, true
307 break
308 }
309 in := src[0]
310 src = src[1:]
311 if in == byte(enc.padChar) && j >= 2 && len(src) < 8 {
312
313 if len(src)+j < 8-1 {
314
315 return n, false, CorruptInputError(olen)
316 }
317 for k := 0; k < 8-1-j; k++ {
318 if len(src) > k && src[k] != byte(enc.padChar) {
319
320 return n, false, CorruptInputError(olen - len(src) + k - 1)
321 }
322 }
323 dlen, end = j, true
324
325
326
327
328
329 if dlen == 1 || dlen == 3 || dlen == 6 {
330 return n, false, CorruptInputError(olen - len(src) - 1)
331 }
332 break
333 }
334 dbuf[j] = enc.decodeMap[in]
335 if dbuf[j] == 0xFF {
336 return n, false, CorruptInputError(olen - len(src) - 1)
337 }
338 j++
339 }
340
341
342
343 switch dlen {
344 case 8:
345 dst[dsti+4] = dbuf[6]<<5 | dbuf[7]
346 n++
347 fallthrough
348 case 7:
349 dst[dsti+3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3
350 n++
351 fallthrough
352 case 5:
353 dst[dsti+2] = dbuf[3]<<4 | dbuf[4]>>1
354 n++
355 fallthrough
356 case 4:
357 dst[dsti+1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4
358 n++
359 fallthrough
360 case 2:
361 dst[dsti+0] = dbuf[0]<<3 | dbuf[1]>>2
362 n++
363 }
364 dsti += 5
365 }
366 return n, end, nil
367 }
368
369
370
371
372
373
374 func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
375 src = bytes.Map(removeNewlinesMapper, src)
376 n, _, err = enc.decode(dst, src)
377 return
378 }
379
380
381 func (enc *Encoding) DecodeString(s string) ([]byte, error) {
382 s = strings.Map(removeNewlinesMapper, s)
383 dbuf := make([]byte, enc.DecodedLen(len(s)))
384 n, _, err := enc.decode(dbuf, []byte(s))
385 return dbuf[:n], err
386 }
387
388 type decoder struct {
389 err error
390 enc *Encoding
391 r io.Reader
392 end bool
393 buf [1024]byte
394 nbuf int
395 out []byte
396 outbuf [1024 / 8 * 5]byte
397 }
398
399 func readEncodedData(r io.Reader, buf []byte, min int, expectsPadding bool) (n int, err error) {
400 for n < min && err == nil {
401 var nn int
402 nn, err = r.Read(buf[n:])
403 n += nn
404 }
405
406 if n < min && n > 0 && err == io.EOF {
407 err = io.ErrUnexpectedEOF
408 }
409
410
411
412 if expectsPadding && min < 8 && n == 0 && err == io.EOF {
413 err = io.ErrUnexpectedEOF
414 }
415 return
416 }
417
418 func (d *decoder) Read(p []byte) (n int, err error) {
419
420 if len(d.out) > 0 {
421 n = copy(p, d.out)
422 d.out = d.out[n:]
423 if len(d.out) == 0 {
424 return n, d.err
425 }
426 return n, nil
427 }
428
429 if d.err != nil {
430 return 0, d.err
431 }
432
433
434 nn := len(p) / 5 * 8
435 if nn < 8 {
436 nn = 8
437 }
438 if nn > len(d.buf) {
439 nn = len(d.buf)
440 }
441
442
443 var min int
444 var expectsPadding bool
445 if d.enc.padChar == NoPadding {
446 min = 1
447 expectsPadding = false
448 } else {
449 min = 8 - d.nbuf
450 expectsPadding = true
451 }
452
453 nn, d.err = readEncodedData(d.r, d.buf[d.nbuf:nn], min, expectsPadding)
454 d.nbuf += nn
455 if d.nbuf < min {
456 return 0, d.err
457 }
458
459
460 var nr int
461 if d.enc.padChar == NoPadding {
462 nr = d.nbuf
463 } else {
464 nr = d.nbuf / 8 * 8
465 }
466 nw := d.enc.DecodedLen(d.nbuf)
467
468 if nw > len(p) {
469 nw, d.end, err = d.enc.decode(d.outbuf[0:], d.buf[0:nr])
470 d.out = d.outbuf[0:nw]
471 n = copy(p, d.out)
472 d.out = d.out[n:]
473 } else {
474 n, d.end, err = d.enc.decode(p, d.buf[0:nr])
475 }
476 d.nbuf -= nr
477 for i := 0; i < d.nbuf; i++ {
478 d.buf[i] = d.buf[i+nr]
479 }
480
481 if err != nil && (d.err == nil || d.err == io.EOF) {
482 d.err = err
483 }
484
485 if len(d.out) > 0 {
486
487
488
489
490 return n, nil
491 }
492
493 return n, d.err
494 }
495
496 type newlineFilteringReader struct {
497 wrapped io.Reader
498 }
499
500 func (r *newlineFilteringReader) Read(p []byte) (int, error) {
501 n, err := r.wrapped.Read(p)
502 for n > 0 {
503 offset := 0
504 for i, b := range p[0:n] {
505 if b != '\r' && b != '\n' {
506 if i != offset {
507 p[offset] = b
508 }
509 offset++
510 }
511 }
512 if err != nil || offset > 0 {
513 return offset, err
514 }
515
516 n, err = r.wrapped.Read(p)
517 }
518 return n, err
519 }
520
521
522 func NewDecoder(enc *Encoding, r io.Reader) io.Reader {
523 return &decoder{enc: enc, r: &newlineFilteringReader{r}}
524 }
525
526
527
528 func (enc *Encoding) DecodedLen(n int) int {
529 if enc.padChar == NoPadding {
530 return n * 5 / 8
531 }
532
533 return n / 8 * 5
534 }
535
View as plain text