-
Notifications
You must be signed in to change notification settings - Fork 0
/
pgpwordlist.go
60 lines (54 loc) · 1.82 KB
/
pgpwordlist.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
* Copyright (c) 2015-2016 The Decred developers
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package pgpwordlist
import (
"strings"
"github.com/fistchain/fistwallet/errors"
)
// ByteToMnemonic returns the PGP word list encoding of b when found at index.
func ByteToMnemonic(b byte, index int) string {
bb := uint16(b) * 2
if index%2 != 0 {
bb++
}
return wordList[bb]
}
// DecodeMnemonics returns the decoded value that is encoded by words. Any
// words that are whitespace are empty are skipped.
func DecodeMnemonics(words []string) ([]byte, error) {
const op errors.Op = "pgpwordlist.DecodeMnemonics"
decoded := make([]byte, len(words))
idx := 0
for _, w := range words {
w = strings.TrimSpace(w)
if w == "" {
continue
}
b, ok := wordIndexes[strings.ToLower(w)]
if !ok {
err := errors.Errorf("word %v is not in the PGP word list", w)
return nil, errors.E(op, errors.Encoding, err)
}
if int(b%2) != idx%2 {
err := errors.Errorf("word %v is not valid at position %v, "+
"check for missing words", w, idx)
return nil, errors.E(op, errors.Encoding, err)
}
decoded[idx] = byte(b / 2)
idx++
}
return decoded[:idx], nil
}