Skip to content

Commit

Permalink
rxrpc: Support keys with multiple authentication tokens
Browse files Browse the repository at this point in the history
rxrpc-type keys can have multiple tokens attached for different security
classes.  Currently, rxrpc always picks the first one, whether or not the
security class it indicates is supported.

Add preliminary support for choosing which security class will be used
(this will need to be directed from a higher layer) and go through the
tokens to find one that's supported.

Signed-off-by: David Howells <[email protected]>
  • Loading branch information
dhowells committed Nov 23, 2020
1 parent 0727d3e commit 41057eb
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 13 deletions.
4 changes: 3 additions & 1 deletion net/rxrpc/ar-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <net/netns/generic.h>
#include <net/sock.h>
#include <net/af_rxrpc.h>
#include <keys/rxrpc-type.h>
#include "protocol.h"

#if 0
Expand Down Expand Up @@ -217,7 +218,8 @@ struct rxrpc_security {
void (*exit)(void);

/* initialise a connection's security */
int (*init_connection_security)(struct rxrpc_connection *);
int (*init_connection_security)(struct rxrpc_connection *,
struct rxrpc_key_token *);

/* prime a connection's packet security */
int (*prime_packet_security)(struct rxrpc_connection *);
Expand Down
3 changes: 2 additions & 1 deletion net/rxrpc/conn_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,8 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
if (ret < 0)
return ret;

ret = conn->security->init_connection_security(conn);
ret = conn->security->init_connection_security(
conn, conn->params.key->payload.data[0]);
if (ret < 0)
return ret;

Expand Down
3 changes: 2 additions & 1 deletion net/rxrpc/insecure.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
#include <net/af_rxrpc.h>
#include "ar-internal.h"

static int none_init_connection_security(struct rxrpc_connection *conn)
static int none_init_connection_security(struct rxrpc_connection *conn,
struct rxrpc_key_token *token)
{
return 0;
}
Expand Down
5 changes: 2 additions & 3 deletions net/rxrpc/rxkad.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,14 @@ static DEFINE_MUTEX(rxkad_ci_mutex);
/*
* initialise connection security
*/
static int rxkad_init_connection_security(struct rxrpc_connection *conn)
static int rxkad_init_connection_security(struct rxrpc_connection *conn,
struct rxrpc_key_token *token)
{
struct crypto_sync_skcipher *ci;
struct rxrpc_key_token *token;
int ret;

_enter("{%d},{%x}", conn->debug_id, key_serial(conn->params.key));

token = conn->params.key->payload.data[0];
conn->security_ix = token->security_index;

ci = crypto_alloc_sync_skcipher("pcbc(fcrypt)", 0, 0);
Expand Down
15 changes: 8 additions & 7 deletions net/rxrpc/security.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,17 @@ int rxrpc_init_client_conn_security(struct rxrpc_connection *conn)
if (ret < 0)
return ret;

token = key->payload.data[0];
if (!token)
return -EKEYREJECTED;
for (token = key->payload.data[0]; token; token = token->next) {
sec = rxrpc_security_lookup(token->security_index);
if (sec)
goto found;
}
return -EKEYREJECTED;

sec = rxrpc_security_lookup(token->security_index);
if (!sec)
return -EKEYREJECTED;
found:
conn->security = sec;

ret = conn->security->init_connection_security(conn);
ret = conn->security->init_connection_security(conn, token);
if (ret < 0) {
conn->security = &rxrpc_no_security;
return ret;
Expand Down

0 comments on commit 41057eb

Please sign in to comment.