From 185547efc1fe6e03fe22fcc2c00d001df8832071 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sun, 13 Mar 2016 14:00:27 -0700 Subject: [PATCH] Add ascii armor support --- armor.go | 39 ++++++++++++++++++++++++++++ armor_test.go | 25 ++++++++++++++++++ encrypt.go => symmetric.go | 0 encrypt_test.go => symmetric_test.go | 3 ++- 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 armor.go create mode 100644 armor_test.go rename encrypt.go => symmetric.go (100%) rename encrypt_test.go => symmetric_test.go (99%) diff --git a/armor.go b/armor.go new file mode 100644 index 00000000..9343284e --- /dev/null +++ b/armor.go @@ -0,0 +1,39 @@ +package crypto + +import ( + "bytes" + "io/ioutil" + + . "github.com/tendermint/go-common" + "golang.org/x/crypto/openpgp/armor" +) + +func EncodeArmor(blockType string, headers map[string]string, data []byte) string { + buf := new(bytes.Buffer) + w, err := armor.Encode(buf, blockType, headers) + if err != nil { + PanicSanity("Error encoding ascii armor: " + err.Error()) + } + _, err = w.Write(data) + if err != nil { + PanicSanity("Error encoding ascii armor: " + err.Error()) + } + err = w.Close() + if err != nil { + PanicSanity("Error encoding ascii armor: " + err.Error()) + } + return string(buf.Bytes()) +} + +func DecodeArmor(armorStr string) (blockType string, headers map[string]string, data []byte, err error) { + buf := bytes.NewBufferString(armorStr) + block, err := armor.Decode(buf) + if err != nil { + return "", nil, nil, err + } + data, err = ioutil.ReadAll(block.Body) + if err != nil { + return "", nil, nil, err + } + return block.Type, block.Header, data, nil +} diff --git a/armor_test.go b/armor_test.go new file mode 100644 index 00000000..3de37d7b --- /dev/null +++ b/armor_test.go @@ -0,0 +1,25 @@ +package crypto + +import ( + "bytes" + "testing" +) + +func TestSimpleArmor(t *testing.T) { + blockType := "MINT TEST" + data := []byte("somedata") + armorStr := EncodeArmor(blockType, nil, data) + t.Log("Got armor: ", armorStr) + + // Decode armorStr and test for equivalence. + blockType2, _, data2, err := DecodeArmor(armorStr) + if err != nil { + t.Error(err) + } + if blockType != blockType2 { + t.Errorf("Expected block type %v but got %v", blockType, blockType2) + } + if !bytes.Equal(data, data2) { + t.Errorf("Expected data %X but got %X", data2, data) + } +} diff --git a/encrypt.go b/symmetric.go similarity index 100% rename from encrypt.go rename to symmetric.go diff --git a/encrypt_test.go b/symmetric_test.go similarity index 99% rename from encrypt_test.go rename to symmetric_test.go index f05c812b..c8134742 100644 --- a/encrypt_test.go +++ b/symmetric_test.go @@ -2,8 +2,9 @@ package crypto import ( "bytes" - "golang.org/x/crypto/bcrypt" "testing" + + "golang.org/x/crypto/bcrypt" ) func TestSimple(t *testing.T) {