diff --git a/src/wscutil.c b/src/wscutil.c index cb1db8fe..bcb6bc19 100644 --- a/src/wscutil.c +++ b/src/wscutil.c @@ -1479,6 +1479,31 @@ int wsc_parse_m8_encrypted_settings(const uint8_t *pdu, uint32_t len, return 0; } +int wsc_parse_wsc_ack(const uint8_t *pdu, uint32_t len, struct wsc_ack *out) +{ + int r; + struct wsc_wfa_ext_iter iter; + uint8_t version; + enum wsc_message_type msg_type; + + memset(out, 0, sizeof(struct wsc_ack)); + + r = wsc_parse_attrs(pdu, len, &out->version2, &iter, 0, NULL, + REQUIRED(VERSION, &version), + REQUIRED(MESSAGE_TYPE, &msg_type), + REQUIRED(ENROLLEE_NONCE, &out->enrollee_nonce), + REQUIRED(REGISTRAR_NONCE, &out->registrar_nonce), + WSC_ATTR_INVALID); + + if (r < 0) + return r; + + if (msg_type != WSC_MESSAGE_TYPE_WSC_ACK) + return -EBADMSG; + + return 0; +} + int wsc_parse_nack(const uint8_t *pdu, uint32_t len, struct wsc_nack *out) { int r; diff --git a/src/wscutil.h b/src/wscutil.h index f374068e..9333af07 100644 --- a/src/wscutil.h +++ b/src/wscutil.h @@ -515,6 +515,12 @@ struct wsc_m8_encrypted_settings { uint8_t authenticator[8]; }; +struct wsc_ack { + bool version2; + uint8_t enrollee_nonce[16]; + uint8_t registrar_nonce[16]; +}; + struct wsc_nack { bool version2; uint8_t enrollee_nonce[16]; @@ -563,6 +569,7 @@ int wsc_parse_m8_encrypted_settings(const uint8_t *pdu, uint32_t len, struct wsc_m8_encrypted_settings *out, struct iovec *iov, size_t *iovcnt); +int wsc_parse_wsc_ack(const uint8_t *pdu, uint32_t len, struct wsc_ack *out); int wsc_parse_nack(const uint8_t *pdu, uint32_t len, struct wsc_nack *out); int wsc_parse_wsc_done(const uint8_t *pdu, uint32_t len, struct wsc_done *out);