code: func DoPK(ctx *cli.Context, privateKey *ecdsa.PrivateKey, granteePublicKey string, salt []byte) (sessionKey []byte, ae *AccessEntry, err error) {
  	if granteePublicKey == "" {
  		return nil, nil, errors.New("need a grantee Public Key")
  	}
  	b, err := hex.DecodeString(granteePublicKey)
  	if err != nil {
  		log.Error("error decoding grantee public key", "err", err)
  		return nil, nil, err
  	}
  
  	granteePub, err := crypto.DecompressPubkey(b)
  	if err != nil {
  		log.Error("error decompressing grantee public key", "err", err)
  		return nil, nil, err
  	}
  
  	sessionKey, err = NewSessionKeyPK(privateKey, granteePub, salt)
  	if err != nil {
  		log.Error("error getting session key", "err", err)
  		return nil, nil, err
  	}
  
  	ae, err = NewAccessEntryPK(hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)), salt)
  	if err != nil {
  		log.Error("error generating access entry", "err", err)
  		return nil, nil, err
  	}
  
  	return sessionKey, ae, nil
  }
docs: // DoPK is a helper function to the CLI API that handles the entire business logic for
  // creating a session key and access entry given the cli context, ec keys and salt