Main author: Laurent Bercot Thanks to: Dan J. Bernstein Jorge Almeida