sha implementations because why not