From d59086c7911983db0f015699305cb111cf1af7a6 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 30 Aug 2016 13:57:28 -0500 Subject: [PATCH] wscutil: Add wsc_build_m4_encrypted_settings --- src/wscutil.c | 27 +++++++++++++++++++++++++++ src/wscutil.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/src/wscutil.c b/src/wscutil.c index 49c27acc..fc34478f 100644 --- a/src/wscutil.c +++ b/src/wscutil.c @@ -1463,6 +1463,13 @@ static void build_enrollee_nonce(struct wsc_attr_builder *builder, wsc_attr_builder_put_bytes(builder, nonce, 16); } +static void build_key_wrap_authenticator(struct wsc_attr_builder *builder, + const uint8_t *authenticator) +{ + wsc_attr_builder_start_attr(builder, WSC_ATTR_KEY_WRAP_AUTHENTICATOR); + wsc_attr_builder_put_bytes(builder, authenticator, 8); +} + static void build_mac_address(struct wsc_attr_builder *builder, const uint8_t *addr) { @@ -1556,6 +1563,13 @@ static void build_r_hash2(struct wsc_attr_builder *builder, wsc_attr_builder_put_bytes(builder, r_hash2, 32); } +static void build_r_snonce1(struct wsc_attr_builder *builder, + const uint8_t *nonce) +{ + wsc_attr_builder_start_attr(builder, WSC_ATTR_R_SNONCE1); + wsc_attr_builder_put_bytes(builder, nonce, 16); +} + static void build_serial_number(struct wsc_attr_builder *builder, const char *serial_number) { @@ -1772,6 +1786,19 @@ done: return ret; } +uint8_t *wsc_build_m4_encrypted_settings( + const struct wsc_m4_encrypted_settings *in, + size_t *out_len) +{ + struct wsc_attr_builder *builder; + + builder = wsc_attr_builder_new(256); + build_r_snonce1(builder, in->r_snonce1); + build_key_wrap_authenticator(builder, in->authenticator); + + return wsc_attr_builder_free(builder, false, out_len); +} + uint8_t *wsc_build_m5(const struct wsc_m5 *m5, const uint8_t *encrypted, size_t encrypted_len, size_t *out_len) { diff --git a/src/wscutil.h b/src/wscutil.h index 632cba13..f853d2e0 100644 --- a/src/wscutil.h +++ b/src/wscutil.h @@ -498,6 +498,9 @@ uint8_t *wsc_build_m2(const struct wsc_m2 *m2, size_t *out_len); uint8_t *wsc_build_m3(const struct wsc_m3 *m3, size_t *out_len); uint8_t *wsc_build_m4(const struct wsc_m4 *m4, const uint8_t *encrypted, size_t encrypted_len, size_t *out_len); +uint8_t *wsc_build_m4_encrypted_settings( + const struct wsc_m4_encrypted_settings *in, + size_t *out_len); uint8_t *wsc_build_m5(const struct wsc_m5 *m5, const uint8_t *encrypted, size_t encrypted_len, size_t *out_len);