113 lines
3.5 KiB
C
113 lines
3.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright (c) 2018 Richard Palethorpe <rpalethorpe@suse.com>
|
|
*/
|
|
|
|
/**
|
|
* @file tst_crypto.h
|
|
*
|
|
* Library for interacting with kernel's crypto layer using the netlink
|
|
* interface.
|
|
*/
|
|
|
|
#ifndef TST_CRYPTO_H
|
|
#define TST_CRYPTO_H
|
|
|
|
#include "lapi/cryptouser.h"
|
|
|
|
/**
|
|
* A reference to a crypto session and associated state.
|
|
*
|
|
* Holds state relevant to a netlink crypto connection. The seq_num is used
|
|
* to tag each message sent to the netlink layer and is automatically
|
|
* incremented by the tst_crypto_ functions. When the netlink layer sends a
|
|
* response (ack) it will use the sequences number from the request.
|
|
*
|
|
* Some functions, such as delete ALG, may return EBUSY in which case it is
|
|
* safe to retry them. The retries field allows you to set the number of
|
|
* times this should be done. If set to zero the operation will only be tried
|
|
* once. For operations which do not return EBUSY, the field is ignored.
|
|
*
|
|
* Use TST_CRYPTO_SESSION_INIT to statically initialize this struct with sane
|
|
* defaults.
|
|
*/
|
|
struct tst_crypto_session {
|
|
/** File descriptor for the netlink socket */
|
|
int fd;
|
|
/** A sequence number used to identify responses from the kernel. */
|
|
uint32_t seq_num;
|
|
/** Number of times some operations will be retried. */
|
|
uint32_t retries;
|
|
};
|
|
|
|
/**
|
|
* Default static definition of tst_crypto_session.
|
|
*
|
|
* @relates tst_crypto_session
|
|
*/
|
|
#define TST_CRYPTO_SESSION_INIT {\
|
|
.fd = 0, \
|
|
.seq_num = 0, \
|
|
.retries = 1000 \
|
|
}
|
|
|
|
/**
|
|
* Creates a crypto session.
|
|
*
|
|
* @relates tst_crypto_session
|
|
* @param ses Session structure to use, it can be uninitialized.
|
|
*
|
|
* If some necessary feature is missing then it will call tst_brk() with
|
|
* TCONF, for any other error it will use TBROK.
|
|
*/
|
|
void tst_crypto_open(struct tst_crypto_session *ses);
|
|
|
|
/**
|
|
* Close a crypto session.
|
|
*
|
|
* @relates tst_crypto_session
|
|
* @param ses The session to close.
|
|
*/
|
|
void tst_crypto_close(struct tst_crypto_session *ses);
|
|
|
|
/**
|
|
* Add a crypto algorithm to a session.
|
|
*
|
|
* @relates tst_crypto_session
|
|
* @param ses An open session.
|
|
* @param alg The crypto algorithm or module to add.
|
|
*
|
|
* This requests a new crypto algorithm/engine/module to be initialized by the
|
|
* kernel. It sends the request contained in alg and then waits for a
|
|
* response. If sending the message or receiving the ack fails at the netlink
|
|
* level then tst_brk() with TBROK will be called.
|
|
*
|
|
* @return On success it will return 0 otherwise it will return an inverted
|
|
* error code from the crypto layer.
|
|
*/
|
|
int tst_crypto_add_alg(struct tst_crypto_session *ses,
|
|
const struct crypto_user_alg *alg);
|
|
|
|
/**
|
|
* Delete a crypto algorithm from a session.
|
|
*
|
|
* @relates tst_crypto_session
|
|
* @param ses An open session.
|
|
* @param alg The crypto algorithm to delete.
|
|
*
|
|
* Request that the kernel remove an existing crypto algorithm. This behaves
|
|
* in a similar way to tst_crypto_add_alg() except that it is the inverse
|
|
* operation and that it is not unusual for the crypto layer to return
|
|
* EBUSY. If EBUSY is returned then the function will internally retry the
|
|
* operation tst_crypto_session::retries times before giving up and returning
|
|
* EBUSY.
|
|
*
|
|
* Return: Either 0 or an inverted error code from the crypto layer. If called
|
|
* during cleanup it may return a positive ENODATA value from the LTP
|
|
* library, you don't need to log this error as it will already have
|
|
* been printed by tst_brk().
|
|
*/
|
|
int tst_crypto_del_alg(struct tst_crypto_session *ses,
|
|
const struct crypto_user_alg *alg);
|
|
|
|
#endif /* TST_CRYPTO_H */
|