/* * Wrappers for backward compatibility with old Kernels. * * Copyright (C) 2019 Samsung Electronics, Inc. * * Egor Uleyskiy, * * 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 #include #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 */