summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-04-13 12:57:12 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-04-13 12:57:12 +0200
commit909dbe5334d54a5538128ebf18391608315c2f9a (patch)
treeded97d91bba0ba00dabef434dd98611ea5cd6e15 /include
parent881d2e4ac607d8545dd2e62892436c759b8c0958 (diff)
parent238ffb68f62525f12ef1af1ebe316360634ec529 (diff)
downloadbarebox-909dbe5334d54a5538128ebf18391608315c2f9a.tar.gz
barebox-909dbe5334d54a5538128ebf18391608315c2f9a.tar.xz
Merge branch 'for-next/crypto'
Diffstat (limited to 'include')
-rw-r--r--include/asm-generic/barebox.lds.h3
-rw-r--r--include/command.h3
-rw-r--r--include/crypto/internal.h9
-rw-r--r--include/crypto/pbkdf2.h23
-rw-r--r--include/crypto/sha.h95
-rw-r--r--include/digest.h102
-rw-r--r--include/init.h3
7 files changed, 226 insertions, 12 deletions
diff --git a/include/asm-generic/barebox.lds.h b/include/asm-generic/barebox.lds.h
index 66abff30fa..e359187d7f 100644
--- a/include/asm-generic/barebox.lds.h
+++ b/include/asm-generic/barebox.lds.h
@@ -33,7 +33,8 @@
KEEP(*(.initcall.8)) \
KEEP(*(.initcall.9)) \
KEEP(*(.initcall.10)) \
- KEEP(*(.initcall.11))
+ KEEP(*(.initcall.11)) \
+ KEEP(*(.initcall.12))
#define BAREBOX_CMDS KEEP(*(SORT_BY_NAME(.barebox_cmd*)))
diff --git a/include/command.h b/include/command.h
index 5d5bf53544..3aca1a9f1b 100644
--- a/include/command.h
+++ b/include/command.h
@@ -54,6 +54,7 @@ struct command {
uint32_t group;
#ifdef CONFIG_LONGHELP
const char *help; /* Help message (long) */
+ void (*usage)(void);
#endif
}
#ifdef __x86_64__
@@ -115,8 +116,10 @@ static const __maybe_unused char cmd_##_name##_help[] =
#ifdef CONFIG_LONGHELP
#define BAREBOX_CMD_HELP(text) .help = text,
+#define BAREBOX_CMD_USAGE(fn) .usage = fn,
#else
#define BAREBOX_CMD_HELP(text)
+#define BAREBOX_CMD_USAGE(fn)
#endif
#define BAREBOX_CMD_GROUP(grp) .group = grp,
diff --git a/include/crypto/internal.h b/include/crypto/internal.h
new file mode 100644
index 0000000000..0987ccc160
--- /dev/null
+++ b/include/crypto/internal.h
@@ -0,0 +1,9 @@
+/*
+ * (C) Copyright 2015 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
+ *
+ * GPL v2 only
+ */
+
+int digest_generic_verify(struct digest *d, const unsigned char *md);
+int digest_generic_digest(struct digest *d, const void *data,
+ unsigned int len, u8 *out);
diff --git a/include/crypto/pbkdf2.h b/include/crypto/pbkdf2.h
new file mode 100644
index 0000000000..fa66675261
--- /dev/null
+++ b/include/crypto/pbkdf2.h
@@ -0,0 +1,23 @@
+/*
+ * (C) Copyright 2015 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
+ *
+ * Under GPLv2 Only
+ */
+
+#ifndef __PBKDF2_H__
+#define __PBKDF2_H__
+
+#include <digest.h>
+
+int pkcs5_pbkdf2_hmac_sha1(const unsigned char *pwd, size_t pwd_len,
+ const unsigned char *salt, size_t salt_len,
+ uint32_t iteration,
+ uint32_t key_len, unsigned char *buf);
+
+int pkcs5_pbkdf2_hmac(struct digest* d,
+ const unsigned char *pwd, size_t pwd_len,
+ const unsigned char *salt, size_t salt_len,
+ uint32_t iteration,
+ uint32_t key_len, unsigned char *key);
+
+#endif /* __PBKDF2_H__ */
diff --git a/include/crypto/sha.h b/include/crypto/sha.h
new file mode 100644
index 0000000000..190f8a0e02
--- /dev/null
+++ b/include/crypto/sha.h
@@ -0,0 +1,95 @@
+/*
+ * 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
+
+struct sha1_state {
+ u64 count;
+ u32 state[SHA1_DIGEST_SIZE / 4];
+ u8 buffer[SHA1_BLOCK_SIZE];
+};
+
+struct sha256_state {
+ u64 count;
+ u32 state[SHA256_DIGEST_SIZE / 4];
+ u8 buf[SHA256_BLOCK_SIZE];
+};
+
+struct sha512_state {
+ u64 count[2];
+ u64 state[SHA512_DIGEST_SIZE / 8];
+ 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_sha256_update(struct shash_desc *desc, const u8 *data,
+ unsigned int len);
+
+extern int crypto_sha512_update(struct shash_desc *desc, const u8 *data,
+ unsigned int len);
+#endif
diff --git a/include/digest.h b/include/digest.h
index 8563c10128..7f8d696eb6 100644
--- a/include/digest.h
+++ b/include/digest.h
@@ -21,33 +21,115 @@
#include <linux/list.h>
-struct digest
-{
+struct digest;
+
+struct crypto_alg {
char *name;
+ char *driver_name;
+ int priority;
+#define DIGEST_ALGO_NEED_KEY (1 << 0)
+ unsigned int flags;
+};
+
+struct digest_algo {
+ struct crypto_alg base;
+ int (*alloc)(struct digest *d);
+ void (*free)(struct digest *d);
int (*init)(struct digest *d);
int (*update)(struct digest *d, const void *data, unsigned long len);
int (*final)(struct digest *d, unsigned char *md);
+ int (*digest)(struct digest *d, const void *data,
+ unsigned int len, u8 *out);
+ int (*set_key)(struct digest *d, const unsigned char *key, unsigned int len);
+ int (*verify)(struct digest *d, const unsigned char *md);
unsigned int length;
+ unsigned int ctx_length;
struct list_head list;
};
+struct digest {
+ struct digest_algo *algo;
+ void *ctx;
+ unsigned int length;
+};
+
/*
* digest functions
*/
-int digest_register(struct digest *d);
-void digest_unregister(struct digest *d);
+int digest_algo_register(struct digest_algo *d);
+void digest_algo_unregister(struct digest_algo *d);
+void digest_algo_prints(const char *prefix);
-struct digest* digest_get_by_name(char* name);
+struct digest *digest_alloc(const char *name);
+void digest_free(struct digest *d);
-int digest_file_window(struct digest *d, char *filename,
+int digest_file_window(struct digest *d, const char *filename,
unsigned char *hash,
+ unsigned char *sig,
ulong start, ulong size);
-int digest_file(struct digest *d, char *filename,
- unsigned char *hash);
-int digest_file_by_name(char *algo, char *filename,
- unsigned char *hash);
+int digest_file(struct digest *d, const char *filename,
+ unsigned char *hash,
+ unsigned char *sig);
+int digest_file_by_name(const char *algo, const char *filename,
+ unsigned char *hash,
+ unsigned char *sig);
+
+static inline int digest_init(struct digest *d)
+{
+ return d->algo->init(d);
+}
+
+static inline int digest_update(struct digest *d, const void *data,
+ unsigned long len)
+{
+ return d->algo->update(d, data, len);
+}
+
+static inline int digest_final(struct digest *d, unsigned char *md)
+{
+ return d->algo->final(d, md);
+}
+
+static inline int digest_digest(struct digest *d, const void *data,
+ unsigned int len, u8 *md)
+{
+ return d->algo->digest(d, data, len, md);
+}
+
+static inline int digest_verify(struct digest *d, const unsigned char *md)
+{
+ return d->algo->verify(d, md);
+}
+
+static inline int digest_length(struct digest *d)
+{
+ return d->length ? d->length : d->algo->length;
+}
+
+static inline int digest_set_key(struct digest *d, const unsigned char *key,
+ unsigned int len)
+{
+ if (!d->algo->set_key)
+ return -ENOTSUPP;
+ return d->algo->set_key(d, key, len);
+}
+
+static inline int digest_is_flags(struct digest *d, unsigned int flags)
+{
+ return d->algo->base.flags & flags;
+}
+
+static inline const char *digest_name(struct digest *d)
+{
+ return d->algo->base.name;
+}
+
+static inline void* digest_ctx(struct digest *d)
+{
+ return d->ctx;
+}
#endif /* __SH_ST_DEVICES_H__ */
diff --git a/include/init.h b/include/init.h
index 40cea55fb1..37c7eedf67 100644
--- a/include/init.h
+++ b/include/init.h
@@ -37,7 +37,8 @@ typedef int (*initcall_t)(void);
#define coredevice_initcall(fn) __define_initcall("8",fn,8)
#define fs_initcall(fn) __define_initcall("9",fn,9)
#define device_initcall(fn) __define_initcall("10",fn,10)
-#define late_initcall(fn) __define_initcall("11",fn,11)
+#define crypto_initcall(fn) __define_initcall("11",fn,11)
+#define late_initcall(fn) __define_initcall("12",fn,12)
/* section for code used very early when
* - we're not running from where we linked at