2005-04-17 02:20:36 +04:00
# include <linux/kernel.h>
2011-11-17 06:29:17 +04:00
# include <linux/export.h>
2005-04-17 02:20:36 +04:00
# include <linux/cryptohash.h>
/* F, G and H are basic MD4 functions: selection, majority, parity */
# define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
# define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z)))
# define H(x, y, z) ((x) ^ (y) ^ (z))
/*
* The generic round function . The application is so specific that
* we don ' t bother protecting all the arguments with parens , as is generally
* good macro practice , in favor of extra legibility .
* Rotation is separate from addition to prevent recomputation
*/
# define ROUND(f, a, b, c, d, x, s) \
( a + = f ( b , c , d ) + x , a = ( a < < s ) | ( a > > ( 32 - s ) ) )
# define K1 0
# define K2 013240474631UL
# define K3 015666365641UL
/*
* Basic cut - down MD4 transform . Returns only 32 bits of result .
*/
__u32 half_md4_transform ( __u32 buf [ 4 ] , __u32 const in [ 8 ] )
{
__u32 a = buf [ 0 ] , b = buf [ 1 ] , c = buf [ 2 ] , d = buf [ 3 ] ;
/* Round 1 */
ROUND ( F , a , b , c , d , in [ 0 ] + K1 , 3 ) ;
ROUND ( F , d , a , b , c , in [ 1 ] + K1 , 7 ) ;
ROUND ( F , c , d , a , b , in [ 2 ] + K1 , 11 ) ;
ROUND ( F , b , c , d , a , in [ 3 ] + K1 , 19 ) ;
ROUND ( F , a , b , c , d , in [ 4 ] + K1 , 3 ) ;
ROUND ( F , d , a , b , c , in [ 5 ] + K1 , 7 ) ;
ROUND ( F , c , d , a , b , in [ 6 ] + K1 , 11 ) ;
ROUND ( F , b , c , d , a , in [ 7 ] + K1 , 19 ) ;
/* Round 2 */
ROUND ( G , a , b , c , d , in [ 1 ] + K2 , 3 ) ;
ROUND ( G , d , a , b , c , in [ 3 ] + K2 , 5 ) ;
ROUND ( G , c , d , a , b , in [ 5 ] + K2 , 9 ) ;
ROUND ( G , b , c , d , a , in [ 7 ] + K2 , 13 ) ;
ROUND ( G , a , b , c , d , in [ 0 ] + K2 , 3 ) ;
ROUND ( G , d , a , b , c , in [ 2 ] + K2 , 5 ) ;
ROUND ( G , c , d , a , b , in [ 4 ] + K2 , 9 ) ;
ROUND ( G , b , c , d , a , in [ 6 ] + K2 , 13 ) ;
/* Round 3 */
ROUND ( H , a , b , c , d , in [ 3 ] + K3 , 3 ) ;
ROUND ( H , d , a , b , c , in [ 7 ] + K3 , 9 ) ;
ROUND ( H , c , d , a , b , in [ 2 ] + K3 , 11 ) ;
ROUND ( H , b , c , d , a , in [ 6 ] + K3 , 15 ) ;
ROUND ( H , a , b , c , d , in [ 1 ] + K3 , 3 ) ;
ROUND ( H , d , a , b , c , in [ 5 ] + K3 , 9 ) ;
ROUND ( H , c , d , a , b , in [ 0 ] + K3 , 11 ) ;
ROUND ( H , b , c , d , a , in [ 4 ] + K3 , 15 ) ;
buf [ 0 ] + = a ;
buf [ 1 ] + = b ;
buf [ 2 ] + = c ;
buf [ 3 ] + = d ;
return buf [ 1 ] ; /* "most hashed" word */
}
EXPORT_SYMBOL ( half_md4_transform ) ;