[SCTP]: Add check for hmac_algo parameter in sctp_verify_param()
RFC 4890 has the following text: The HMAC algorithm based on SHA-1 MUST be supported and included in the HMAC-ALGO parameter. As a result, we need to check in sctp_verify_param() that HMAC_SHA1 is present in the list. If not, we should probably treat this as a protocol violation. It should also be a protocol violation if the HMAC parameter is empty. Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e56cfad132
commit
72da7b3860
@@ -1982,7 +1982,10 @@ static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
|
|||||||
struct sctp_chunk *chunk,
|
struct sctp_chunk *chunk,
|
||||||
struct sctp_chunk **err_chunk)
|
struct sctp_chunk **err_chunk)
|
||||||
{
|
{
|
||||||
|
struct sctp_hmac_algo_param *hmacs;
|
||||||
int retval = SCTP_IERROR_NO_ERROR;
|
int retval = SCTP_IERROR_NO_ERROR;
|
||||||
|
__u16 n_elt, id = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* FIXME - This routine is not looking at each parameter per the
|
/* FIXME - This routine is not looking at each parameter per the
|
||||||
* chunk type, i.e., unrecognized parameters should be further
|
* chunk type, i.e., unrecognized parameters should be further
|
||||||
@@ -2056,9 +2059,29 @@ static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SCTP_PARAM_HMAC_ALGO:
|
case SCTP_PARAM_HMAC_ALGO:
|
||||||
if (sctp_auth_enable)
|
if (!sctp_auth_enable)
|
||||||
|
goto fallthrough;
|
||||||
|
|
||||||
|
hmacs = (struct sctp_hmac_algo_param *)param.p;
|
||||||
|
n_elt = (ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) >> 1;
|
||||||
|
|
||||||
|
/* SCTP-AUTH: Section 6.1
|
||||||
|
* The HMAC algorithm based on SHA-1 MUST be supported and
|
||||||
|
* included in the HMAC-ALGO parameter.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < n_elt; i++) {
|
||||||
|
id = ntohs(hmacs->hmac_ids[i]);
|
||||||
|
|
||||||
|
if (id == SCTP_AUTH_HMAC_ID_SHA1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id != SCTP_AUTH_HMAC_ID_SHA1) {
|
||||||
|
sctp_process_inv_paramlength(asoc, param.p, chunk,
|
||||||
|
err_chunk);
|
||||||
|
retval = SCTP_IERROR_ABORT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
/* Fall Through */
|
|
||||||
fallthrough:
|
fallthrough:
|
||||||
default:
|
default:
|
||||||
SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n",
|
SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n",
|
||||||
|
Reference in New Issue
Block a user