Lift out connection setup and PSP assoc uapi code in psp.py and responder, so that the key exchange sequence can be used in other test cases that start with a key exchange, but might choose to perform additional tx/rx assoc calls afterwards.
Signed-off-by: Daniel Zahka <[email protected]> --- tools/testing/selftests/drivers/net/psp.py | 14 +++- .../testing/selftests/drivers/net/psp_responder.c | 87 +++++++++++++++------- 2 files changed, 73 insertions(+), 28 deletions(-) diff --git a/tools/testing/selftests/drivers/net/psp.py b/tools/testing/selftests/drivers/net/psp.py index 473500901879..71eeade62ad2 100755 --- a/tools/testing/selftests/drivers/net/psp.py +++ b/tools/testing/selftests/drivers/net/psp.py @@ -447,10 +447,11 @@ def assoc_twice(cfg): ksft_eq(len(tx), 0) -def _data_basic_send(cfg, version, ipver): - """ Test basic data send """ - _init_psp_dev(cfg) +def _establish_psp_conn(cfg, version, ipver=None): + """Establish a PSP connection and return after key exchange + Requires _init_psp_dev() to have been called first. + """ # Version 0 is required by spec, don't let it skip if version: name = cfg.pspnl.consts["version"].entries_by_val[version].name @@ -475,7 +476,14 @@ def _data_basic_send(cfg, version, ipver): "version": version, "tx-key": tx, "sock-fd": s.fileno()}) + return s + + +def _data_basic_send(cfg, version, ipver): + """ Test basic data send """ + _init_psp_dev(cfg) + s = _establish_psp_conn(cfg, version, ipver) data_len = _send_careful(cfg, s, 100) _check_data_rx(cfg, data_len) _close_psp_conn(cfg, s) diff --git a/tools/testing/selftests/drivers/net/psp_responder.c b/tools/testing/selftests/drivers/net/psp_responder.c index a26e7628bbb1..57425ecb9561 100644 --- a/tools/testing/selftests/drivers/net/psp_responder.c +++ b/tools/testing/selftests/drivers/net/psp_responder.c @@ -37,20 +37,24 @@ static struct { unsigned char rx; } psp_vers; -static int conn_setup_psp(struct ynl_sock *ys, struct opts *opts, int data_sock) +static unsigned int psp_key_len(unsigned char version) { + switch (version) { + case PSP_VERSION_HDR0_AES_GCM_256: + case PSP_VERSION_HDR0_AES_GMAC_256: + return 32; + default: + return 16; + } +} + +static int +rx_assoc(struct ynl_sock *ys, __u32 *spi, char *key, int data_sock) +{ + unsigned int key_len = psp_key_len(psp_vers.rx); struct psp_rx_assoc_rsp *rsp; struct psp_rx_assoc_req *req; - struct psp_tx_assoc_rsp *tsp; - struct psp_tx_assoc_req *teq; - char info[300]; - int key_len; - ssize_t sz; - __u32 spi; - dbg("create PSP connection\n"); - - // Rx assoc alloc req = psp_rx_assoc_req_alloc(); psp_rx_assoc_req_set_sock_fd(req, data_sock); @@ -64,29 +68,34 @@ static int conn_setup_psp(struct ynl_sock *ys, struct opts *opts, int data_sock) return -1; } - // SPI exchange - key_len = rsp->rx_key._len.key; - memcpy(info, &rsp->rx_key.spi, sizeof(spi)); - memcpy(&info[sizeof(spi)], rsp->rx_key.key, key_len); - sz = sizeof(spi) + key_len; + if (rsp->rx_key._len.key != key_len) { + fprintf(stderr, "ERROR: unexpected Rx key length %u\n", + rsp->rx_key._len.key); + psp_rx_assoc_rsp_free(rsp); + return -1; + } + + memcpy(spi, &rsp->rx_key.spi, sizeof(*spi)); + memcpy(key, rsp->rx_key.key, key_len); - send(data_sock, info, sz, MSG_WAITALL); psp_rx_assoc_rsp_free(rsp); - sz = recv(data_sock, info, sz, MSG_WAITALL); - if (sz < 0) { - perror("ERROR: failed to read PSP key from sock"); - return -1; - } - memcpy(&spi, info, sizeof(spi)); + return 0; +} + +static int +tx_assoc(struct ynl_sock *ys, __u8 version, __u32 spi, char *key, + int data_sock) +{ + struct psp_tx_assoc_rsp *tsp; + struct psp_tx_assoc_req *teq; - // Setup Tx assoc teq = psp_tx_assoc_req_alloc(); psp_tx_assoc_req_set_sock_fd(teq, data_sock); - psp_tx_assoc_req_set_version(teq, psp_vers.tx); + psp_tx_assoc_req_set_version(teq, version); psp_tx_assoc_req_set_tx_key_spi(teq, spi); - psp_tx_assoc_req_set_tx_key_key(teq, &info[sizeof(spi)], key_len); + psp_tx_assoc_req_set_tx_key_key(teq, key, psp_key_len(version)); tsp = psp_tx_assoc(ys, teq); psp_tx_assoc_req_free(teq); @@ -99,6 +108,34 @@ static int conn_setup_psp(struct ynl_sock *ys, struct opts *opts, int data_sock) return 0; } +static int conn_setup_psp(struct ynl_sock *ys, struct opts *opts, int data_sock) +{ + unsigned int key_len = psp_key_len(psp_vers.rx); + char info[300]; + ssize_t sz; + __u32 spi; + + dbg("create PSP connection\n"); + + if (rx_assoc(ys, &spi, &info[sizeof(spi)], data_sock)) + return -1; + + // SPI exchange + memcpy(info, &spi, sizeof(spi)); + sz = sizeof(spi) + key_len; + + send(data_sock, info, sz, MSG_WAITALL); + + sz = recv(data_sock, info, sz, MSG_WAITALL); + if (sz < 0) { + perror("ERROR: failed to read PSP key from sock"); + return -1; + } + memcpy(&spi, info, sizeof(spi)); + + return tx_assoc(ys, psp_vers.tx, spi, &info[sizeof(spi)], data_sock); +} + static void send_ack(int sock) { send(sock, "ack", 4, MSG_WAITALL); -- 2.52.0

