Skip to content
Snippets Groups Projects
Select Git revision
21 results Searching

sha256_generic.c

Blame
  • Forked from Jonas Rabenstein / Linux
    Source project has a limited visibility.
    sha256_generic.c 12.10 KiB
    /*
     * Cryptographic API.
     *
     * SHA-256, as specified in
     * http://csrc.nist.gov/groups/STM/cavp/documents/shs/sha256-384-512.pdf
     *
     * SHA-256 code by Jean-Luc Cooke <jlcooke@certainkey.com>.
     *
     * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com>
     * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
     * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
     * SHA224 Support Copyright 2007 Intel Corporation <jonathan.lynch@intel.com>
     *
     * 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 <linux/init.h>
    #include <linux/module.h>
    #include <linux/mm.h>
    #include <linux/types.h>
    #include <crypto/sha.h>
    #include <asm/byteorder.h>
    
    static inline u32 Ch(u32 x, u32 y, u32 z)
    {
    	return z ^ (x & (y ^ z));
    }
    
    static inline u32 Maj(u32 x, u32 y, u32 z)
    {
    	return (x & y) | (z & (x | y));
    }
    
    #define e0(x)       (ror32(x, 2) ^ ror32(x,13) ^ ror32(x,22))
    #define e1(x)       (ror32(x, 6) ^ ror32(x,11) ^ ror32(x,25))
    #define s0(x)       (ror32(x, 7) ^ ror32(x,18) ^ (x >> 3))
    #define s1(x)       (ror32(x,17) ^ ror32(x,19) ^ (x >> 10))
    
    static inline void LOAD_OP(int I, u32 *W, const u8 *input)
    {
    	W[I] = __be32_to_cpu( ((__be32*)(input))[I] );
    }
    
    static inline void BLEND_OP(int I, u32 *W)
    {
    	W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
    }
    
    static void sha256_transform(u32 *state, const u8 *input)
    {
    	u32 a, b, c, d, e, f, g, h, t1, t2;
    	u32 W[64];
    	int i;
    
    	/* load the input */
    	for (i = 0; i < 16; i++)
    		LOAD_OP(i, W, input);
    
    	/* now blend */
    	for (i = 16; i < 64; i++)
    		BLEND_OP(i, W);
    
    	/* load the state into our registers */
    	a=state[0];  b=state[1];  c=state[2];  d=state[3];
    	e=state[4];  f=state[5];  g=state[6];  h=state[7];