launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/environs/simplestreams/encode.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package simplestreams
     5  
     6  import (
     7  	"bytes"
     8  	"io"
     9  	"io/ioutil"
    10  
    11  	"code.google.com/p/go.crypto/openpgp"
    12  	"code.google.com/p/go.crypto/openpgp/clearsign"
    13  )
    14  
    15  // Encode signs the data returned by the reader and returns an inline signed copy.
    16  func Encode(r io.Reader, armoredPrivateKey, passphrase string) ([]byte, error) {
    17  	keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(armoredPrivateKey))
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	privateKey := keyring[0].PrivateKey
    23  	if privateKey.Encrypted {
    24  		err = privateKey.Decrypt([]byte(passphrase))
    25  		if err != nil {
    26  			return nil, err
    27  		}
    28  	}
    29  
    30  	var buf bytes.Buffer
    31  	plaintext, err := clearsign.Encode(&buf, privateKey, nil)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	metadata, err := ioutil.ReadAll(r)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	dataToSign := metadata
    40  	if dataToSign[0] == '\n' {
    41  		dataToSign = dataToSign[1:]
    42  	}
    43  	_, err = plaintext.Write([]byte(dataToSign))
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	err = plaintext.Close()
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  	return buf.Bytes(), nil
    52  }