mirror of https://github.com/poanetwork/quorum.git
53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
|
package plugin
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path"
|
||
|
)
|
||
|
|
||
|
const DefaultPublicKeyFile = "Central.pgp.pk.asc"
|
||
|
|
||
|
// Local Implementation of plugin.Verifier
|
||
|
type LocalVerifier struct {
|
||
|
PublicKeyPath string // where to obtain PGP public key
|
||
|
SignatureBaseDir string // where to obtain plugin signature file
|
||
|
}
|
||
|
|
||
|
// Build a new LocalVerifier
|
||
|
func NewLocalVerifier(publicKeyPath string, pluginSignatureBaseDir string) (*LocalVerifier, error) {
|
||
|
if _, err := os.Stat(publicKeyPath); os.IsNotExist(err) {
|
||
|
return nil, err
|
||
|
}
|
||
|
stat, err := os.Stat(pluginSignatureBaseDir)
|
||
|
if os.IsNotExist(err) {
|
||
|
return nil, err
|
||
|
}
|
||
|
if !stat.Mode().IsDir() {
|
||
|
return nil, fmt.Errorf("pluginSignatureBaseDir is not a directory")
|
||
|
}
|
||
|
verifier := &LocalVerifier{
|
||
|
PublicKeyPath: publicKeyPath,
|
||
|
SignatureBaseDir: pluginSignatureBaseDir,
|
||
|
}
|
||
|
return verifier, nil
|
||
|
}
|
||
|
|
||
|
// Verify a plugin giving its name from Central
|
||
|
func (v *LocalVerifier) VerifySignature(definition *PluginDefinition, checksum string) error {
|
||
|
pluginSigPath := path.Join(v.SignatureBaseDir, definition.SignatureFileName())
|
||
|
if _, err := os.Stat(pluginSigPath); os.IsNotExist(err) {
|
||
|
return err
|
||
|
}
|
||
|
pubkey, err := ioutil.ReadFile(v.PublicKeyPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
sig, err := ioutil.ReadFile(pluginSigPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return verify(sig, pubkey, checksum)
|
||
|
}
|