blob: 0bb58d5582c261f4b08cd11b3a1d02ca6dc906fc [file] [log] [blame]
/*
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: Public APIs for crypto service
*/
#ifndef _WLAN_CRYPTO_GLOBAL_API_H_
#define _WLAN_CRYPTO_GLOBAL_API_H_
#include "wlan_crypto_global_def.h"
/**
* wlan_crypto_set_vdev_param - called by ucfg to set crypto param
* @vdev: vdev
* @param: param to be set.
* @value: value
*
* This function gets called from ucfg to set param
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_set_vdev_param(struct wlan_objmgr_vdev *vdev,
wlan_crypto_param_type param,
uint32_t value);
/**
* wlan_crypto_set_peer_param - called by ucfg to set crypto param
*
* @peer: peer
* @param: param to be set.
* @value: value
*
* This function gets called from ucfg to set param
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_set_peer_param(struct wlan_objmgr_peer *peer,
wlan_crypto_param_type param,
uint32_t value);
/**
* wlan_crypto_get_param - called by ucfg to get crypto param
* @vdev: vdev
* @param: param to be get.
*
* This function gets called from ucfg to get param
*
* Return: value or -1 for failure
*/
int32_t wlan_crypto_get_param(struct wlan_objmgr_vdev *vdev,
wlan_crypto_param_type param);
/**
* wlan_crypto_get_peer_param - called by ucfg to get crypto peer param
* @peer: peer
* @param: param to be get.
*
* This function gets called from ucfg to get peer param
*
* Return: value or -1 for failure
*/
int32_t wlan_crypto_get_peer_param(struct wlan_objmgr_peer *peer,
wlan_crypto_param_type param);
/**
* wlan_crypto_is_htallowed - called by ucfg to check if HT rates is allowed
* @vdev: Vdev
* @peer: Peer
*
* This function is called to check if HT rates is allowed
*
* Return: 0 for not allowed and +ve for allowed
*/
uint8_t wlan_crypto_is_htallowed(struct wlan_objmgr_vdev *vdev,
struct wlan_objmgr_peer *peer);
/**
* wlan_crypto_setkey - called by ucfg to setkey
* @vdev: vdev
* @req_key: req_key with cipher type, key macaddress
*
* This function gets called from ucfg to sey key
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_setkey(struct wlan_objmgr_vdev *vdev,
struct wlan_crypto_req_key *req_key);
/**
* wlan_crypto_getkey - called by ucfg to get key
* @vdev: vdev
* @req_key: key value will be copied in this req_key
* @mac_address: mac address of the peer for unicast key
* or broadcast address if group key is requested.
*
* This function gets called from ucfg to get key
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_getkey(struct wlan_objmgr_vdev *vdev,
struct wlan_crypto_req_key *req_key,
uint8_t *mac_addr);
/**
* wlan_crypto_delkey - called by ucfg to delete key
* @vdev: vdev
* @mac_address: mac address of the peer for unicast key
* or broadcast address if group key is deleted.
* @key_idx: key index to be deleted
*
* This function gets called from ucfg to delete key
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_delkey(struct wlan_objmgr_vdev *vdev,
uint8_t *macaddr,
uint8_t key_idx);
/**
* wlan_crypto_default_key - called by ucfg to set default tx key
* @vdev: vdev
* @mac_address: mac address of the peer for unicast key
* or broadcast address if group key need to made default.
* @key_idx: key index to be made as default key
* @unicast: is key was unicast or group key.
*
* This function gets called from ucfg to set default key
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_default_key(struct wlan_objmgr_vdev *vdev,
uint8_t *macaddr,
uint8_t key_idx,
bool unicast);
/**
* wlan_crypto_encap - called by mgmt for encap the frame based on cipher
* @vdev: vdev
* @wbuf: wbuf
* @macaddr: macaddr
* @encapdone: is encapdone already or not.
*
* This function gets called from mgmt txrx to encap frame.
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_encap(struct wlan_objmgr_vdev *vdev,
qdf_nbuf_t wbuf,
uint8_t *macaddr,
uint8_t encapdone);
/**
* wlan_crypto_decap - called by mgmt for decap the frame based on cipher
* @vdev: vdev
* @wbuf: wbuf
* @macaddr: macaddr
* @tid: tid of the packet.
*
* This function gets called from mgmt txrx to decap frame.
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_decap(struct wlan_objmgr_vdev *vdev,
qdf_nbuf_t wbuf,
uint8_t *macaddr,
uint8_t tid);
/**
* wlan_crypto_enmic - called by mgmt for adding mic in frame based on cipher
* @vdev: vdev
* @wbuf: wbuf
* @macaddr: macaddr
* @encapdone: is encapdone already or not.
*
* This function gets called from mgmt txrx to adding mic to the frame.
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_enmic(struct wlan_objmgr_vdev *vdev,
qdf_nbuf_t wbuf,
uint8_t *macaddr,
uint8_t encapdone);
/**
* wlan_crypto_demic - called by mgmt for remove and check mic for
* the frame based on cipher
* @vdev: vdev
* @wbuf: wbuf
* @macaddr: macaddr
* @tid: tid of the frame
* @keyid: keyid in the received frame
*
* This function gets called from mgmt txrx to decap frame.
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_demic(struct wlan_objmgr_vdev *vdev,
qdf_nbuf_t wbuf,
uint8_t *macaddr,
uint8_t tid,
uint8_t keyid);
/**
* wlan_crypto_vdev_is_pmf_enabled - called to check is pmf enabled in vdev
* @vdev: vdev
*
* This function gets called to check is pmf enabled or not in vdev.
*
* Return: true or false
*/
bool wlan_crypto_vdev_is_pmf_enabled(struct wlan_objmgr_vdev *vdev);
/**
* wlan_crypto_is_pmf_enabled - called by mgmt txrx to check is pmf enabled
* @vdev: vdev
* @peer: peer
*
* This function gets called by mgmt txrx to check is pmf enabled or not.
*
* Return: true or false
*/
bool wlan_crypto_is_pmf_enabled(struct wlan_objmgr_vdev *vdev,
struct wlan_objmgr_peer *peer);
/**
* wlan_crypto_add_mmie - called by mgmt txrx to add mmie in frame
* @vdev: vdev
* @frm: frame starting pointer
* @len: length of the frame
*
* This function gets called by mgmt txrx to add mmie in frame
*
* Return: end of frame or NULL in case failure
*/
uint8_t *wlan_crypto_add_mmie(struct wlan_objmgr_vdev *vdev,
uint8_t *frm,
uint32_t len);
/**
* wlan_crypto_is_mmie_valid - called by mgmt txrx to check mmie of the frame
* @vdev: vdev
* @frm: frame starting pointer
* @efrm: end of frame pointer
*
* This function gets called by mgmt txrx to check mmie of the frame
*
* Return: true or false
*/
bool wlan_crypto_is_mmie_valid(struct wlan_objmgr_vdev *vdev,
uint8_t *frm,
uint8_t *efrm);
/**
* wlan_crypto_wpaie_check - called by mlme to check the wpaie
* @crypto params: crypto params
* @iebuf: ie buffer
*
* This function gets called by mlme to check the contents of wpa is
* matching with given crypto params
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_wpaie_check(struct wlan_crypto_params *, uint8_t *frm);
/**
* wlan_crypto_rsnie_check - called by mlme to check the rsnie
* @crypto params: crypto params
* @iebuf: ie buffer
*
* This function gets called by mlme to check the contents of rsn is
* matching with given crypto params
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_rsnie_check(struct wlan_crypto_params *, uint8_t *frm);
/**
* wlan_crypto_build_wpaie - called by mlme to build wpaie
* @vdev: vdev
* @iebuf: ie buffer
*
* This function gets called by mlme to build wpaie from given vdev
*
* Return: end of buffer
*/
uint8_t *wlan_crypto_build_wpaie(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf);
/**
* wlan_crypto_build_rsnie - called by mlme to build rsnie
* @vdev: vdev
* @iebuf: ie buffer
*
* This function gets called by mlme to build rsnie from given vdev
*
* Return: end of buffer
*/
uint8_t *wlan_crypto_build_rsnie(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf);
/**
* wlan_crypto_wapiie_check - called by mlme to check the wapiie
* @crypto params: crypto params
* @iebuf: ie buffer
*
* This function gets called by mlme to check the contents of wapi is
* matching with given crypto params
*
* Return: QDF_STATUS_SUCCESS - in case of success
*/
QDF_STATUS wlan_crypto_wapiie_check(struct wlan_crypto_params *crypto_params,
uint8_t *frm);
/**
* wlan_crypto_build_wapiie - called by mlme to build wapi ie
* @vdev: vdev
* @iebuf: ie buffer
*
* This function gets called by mlme to build wapi ie from given vdev
*
* Return: end of buffer
*/
uint8_t *wlan_crypto_build_wapiie(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf);
/**
* wlan_crypto_rsn_info - check is given params matching with vdev params.
* @vdev: vdev
* @crypto params: crypto params
*
* This function gets called by mlme to check is given params matching with
* vdev params.
*
* Return: true success or false for failure.
*/
bool wlan_crypto_rsn_info(struct wlan_objmgr_vdev *vdev,
struct wlan_crypto_params *crypto_params);
/**
* wlan_crypto_pn_check - called by data patch for PN check
* @vdev: vdev
* @wbuf: wbuf
*
* This function gets called by data patch for PN check
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_crypto_pn_check(struct wlan_objmgr_vdev *vdev,
qdf_nbuf_t wbuf);
/**
* wlan_crypto_vdev_get_crypto_params - called by mlme to get crypto params
* @vdev:vdev
*
* This function gets called by mlme to get crypto params
*
* Return: wlan_crypto_params or NULL in case of failure
*/
struct wlan_crypto_params *wlan_crypto_vdev_get_crypto_params(
struct wlan_objmgr_vdev *vdev);
/**
* wlan_crypto_peer_get_crypto_params - called by mlme to get crypto params
* @peer:peer
*
* This function gets called by mlme to get crypto params
*
* Return: wlan_crypto_params or NULL in case of failure
*/
struct wlan_crypto_params *wlan_crypto_peer_get_crypto_params(
struct wlan_objmgr_peer *peer);
/**
* wlan_crypto_set_peer_wep_keys - set wep keys into peer entries
* @vdev:vdev
* @peer:peer
*
* This function gets called by mlme, when auth frame is received.
* this helps in setting wep keys into peer data structure.
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_crypto_set_peer_wep_keys(struct wlan_objmgr_vdev *vdev,
struct wlan_objmgr_peer *peer);
/**
* wlan_crypto_register_crypto_rx_ops - set crypto_rx_ops
* @crypto_rx_ops: crypto_rx_ops
*
* This function gets called by object manger to register crypto rx ops.
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_crypto_register_crypto_rx_ops(
struct wlan_lmac_if_crypto_rx_ops *crypto_rx_ops);
/**
* wlan_crypto_get_crypto_rx_ops - get crypto_rx_ops from psoc
* @psoc: psoc
*
* This function gets called by umac to get the crypto_rx_ops
*
* Return: crypto_rx_ops
*/
struct wlan_lmac_if_crypto_rx_ops *wlan_crypto_get_crypto_rx_ops(
struct wlan_objmgr_psoc *psoc);
/**
* wlan_crypto_vdev_has_auth_mode - check authmode for vdev
* @vdev: vdev
* @authvalue: authvalue to be checked
*
* This function check is authvalue passed is set in vdev or not
*
* Return: true or false
*/
bool wlan_crypto_vdev_has_auth_mode(struct wlan_objmgr_vdev *vdev,
wlan_crypto_auth_mode authmode);
/**
* wlan_crypto_peer_has_auth_mode - check authmode for peer
* @peer: peer
* @authvalue: authvalue to be checked
*
* This function check is authvalue passed is set in peer or not
*
* Return: true or false
*/
bool wlan_crypto_peer_has_auth_mode(struct wlan_objmgr_peer *peer,
wlan_crypto_auth_mode authvalue);
/**
* wlan_crypto_vdev_has_ucastcipher - check ucastcipher for vdev
* @vdev: vdev
* @ucastcipher: ucastcipher to be checked
*
* This function check is ucastcipher passed is set in vdev or not
*
* Return: true or false
*/
bool wlan_crypto_vdev_has_ucastcipher(struct wlan_objmgr_vdev *vdev,
wlan_crypto_cipher_type ucastcipher);
/**
* wlan_crypto_peer_has_ucastcipher - check ucastcipher for peer
* @peer: peer
* @ucastcipher: ucastcipher to be checked
*
* This function check is ucastcipher passed is set in peer or not
*
* Return: true or false
*/
bool wlan_crypto_peer_has_ucastcipher(struct wlan_objmgr_peer *peer,
wlan_crypto_cipher_type ucastcipher);
/**
* wlan_crypto_vdev_has_mcastcipher - check mcastcipher for vdev
* @vdev: vdev
* @mcastcipher: mcastcipher to be checked
*
* This function check is mcastcipher passed is set in vdev or not
*
* Return: true or false
*/
bool wlan_crypto_vdev_has_mcastcipher(struct wlan_objmgr_vdev *vdev,
wlan_crypto_cipher_type mcastcipher);
/**
* wlan_crypto_peer_has_mcastcipher - check mcastcipher for peer
* @peer: peer
* @mcastcipher: mcastcipher to be checked
*
* This function check is mcastcipher passed is set in peer or not
*
* Return: true or false
*/
bool wlan_crypto_peer_has_mcastcipher(struct wlan_objmgr_peer *peer,
wlan_crypto_cipher_type mcastcipher);
/**
* wlan_crypto_get_keytype - get keytype
* @key: key
*
* This function gets keytype from key
*
* Return: keytype
*/
wlan_crypto_cipher_type wlan_crypto_get_key_type(
struct wlan_crypto_key *key);
/**
* wlan_crypto_vdev_getkey - get key from vdev
* @vdev: vdev
* @keyix: keyix
*
* This function gets key from vdev
*
* Return: key or NULL
*/
struct wlan_crypto_key *wlan_crypto_vdev_getkey(struct wlan_objmgr_vdev *vdev,
uint16_t keyix);
/**
* wlan_crypto_peer_getkey - get key from peer
* @peer: peer
* @keyix: keyix
*
* This function gets key from peer
*
* Return: key or NULL
*/
struct wlan_crypto_key *wlan_crypto_peer_getkey(struct wlan_objmgr_peer *peer,
uint16_t keyix);
/**
* wlan_crypto_get_peer_fils_aead - Get peer fils aead set flag
* @peer: Peer object
*
* This function returns the peer fils aead set flag value.
*
* Return: 1 for enabled, 0 for disabled
*/
uint8_t wlan_crypto_get_peer_fils_aead(struct wlan_objmgr_peer *peer);
/**
* wlan_crypto_set_peer_fils_aead - Set peer fils aead set flag
* @peer: Peer object
* @value: Value to set the flag
*
* This function set the peer fils aead set flag once FILS AUTH received.
*
* Return: None
*/
void wlan_crypto_set_peer_fils_aead(
struct wlan_objmgr_peer *peer, uint8_t value);
/**
* wlan_crypto_get_key_header - get header length
* @key: key
*
* This function gets header length based on keytype
*
* Return: header length
*/
uint8_t wlan_crypto_get_key_header(struct wlan_crypto_key *key);
/**
* wlan_crypto_get_key_trailer - get cipher trailer length
* @key: key
*
* This function gets cipher trailer length based on keytype
*
* Return: cipher trailer length
*/
uint8_t wlan_crypto_get_key_trailer(struct wlan_crypto_key *key);
/**
* wlan_crypto_get_key_miclen - get cipher miclen length
* @key: key
*
* This function gets cipher miclen length based on keytype
*
* Return: cipher miclen length
*/
uint8_t wlan_crypto_get_key_miclen(struct wlan_crypto_key *key);
/**
* wlan_crypto_get_keyid - get keyid from frame
* @data: frame
* @hdrlen: 802.11 header length
*
* This function parse frame and returns keyid
*
* Return: keyid
*/
uint16_t wlan_crypto_get_keyid(uint8_t *data, int hdrlen);
/**
* wlan_crypto_restore_keys - restore crypto keys in hw keycache
* @vdev: vdev
*
* This function restores keys in hw keycache
*
* Return: void
*/
void wlan_crypto_restore_keys(struct wlan_objmgr_vdev *vdev);
/**
* wlan_crypto_check_open_none - called by ucfg to check for open security
* @psoc: psoc pointer
* @vdev_id: vdev id
*
* This function gets called from ucfg to check open security.
*
* Return: true or false
*/
bool wlan_crypto_check_open_none(struct wlan_objmgr_psoc *psoc,
uint8_t vedv_id);
/**
* wlan_crypto_check_wep - called by ucfg to check for WEP security
* @psoc: psoc pointer
* @vdev_id: vdev id
*
* This function gets called from ucfg to check WEP security.
*
* Return: true or false
*/
bool wlan_crypto_check_wep(struct wlan_objmgr_psoc *psoc, uint8_t vedv_id);
/**
* wlan_crypto_check_rsn_match - called by ucfg to check for RSN match
* @psoc: psoc pointer
* @vdev_id: vdev id
* @ie_ptr: pointer to IEs
* @ie_len: IE length
*
* This function gets called from ucfg to check RSN match.
*
* Return: true or false
*/
bool wlan_crypto_check_rsn_match(struct wlan_objmgr_psoc *psoc,
uint8_t vedv_id, uint8_t *ie_ptr,
uint16_t ie_len);
/**
* wlan_crypto_check_rsn_match - called by ucfg to check for WPA match
* @psoc: psoc pointer
* @vdev_id: vdev id
* @ie_ptr: pointer to IEs
* @ie_len: IE length
*
* This function gets called from ucfg to check WPA match.
*
* Return: true or false
*/
bool wlan_crypto_check_wpa_match(struct wlan_objmgr_psoc *psoc,
uint8_t vedv_id, uint8_t *ie_ptr,
uint16_t ie_len);
/**
* wlan_set_vdev_crypto_prarams_from_ie - Sets vdev crypto params from IE info
* @vdev: vdev pointer
* @ie_ptr: pointer to IE
* @ie_len: IE length
*
* This function gets called from ucfg to set crypto params from IE data.
*
* Return: QDF_STATUS_SUCCESS or error code
*/
QDF_STATUS wlan_set_vdev_crypto_prarams_from_ie(struct wlan_objmgr_vdev *vdev,
uint8_t *ie_ptr,
uint16_t ie_len);
#ifdef WLAN_CRYPTO_GCM_OS_DERIVATIVE
static inline int wlan_crypto_aes_gmac(const uint8_t *key, size_t key_len,
const uint8_t *iv, size_t iv_len,
const uint8_t *aad, size_t aad_len,
uint8_t *tag)
{
return 0;
}
#endif
#ifdef WLAN_CRYPTO_OMAC1_OS_DERIVATIVE
static inline int omac1_aes_128(const uint8_t *key, const uint8_t *data,
size_t data_len, uint8_t *mac)
{
return 0;
}
static inline int omac1_aes_256(const uint8_t *key, const uint8_t *data,
size_t data_len, uint8_t *mac)
{
return 0;
}
#endif
#endif /* end of _WLAN_CRYPTO_GLOBAL_API_H_ */