Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/crypto/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 6 kB image not shown  

Quelle  md5.c   Sprache: C

 
/* 
 * Cryptographic API.
 *
 * MD5 Message Digest Algorithm (RFC1321).
 *
 * Derived from cryptoapi implementation, originally based on the
 * public domain implementation written by Colin Plumb in 1993.
 *
 * Copyright (c) Cryptoapi developers.
 * Copyright (c) 2002 James Morris <jmorris@intercode.com.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.
 *
 */

#include <crypto/internal/hash.h>
#include <crypto/md5.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/string.h>

const u8 md5_zero_message_hash[MD5_DIGEST_SIZE] = {
 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e,
};
EXPORT_SYMBOL_GPL(md5_zero_message_hash);

#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

#define MD5STEP(f, w, x, y, z, in, s) \
 (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x)

static void md5_transform(__u32 *hash, __u32 const *in)
{
 u32 a, b, c, d;

 a = hash[0];
 b = hash[1];
 c = hash[2];
 d = hash[3];

 MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
 MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
 MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
 MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
 MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
 MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
 MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
 MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
 MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
 MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
 MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
 MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
 MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
 MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
 MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
 MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

 MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
 MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
 MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
 MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
 MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
 MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
 MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
 MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
 MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
 MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
 MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
 MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
 MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
 MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
 MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
 MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

 MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
 MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
 MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
 MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
 MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
 MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
 MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
 MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
 MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
 MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
 MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
 MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
 MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
 MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
 MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
 MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

 MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
 MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
 MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
 MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
 MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
 MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
 MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
 MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
 MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
 MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
 MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
 MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
 MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
 MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
 MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
 MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

 hash[0] += a;
 hash[1] += b;
 hash[2] += c;
 hash[3] += d;
}

static inline void md5_transform_helper(struct md5_state *ctx,
     u32 block[MD5_BLOCK_WORDS])
{
 le32_to_cpu_array(block, MD5_BLOCK_WORDS);
 md5_transform(ctx->hash, block);
}

static int md5_init(struct shash_desc *desc)
{
 struct md5_state *mctx = shash_desc_ctx(desc);

 mctx->hash[0] = MD5_H0;
 mctx->hash[1] = MD5_H1;
 mctx->hash[2] = MD5_H2;
 mctx->hash[3] = MD5_H3;
 mctx->byte_count = 0;

 return 0;
}

static int md5_update(struct shash_desc *desc, const u8 *data, unsigned int len)
{
 struct md5_state *mctx = shash_desc_ctx(desc);
 u32 block[MD5_BLOCK_WORDS];

 mctx->byte_count += len;
 do {
  memcpy(block, data, sizeof(block));
  md5_transform_helper(mctx, block);
  data += sizeof(block);
  len -= sizeof(block);
 } while (len >= sizeof(block));
 memzero_explicit(block, sizeof(block));
 mctx->byte_count -= len;
 return len;
}

static int md5_finup(struct shash_desc *desc, const u8 *data, unsigned int len,
       u8 *out)
{
 struct md5_state *mctx = shash_desc_ctx(desc);
 u32 block[MD5_BLOCK_WORDS];
 unsigned int offset;
 int padding;
 char *p;

 memcpy(block, data, len);

 offset = len;
 p = (char *)block + offset;
 padding = 56 - (offset + 1);

 *p++ = 0x80;
 if (padding < 0) {
  memset(p, 0x00, padding + sizeof (u64));
  md5_transform_helper(mctx, block);
  p = (char *)block;
  padding = 56;
 }

 memset(p, 0, padding);
 mctx->byte_count += len;
 block[14] = mctx->byte_count << 3;
 block[15] = mctx->byte_count >> 29;
 le32_to_cpu_array(block, (sizeof(block) - sizeof(u64)) / sizeof(u32));
 md5_transform(mctx->hash, block);
 memzero_explicit(block, sizeof(block));
 cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(u32));
 memcpy(out, mctx->hash, sizeof(mctx->hash));

 return 0;
}

static struct shash_alg alg = {
 .digestsize = MD5_DIGEST_SIZE,
 .init  = md5_init,
 .update  = md5_update,
 .finup  = md5_finup,
 .descsize = MD5_STATE_SIZE,
 .base  = {
  .cra_name  = "md5",
  .cra_driver_name = "md5-generic",
  .cra_flags  = CRYPTO_AHASH_ALG_BLOCK_ONLY,
  .cra_blocksize  = MD5_HMAC_BLOCK_SIZE,
  .cra_module  = THIS_MODULE,
 }
};

static int __init md5_mod_init(void)
{
 return crypto_register_shash(&alg);
}

static void __exit md5_mod_fini(void)
{
 crypto_unregister_shash(&alg);
}

module_init(md5_mod_init);
module_exit(md5_mod_fini);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MD5 Message Digest Algorithm");
MODULE_ALIAS_CRYPTO("md5");

95%


¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.