unplugged-system/external/ltp/testcases/kernel/crypto/af_alg04.c

82 lines
1.8 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright 2019 Google LLC
* Copyright (c) Linux Test Project, 2019-2021
*/
/*
* Regression test for commit bb2964810233 ("crypto: vmac - separate tfm and
* request context"). This test verifies that a VMAC transform can be used by
* multiple concurrent hash requests without crashing the kernel. Based on the
* reproducer from the commit message.
*/
#include <stdio.h>
#include <sys/wait.h>
#include "tst_test.h"
#include "tst_af_alg.h"
static void test_with_symm_enc_algs(const char *symm_enc_algname)
{
int algfd, reqfd;
char buf[256] = { 0 };
char vmac_algname[64];
pid_t pid;
int status;
int i;
sprintf(vmac_algname, "vmac64(%s)", symm_enc_algname);
if (!tst_have_alg("hash", vmac_algname)) {
sprintf(vmac_algname, "vmac(%s)", symm_enc_algname);
if (!tst_have_alg("hash", vmac_algname))
return;
}
algfd = tst_alg_setup("hash", vmac_algname, NULL, 16);
tst_res(TINFO, "Starting vmac hashing test. May crash buggy kernels.");
pid = SAFE_FORK();
reqfd = tst_alg_accept(algfd);
for (i = 0; i < 500000; i++)
SAFE_WRITE(SAFE_WRITE_ALL, reqfd, buf, sizeof(buf));
close(reqfd);
if (pid != 0) {
SAFE_WAIT(&status);
if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
tst_res(TPASS, "didn't crash");
else if (WIFSIGNALED(status) && WTERMSIG(status) == SIGKILL)
tst_res(TFAIL, "crashed");
else
tst_brk(TBROK, "child %s", tst_strstatus(status));
close(algfd);
}
}
/* try several different symmetric encryption algorithms */
static const char * const symm_enc_algs[] = {
"aes",
"sm4",
"sm4-generic",
};
static void do_test(unsigned int i)
{
test_with_symm_enc_algs(symm_enc_algs[i]);
}
static struct tst_test test = {
.test = do_test,
.tcnt = ARRAY_SIZE(symm_enc_algs),
.forks_child = 1,
.tags = (const struct tst_tag[]) {
{"linux-git", "bb2964810233"},
{}
}
};