diff options
Diffstat (limited to 'c_src/include/crypto')
-rw-r--r-- | c_src/include/crypto/algapi.h | 7 | ||||
-rw-r--r-- | c_src/include/crypto/chacha.h | 15 | ||||
-rw-r--r-- | c_src/include/crypto/hash.h | 104 | ||||
-rw-r--r-- | c_src/include/crypto/poly1305.h | 13 | ||||
-rw-r--r-- | c_src/include/crypto/sha2.h | 115 | ||||
-rw-r--r-- | c_src/include/crypto/skcipher.h | 126 |
6 files changed, 380 insertions, 0 deletions
diff --git a/c_src/include/crypto/algapi.h b/c_src/include/crypto/algapi.h new file mode 100644 index 00000000..5fd3524a --- /dev/null +++ b/c_src/include/crypto/algapi.h @@ -0,0 +1,7 @@ +#ifndef _CRYPTO_ALGAPI_H +#define _CRYPTO_ALGAPI_H + +#include <linux/crypto.h> +#include <crypto/skcipher.h> + +#endif /* _CRYPTO_ALGAPI_H */ diff --git a/c_src/include/crypto/chacha.h b/c_src/include/crypto/chacha.h new file mode 100644 index 00000000..f004cfb5 --- /dev/null +++ b/c_src/include/crypto/chacha.h @@ -0,0 +1,15 @@ +/* + * Common values for the ChaCha20 algorithm + */ + +#ifndef _CRYPTO_CHACHA20_H +#define _CRYPTO_CHACHA20_H + +#include <linux/types.h> +#include <linux/crypto.h> + +#define CHACHA_IV_SIZE 16 +#define CHACHA_KEY_SIZE 32 +#define CHACHA_BLOCK_SIZE 64 + +#endif diff --git a/c_src/include/crypto/hash.h b/c_src/include/crypto/hash.h new file mode 100644 index 00000000..a74f3618 --- /dev/null +++ b/c_src/include/crypto/hash.h @@ -0,0 +1,104 @@ +/* + * Hash: Hash algorithms under the crypto API + * + * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> + * + * 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_HASH_H +#define _CRYPTO_HASH_H + +#include <linux/crypto.h> + +struct shash_desc; + +struct shash_alg { + int (*init)(struct shash_desc *desc); + int (*update)(struct shash_desc *desc, const u8 *data, unsigned len); + int (*final)(struct shash_desc *desc, u8 *out); + int (*finup)(struct shash_desc *desc, const u8 *data, + unsigned len, u8 *out); + int (*digest)(struct shash_desc *desc, const u8 *data, + unsigned len, u8 *out); + + unsigned descsize; + unsigned digestsize; + struct crypto_alg base; +}; + +int crypto_register_shash(struct shash_alg *alg); + +struct crypto_shash { + unsigned descsize; + struct crypto_tfm base; +}; + +struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type, + u32 mask); + +static inline void crypto_free_shash(struct crypto_shash *tfm) +{ + kfree(tfm); +} + +static inline struct shash_alg *crypto_shash_alg(struct crypto_shash *tfm) +{ + return container_of(tfm->base.alg, struct shash_alg, base); +} + +static inline unsigned crypto_shash_digestsize(struct crypto_shash *tfm) +{ + return crypto_shash_alg(tfm)->digestsize; +} + +static inline unsigned crypto_shash_descsize(struct crypto_shash *tfm) +{ + return tfm->descsize; +} + +struct shash_desc { + struct crypto_shash *tfm; + u32 flags; + + void *ctx[] CRYPTO_MINALIGN_ATTR; +}; + +#define SHASH_DESC_ON_STACK(shash, tfm) \ + char __##shash##_desc[sizeof(struct shash_desc) + \ + crypto_shash_descsize(tfm)] CRYPTO_MINALIGN_ATTR; \ + struct shash_desc *shash = (struct shash_desc *)__##shash##_desc + +static inline int crypto_shash_init(struct shash_desc *desc) +{ + return crypto_shash_alg(desc->tfm)->init(desc); +} + +static inline int crypto_shash_update(struct shash_desc *desc, + const u8 *data, unsigned len) +{ + return crypto_shash_alg(desc->tfm)->update(desc, data, len); +} + +static inline int crypto_shash_final(struct shash_desc *desc, u8 *out) +{ + return crypto_shash_alg(desc->tfm)->final(desc, out); +} + +static inline int crypto_shash_finup(struct shash_desc *desc, const u8 *data, + unsigned len, u8 *out) +{ + return crypto_shash_alg(desc->tfm)->finup(desc, data, len, out); +} + +static inline int crypto_shash_digest(struct shash_desc *desc, const u8 *data, + unsigned len, u8 *out) +{ + return crypto_shash_alg(desc->tfm)->digest(desc, data, len, out); +} + +#endif /* _CRYPTO_HASH_H */ diff --git a/c_src/include/crypto/poly1305.h b/c_src/include/crypto/poly1305.h new file mode 100644 index 00000000..9fcfbfeb --- /dev/null +++ b/c_src/include/crypto/poly1305.h @@ -0,0 +1,13 @@ +/* + * Common values for the Poly1305 algorithm + */ + +#ifndef _CRYPTO_POLY1305_H +#define _CRYPTO_POLY1305_H + +#include <sodium/crypto_onetimeauth_poly1305.h> + +#define POLY1305_KEY_SIZE crypto_onetimeauth_poly1305_KEYBYTES +#define POLY1305_DIGEST_SIZE crypto_onetimeauth_poly1305_BYTES + +#endif diff --git a/c_src/include/crypto/sha2.h b/c_src/include/crypto/sha2.h new file mode 100644 index 00000000..8a46202b --- /dev/null +++ b/c_src/include/crypto/sha2.h @@ -0,0 +1,115 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Common values for SHA algorithms + */ + +#ifndef _CRYPTO_SHA_H +#define _CRYPTO_SHA_H + +#include <linux/types.h> + +#define SHA1_DIGEST_SIZE 20 +#define SHA1_BLOCK_SIZE 64 + +#define SHA224_DIGEST_SIZE 28 +#define SHA224_BLOCK_SIZE 64 + +#define SHA256_DIGEST_SIZE 32 +#define SHA256_BLOCK_SIZE 64 + +#define SHA384_DIGEST_SIZE 48 +#define SHA384_BLOCK_SIZE 128 + +#define SHA512_DIGEST_SIZE 64 +#define SHA512_BLOCK_SIZE 128 + +#define SHA1_H0 0x67452301UL +#define SHA1_H1 0xefcdab89UL +#define SHA1_H2 0x98badcfeUL +#define SHA1_H3 0x10325476UL +#define SHA1_H4 0xc3d2e1f0UL + +#define SHA224_H0 0xc1059ed8UL +#define SHA224_H1 0x367cd507UL +#define SHA224_H2 0x3070dd17UL +#define SHA224_H3 0xf70e5939UL +#define SHA224_H4 0xffc00b31UL +#define SHA224_H5 0x68581511UL +#define SHA224_H6 0x64f98fa7UL +#define SHA224_H7 0xbefa4fa4UL + +#define SHA256_H0 0x6a09e667UL +#define SHA256_H1 0xbb67ae85UL +#define SHA256_H2 0x3c6ef372UL +#define SHA256_H3 0xa54ff53aUL +#define SHA256_H4 0x510e527fUL +#define SHA256_H5 0x9b05688cUL +#define SHA256_H6 0x1f83d9abUL +#define SHA256_H7 0x5be0cd19UL + +#define SHA384_H0 0xcbbb9d5dc1059ed8ULL +#define SHA384_H1 0x629a292a367cd507ULL +#define SHA384_H2 0x9159015a3070dd17ULL +#define SHA384_H3 0x152fecd8f70e5939ULL +#define SHA384_H4 0x67332667ffc00b31ULL +#define SHA384_H5 0x8eb44a8768581511ULL +#define SHA384_H6 0xdb0c2e0d64f98fa7ULL +#define SHA384_H7 0x47b5481dbefa4fa4ULL + +#define SHA512_H0 0x6a09e667f3bcc908ULL +#define SHA512_H1 0xbb67ae8584caa73bULL +#define SHA512_H2 0x3c6ef372fe94f82bULL +#define SHA512_H3 0xa54ff53a5f1d36f1ULL +#define SHA512_H4 0x510e527fade682d1ULL +#define SHA512_H5 0x9b05688c2b3e6c1fULL +#define SHA512_H6 0x1f83d9abfb41bd6bULL +#define SHA512_H7 0x5be0cd19137e2179ULL + +extern const u8 sha1_zero_message_hash[SHA1_DIGEST_SIZE]; + +extern const u8 sha224_zero_message_hash[SHA224_DIGEST_SIZE]; + +extern const u8 sha256_zero_message_hash[SHA256_DIGEST_SIZE]; + +extern const u8 sha384_zero_message_hash[SHA384_DIGEST_SIZE]; + +extern const u8 sha512_zero_message_hash[SHA512_DIGEST_SIZE]; + +struct sha1_state { + u32 state[SHA1_DIGEST_SIZE / 4]; + u64 count; + u8 buffer[SHA1_BLOCK_SIZE]; +}; + +struct sha256_state { + u32 state[SHA256_DIGEST_SIZE / 4]; + u64 count; + u8 buf[SHA256_BLOCK_SIZE]; +}; + +struct sha512_state { + u64 state[SHA512_DIGEST_SIZE / 8]; + u64 count[2]; + u8 buf[SHA512_BLOCK_SIZE]; +}; + +struct shash_desc; + +extern int crypto_sha1_update(struct shash_desc *desc, const u8 *data, + unsigned int len); + +extern int crypto_sha1_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *hash); + +extern int crypto_sha256_update(struct shash_desc *desc, const u8 *data, + unsigned int len); + +extern int crypto_sha256_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *hash); + +extern int crypto_sha512_update(struct shash_desc *desc, const u8 *data, + unsigned int len); + +extern int crypto_sha512_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *hash); +#endif diff --git a/c_src/include/crypto/skcipher.h b/c_src/include/crypto/skcipher.h new file mode 100644 index 00000000..5989855d --- /dev/null +++ b/c_src/include/crypto/skcipher.h @@ -0,0 +1,126 @@ +/* + * Symmetric key ciphers. + * + * Copyright (c) 2007-2015 Herbert Xu <herbert@gondor.apana.org.au> + * + * 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_SKCIPHER_H +#define _CRYPTO_SKCIPHER_H + +#include <linux/crypto.h> + +struct crypto_skcipher; +struct skcipher_request; + +struct skcipher_alg { + struct crypto_alg base; +}; + +int crypto_register_skcipher(struct skcipher_alg *alg); + +struct crypto_skcipher { + int (*setkey)(struct crypto_skcipher *tfm, const u8 *key, + unsigned int keylen); + int (*encrypt)(struct skcipher_request *req); + int (*decrypt)(struct skcipher_request *req); + + unsigned ivsize; + unsigned keysize; + + struct crypto_tfm base; +}; + +struct crypto_sync_skcipher { + struct crypto_skcipher base; +}; + +struct crypto_skcipher *crypto_alloc_skcipher(const char *alg_name, + u32 type, u32 mask); + +static inline struct crypto_sync_skcipher * +crypto_alloc_sync_skcipher(const char *alg_name, u32 type, u32 mask) +{ + return (void *) crypto_alloc_skcipher(alg_name, type, mask); +} + +static inline void crypto_free_skcipher(struct crypto_skcipher *tfm) +{ + kfree(tfm); +} + +static inline void crypto_free_sync_skcipher(struct crypto_sync_skcipher *tfm) +{ + crypto_free_skcipher(&tfm->base); +} + +struct skcipher_request { + unsigned cryptlen; + u8 *iv; + + struct scatterlist *src; + struct scatterlist *dst; + + struct crypto_tfm *tfm; +}; + +#define MAX_SYNC_SKCIPHER_REQSIZE 384 +#define SYNC_SKCIPHER_REQUEST_ON_STACK(name, tfm) \ + char __##name##_desc[sizeof(struct skcipher_request) + \ + MAX_SYNC_SKCIPHER_REQSIZE + \ + (!(sizeof((struct crypto_sync_skcipher *)1 == \ + (typeof(tfm))1))) \ + ] CRYPTO_MINALIGN_ATTR; \ + struct skcipher_request *name = (void *)__##name##_desc + +static inline int crypto_skcipher_setkey(struct crypto_skcipher *tfm, + const u8 *key, unsigned int keylen) +{ + return tfm->setkey(tfm, key, keylen); +} + +static inline struct crypto_skcipher *crypto_skcipher_reqtfm( + struct skcipher_request *req) +{ + return container_of(req->tfm, struct crypto_skcipher, base); +} + +static inline int crypto_skcipher_encrypt(struct skcipher_request *req) +{ + return crypto_skcipher_reqtfm(req)->encrypt(req); +} + +static inline int crypto_skcipher_decrypt(struct skcipher_request *req) +{ + return crypto_skcipher_reqtfm(req)->decrypt(req); +} + +static inline void skcipher_request_set_tfm(struct skcipher_request *req, + struct crypto_skcipher *tfm) +{ + req->tfm = &tfm->base; +} + +static inline void skcipher_request_set_sync_tfm(struct skcipher_request *req, + struct crypto_sync_skcipher *tfm) +{ + skcipher_request_set_tfm(req, &tfm->base); +} + +static inline void skcipher_request_set_crypt( + struct skcipher_request *req, + struct scatterlist *src, struct scatterlist *dst, + unsigned int cryptlen, void *iv) +{ + req->src = src; + req->dst = dst; + req->cryptlen = cryptlen; + req->iv = iv; +} + +#endif /* _CRYPTO_SKCIPHER_H */ |