diff options
author | obscuren <geffobscura@gmail.com> | 2014-12-20 09:34:12 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-12-20 09:34:12 +0800 |
commit | 3983dd2428137211f84f299f9ce8690c22f50afd (patch) | |
tree | 3a2dc53b365e6f377fc82a3514150d1297fe549c /crypto/mnemonic.go | |
parent | 7daa8c2f6eb25511c6a54ad420709af911fc6748 (diff) | |
parent | 0a9dc1536c5d776844d6947a0090ff7e1a7c6ab4 (diff) | |
download | go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.gz go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.bz2 go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.lz go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.xz go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.zst go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.zip |
Merge branch 'release/v0.7.10'vv0.7.10
Diffstat (limited to 'crypto/mnemonic.go')
-rw-r--r-- | crypto/mnemonic.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/crypto/mnemonic.go b/crypto/mnemonic.go new file mode 100644 index 000000000..0d690f245 --- /dev/null +++ b/crypto/mnemonic.go @@ -0,0 +1,60 @@ +package crypto + +import ( + "fmt" + "strconv" +) + +// TODO: See if we can refactor this into a shared util lib if we need it multiple times +func IndexOf(slice []string, value string) int64 { + for p, v := range slice { + if v == value { + return int64(p) + } + } + return -1 +} + +func MnemonicEncode(message string) []string { + var out []string + n := int64(len(MnemonicWords)) + + for i := 0; i < len(message); i += (len(message) / 8) { + x := message[i : i+8] + bit, _ := strconv.ParseInt(x, 16, 64) + w1 := (bit % n) + w2 := ((bit / n) + w1) % n + w3 := ((bit / n / n) + w2) % n + out = append(out, MnemonicWords[w1], MnemonicWords[w2], MnemonicWords[w3]) + } + return out +} + +func MnemonicDecode(wordsar []string) string { + var out string + n := int64(len(MnemonicWords)) + + for i := 0; i < len(wordsar); i += 3 { + word1 := wordsar[i] + word2 := wordsar[i+1] + word3 := wordsar[i+2] + w1 := IndexOf(MnemonicWords, word1) + w2 := IndexOf(MnemonicWords, word2) + w3 := IndexOf(MnemonicWords, word3) + + y := (w2 - w1) % n + z := (w3 - w2) % n + + // Golang handles modulo with negative numbers different then most languages + // The modulo can be negative, we don't want that. + if z < 0 { + z += n + } + if y < 0 { + y += n + } + x := w1 + n*(y) + n*n*(z) + out += fmt.Sprintf("%08x", x) + } + return out +} |