Pseudocode for the SHA-256 algorithm follows. Note the great increase in mixing between bits of the w[16..63] words compared to SHA-1. h0 := 0x6a09e667 h1 := 0xbb67ae85 h2 := 0x3c6ef372 h3 := 0xa54ff53a h4 := 0x510e527f h5 := 0x9b05688c h6 := 0x1f83d9ab h7 := 0x5be0cd19 k[0..63] := 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 begin with the original message of length L bits append a single '1' bit append K '0' bits, where K is the minimum number >= 0 such that (L + 1 + K + 64) is a multiple of 512 append L as a 64-bit big-endian integer, making the total post-processed length a multiple of 512 bits such that the bits in the message are: 1 , (the number of bits will be a multiple of 512) break message into 512-bit chunks
for each chunk create a 64-entry message schedule array w[0..63] of 32-bit words copy chunk into first 16 words w[0..15] of the message schedule array
for i
from 16 to 63 s0 := (w[i-15]
rightrotate 7)
xor (w[i-15]
rightrotate 18)
xor (w[i-15]
rightshift 3) s1 := (w[i-2]
rightrotate 17)
xor (w[i-2]
rightrotate 19)
xor (w[i-2]
rightshift 10) w[i] := w[i-16]
+ s0
+ w[i-7]
+ s1 a := h0 b := h1 c := h2 d := h3 e := h4 f := h5 g := h6 h := h7
for i
from 0 to 63 S1 := (e
rightrotate 6)
xor (e
rightrotate 11)
xor (e
rightrotate 25) ch := (e
and f)
xor ((
not e)
and g) temp1 := h
+ S1
+ ch
+ k[i]
+ w[i] S0 := (a
rightrotate 2)
xor (a
rightrotate 13)
xor (a
rightrotate 22) maj := (a
and b)
xor (a
and c)
xor (b
and c) temp2 := S0
+ maj h := g g := f f := e e := d
+ temp1 d := c c := b b := a := temp1
+ temp2 h0 := h0
+ a h1 := h1
+ b h2 := h2
+ c h3 := h3
+ d h4 := h4
+ e h5 := h5
+ f h6 := h6
+ g h7 := h7
+ h digest := hash := h0
append h1
append h2
append h3
append h4
append h5
append h6
append h7 The computation of the ch and maj values can be optimized the same way
as described for SHA-1. SHA-224 is identical to SHA-256, except that: • the initial hash values h0 through h7 are different, and • the output is constructed by omitting h7. h[0..7] := 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 SHA-512 is identical in structure to SHA-256, but: • the message is broken into 1024-bit chunks, • the initial hash values and round constants are extended to 64 bits, • there are 80 rounds instead of 64, • the message schedule array w has 80 64-bit words instead of 64 32-bit words, • to extend the message schedule array w, the loop is from 16 to 79 instead of from 16 to 63, • the round constants are based on the first 80 primes 2..409, • the word size used for calculations is 64 bits long, • the appended length of the message (before pre-processing), in
bits, is a 128-bit big-endian integer, and • the shift and rotate amounts used are different. SHA-384 is identical to SHA-512, except that: • the initial hash values h0 through h7 are different (taken from the 9th through 16th primes), and • the output is constructed by omitting h6 and h7. SHA-512/t is identical to SHA-512 except that: • the initial hash values h0 through h7 are given by the
SHA-512/t IV generation function, • the output is constructed by truncating the concatenation of h0 through h7 at
t bits, •
t equal to 384 is not allowed, instead SHA-384 should be used as specified, and •
t values 224 and 256 are especially mentioned as approved. The
SHA-512/t IV generation function evaluates a
modified SHA-512 on the ASCII string "SHA-512/
t", substituted with the decimal representation of
t. The
modified SHA-512 is the same as SHA-512 except its initial values h0 through h7 have each been
XORed with the hexadecimal constant 0xa5a5a5a5a5a5a5a5. Sample C implementation for SHA-2 family of hash functions can be found in . ==Comparison of SHA functions==