Hi,
The beef of this pull request is OpenSSL 3.0 compatibility fixes for the signing and certificates. BR, Jarkko -----BEGIN PGP SIGNATURE----- iIgEABYKADAWIQRE6pSOnaBC00OEHEIaerohdGur0gUCZu2qwxIcamFya2tvQGtl cm5lbC5vcmcACgkQGnq6IXRrq9L+OgD/RX6k7fTGFBEx+khgUmOijYUwLUGTwX77 QdAmOs8eT4oBANmp8kzfMdZjHTlD7zeYNIj7oXxkqw1tQuPOTQzgAIwO =qDl1 -----END PGP SIGNATURE----- Merge tag 'keys-next-6.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd Pull key updates from Jarkko Sakkinen: "The bulk of this is OpenSSL 3.0 compatibility fixes for the signing and certificates" * tag 'keys-next-6.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd: sign-file,extract-cert: use pkcs11 provider for OPENSSL MAJOR >= 3 sign-file,extract-cert: avoid using deprecated ERR_get_error_line() sign-file,extract-cert: move common SSL helper functions to a header KEYS: prevent NULL pointer dereference in find_asymmetric_key() KEYS: Remove unused declarations
This commit is contained in:
commit
24f772dec3
@ -5215,6 +5215,7 @@ S: Maintained
|
|||||||
F: Documentation/admin-guide/module-signing.rst
|
F: Documentation/admin-guide/module-signing.rst
|
||||||
F: certs/
|
F: certs/
|
||||||
F: scripts/sign-file.c
|
F: scripts/sign-file.c
|
||||||
|
F: scripts/ssl-common.h
|
||||||
F: tools/certs/
|
F: tools/certs/
|
||||||
|
|
||||||
CFAG12864B LCD DRIVER
|
CFAG12864B LCD DRIVER
|
||||||
|
@ -84,5 +84,5 @@ targets += x509_revocation_list
|
|||||||
|
|
||||||
hostprogs := extract-cert
|
hostprogs := extract-cert
|
||||||
|
|
||||||
HOSTCFLAGS_extract-cert.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null)
|
HOSTCFLAGS_extract-cert.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null) -I$(srctree)/scripts
|
||||||
HOSTLDLIBS_extract-cert = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
HOSTLDLIBS_extract-cert = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||||
|
@ -21,14 +21,17 @@
|
|||||||
#include <openssl/bio.h>
|
#include <openssl/bio.h>
|
||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/engine.h>
|
#if OPENSSL_VERSION_MAJOR >= 3
|
||||||
|
# define USE_PKCS11_PROVIDER
|
||||||
/*
|
# include <openssl/provider.h>
|
||||||
* OpenSSL 3.0 deprecates the OpenSSL's ENGINE API.
|
# include <openssl/store.h>
|
||||||
*
|
#else
|
||||||
* Remove this if/when that API is no longer used
|
# if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
|
||||||
*/
|
# define USE_PKCS11_ENGINE
|
||||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
# include <openssl/engine.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#include "ssl-common.h"
|
||||||
|
|
||||||
#define PKEY_ID_PKCS7 2
|
#define PKEY_ID_PKCS7 2
|
||||||
|
|
||||||
@ -40,41 +43,6 @@ void format(void)
|
|||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void display_openssl_errors(int l)
|
|
||||||
{
|
|
||||||
const char *file;
|
|
||||||
char buf[120];
|
|
||||||
int e, line;
|
|
||||||
|
|
||||||
if (ERR_peek_error() == 0)
|
|
||||||
return;
|
|
||||||
fprintf(stderr, "At main.c:%d:\n", l);
|
|
||||||
|
|
||||||
while ((e = ERR_get_error_line(&file, &line))) {
|
|
||||||
ERR_error_string(e, buf);
|
|
||||||
fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void drain_openssl_errors(void)
|
|
||||||
{
|
|
||||||
const char *file;
|
|
||||||
int line;
|
|
||||||
|
|
||||||
if (ERR_peek_error() == 0)
|
|
||||||
return;
|
|
||||||
while (ERR_get_error_line(&file, &line)) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ERR(cond, fmt, ...) \
|
|
||||||
do { \
|
|
||||||
bool __cond = (cond); \
|
|
||||||
display_openssl_errors(__LINE__); \
|
|
||||||
if (__cond) { \
|
|
||||||
err(1, fmt, ## __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
static const char *key_pass;
|
static const char *key_pass;
|
||||||
static BIO *wb;
|
static BIO *wb;
|
||||||
static char *cert_dst;
|
static char *cert_dst;
|
||||||
@ -94,6 +62,66 @@ static void write_cert(X509 *x509)
|
|||||||
fprintf(stderr, "Extracted cert: %s\n", buf);
|
fprintf(stderr, "Extracted cert: %s\n", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static X509 *load_cert_pkcs11(const char *cert_src)
|
||||||
|
{
|
||||||
|
X509 *cert = NULL;
|
||||||
|
#ifdef USE_PKCS11_PROVIDER
|
||||||
|
OSSL_STORE_CTX *store;
|
||||||
|
|
||||||
|
if (!OSSL_PROVIDER_try_load(NULL, "pkcs11", true))
|
||||||
|
ERR(1, "OSSL_PROVIDER_try_load(pkcs11)");
|
||||||
|
if (!OSSL_PROVIDER_try_load(NULL, "default", true))
|
||||||
|
ERR(1, "OSSL_PROVIDER_try_load(default)");
|
||||||
|
|
||||||
|
store = OSSL_STORE_open(cert_src, NULL, NULL, NULL, NULL);
|
||||||
|
ERR(!store, "OSSL_STORE_open");
|
||||||
|
|
||||||
|
while (!OSSL_STORE_eof(store)) {
|
||||||
|
OSSL_STORE_INFO *info = OSSL_STORE_load(store);
|
||||||
|
|
||||||
|
if (!info) {
|
||||||
|
drain_openssl_errors(__LINE__, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_CERT) {
|
||||||
|
cert = OSSL_STORE_INFO_get1_CERT(info);
|
||||||
|
ERR(!cert, "OSSL_STORE_INFO_get1_CERT");
|
||||||
|
}
|
||||||
|
OSSL_STORE_INFO_free(info);
|
||||||
|
if (cert)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
OSSL_STORE_close(store);
|
||||||
|
#elif defined(USE_PKCS11_ENGINE)
|
||||||
|
ENGINE *e;
|
||||||
|
struct {
|
||||||
|
const char *cert_id;
|
||||||
|
X509 *cert;
|
||||||
|
} parms;
|
||||||
|
|
||||||
|
parms.cert_id = cert_src;
|
||||||
|
parms.cert = NULL;
|
||||||
|
|
||||||
|
ENGINE_load_builtin_engines();
|
||||||
|
drain_openssl_errors(__LINE__, 1);
|
||||||
|
e = ENGINE_by_id("pkcs11");
|
||||||
|
ERR(!e, "Load PKCS#11 ENGINE");
|
||||||
|
if (ENGINE_init(e))
|
||||||
|
drain_openssl_errors(__LINE__, 1);
|
||||||
|
else
|
||||||
|
ERR(1, "ENGINE_init");
|
||||||
|
if (key_pass)
|
||||||
|
ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0), "Set PKCS#11 PIN");
|
||||||
|
ENGINE_ctrl_cmd(e, "LOAD_CERT_CTRL", 0, &parms, NULL, 1);
|
||||||
|
ERR(!parms.cert, "Get X.509 from PKCS#11");
|
||||||
|
cert = parms.cert;
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "no pkcs11 engine/provider available\n");
|
||||||
|
exit(1);
|
||||||
|
#endif
|
||||||
|
return cert;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *cert_src;
|
char *cert_src;
|
||||||
@ -122,28 +150,10 @@ int main(int argc, char **argv)
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
exit(0);
|
exit(0);
|
||||||
} else if (!strncmp(cert_src, "pkcs11:", 7)) {
|
} else if (!strncmp(cert_src, "pkcs11:", 7)) {
|
||||||
ENGINE *e;
|
X509 *cert = load_cert_pkcs11(cert_src);
|
||||||
struct {
|
|
||||||
const char *cert_id;
|
|
||||||
X509 *cert;
|
|
||||||
} parms;
|
|
||||||
|
|
||||||
parms.cert_id = cert_src;
|
ERR(!cert, "load_cert_pkcs11 failed");
|
||||||
parms.cert = NULL;
|
write_cert(cert);
|
||||||
|
|
||||||
ENGINE_load_builtin_engines();
|
|
||||||
drain_openssl_errors();
|
|
||||||
e = ENGINE_by_id("pkcs11");
|
|
||||||
ERR(!e, "Load PKCS#11 ENGINE");
|
|
||||||
if (ENGINE_init(e))
|
|
||||||
drain_openssl_errors();
|
|
||||||
else
|
|
||||||
ERR(1, "ENGINE_init");
|
|
||||||
if (key_pass)
|
|
||||||
ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0), "Set PKCS#11 PIN");
|
|
||||||
ENGINE_ctrl_cmd(e, "LOAD_CERT_CTRL", 0, &parms, NULL, 1);
|
|
||||||
ERR(!parms.cert, "Get X.509 from PKCS#11");
|
|
||||||
write_cert(parms.cert);
|
|
||||||
} else {
|
} else {
|
||||||
BIO *b;
|
BIO *b;
|
||||||
X509 *x509;
|
X509 *x509;
|
||||||
|
@ -60,17 +60,18 @@ struct key *find_asymmetric_key(struct key *keyring,
|
|||||||
char *req, *p;
|
char *req, *p;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
WARN_ON(!id_0 && !id_1 && !id_2);
|
|
||||||
|
|
||||||
if (id_0) {
|
if (id_0) {
|
||||||
lookup = id_0->data;
|
lookup = id_0->data;
|
||||||
len = id_0->len;
|
len = id_0->len;
|
||||||
} else if (id_1) {
|
} else if (id_1) {
|
||||||
lookup = id_1->data;
|
lookup = id_1->data;
|
||||||
len = id_1->len;
|
len = id_1->len;
|
||||||
} else {
|
} else if (id_2) {
|
||||||
lookup = id_2->data;
|
lookup = id_2->data;
|
||||||
len = id_2->len;
|
len = id_2->len;
|
||||||
|
} else {
|
||||||
|
WARN_ON(1);
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Construct an identifier "id:<keyid>". */
|
/* Construct an identifier "id:<keyid>". */
|
||||||
|
@ -12,8 +12,4 @@
|
|||||||
|
|
||||||
extern struct key_type key_type_dns_resolver;
|
extern struct key_type key_type_dns_resolver;
|
||||||
|
|
||||||
extern int request_dns_resolver_key(const char *description,
|
|
||||||
const char *callout_info,
|
|
||||||
char **data);
|
|
||||||
|
|
||||||
#endif /* _KEYS_DNS_RESOLVER_TYPE_H */
|
#endif /* _KEYS_DNS_RESOLVER_TYPE_H */
|
||||||
|
@ -436,9 +436,6 @@ extern key_ref_t keyring_search(key_ref_t keyring,
|
|||||||
const char *description,
|
const char *description,
|
||||||
bool recurse);
|
bool recurse);
|
||||||
|
|
||||||
extern int keyring_add_key(struct key *keyring,
|
|
||||||
struct key *key);
|
|
||||||
|
|
||||||
extern int keyring_restrict(key_ref_t keyring, const char *type,
|
extern int keyring_restrict(key_ref_t keyring, const char *type,
|
||||||
const char *restriction);
|
const char *restriction);
|
||||||
|
|
||||||
|
@ -27,14 +27,17 @@
|
|||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/engine.h>
|
#if OPENSSL_VERSION_MAJOR >= 3
|
||||||
|
# define USE_PKCS11_PROVIDER
|
||||||
/*
|
# include <openssl/provider.h>
|
||||||
* OpenSSL 3.0 deprecates the OpenSSL's ENGINE API.
|
# include <openssl/store.h>
|
||||||
*
|
#else
|
||||||
* Remove this if/when that API is no longer used
|
# if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
|
||||||
*/
|
# define USE_PKCS11_ENGINE
|
||||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
# include <openssl/engine.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#include "ssl-common.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use CMS if we have openssl-1.0.0 or newer available - otherwise we have to
|
* Use CMS if we have openssl-1.0.0 or newer available - otherwise we have to
|
||||||
@ -83,41 +86,6 @@ void format(void)
|
|||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void display_openssl_errors(int l)
|
|
||||||
{
|
|
||||||
const char *file;
|
|
||||||
char buf[120];
|
|
||||||
int e, line;
|
|
||||||
|
|
||||||
if (ERR_peek_error() == 0)
|
|
||||||
return;
|
|
||||||
fprintf(stderr, "At main.c:%d:\n", l);
|
|
||||||
|
|
||||||
while ((e = ERR_get_error_line(&file, &line))) {
|
|
||||||
ERR_error_string(e, buf);
|
|
||||||
fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void drain_openssl_errors(void)
|
|
||||||
{
|
|
||||||
const char *file;
|
|
||||||
int line;
|
|
||||||
|
|
||||||
if (ERR_peek_error() == 0)
|
|
||||||
return;
|
|
||||||
while (ERR_get_error_line(&file, &line)) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ERR(cond, fmt, ...) \
|
|
||||||
do { \
|
|
||||||
bool __cond = (cond); \
|
|
||||||
display_openssl_errors(__LINE__); \
|
|
||||||
if (__cond) { \
|
|
||||||
errx(1, fmt, ## __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
static const char *key_pass;
|
static const char *key_pass;
|
||||||
|
|
||||||
static int pem_pw_cb(char *buf, int len, int w, void *v)
|
static int pem_pw_cb(char *buf, int len, int w, void *v)
|
||||||
@ -139,28 +107,64 @@ static int pem_pw_cb(char *buf, int len, int w, void *v)
|
|||||||
return pwlen;
|
return pwlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EVP_PKEY *read_private_key_pkcs11(const char *private_key_name)
|
||||||
|
{
|
||||||
|
EVP_PKEY *private_key = NULL;
|
||||||
|
#ifdef USE_PKCS11_PROVIDER
|
||||||
|
OSSL_STORE_CTX *store;
|
||||||
|
|
||||||
|
if (!OSSL_PROVIDER_try_load(NULL, "pkcs11", true))
|
||||||
|
ERR(1, "OSSL_PROVIDER_try_load(pkcs11)");
|
||||||
|
if (!OSSL_PROVIDER_try_load(NULL, "default", true))
|
||||||
|
ERR(1, "OSSL_PROVIDER_try_load(default)");
|
||||||
|
|
||||||
|
store = OSSL_STORE_open(private_key_name, NULL, NULL, NULL, NULL);
|
||||||
|
ERR(!store, "OSSL_STORE_open");
|
||||||
|
|
||||||
|
while (!OSSL_STORE_eof(store)) {
|
||||||
|
OSSL_STORE_INFO *info = OSSL_STORE_load(store);
|
||||||
|
|
||||||
|
if (!info) {
|
||||||
|
drain_openssl_errors(__LINE__, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY) {
|
||||||
|
private_key = OSSL_STORE_INFO_get1_PKEY(info);
|
||||||
|
ERR(!private_key, "OSSL_STORE_INFO_get1_PKEY");
|
||||||
|
}
|
||||||
|
OSSL_STORE_INFO_free(info);
|
||||||
|
if (private_key)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
OSSL_STORE_close(store);
|
||||||
|
#elif defined(USE_PKCS11_ENGINE)
|
||||||
|
ENGINE *e;
|
||||||
|
|
||||||
|
ENGINE_load_builtin_engines();
|
||||||
|
drain_openssl_errors(__LINE__, 1);
|
||||||
|
e = ENGINE_by_id("pkcs11");
|
||||||
|
ERR(!e, "Load PKCS#11 ENGINE");
|
||||||
|
if (ENGINE_init(e))
|
||||||
|
drain_openssl_errors(__LINE__, 1);
|
||||||
|
else
|
||||||
|
ERR(1, "ENGINE_init");
|
||||||
|
if (key_pass)
|
||||||
|
ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0), "Set PKCS#11 PIN");
|
||||||
|
private_key = ENGINE_load_private_key(e, private_key_name, NULL, NULL);
|
||||||
|
ERR(!private_key, "%s", private_key_name);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "no pkcs11 engine/provider available\n");
|
||||||
|
exit(1);
|
||||||
|
#endif
|
||||||
|
return private_key;
|
||||||
|
}
|
||||||
|
|
||||||
static EVP_PKEY *read_private_key(const char *private_key_name)
|
static EVP_PKEY *read_private_key(const char *private_key_name)
|
||||||
{
|
{
|
||||||
EVP_PKEY *private_key;
|
|
||||||
|
|
||||||
if (!strncmp(private_key_name, "pkcs11:", 7)) {
|
if (!strncmp(private_key_name, "pkcs11:", 7)) {
|
||||||
ENGINE *e;
|
return read_private_key_pkcs11(private_key_name);
|
||||||
|
|
||||||
ENGINE_load_builtin_engines();
|
|
||||||
drain_openssl_errors();
|
|
||||||
e = ENGINE_by_id("pkcs11");
|
|
||||||
ERR(!e, "Load PKCS#11 ENGINE");
|
|
||||||
if (ENGINE_init(e))
|
|
||||||
drain_openssl_errors();
|
|
||||||
else
|
|
||||||
ERR(1, "ENGINE_init");
|
|
||||||
if (key_pass)
|
|
||||||
ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0),
|
|
||||||
"Set PKCS#11 PIN");
|
|
||||||
private_key = ENGINE_load_private_key(e, private_key_name,
|
|
||||||
NULL, NULL);
|
|
||||||
ERR(!private_key, "%s", private_key_name);
|
|
||||||
} else {
|
} else {
|
||||||
|
EVP_PKEY *private_key;
|
||||||
BIO *b;
|
BIO *b;
|
||||||
|
|
||||||
b = BIO_new_file(private_key_name, "rb");
|
b = BIO_new_file(private_key_name, "rb");
|
||||||
@ -169,9 +173,9 @@ static EVP_PKEY *read_private_key(const char *private_key_name)
|
|||||||
NULL);
|
NULL);
|
||||||
ERR(!private_key, "%s", private_key_name);
|
ERR(!private_key, "%s", private_key_name);
|
||||||
BIO_free(b);
|
BIO_free(b);
|
||||||
}
|
|
||||||
|
|
||||||
return private_key;
|
return private_key;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static X509 *read_x509(const char *x509_name)
|
static X509 *read_x509(const char *x509_name)
|
||||||
@ -306,7 +310,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* Digest the module data. */
|
/* Digest the module data. */
|
||||||
OpenSSL_add_all_digests();
|
OpenSSL_add_all_digests();
|
||||||
display_openssl_errors(__LINE__);
|
drain_openssl_errors(__LINE__, 0);
|
||||||
digest_algo = EVP_get_digestbyname(hash_algo);
|
digest_algo = EVP_get_digestbyname(hash_algo);
|
||||||
ERR(!digest_algo, "EVP_get_digestbyname");
|
ERR(!digest_algo, "EVP_get_digestbyname");
|
||||||
|
|
||||||
|
32
scripts/ssl-common.h
Normal file
32
scripts/ssl-common.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||||
|
/*
|
||||||
|
* SSL helper functions shared by sign-file and extract-cert.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void drain_openssl_errors(int l, int silent)
|
||||||
|
{
|
||||||
|
const char *file;
|
||||||
|
char buf[120];
|
||||||
|
int e, line;
|
||||||
|
|
||||||
|
if (ERR_peek_error() == 0)
|
||||||
|
return;
|
||||||
|
if (!silent)
|
||||||
|
fprintf(stderr, "At main.c:%d:\n", l);
|
||||||
|
|
||||||
|
while ((e = ERR_peek_error_line(&file, &line))) {
|
||||||
|
ERR_error_string(e, buf);
|
||||||
|
if (!silent)
|
||||||
|
fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line);
|
||||||
|
ERR_get_error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ERR(cond, fmt, ...) \
|
||||||
|
do { \
|
||||||
|
bool __cond = (cond); \
|
||||||
|
drain_openssl_errors(__LINE__, 0); \
|
||||||
|
if (__cond) { \
|
||||||
|
errx(1, fmt, ## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
Loading…
Reference in New Issue
Block a user