in pipe/file.go [384:437]
func (p *fileProducer) initCrypterWriter(filename string, writer io.WriteCloser) (io.WriteCloser, error) {
if len(p.cfg.Encryption.PublicKey) == 0 {
return nil, fmt.Errorf("public key is empty. required for producing encrypted stream")
}
block, err := armor.Decode(bytes.NewReader([]byte(p.cfg.Encryption.PublicKey)))
if log.E(err) {
return nil, err
}
if block.Type != openpgp.PublicKeyType {
return nil, fmt.Errorf("expected public key. got:%s", block.Type)
}
encEntity, err := openpgp.ReadEntity(packet.NewReader(block.Body))
if log.E(err) {
return nil, err
}
block, err = armor.Decode(bytes.NewReader([]byte(p.cfg.Encryption.SigningKey)))
if log.E(err) {
return nil, err
}
if block.Type != openpgp.PrivateKeyType {
return nil, fmt.Errorf("expected private key. got:%s", block.Type)
}
signEntity, err := openpgp.ReadEntity(packet.NewReader(block.Body))
if log.E(err) {
return nil, err
}
err = signEntity.PrivateKey.Decrypt([]byte(signKeyPw))
log.Debugf("signKeyPw %v", err)
if log.E(err) {
return nil, err
}
log.Debugf("pubKey: %x", encEntity.PrimaryKey.Fingerprint)
log.Debugf("signKey: %x", signEntity.PrimaryKey.Fingerprint)
hints := &openpgp.FileHints{
IsBinary: true,
FileName: filename,
ModTime: time.Now(),
}
writer, err = openpgp.Encrypt(writer, []*openpgp.Entity{encEntity}, signEntity, hints, nil)
if log.E(err) {
return nil, err
}
return writer, nil
}