diff --git a/src/wscutil.c b/src/wscutil.c index fc34478f..a5bbb765 100644 --- a/src/wscutil.c +++ b/src/wscutil.c @@ -509,6 +509,8 @@ static attr_handler handler_for_type(enum wsc_attr type) case WSC_ATTR_E_HASH1: case WSC_ATTR_E_HASH2: return extract_hash; + case WSC_ATTR_E_SNONCE1: + return extract_nonce; case WSC_ATTR_ENCRYPTED_SETTINGS: return extract_encrypted_settings; case WSC_ATTR_ENCRYPTION_TYPE_FLAGS: @@ -1188,6 +1190,17 @@ int wsc_parse_m5(const uint8_t *pdu, uint32_t len, struct wsc_m5 *out, return 0; } +int wsc_parse_m5_encrypted_settings(const uint8_t *pdu, uint32_t len, + struct wsc_m5_encrypted_settings *out) +{ + memset(out, 0, sizeof(*out)); + + return wsc_parse_attrs(pdu, len, NULL, NULL, + WSC_ATTR_KEY_WRAP_AUTHENTICATOR, out->authenticator, + REQUIRED(E_SNONCE1, out->e_snonce1), + WSC_ATTR_INVALID); +} + 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 f853d2e0..a9853444 100644 --- a/src/wscutil.h +++ b/src/wscutil.h @@ -465,6 +465,11 @@ struct wsc_m5 { uint8_t authenticator[8]; }; +struct wsc_m5_encrypted_settings { + uint8_t e_snonce1[16]; + uint8_t authenticator[8]; +}; + struct wsc_nack { bool version2; uint8_t enrollee_nonce[16]; @@ -488,6 +493,8 @@ int wsc_parse_m4_encrypted_settings(const uint8_t *pdu, uint32_t len, struct wsc_m4_encrypted_settings *out); int wsc_parse_m5(const uint8_t *pdu, uint32_t len, struct wsc_m5 *out, struct iovec *out_encrypted); +int wsc_parse_m5_encrypted_settings(const uint8_t *pdu, uint32_t len, + struct wsc_m5_encrypted_settings *out); int wsc_parse_nack(const uint8_t *pdu, uint32_t len, struct wsc_nack *out);