Source: https://www.cs.princeton.edu/~appel/papers/verif-sha.pdf