blob: 2c71a2e8fc2b9be4916fc556a244740103a1a834 [file] [log] [blame]
/*
* PROCA identity
*
* Copyright (C) 2018 Samsung Electronics, Inc.
* Ivan Vorobiov, <i.vorobiov@samsung.com>
* 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.
*/
#include "proca_identity.h"
#include "proca_certificate.h"
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/string.h>
int init_proca_identity(struct proca_identity *identity, struct file *file,
char *xattr_value, const size_t xattr_size,
struct proca_certificate *parsed_cert)
{
int rc = 0;
if (!file)
return -EINVAL;
get_file(file);
identity->file = file;
identity->certificate = xattr_value;
identity->certificate_size = xattr_size;
if (parsed_cert)
identity->parsed_cert = *parsed_cert;
else
memset(&identity->parsed_cert,
0, sizeof(identity->parsed_cert));
return rc;
}
int proca_identity_copy(struct proca_identity *dst, struct proca_identity *src)
{
int rc = 0;
BUG_ON(!dst || !src);
memset(dst, 0, sizeof(*dst));
get_file(src->file);
dst->file = src->file;
if (src->certificate) {
dst->certificate = kmemdup(
src->certificate,
src->certificate_size,
GFP_KERNEL);
dst->certificate_size =
src->certificate_size;
if (unlikely(!dst->certificate)) {
fput(src->file);
return -ENOMEM;
}
}
rc = proca_certificate_copy(&dst->parsed_cert, &src->parsed_cert);
if (rc != 0) {
kfree(dst->certificate);
fput(src->file);
}
return rc;
}
void deinit_proca_identity(struct proca_identity *identity)
{
if (unlikely(!identity))
return;
deinit_proca_certificate(&identity->parsed_cert);
if (identity->file)
fput(identity->file);
kfree(identity->certificate);
}