forked from raspberrypi/linux
-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
crypto: kpp - Key-agreement Protocol Primitives API (KPP)
Add key-agreement protocol primitives (kpp) API which allows to implement primitives required by protocols such as DH and ECDH. The API is composed mainly by the following functions * set_secret() - It allows the user to set his secret, also referred to as his private key, along with the parameters known to both parties involved in the key-agreement session. * generate_public_key() - It generates the public key to be sent to the other counterpart involved in the key-agreement session. The function has to be called after set_params() and set_secret() * generate_secret() - It generates the shared secret for the session Other functions such as init() and exit() are provided for allowing cryptographic hardware to be inizialized properly before use Signed-off-by: Salvatore Benedetto <salvatore.benedetto@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
- Loading branch information
Showing
8 changed files
with
552 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
/* | ||
* Key-agreement Protocol Primitives (KPP) | ||
* | ||
* Copyright (c) 2016, Intel Corporation | ||
* Authors: Salvatore Benedetto <salvatore.benedetto@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the Free | ||
* Software Foundation; either version 2 of the License, or (at your option) | ||
* any later version. | ||
* | ||
*/ | ||
#include <linux/errno.h> | ||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/seq_file.h> | ||
#include <linux/slab.h> | ||
#include <linux/string.h> | ||
#include <linux/crypto.h> | ||
#include <crypto/algapi.h> | ||
#include <linux/cryptouser.h> | ||
#include <net/netlink.h> | ||
#include <crypto/kpp.h> | ||
#include <crypto/internal/kpp.h> | ||
#include "internal.h" | ||
|
||
#ifdef CONFIG_NET | ||
static int crypto_kpp_report(struct sk_buff *skb, struct crypto_alg *alg) | ||
{ | ||
struct crypto_report_kpp rkpp; | ||
|
||
strncpy(rkpp.type, "kpp", sizeof(rkpp.type)); | ||
|
||
if (nla_put(skb, CRYPTOCFGA_REPORT_KPP, | ||
sizeof(struct crypto_report_kpp), &rkpp)) | ||
goto nla_put_failure; | ||
return 0; | ||
|
||
nla_put_failure: | ||
return -EMSGSIZE; | ||
} | ||
#else | ||
static int crypto_kpp_report(struct sk_buff *skb, struct crypto_alg *alg) | ||
{ | ||
return -ENOSYS; | ||
} | ||
#endif | ||
|
||
static void crypto_kpp_show(struct seq_file *m, struct crypto_alg *alg) | ||
__attribute__ ((unused)); | ||
|
||
static void crypto_kpp_show(struct seq_file *m, struct crypto_alg *alg) | ||
{ | ||
seq_puts(m, "type : kpp\n"); | ||
} | ||
|
||
static void crypto_kpp_exit_tfm(struct crypto_tfm *tfm) | ||
{ | ||
struct crypto_kpp *kpp = __crypto_kpp_tfm(tfm); | ||
struct kpp_alg *alg = crypto_kpp_alg(kpp); | ||
|
||
alg->exit(kpp); | ||
} | ||
|
||
static int crypto_kpp_init_tfm(struct crypto_tfm *tfm) | ||
{ | ||
struct crypto_kpp *kpp = __crypto_kpp_tfm(tfm); | ||
struct kpp_alg *alg = crypto_kpp_alg(kpp); | ||
|
||
if (alg->exit) | ||
kpp->base.exit = crypto_kpp_exit_tfm; | ||
|
||
if (alg->init) | ||
return alg->init(kpp); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct crypto_type crypto_kpp_type = { | ||
.extsize = crypto_alg_extsize, | ||
.init_tfm = crypto_kpp_init_tfm, | ||
#ifdef CONFIG_PROC_FS | ||
.show = crypto_kpp_show, | ||
#endif | ||
.report = crypto_kpp_report, | ||
.maskclear = ~CRYPTO_ALG_TYPE_MASK, | ||
.maskset = CRYPTO_ALG_TYPE_MASK, | ||
.type = CRYPTO_ALG_TYPE_KPP, | ||
.tfmsize = offsetof(struct crypto_kpp, base), | ||
}; | ||
|
||
struct crypto_kpp *crypto_alloc_kpp(const char *alg_name, u32 type, u32 mask) | ||
{ | ||
return crypto_alloc_tfm(alg_name, &crypto_kpp_type, type, mask); | ||
} | ||
EXPORT_SYMBOL_GPL(crypto_alloc_kpp); | ||
|
||
static void kpp_prepare_alg(struct kpp_alg *alg) | ||
{ | ||
struct crypto_alg *base = &alg->base; | ||
|
||
base->cra_type = &crypto_kpp_type; | ||
base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK; | ||
base->cra_flags |= CRYPTO_ALG_TYPE_KPP; | ||
} | ||
|
||
int crypto_register_kpp(struct kpp_alg *alg) | ||
{ | ||
struct crypto_alg *base = &alg->base; | ||
|
||
kpp_prepare_alg(alg); | ||
return crypto_register_alg(base); | ||
} | ||
EXPORT_SYMBOL_GPL(crypto_register_kpp); | ||
|
||
void crypto_unregister_kpp(struct kpp_alg *alg) | ||
{ | ||
crypto_unregister_alg(&alg->base); | ||
} | ||
EXPORT_SYMBOL_GPL(crypto_unregister_kpp); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_DESCRIPTION("Key-agreement Protocol Primitives"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* Key-agreement Protocol Primitives (KPP) | ||
* | ||
* Copyright (c) 2016, Intel Corporation | ||
* Authors: Salvatore Benedetto <salvatore.benedetto@intel.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the Free | ||
* Software Foundation; either version 2 of the License, or (at your option) | ||
* any later version. | ||
* | ||
*/ | ||
#ifndef _CRYPTO_KPP_INT_H | ||
#define _CRYPTO_KPP_INT_H | ||
#include <crypto/kpp.h> | ||
#include <crypto/algapi.h> | ||
|
||
/* | ||
* Transform internal helpers. | ||
*/ | ||
static inline void *kpp_request_ctx(struct kpp_request *req) | ||
{ | ||
return req->__ctx; | ||
} | ||
|
||
static inline void *kpp_tfm_ctx(struct crypto_kpp *tfm) | ||
{ | ||
return tfm->base.__crt_ctx; | ||
} | ||
|
||
static inline void kpp_request_complete(struct kpp_request *req, int err) | ||
{ | ||
req->base.complete(&req->base, err); | ||
} | ||
|
||
static inline const char *kpp_alg_name(struct crypto_kpp *tfm) | ||
{ | ||
return crypto_kpp_tfm(tfm)->__crt_alg->cra_name; | ||
} | ||
|
||
/** | ||
* crypto_register_kpp() -- Register key-agreement protocol primitives algorithm | ||
* | ||
* Function registers an implementation of a key-agreement protocol primitive | ||
* algorithm | ||
* | ||
* @alg: algorithm definition | ||
* | ||
* Return: zero on success; error code in case of error | ||
*/ | ||
int crypto_register_kpp(struct kpp_alg *alg); | ||
|
||
/** | ||
* crypto_unregister_kpp() -- Unregister key-agreement protocol primitive | ||
* algorithm | ||
* | ||
* Function unregisters an implementation of a key-agreement protocol primitive | ||
* algorithm | ||
* | ||
* @alg: algorithm definition | ||
*/ | ||
void crypto_unregister_kpp(struct kpp_alg *alg); | ||
|
||
#endif |
Oops, something went wrong.