func ReadEntity(packets *packet.Reader) (*Entity, error) {
	e := new(Entity)
	e.Identities = make(map[string]*Identity)

	p, err := packets.Next()
	if err != nil {
		return nil, err
	}

	var ok bool
	if e.PrimaryKey, ok = p.(*packet.PublicKey); !ok {
		if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok {
			packets.Unread(p)
			return nil, errors.StructuralError("first packet was not a public/private key")
		}
		e.PrimaryKey = &e.PrivateKey.PublicKey
	}

	if !e.PrimaryKey.PubKeyAlgo.CanSign() {
		return nil, errors.StructuralError("primary key cannot be used for signatures")
	}

	var revocations []*packet.Signature
EachPacket:
	for {
		p, err := packets.Next()
		if err == io.EOF {
			break
		} else if err != nil {
			return nil, err
		}

		switch pkt := p.(type) {
		case *packet.UserId:
			if err := addUserID(e, packets, pkt); err != nil {
				return nil, err
			}
		case *packet.Signature:
			if pkt.SigType == packet.SigTypeKeyRevocation {
				revocations = append(revocations, pkt)
			} else if pkt.SigType == packet.SigTypeDirectSignature {
				// TODO: RFC4880 5.2.1 permits signatures
				// directly on keys (eg. to bind additional
				// revocation keys).
			}
			// Else, ignoring the signature as it does not follow anything
			// we would know to attach it to.
		case *packet.PrivateKey:
			if pkt.IsSubkey == false {
				packets.Unread(p)
				break EachPacket
			}
			err = addSubkey(e, packets, &pkt.PublicKey, pkt)
			if err != nil {
				return nil, err
			}
		case *packet.PublicKey:
			if pkt.IsSubkey == false {
				packets.Unread(p)
				break EachPacket
			}
			err = addSubkey(e, packets, pkt, nil)
			if err != nil {
				return nil, err
			}
		default:
			// we ignore unknown packets
		}
	}

	if len(e.Identities) == 0 {
		return nil, errors.StructuralError("entity without any identities")
	}

	for _, revocation := range revocations {
		err = e.PrimaryKey.VerifyRevocationSignature(revocation)
		if err == nil {
			e.Revocations = append(e.Revocations, revocation)
		} else {
			// TODO: RFC 4880 5.2.3.15 defines revocation keys.
			return nil, errors.StructuralError("revocation signature signed by alternate key")
		}
	}

	return e, nil
}
// ReadEntity reads an entity (public key, identities, subkeys etc) from the
// given Reader.
ReadEntity reads an entity (public key, identities, subkeys etc) from the
given Reader.
// ReadEntity reads an entity ( public key identities subkeys etc ) from the // given Reader .
func ReadEntity(packets *packet.Reader) (*Entity, error) {
	e := new(Entity)
	e.Identities = make(map[string]*Identity)
	p, err := packets.Next()
	if err != nil {
		return nil, err
	}
	var ok bool
	if e.PrimaryKey, ok = p.(*packet.PublicKey); !ok {
		if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok {
			packets.Unread(p)
			return nil, errors.StructuralError("first packet was not a public/private key")
		}
		e.PrimaryKey = &e.PrivateKey.PublicKey
	}
	if !e.PrimaryKey.PubKeyAlgo.CanSign() {
		return nil, errors.StructuralError("primary key cannot be used for signatures")
	}
	var revocations []*packet.Signature
EachPacket:
	for {
		p, err := packets.Next()
		if err == io.EOF {
			break
		} else if err != nil {
			return nil, err
		}
		switch pkt := p.(type) {
		case *packet.UserId:
			if err := addUserID(e, packets, pkt); err != nil {
				return nil, err
			}
		case *packet.Signature:
			if pkt.SigType == packet.SigTypeKeyRevocation {
				revocations = append(revocations, pkt)
			} else if pkt.SigType == packet.SigTypeDirectSignature {
			}
		case *packet.PrivateKey:
			if pkt.IsSubkey == false {
				packets.Unread(p)
				break EachPacket
			}
			err = addSubkey(e, packets, &pkt.PublicKey, pkt)
			if err != nil {
				return nil, err
			}
		case *packet.PublicKey:
			if pkt.IsSubkey == false {
				packets.Unread(p)
				break EachPacket
			}
			err = addSubkey(e, packets, pkt, nil)
			if err != nil {
				return nil, err
			}
		default:
		}
	}
	if len(e.Identities) == 0 {
		return nil, errors.StructuralError("entity without any identities")
	}
	for _, revocation := range revocations {
		err = e.PrimaryKey.VerifyRevocationSignature(revocation)
		if err == nil {
			e.Revocations = append(e.Revocations, revocation)
		} else {
			return nil, errors.StructuralError("revocation signature signed by alternate key")
		}
	}
	return e, nil
}
func ReadEntity ( packets * packet . Reader ) ( * Entity , error ) { e := new ( Entity ) e . Identities = make ( map [ string ] * Identity ) p , err := packets . Next ( ) if err != nil { return nil , err } var ok bool if e . PrimaryKey , ok = p . ( * packet . PublicKey ) ; ! ok { if e . PrivateKey , ok = p . ( * packet . PrivateKey ) ; ! ok { packets . Unread ( p ) return nil , errors . StructuralError ( " " ) } e . PrimaryKey = & e . PrivateKey . PublicKey } if ! e . PrimaryKey . PubKeyAlgo . CanSign ( ) { return nil , errors . StructuralError ( " " ) } var revocations [ ] * packet . Signature EachPacket : for { p , err := packets . Next ( ) if err == io . EOF { break } else if err != nil { return nil , err } switch pkt := p . ( type ) { case * packet . UserId : if err := addUserID ( e , packets , pkt ) ; err != nil { return nil , err } case * packet . Signature : if pkt . SigType == packet . SigTypeKeyRevocation { revocations = append ( revocations , pkt ) } else if pkt . SigType == packet . SigTypeDirectSignature { } case * packet . PrivateKey : if pkt . IsSubkey == false { packets . Unread ( p ) break EachPacket } err = addSubkey ( e , packets , & pkt . PublicKey , pkt ) if err != nil { return nil , err } case * packet . PublicKey : if pkt . IsSubkey == false { packets . Unread ( p ) break EachPacket } err = addSubkey ( e , packets , pkt , nil ) if err != nil { return nil , err } default : } } if len ( e . Identities ) == 0 { return nil , errors . StructuralError ( " " ) } for _ , revocation := range revocations { err = e . PrimaryKey . VerifyRevocationSignature ( revocation ) if err == nil { e . Revocations = append ( e . Revocations , revocation ) } else { return nil , errors . StructuralError ( " " ) } } return e , nil }
ReadEntity reads an entity (public key, identities, subkeys etc) from the
given Reader.
ReadEntity reads an entity ( public key identities subkeys etc ) from the given Reader .
// TODO: RFC4880 5.2.1 permits signatures // directly on keys (eg. to bind additional // revocation keys). // Else, ignoring the signature as it does not follow anything // we would know to attach it to. // we ignore unknown packets // TODO: RFC 4880 5.2.3.15 defines revocation keys.