* SHA-512 algorithm as described at
*
* http://csrc.nist.gov/cryptval/shs.html
+ *
+ * Modifications made for SHA-384 also
*/
#include "ssh.h"
s->h[i] = iv[i];
}
+static void SHA384_Core_Init(SHA512_State *s) {
+ static const uint64 iv[] = {
+ INIT(0xcbbb9d5d, 0xc1059ed8),
+ INIT(0x629a292a, 0x367cd507),
+ INIT(0x9159015a, 0x3070dd17),
+ INIT(0x152fecd8, 0xf70e5939),
+ INIT(0x67332667, 0xffc00b31),
+ INIT(0x8eb44a87, 0x68581511),
+ INIT(0xdb0c2e0d, 0x64f98fa7),
+ INIT(0x47b5481d, 0xbefa4fa4),
+ };
+ int i;
+ for (i = 0; i < 8; i++)
+ s->h[i] = iv[i];
+}
+
static void SHA512_Block(SHA512_State *s, uint64 *block) {
uint64 w[80];
uint64 a,b,c,d,e,f,g,h;
s->len[i] = 0;
}
+void SHA384_Init(SHA512_State *s) {
+ int i;
+ SHA384_Core_Init(s);
+ s->blkused = 0;
+ for (i = 0; i < 4; i++)
+ s->len[i] = 0;
+}
+
void SHA512_Bytes(SHA512_State *s, const void *p, int len) {
unsigned char *q = (unsigned char *)p;
uint64 wordblock[16];
}
}
+void SHA384_Final(SHA512_State *s, unsigned char *digest) {
+ unsigned char biggerDigest[512 / 8];
+ SHA512_Final(s, biggerDigest);
+ memcpy(digest, biggerDigest, 384 / 8);
+}
+
void SHA512_Simple(const void *p, int len, unsigned char *output) {
SHA512_State s;
SHA512_Init(&s);
SHA512_Bytes(&s, p, len);
SHA512_Final(&s, output);
+ smemclr(&s, sizeof(s));
+}
+
+void SHA384_Simple(const void *p, int len, unsigned char *output) {
+ SHA512_State s;
+
+ SHA384_Init(&s);
+ SHA512_Bytes(&s, p, len);
+ SHA384_Final(&s, output);
+ smemclr(&s, sizeof(s));
+}
+
+/*
+ * Thin abstraction for things where hashes are pluggable.
+ */
+
+static void *sha512_init(void)
+{
+ SHA512_State *s;
+
+ s = snew(SHA512_State);
+ SHA512_Init(s);
+ return s;
+}
+
+static void *sha512_copy(const void *vold)
+{
+ const SHA512_State *old = (const SHA512_State *)vold;
+ SHA512_State *s;
+
+ s = snew(SHA512_State);
+ *s = *old;
+ return s;
+}
+
+static void sha512_free(void *handle)
+{
+ SHA512_State *s = handle;
+
+ smemclr(s, sizeof(*s));
+ sfree(s);
+}
+
+static void sha512_bytes(void *handle, const void *p, int len)
+{
+ SHA512_State *s = handle;
+
+ SHA512_Bytes(s, p, len);
}
+static void sha512_final(void *handle, unsigned char *output)
+{
+ SHA512_State *s = handle;
+
+ SHA512_Final(s, output);
+ sha512_free(s);
+}
+
+const struct ssh_hash ssh_sha512 = {
+ sha512_init, sha512_copy, sha512_bytes, sha512_final, sha512_free,
+ 64, "SHA-512"
+};
+
+static void *sha384_init(void)
+{
+ SHA512_State *s;
+
+ s = snew(SHA512_State);
+ SHA384_Init(s);
+ return s;
+}
+
+static void sha384_final(void *handle, unsigned char *output)
+{
+ SHA512_State *s = handle;
+
+ SHA384_Final(s, output);
+ smemclr(s, sizeof(*s));
+ sfree(s);
+}
+
+const struct ssh_hash ssh_sha384 = {
+ sha384_init, sha512_copy, sha512_bytes, sha384_final, sha512_free,
+ 48, "SHA-384"
+};
+
#ifdef TEST
#include <stdio.h>