From 5e86107a3486fc923c761a3202b82f7b986e2c21 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 28 Aug 2017 16:42:32 -0400 Subject: [PATCH 1/5] Update base32 dep. and bump go version to 1.8.3 in CI tests. --- .travis.yml | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b95a291..3cb0758 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ os: language: go go: - - 1.7 + - 1.8.3 install: - go get -u github.com/whyrusleeping/gx diff --git a/package.json b/package.json index 7bb8b8e..758df39 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "gxDependencies": [ { "author": "whyrusleeping", - "hash": "QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93", + "hash": "QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6", "name": "base32", - "version": "0.0.1" + "version": "0.0.2" }, { "author": "whyrusleeping", From 8d1441db4bede7cdfd342fc8c85c9d50718f28d0 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 28 Aug 2017 17:38:04 -0400 Subject: [PATCH 2/5] Make base32 encodings case preserving. --- multibase.go | 50 ++++++++++++++++++++++++++++++++++------------- multibase_test.go | 18 ++++++++++++----- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/multibase.go b/multibase.go index eced3d6..2b56b70 100644 --- a/multibase.go +++ b/multibase.go @@ -51,14 +51,22 @@ func Encode(base Encoding, data []byte) (string, error) { return string(Identity) + string(data), nil case Base16, Base16Upper: return string(Base16) + hex.EncodeToString(data), nil - case Base32, Base32Upper: - return string(Base32) + b32.RawStdEncoding.EncodeToString(data), nil - case Base32hex, Base32hexUpper: - return string(Base32hex) + b32.RawHexEncoding.EncodeToString(data), nil - case Base32pad, Base32padUpper: - return string(Base32pad) + b32.StdEncoding.EncodeToString(data), nil - case Base32hexPad, Base32hexPadUpper: - return string(Base32hexPad) + b32.HexEncoding.EncodeToString(data), nil + case Base32: + return string(Base32) + base32StdLowerNoPad.EncodeToString(data), nil + case Base32Upper: + return string(Base32Upper) + base32StdUpperNoPad.EncodeToString(data), nil + case Base32hex: + return string(Base32hex) + base32HexLowerNoPad.EncodeToString(data), nil + case Base32hexUpper: + return string(Base32hexUpper) + base32HexUpperNoPad.EncodeToString(data), nil + case Base32pad: + return string(Base32pad) + base32StdLowerPad.EncodeToString(data), nil + case Base32padUpper: + return string(Base32padUpper) + base32StdUpperPad.EncodeToString(data), nil + case Base32hexPad: + return string(Base32hexPad) + base32HexLowerPad.EncodeToString(data), nil + case Base32hexPadUpper: + return string(Base32hexPadUpper) + base32HexUpperPad.EncodeToString(data), nil case Base58BTC: return string(Base58BTC) + b58.EncodeAlphabet(data, b58.BTCAlphabet), nil case Base58Flickr: @@ -83,24 +91,26 @@ func Decode(data string) (Encoding, []byte, error) { return 0, nil, fmt.Errorf("cannot decode multibase for zero length string") } - switch data[0] { + enc := Encoding(data[0]) + + switch enc { case Identity: return Identity, []byte(data[1:]), nil case Base16, Base16Upper: bytes, err := hex.DecodeString(data[1:]) - return Base16, bytes, err + return enc, bytes, err case Base32, Base32Upper: bytes, err := b32.RawStdEncoding.DecodeString(data[1:]) - return Base32, bytes, err + return enc, bytes, err case Base32hex, Base32hexUpper: bytes, err := b32.RawHexEncoding.DecodeString(data[1:]) - return Base32hex, bytes, err + return enc, bytes, err case Base32pad, Base32padUpper: bytes, err := b32.StdEncoding.DecodeString(data[1:]) - return Base32pad, bytes, err + return enc, bytes, err case Base32hexPad, Base32hexPadUpper: bytes, err := b32.HexEncoding.DecodeString(data[1:]) - return Base32hexPad, bytes, err + return enc, bytes, err case Base58BTC: return Base58BTC, b58.DecodeAlphabet(data[1:], b58.BTCAlphabet), nil case Base58Flickr: @@ -121,3 +131,15 @@ func Decode(data string) (Encoding, []byte, error) { return -1, nil, ErrUnsupportedEncoding } } + +var base32StdLowerPad = b32.NewEncodingCI("abcdefghijklmnopqrstuvwxyz234567") +var base32StdLowerNoPad = base32StdLowerPad.WithPadding(b32.NoPadding) + +var base32StdUpperPad = b32.NewEncodingCI("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567") +var base32StdUpperNoPad = base32StdUpperPad.WithPadding(b32.NoPadding) + +var base32HexLowerPad = b32.NewEncodingCI("0123456789abcdefghijklmnopqrstuv") +var base32HexLowerNoPad = base32HexLowerPad.WithPadding(b32.NoPadding) + +var base32HexUpperPad = b32.NewEncodingCI("0123456789ABCDEFGHIJKLMNOPQRSTUV") +var base32HexUpperNoPad = base32HexUpperPad.WithPadding(b32.NoPadding) diff --git a/multibase_test.go b/multibase_test.go index e71f77f..5c9ada7 100644 --- a/multibase_test.go +++ b/multibase_test.go @@ -8,11 +8,19 @@ import ( var sampleBytes = []byte("Decentralize everything!!") var encodedSamples = map[Encoding]string{ - Identity: string(0x00) + "Decentralize everything!!", - Base16: "f446563656e7472616c697a652065766572797468696e672121", - Base58BTC: "zUXE7GvtEk8XTXs1GF8HSGbVA9FCX9SEBPe", - Base64pad: "MRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ==", - Base64urlPad: "URGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ==", + Identity: string(0x00) + "Decentralize everything!!", + Base16: "f446563656e7472616c697a652065766572797468696e672121", + Base32: "birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", + Base32Upper: "BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJB", + Base32pad: "cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", + Base32padUpper: "CIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJB", + Base32hex: "v8him6pbeehp62r39f9ii0pbmclp7it38d5n6e891", + Base32hexUpper: "V8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E891", + Base32hexPad: "t8him6pbeehp62r39f9ii0pbmclp7it38d5n6e891", + Base32hexPadUpper: "T8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E891", + Base58BTC: "zUXE7GvtEk8XTXs1GF8HSGbVA9FCX9SEBPe", + Base64pad: "MRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ==", + Base64urlPad: "URGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ==", } func testEncode(t *testing.T, encoding Encoding, bytes []byte, expected string) { From e98e07ec91ccfebdad398529333c6a3c25894aec Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 28 Aug 2017 17:48:25 -0400 Subject: [PATCH 3/5] Make base16 encoding case preserving. --- multibase.go | 25 ++++++++++++++++++++++++- multibase_test.go | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/multibase.go b/multibase.go index 2b56b70..24a4bd2 100644 --- a/multibase.go +++ b/multibase.go @@ -49,8 +49,10 @@ func Encode(base Encoding, data []byte) (string, error) { case Identity: // 0x00 inside a string is OK in golang and causes no problems with the length calculation. return string(Identity) + string(data), nil - case Base16, Base16Upper: + case Base16: return string(Base16) + hex.EncodeToString(data), nil + case Base16Upper: + return string(Base16Upper) + hexEncodeToStringUpper(data), nil case Base32: return string(Base32) + base32StdLowerNoPad.EncodeToString(data), nil case Base32Upper: @@ -143,3 +145,24 @@ var base32HexLowerNoPad = base32HexLowerPad.WithPadding(b32.NoPadding) var base32HexUpperPad = b32.NewEncodingCI("0123456789ABCDEFGHIJKLMNOPQRSTUV") var base32HexUpperNoPad = base32HexUpperPad.WithPadding(b32.NoPadding) + + +func hexEncodeToStringUpper(src []byte) string { + dst := make([]byte, len(src) * 2) + hexEncodeUpper(dst, src) + return string(dst) +} + +var hextableUpper = [16]byte{ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', +} + +func hexEncodeUpper(dst, src []byte) int { + for i, v := range src { + dst[i*2] = hextableUpper[v>>4] + dst[i*2+1] = hextableUpper[v&0x0f] + } + + return len(src) * 2 +} diff --git a/multibase_test.go b/multibase_test.go index 5c9ada7..e343f8c 100644 --- a/multibase_test.go +++ b/multibase_test.go @@ -10,6 +10,7 @@ var sampleBytes = []byte("Decentralize everything!!") var encodedSamples = map[Encoding]string{ Identity: string(0x00) + "Decentralize everything!!", Base16: "f446563656e7472616c697a652065766572797468696e672121", + Base16Upper: "F446563656E7472616C697A652065766572797468696E672121", Base32: "birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", Base32Upper: "BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJB", Base32pad: "cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", From e81eb6473bbb95e440d1d01ac4e07620017d156f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 28 Aug 2017 18:11:27 -0400 Subject: [PATCH 4/5] Change length of test string to encode to distinguish between padded and unpadded base32 encodings. --- multibase_test.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/multibase_test.go b/multibase_test.go index e343f8c..c402385 100644 --- a/multibase_test.go +++ b/multibase_test.go @@ -6,22 +6,22 @@ import ( "testing" ) -var sampleBytes = []byte("Decentralize everything!!") +var sampleBytes = []byte("Decentralize everything!!!") var encodedSamples = map[Encoding]string{ - Identity: string(0x00) + "Decentralize everything!!", - Base16: "f446563656e7472616c697a652065766572797468696e672121", - Base16Upper: "F446563656E7472616C697A652065766572797468696E672121", - Base32: "birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", - Base32Upper: "BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJB", - Base32pad: "cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijb", - Base32padUpper: "CIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJB", - Base32hex: "v8him6pbeehp62r39f9ii0pbmclp7it38d5n6e891", - Base32hexUpper: "V8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E891", - Base32hexPad: "t8him6pbeehp62r39f9ii0pbmclp7it38d5n6e891", - Base32hexPadUpper: "T8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E891", - Base58BTC: "zUXE7GvtEk8XTXs1GF8HSGbVA9FCX9SEBPe", - Base64pad: "MRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ==", - Base64urlPad: "URGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ==", + Identity: string(0x00) + "Decentralize everything!!!", + Base16: "f446563656e7472616c697a652065766572797468696e67212121", + Base16Upper: "F446563656E7472616C697A652065766572797468696E67212121", + Base32: "birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijbee", + Base32Upper: "BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJBEE", + Base32pad: "cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijbee======", + Base32padUpper: "CIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJBEE======", + Base32hex: "v8him6pbeehp62r39f9ii0pbmclp7it38d5n6e89144", + Base32hexUpper: "V8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E89144", + Base32hexPad: "t8him6pbeehp62r39f9ii0pbmclp7it38d5n6e89144======", + Base32hexPadUpper: "T8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E89144======", + Base58BTC: "z36UQrhJq9fNDS7DiAHM9YXqDHMPfr4EMArvt", + Base64pad: "MRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE=", + Base64urlPad: "URGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE=", } func testEncode(t *testing.T, encoding Encoding, bytes []byte, expected string) { From 36e6b228ae84243f74f6e86e261c1ac689bc59c2 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 28 Aug 2017 21:32:26 -0400 Subject: [PATCH 5/5] Move base16 and base32 specific bits to their own file. --- base16.go | 21 +++++++++++++++++++++ base32.go | 17 +++++++++++++++++ multibase.go | 33 --------------------------------- 3 files changed, 38 insertions(+), 33 deletions(-) create mode 100644 base16.go create mode 100644 base32.go diff --git a/base16.go b/base16.go new file mode 100644 index 0000000..ac8c819 --- /dev/null +++ b/base16.go @@ -0,0 +1,21 @@ +package multibase + +func hexEncodeToStringUpper(src []byte) string { + dst := make([]byte, len(src)*2) + hexEncodeUpper(dst, src) + return string(dst) +} + +var hextableUpper = [16]byte{ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', +} + +func hexEncodeUpper(dst, src []byte) int { + for i, v := range src { + dst[i*2] = hextableUpper[v>>4] + dst[i*2+1] = hextableUpper[v&0x0f] + } + + return len(src) * 2 +} diff --git a/base32.go b/base32.go new file mode 100644 index 0000000..dffcfae --- /dev/null +++ b/base32.go @@ -0,0 +1,17 @@ +package multibase + +import ( + b32 "github.com/whyrusleeping/base32" +) + +var base32StdLowerPad = b32.NewEncodingCI("abcdefghijklmnopqrstuvwxyz234567") +var base32StdLowerNoPad = base32StdLowerPad.WithPadding(b32.NoPadding) + +var base32StdUpperPad = b32.NewEncodingCI("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567") +var base32StdUpperNoPad = base32StdUpperPad.WithPadding(b32.NoPadding) + +var base32HexLowerPad = b32.NewEncodingCI("0123456789abcdefghijklmnopqrstuv") +var base32HexLowerNoPad = base32HexLowerPad.WithPadding(b32.NoPadding) + +var base32HexUpperPad = b32.NewEncodingCI("0123456789ABCDEFGHIJKLMNOPQRSTUV") +var base32HexUpperNoPad = base32HexUpperPad.WithPadding(b32.NoPadding) diff --git a/multibase.go b/multibase.go index 24a4bd2..5f5b58d 100644 --- a/multibase.go +++ b/multibase.go @@ -133,36 +133,3 @@ func Decode(data string) (Encoding, []byte, error) { return -1, nil, ErrUnsupportedEncoding } } - -var base32StdLowerPad = b32.NewEncodingCI("abcdefghijklmnopqrstuvwxyz234567") -var base32StdLowerNoPad = base32StdLowerPad.WithPadding(b32.NoPadding) - -var base32StdUpperPad = b32.NewEncodingCI("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567") -var base32StdUpperNoPad = base32StdUpperPad.WithPadding(b32.NoPadding) - -var base32HexLowerPad = b32.NewEncodingCI("0123456789abcdefghijklmnopqrstuv") -var base32HexLowerNoPad = base32HexLowerPad.WithPadding(b32.NoPadding) - -var base32HexUpperPad = b32.NewEncodingCI("0123456789ABCDEFGHIJKLMNOPQRSTUV") -var base32HexUpperNoPad = base32HexUpperPad.WithPadding(b32.NoPadding) - - -func hexEncodeToStringUpper(src []byte) string { - dst := make([]byte, len(src) * 2) - hexEncodeUpper(dst, src) - return string(dst) -} - -var hextableUpper = [16]byte{ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', -} - -func hexEncodeUpper(dst, src []byte) int { - for i, v := range src { - dst[i*2] = hextableUpper[v>>4] - dst[i*2+1] = hextableUpper[v&0x0f] - } - - return len(src) * 2 -}