blob: c93e65220cd495a58e4d1269b6212bbe1924debb [file] [log] [blame]
/*
* Wrappers for backward compatibility with old Kernels.
*
* Copyright (C) 2019 Samsung Electronics, Inc.
*
* Egor Uleyskiy, <e.uleyskiy@samsung.com>
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __LINUX_FIVE_CRYPTO_COMP_H
#define __LINUX_FIVE_CRYPTO_COMP_H
#include <linux/version.h>
#include <crypto/public_key.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
static inline int five_verify_signature(struct key *key,
struct public_key_signature *pks,
struct five_cert *cert,
struct five_cert_header *header)
{
int ret = -ENOMEM;
pks->pkey_hash_algo = header->hash_algo;
pks->nr_mpi = 1;
pks->rsa.s = mpi_read_raw_data(cert->signature->value,
cert->signature->length);
if (pks->rsa.s)
ret = verify_signature(key, pks);
mpi_free(pks->rsa.s);
return ret;
}
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
static inline int five_verify_signature(struct key *key,
struct public_key_signature *pks,
struct five_cert *cert,
struct five_cert_header *header)
{
int ret = -ENOMEM;
pks->pkey_algo = "rsa";
pks->hash_algo = hash_algo_name[header->hash_algo];
pks->s = cert->signature->value;
pks->s_size = cert->signature->length;
ret = verify_signature(key, pks);
return ret;
}
#else
static inline int five_verify_signature(struct key *key,
struct public_key_signature *pks,
struct five_cert *cert,
struct five_cert_header *header)
{
int ret = -ENOMEM;
pks->pkey_algo = "rsa";
pks->encoding = "pkcs1";
pks->hash_algo = hash_algo_name[header->hash_algo];
pks->s = cert->signature->value;
pks->s_size = cert->signature->length;
ret = verify_signature(key, pks);
return ret;
}
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
static inline struct key *five_keyring_alloc(const char *description,
kuid_t uid, kgid_t gid, const struct cred *cred,
key_perm_t perm, unsigned long flags)
{
return keyring_alloc(description, uid, gid, cred,
perm, flags, NULL);
}
#else
static inline struct key *five_keyring_alloc(const char *description,
kuid_t uid, kgid_t gid, const struct cred *cred,
key_perm_t perm, unsigned long flags)
{
return keyring_alloc(description, uid, gid, cred,
perm, flags, NULL, NULL);
}
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)
#define keyring_search(keyring, type, desc, recurse) \
keyring_search(keyring, type, desc)
#endif
#endif /* __LINUX_FIVE_CRYPTO_COMP_H */