+module_exit(fini);
+
+MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
+MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
+MODULE_LICENSE("GPL and additional rights");
diff -urN exclude '*.ko' exclude '*.mod.*' exclude '*~' exclude '*.o*' exclude '.*' exclude '*.cmd' exclude drivers linux-2.6.1.orig/crypto/internal.h linux/crypto/internal.h
- linux-2.6.1.orig/crypto/internal.hFri Jan 9 00:59:04 2004
+++ linux/crypto/internal.hMon Jan 12 10:33:59 2004
@@ -79,14 +79,17 @@
int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
+int crypto_init_chksum_flags(struct crypto_tfm *tfm, u32 flags);
int crypto_init_digest_ops(struct crypto_tfm *tfm);
int crypto_init_cipher_ops(struct crypto_tfm *tfm);
int crypto_init_compress_ops(struct crypto_tfm *tfm);
+int crypto_init_chksum_ops(struct crypto_tfm *tfm);
void crypto_exit_digest_ops(struct crypto_tfm *tfm);
void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
void crypto_exit_compress_ops(struct crypto_tfm *tfm);
+void crypto_exit_chksum_ops(struct crypto_tfm *tfm);
#endif/* _CRYPTO_INTERNAL_H */
diff -urN exclude '*.ko' exclude '*.mod.*' exclude '*~' exclude '*.o*' exclude '.*' exclude '*.cmd' exclude drivers linux-2.6.1.orig/crypto/tcrypt.c linux/crypto/tcrypt.c
- linux-2.6.1.orig/crypto/tcrypt.cFri Jan 9 00:59:56 2004
+++ linux/crypto/tcrypt.cWed Jan 14 11:43:12 2004
@@ -61,7 +61,7 @@
static char *check[] = {
"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
-"deflate", NULL
+"deflate", "crc32c", NULL
Trang 2};
static void
@@ -492,6 +492,102 @@
}
static void
+test_crc32c(void)
+{
+#define NUMVEC 6
+#define VECSIZE 40
+
+int i, j, pass;
+u32 crc;
+u8 b, test_vec[NUMVEC][VECSIZE];
+static u32 vec_results[NUMVEC] = {
+0x0e2c157f, 0xe980ebf6, 0xde74bded,
+0xd579c862, 0xba979ad0, 0x2b29d913
+};
+static u32 tot_vec_results = 0x24c5d375;
+
+struct scatterlist sg[NUMVEC];
+struct crypto_tfm *tfm;
+char *fmtdata = "testing crc32c initted to %08x: %s\n"; +#define SEEDTESTVAL 0xedcba987
+
+printk("\ntesting crc32c\n");
+
+tfm = crypto_alloc_tfm("crc32c", 0);
+if (tfm == NULL) {
+printk("failed to load transform for crc32c\n");
+return;
+}
+
+crypto_chksum_init(tfm);
+crypto_chksum_final(tfm, &crc);
+printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR"); +
+/*
Trang 3+ * stuff test_vec with known values, simple incrementing
+ * byte values
+ */
+b = 0;
+for (i = 0; i < NUMVEC; i++) {
+for (j = 0; j < VECSIZE; j++)
+test_vec[i][j] = ++b;
+sg[i].page = virt_to_page(test_vec[i]);
+sg[i].offset = offset_in_page(test_vec[i]);
+sg[i].length = VECSIZE;
+}
+
+crypto_chksum_setseed(tfm, SEEDTESTVAL);
+crypto_chksum_final(tfm, &crc);
+printk("testing crc32c setseed returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ?
+ "pass" : "ERROR");
+
+printk("testing crc32c using update/final:\n");
+
+pass = 1; /* assume all is well */
+
+for (i = 0; i < NUMVEC; i++) {
+crypto_chksum_setseed(tfm, ~(u32)0);
+crypto_chksum_update(tfm, &sg[i], 1);
+crypto_chksum_final(tfm, &crc);
+if (crc == vec_results[i]) {
+printk(" %08x:OK", crc);
+} else {
+printk(" %08x:BAD, wanted %08x\n", crc, vec_results[i]); +pass = 0;
+}
+}
+
+printk("\ntesting crc32c using incremental accumulator:\n"); +crc = 0;
+for (i = 0; i < NUMVEC; i++) {
+crypto_chksum_setseed(tfm, (crc ^ ~(u32)0));
+crypto_chksum_update(tfm, &sg[i], 1);
Trang 4+crypto_chksum_final(tfm, &crc);
+}
+if (crc == tot_vec_results) {
+printk(" %08x:OK", crc);
+} else {
+printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
+pass = 0;
+}
+
+printk("\ntesting crc32c using digest:\n");
+crypto_chksum_setseed(tfm, ~(u32)0);
+crypto_chksum_digest(tfm, sg, NUMVEC, &crc);
+if (crc == tot_vec_results) {
+printk(" %08x:OK", crc);
+} else {
+printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
+pass = 0;
+}
+
+printk("\n%s\n", pass ? "pass" : "ERROR");
+
+crypto_free_tfm(tfm);
+printk("crc32c test complete\n");
+}
+
+static void
test_available(void)
{
char **name = check;
@@ -558,7 +654,8 @@
test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
-test_deflate();
+test_deflate();
+test_crc32c();
#ifdef CONFIG_CRYPTO_HMAC
test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
Trang 5@@ -638,6 +735,10 @@
test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template,
CAST6_DEC_TEST_VECTORS);
break;
+case 16:
+test_crc32c();
+break;
+
#ifdef CONFIG_CRYPTO_HMAC
case 100:
test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); diff -urN exclude '*.ko' exclude '*.mod.*' exclude '*~' exclude '*.o*' exclude '.*' exclude '*.cmd' exclude drivers
linux-2.6.1.orig/include/linux/crypto.h linux/include/linux/crypto.h
- linux-2.6.1.orig/include/linux/crypto.hFri Jan 9 00:59:19 2004
+++ linux/include/linux/crypto.hWed Jan 14 11:26:39 2004
@@ -30,7 +30,7 @@
#define CRYPTO_ALG_TYPE_CIPHER0x00000001
#define CRYPTO_ALG_TYPE_DIGEST0x00000002
#define CRYPTO_ALG_TYPE_COMPRESS0x00000004
-
+#define CRYPTO_ALG_TYPE_CHKSUM0x00000008
/*
* Transform masks and values (for crt_flags)
*/
@@ -87,9 +87,18 @@
u8 *dst, unsigned int *dlen);
};
+struct chksum_alg {
+unsigned int cha_digestsize;
+void (*cha_init)(void *ctx);
+void (*cha_setseed)(void *ctx, const u32 seed);
+void (*cha_update)(void *ctx, const u8 *data, unsigned int len);
+void (*cha_final)(void *ctx, u32 *out);
+};
+
#define cra_ciphercra_u.cipher