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 }