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