fixed big endian bug in md5 hasher
[strongswan.git] / src / libstrongswan / crypto / hashers / md5_hasher.c
index bc806c2..d4dde36 100644 (file)
@@ -6,7 +6,8 @@
  */
 
 /*
  */
 
 /*
- * Copyright (C) 2005 Jan Hutter, Martin Willi
+ * Copyright (C) 2005-2006 Martin Willi
+ * Copyright (C) 2005 Jan Hutter
  * Hochschule fuer Technik Rapperswil
  * Copyright (C) 1991-1992, RSA Data Security, Inc. Created 1991. 
  * All rights reserved.
  * Hochschule fuer Technik Rapperswil
  * Copyright (C) 1991-1992, RSA Data Security, Inc. Created 1991. 
  * All rights reserved.
 
 #include "md5_hasher.h"
 
 
 #include "md5_hasher.h"
 
-#include <definitions.h>
-
-#define BLOCK_SIZE_MD5 16
-
 
 /* Constants for MD5Transform routine. */
 #define S11 7
 
 /* Constants for MD5Transform routine. */
 #define S11 7
@@ -123,7 +120,7 @@ struct private_md5_hasher_t {
 /* Encodes input (u_int32_t) into output (u_int8_t). Assumes len is
  * a multiple of 4.
  */
 /* Encodes input (u_int32_t) into output (u_int8_t). Assumes len is
  * a multiple of 4.
  */
-static void Encode (u_int8_t *output, u_int32_t *input, size_t *len)
+static void Encode (u_int8_t *output, u_int32_t *input, size_t len)
 {
        size_t i, j;
 
 {
        size_t i, j;
 
@@ -335,8 +332,8 @@ static void allocate_hash(private_md5_hasher_t *this, chunk_t chunk, chunk_t *ha
        MD5Update(this, chunk.ptr, chunk.len);
        if (hash != NULL)
        {
        MD5Update(this, chunk.ptr, chunk.len);
        if (hash != NULL)
        {
-               allocated_hash.ptr = malloc(BLOCK_SIZE_MD5);
-               allocated_hash.len = BLOCK_SIZE_MD5;
+               allocated_hash.ptr = malloc(HASH_SIZE_MD5);
+               allocated_hash.len = HASH_SIZE_MD5;
 
                MD5Final(this, allocated_hash.ptr);
                this->public.hasher_interface.reset(&(this->public.hasher_interface));
 
                MD5Final(this, allocated_hash.ptr);
                this->public.hasher_interface.reset(&(this->public.hasher_interface));
@@ -350,7 +347,7 @@ static void allocate_hash(private_md5_hasher_t *this, chunk_t chunk, chunk_t *ha
  */
 static size_t get_hash_size(private_md5_hasher_t *this)
 {
  */
 static size_t get_hash_size(private_md5_hasher_t *this)
 {
-       return BLOCK_SIZE_MD5;
+       return HASH_SIZE_MD5;
 }
 
 /**
 }
 
 /**
@@ -367,6 +364,19 @@ static void reset(private_md5_hasher_t *this)
 }
 
 /**
 }
 
 /**
+ * Implementation of hasher_t.get_state
+ */
+static chunk_t get_state(private_md5_hasher_t *this)
+{
+       chunk_t chunk;
+       
+       chunk.ptr = (u_char*)&this->state[0];
+       chunk.len = sizeof(this->state);
+       
+       return chunk;
+}
+
+/**
  * Implementation of hasher_t.destroy.
  */
 static void destroy(private_md5_hasher_t *this)
  * Implementation of hasher_t.destroy.
  */
 static void destroy(private_md5_hasher_t *this)
@@ -385,6 +395,7 @@ md5_hasher_t *md5_hasher_create(void)
        this->public.hasher_interface.allocate_hash = (void (*) (hasher_t*, chunk_t, chunk_t*))allocate_hash;
        this->public.hasher_interface.get_hash_size = (size_t (*) (hasher_t*))get_hash_size;
        this->public.hasher_interface.reset = (void (*) (hasher_t*))reset;
        this->public.hasher_interface.allocate_hash = (void (*) (hasher_t*, chunk_t, chunk_t*))allocate_hash;
        this->public.hasher_interface.get_hash_size = (size_t (*) (hasher_t*))get_hash_size;
        this->public.hasher_interface.reset = (void (*) (hasher_t*))reset;
+       this->public.hasher_interface.get_state = (chunk_t (*) (hasher_t*))get_state;
        this->public.hasher_interface.destroy = (void (*) (hasher_t*))destroy;
        
        /* initialize */
        this->public.hasher_interface.destroy = (void (*) (hasher_t*))destroy;
        
        /* initialize */