Use AES256 and SHA256 by default for the legacy protocol.
[tinc] / src / openssl / digest.c
index 8d97e3b..58ca167 100644 (file)
@@ -1,6 +1,6 @@
 /*
     digest.c -- Digest handling
-    Copyright (C) 2007-2013 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 2007-2016 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -64,10 +64,6 @@ digest_t *digest_open_by_nid(int nid, int maclength) {
        return digest_open(evp_md, maclength);
 }
 
-digest_t *digest_open_sha1(int maclength) {
-       return digest_open(EVP_sha1(), maclength);
-}
-
 bool digest_set_key(digest_t *digest, const void *key, size_t len) {
        digest->key = xrealloc(digest->key, len);
        memcpy(digest->key, key, len);
@@ -93,14 +89,19 @@ bool digest_create(digest_t *digest, const void *indata, size_t inlen, void *out
                        return false;
                }
        } else {
-               EVP_MD_CTX ctx;
+               EVP_MD_CTX *ctx = EVP_MD_CTX_create();
+               if(!ctx)
+                       abort();
 
-               if(!EVP_DigestInit(&ctx, digest->digest)
-                               || !EVP_DigestUpdate(&ctx, indata, inlen)
-                               || !EVP_DigestFinal(&ctx, tmpdata, NULL)) {
+               if(!EVP_DigestInit(ctx, digest->digest)
+                               || !EVP_DigestUpdate(ctx, indata, inlen)
+                               || !EVP_DigestFinal(ctx, tmpdata, NULL)) {
                        logger(DEBUG_ALWAYS, LOG_DEBUG, "Error creating digest: %s", ERR_error_string(ERR_get_error(), NULL));
+                       EVP_MD_CTX_destroy(ctx);
                        return false;
                }
+
+               EVP_MD_CTX_destroy(ctx);
        }
 
        memcpy(outdata, tmpdata, digest->maclength);
@@ -115,17 +116,26 @@ bool digest_verify(digest_t *digest, const void *indata, size_t inlen, const voi
 }
 
 int digest_get_nid(const digest_t *digest) {
-       return digest->digest ? digest->digest->type : 0;
+       if(!digest || !digest->digest)
+               return 0;
+
+       return EVP_MD_type(digest->digest);
 }
 
 size_t digest_keylength(const digest_t *digest) {
-       return digest->digest->md_size;
+       if(!digest || !digest->digest)
+               return 0;
+
+       return EVP_MD_size(digest->digest);
 }
 
 size_t digest_length(const digest_t *digest) {
+       if(!digest)
+               return 0;
+
        return digest->maclength;
 }
 
 bool digest_active(const digest_t *digest) {
-       return digest && digest->digest && digest->digest->type != 0;
+       return digest && digest->digest && EVP_MD_type(digest->digest) != 0;
 }