From 80db488cbdbd7a35f61526f8581d806849703298 Mon Sep 17 00:00:00 2001 From: Gibheer Date: Thu, 19 Feb 2015 21:48:08 +0100 Subject: [PATCH] add public key loader This adds a way to restore a public key from any data source. --- ecdsa.go | 10 ++++++++++ private_key_test.go | 29 ++++++++++++++++++++--------- rsa.go | 4 ++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/ecdsa.go b/ecdsa.go index 6754ee4..42c5cf1 100644 --- a/ecdsa.go +++ b/ecdsa.go @@ -75,6 +75,16 @@ func (pr EcdsaPrivateKey) MarshalPem() (marshalledPemBlock, error) { return pem.EncodeToMemory(&pem_block), nil } +// load an ecdsa public key +func LoadPublicKeyEcdsa(raw []byte) (*EcdsaPublicKey, error) { + raw_pub, err := x509.ParsePKIXPublicKey(raw) + if err != nil { return nil, err } + + pub, ok := raw_pub.(*ecdsa.PublicKey) + if !ok { return nil, errors.New("Not an ecdsa key!") } + return &EcdsaPublicKey{pub}, nil +} + // marshal the public key to a pem block func (pu *EcdsaPublicKey) MarshalPem() (marshalledPemBlock, error) { asn1, err := x509.MarshalPKIXPublicKey(pu.public_key) diff --git a/private_key_test.go b/private_key_test.go index a563f50..6a40d70 100644 --- a/private_key_test.go +++ b/private_key_test.go @@ -12,6 +12,10 @@ var ( SignatureHash = crypto.SHA512 ) +type ( + Loader func(raw []byte) (PublicKey, error) +) + // run the marshal test func RunMarshalTest(pk_type string, pe Pemmer, label string, t *testing.T) ([]byte, error) { marsh_pem, err := pe.MarshalPem() @@ -29,13 +33,7 @@ func RunMarshalTest(pk_type string, pe Pemmer, label string, t *testing.T) ([]by } // test other private key functions -func RunPrivateKeyTests(pk_type string, pk PrivateKey, t *testing.T) { - pu := pk.Public() - - // TODO check return result of the marshalled public key - _, err := RunMarshalTest(pk_type + "-public", pu, PemLabelPublic, t) - if err != nil { return } - +func RunPrivateKeyTests(pk_type string, pk PrivateKey, pu PublicKey, t *testing.T) { signature, err := pk.Sign(SignatureMessage, SignatureHash) if err != nil { t.Errorf("%s: error creating a signature: %s", pk_type, err) } @@ -55,7 +53,13 @@ func TestEcdsaFunctions(t *testing.T) { pk, err = LoadPrivateKeyEcdsa(block_bytes) if err != nil { t.Errorf("ecdsa: pem content wrong: %s", err) } - RunPrivateKeyTests("ecdsa", pk, t) + block_bytes, err = RunMarshalTest("ecdsa-public", pk.Public(), PemLabelPublic, t) + if err != nil { return } + + pu, err := LoadPublicKeyEcdsa(block_bytes) + if err != nil { t.Errorf("ecdsa-public: pem content wrong: %s", err) } + + RunPrivateKeyTests("ecdsa", pk, pu, t) } // test rsa private key functions @@ -69,5 +73,12 @@ func TestRsaFunctions(t *testing.T) { pk, err = LoadPrivateKeyRsa(block_bytes) if err != nil { t.Errorf("rsa: pem content wrong: %s", err) } - RunPrivateKeyTests("rsa", pk, t) + + block_bytes, err = RunMarshalTest("rsa-public", pk.Public(), PemLabelPublic, t) + if err != nil { return } + + pu, err := LoadPublicKeyRsa(block_bytes) + if err != nil { t.Errorf("rsa-public: pem content wrong: %s", err) } + + RunPrivateKeyTests("rsa", pk, pu, t) } diff --git a/rsa.go b/rsa.go index 9a4f298..1661163 100644 --- a/rsa.go +++ b/rsa.go @@ -56,6 +56,10 @@ func (pr RsaPrivateKey) MarshalPem() (marshalledPemBlock, error) { return pem.EncodeToMemory(&pem_block), nil } +func LoadPublicKeyRsa(raw []byte) (*RsaPublicKey, error) { + return nil, errors.New("not implemented yet!") +} + func (pu *RsaPublicKey) MarshalPem() (marshalledPemBlock, error) { asn1, err := x509.MarshalPKIXPublicKey(pu.public_key) if err != nil { return nil, err }