code: func NewEncrypterSignerEntity(ID string, bccsp bccsp.BCCSP, eKey, sKey bccsp.Key, eOpts bccsp.EncrypterOpts, dOpts bccsp.DecrypterOpts, sOpts bccsp.SignerOpts, hOpts bccsp.HashOpts) (*BCCSPEncrypterSignerEntity, error) {
  	if ID == "" {
  		return nil, errors.New("NewEntity error: empty ID")
  	}
  
  	if bccsp == nil {
  		return nil, errors.New("NewEntity error: nil bccsp")
  	}
  
  	if eKey == nil || sKey == nil {
  		return nil, errors.New("NewEntity error: nil keys")
  	}
  
  	return &BCCSPEncrypterSignerEntity{
  		BCCSPEncrypterEntity: BCCSPEncrypterEntity{
  			BCCSPEntity: BCCSPEntity{
  				IDstr: ID,
  				BCCSP: bccsp,
  			},
  			EKey:  eKey,
  			EOpts: eOpts,
  			DOpts: dOpts,
  		},
  		BCCSPSignerEntity: BCCSPSignerEntity{
  			BCCSPEntity: BCCSPEntity{
  				IDstr: ID,
  				BCCSP: bccsp,
  			},
  			SKey:  sKey,
  			SOpts: sOpts,
  			HOpts: hOpts,
  		},
  	}, nil
  }
docs: // NewEncrypterSignerEntity returns an EncrypterSignerEntity
  // (which is also an EncrypterEntity) that is capable of
  // performing encryption AND of generating signatures using
  // i) the supplied BCCSP instance; ii) the supplied encryption
  // and signing keys and iii) the supplied encryption, decryption,
  // signing and hashing options. The identifier of the entity is
  // supplied as an argument as well - it's the caller's responsibility
  // to choose it in a way that it is meaningful