func openArmoredPublicKeyFile(reader io.ReadCloser) (*packet.PublicKeyPacket, os.Error) { defer reader.Close() var lr = io.LimitReader(reader, publicKeyMaxSize) data, err := ioutil.ReadAll(lr) if err != nil { return nil, os.NewError(fmt.Sprintf("Error reading public key file: %v", err)) } if len(data) == publicKeyMaxSize { return nil, os.NewError(fmt.Sprintf("Public key blob is too large")) } block, _ := armor.Decode(data) if block == nil { return nil, os.NewError("Couldn't find PGP block in public key file") } if block.Type != "PGP PUBLIC KEY BLOCK" { return nil, os.NewError("Invalid public key blob.") } buf := bytes.NewBuffer(block.Bytes) p, err := packet.ReadPacket(buf) if err != nil { return nil, os.NewError(fmt.Sprintf("Invalid public key blob: %v", err)) } pk, ok := p.(packet.PublicKeyPacket) if !ok { return nil, os.NewError(fmt.Sprintf("Invalid public key blob; not a public key packet")) } return &pk, nil }
func main() { b, erd := armor.Decode(os.Stdin) if erd != nil { fmt.Println("unable to decode the Stdin") os.Exit(2) } const NBUF = 512 var buf [NBUF]byte var err, erw os.Error var nr, nw int for { switch nr, err = b.Body.Read(buf[:]); true { case nr < 0: fmt.Fprintf(os.Stderr, "error reading from Stdin: %s\n", err.String()) os.Exit(1) case nr == 0: break case nr > 0: if nw, erw = os.Stdout.Write(buf[0:nr]); nw != nr { fmt.Fprintf(os.Stderr, "error writing decoded bytes to Stdout: %s\n", erw.String()) os.Exit(1) } } if err == os.EOF { break } } }
func (vr *VerifyRequest) VerifySignature() bool { armorData := reArmor(vr.CamliSig) block, _ := armor.Decode([]byte(armorData)) if block == nil { return vr.fail("Can't parse camliSig armor") } buf := bytes.NewBuffer(block.Bytes) p, err := packet.ReadPacket(buf) if err != nil { return vr.fail("Error reading PGP packet from camliSig") } sig, ok := p.(packet.SignaturePacket) if !ok { return vr.fail("PGP packet isn't a signature packet") } if sig.Hash != packet.HashFuncSHA1 { return vr.fail("I can only verify SHA1 signatures") } if sig.SigType != packet.SigTypeBinary { return vr.fail("I can only verify binary signatures") } hash := sha1.New() hash.Write(vr.bp) // payload bytes hash.Write(sig.HashSuffix) hashBytes := hash.Sum() if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { return vr.fail("hash tag doesn't match") } err = rsa.VerifyPKCS1v15(&vr.PublicKeyPacket.PublicKey, rsa.HashSHA1, hashBytes, sig.Signature) if err != nil { return vr.fail(fmt.Sprintf("bad signature: %s", err)) } return true }
func (vr *VerifyRequest) VerifySignature() bool { armorData := reArmor(vr.CamliSig) block, _ := armor.Decode(bytes.NewBufferString(armorData)) if block == nil { return vr.fail("can't parse camliSig armor") } var p packet.Packet var err os.Error p, err = packet.Read(block.Body) if err != nil { return vr.fail("error reading PGP packet from camliSig: " + err.String()) } sig, ok := p.(*packet.Signature) if !ok { return vr.fail("PGP packet isn't a signature packet") } if sig.Hash != crypto.SHA1 && sig.Hash != crypto.SHA256 { return vr.fail("I can only verify SHA1 or SHA256 signatures") } if sig.SigType != packet.SigTypeBinary { return vr.fail("I can only verify binary signatures") } hash := sig.Hash.New() hash.Write(vr.bp) // payload bytes err = vr.PublicKeyPacket.VerifySignature(hash, sig) if err != nil { return vr.fail(fmt.Sprintf("bad signature: %s", err)) } vr.SignerKeyId = vr.PublicKeyPacket.KeyIdString() return true }
// readArmored reads an armored block with the given type. func readArmored(r io.Reader, expectedType string) (body io.Reader, err os.Error) { block, err := armor.Decode(r) if err != nil { return } if block.Type != expectedType { return nil, error.InvalidArgumentError("expected '" + expectedType + "', got: " + block.Type) } return block.Body, nil }
// ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file. func ReadArmoredKeyRing(r io.Reader) (EntityList, os.Error) { block, err := armor.Decode(r) if err == os.EOF { return nil, error.InvalidArgumentError("no armored data found") } if err != nil { return nil, err } if block.Type != PublicKeyType && block.Type != PrivateKeyType { return nil, error.InvalidArgumentError("expected public or private key block, got: " + block.Type) } return ReadKeyRing(block.Body) }
func readOpenPGPPacketFromArmoredFileOrDie(fileName string, armorType string) (p packet.Packet) { data, err := ioutil.ReadFile(fileName) if err != nil { log.Exit("Cannot open '%s': %s", fileName, err) } block, _ := armor.Decode(data) if block == nil { log.Exit("cannot parse armor") } if block.Type != armorType { log.Exitf("bad type in '%s' (got: %s, want: %s)", fileName, block.Type, armorType) } buf := bytes.NewBuffer(block.Bytes) p, err = packet.ReadPacket(buf) if err != nil { log.Exitf("failed to parse packet from '%s': %s", fileName, err) } return }
func openArmoredPublicKeyFile(reader io.ReadCloser) (*packet.PublicKey, os.Error) { defer reader.Close() var lr = io.LimitReader(reader, publicKeyMaxSize) block, _ := armor.Decode(lr) if block == nil { return nil, os.NewError("Couldn't find PGP block in public key file") } if block.Type != "PGP PUBLIC KEY BLOCK" { return nil, os.NewError("Invalid public key blob.") } p, err := packet.Read(block.Body) if err != nil { return nil, os.NewError(fmt.Sprintf("Invalid public key blob: %v", err)) } pk, ok := p.(*packet.PublicKey) if !ok { return nil, os.NewError(fmt.Sprintf("Invalid public key blob; not a public key packet")) } return pk, nil }