]> git.proxmox.com Git - mirror_frr.git/commitdiff
ospfd,ripd: Enabling build with openssl
authorMichal Ruprich <mruprich@redhat.com>
Thu, 11 Jul 2019 09:28:15 +0000 (11:28 +0200)
committerMichal Ruprich <mruprich@redhat.com>
Thu, 8 Aug 2019 14:03:20 +0000 (16:03 +0200)
Enabling openssl library for md5 authentication in RIP and OSPF

Signed-off-by: Michal Ruprich <michalruprich@gmail.com>
configure.ac
lib/zebra.h
ospfd/ospf_packet.c
ripd/ripd.c

index 961336fbd09f218d35fa92f458e73a9f6eef3880..134c8692d43b57cf410fcbc21c205b7f364f0ee8 100755 (executable)
@@ -572,6 +572,20 @@ AC_ARG_ENABLE([thread-sanitizer],
   AS_HELP_STRING([--enable-thread-sanitizer], [enable ThreadSanitizer support for detecting data races]))
 AC_ARG_ENABLE([memory-sanitizer],
   AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads]))
+AC_ARG_WITH([crypto],
+  AS_HELP_STRING([--with-crypto=<internal|openssl>], [choose between different implementations of cryptographic functions(default value is --with-crypto=internal)]))
+
+#if openssl, else use the internal
+AS_IF([test x"${with_crypto}" = x"openssl"], [
+AC_CHECK_LIB([crypto], [EVP_DigestInit], [LIBS="$LIBS -lcrypto"], [], [])
+if test $ac_cv_lib_crypto_EVP_DigestInit = no; then
+  AC_MSG_ERROR([build with openssl has been specified but openssl library was not found on your system])
+else
+  AC_DEFINE([CRYPTO_OPENSSL], [1], [Compile with openssl support])
+fi
+], [test x"${with_crypto}" = x"internal" || test x"${with_crypto}" = x"" ], [AC_DEFINE([CRYPTO_INTERNAL], [1], [Compile with internal cryptographic implementation])
+], [AC_MSG_ERROR([Unknown value for --with-crypto])]
+)
 
 AS_IF([test "${enable_clippy_only}" != "yes"], [
 AC_CHECK_HEADERS([json-c/json.h])
index 22239f8e6059e168dfd1223691bd376c54ce49ed..352887eca8c78212b7e6d7a96b97559f849994a8 100644 (file)
@@ -134,6 +134,10 @@ typedef unsigned char uint8_t;
 #endif
 #endif
 
+#ifdef CRYPTO_OPENSSL
+#include <openssl/evp.h>
+#endif
+
 #include "openbsd-tree.h"
 
 #include <netinet/in.h>
index 50c30a6fa0c15171e5aebc612e7e270f2ba920cb..62b0444796534962578ae22bbc3a1834c3222c5d 100644 (file)
@@ -33,7 +33,9 @@
 #include "log.h"
 #include "sockopt.h"
 #include "checksum.h"
+#ifdef CRYPTO_INTERNAL
 #include "md5.h"
+#endif
 #include "vrf.h"
 #include "lib_errors.h"
 
@@ -332,7 +334,11 @@ static unsigned int ospf_packet_max(struct ospf_interface *oi)
 static int ospf_check_md5_digest(struct ospf_interface *oi,
                                 struct ospf_header *ospfh)
 {
+#ifdef CRYPTO_OPENSSL
+       EVP_MD_CTX *ctx;
+#elif CRYPTO_INTERNAL
        MD5_CTX ctx;
+#endif
        unsigned char digest[OSPF_AUTH_MD5_SIZE];
        struct crypt_key *ck;
        struct ospf_neighbor *nbr;
@@ -361,11 +367,21 @@ static int ospf_check_md5_digest(struct ospf_interface *oi,
        }
 
        /* Generate a digest for the ospf packet - their digest + our digest. */
+#ifdef CRYPTO_OPENSSL
+       unsigned int md5_size = OSPF_AUTH_MD5_SIZE;
+       ctx = EVP_MD_CTX_new();
+       EVP_DigestInit(ctx, EVP_md5());
+       EVP_DigestUpdate(ctx, ospfh, length);
+       EVP_DigestUpdate(ctx, ck->auth_key, OSPF_AUTH_MD5_SIZE);
+       EVP_DigestFinal(ctx, digest, &md5_size);
+       EVP_MD_CTX_free(ctx);
+#elif CRYPTO_INTERNAL
        memset(&ctx, 0, sizeof(ctx));
        MD5Init(&ctx);
        MD5Update(&ctx, ospfh, length);
        MD5Update(&ctx, ck->auth_key, OSPF_AUTH_MD5_SIZE);
        MD5Final(digest, &ctx);
+#endif
 
        /* compare the two */
        if (memcmp((caddr_t)ospfh + length, digest, OSPF_AUTH_MD5_SIZE)) {
@@ -389,7 +405,11 @@ static int ospf_make_md5_digest(struct ospf_interface *oi,
 {
        struct ospf_header *ospfh;
        unsigned char digest[OSPF_AUTH_MD5_SIZE] = {0};
+#ifdef CRYPTO_OPENSSL
+       EVP_MD_CTX *ctx;
+#elif CRYPTO_INTERNAL
        MD5_CTX ctx;
+#endif
        void *ibuf;
        uint32_t t;
        struct crypt_key *ck;
@@ -422,11 +442,21 @@ static int ospf_make_md5_digest(struct ospf_interface *oi,
        }
 
        /* Generate a digest for the entire packet + our secret key. */
+#ifdef CRYPTO_OPENSSL
+       unsigned int md5_size = OSPF_AUTH_MD5_SIZE;
+       ctx = EVP_MD_CTX_new();
+       EVP_DigestInit(ctx, EVP_md5());
+       EVP_DigestUpdate(ctx, ibuf, ntohs(ospfh->length));
+       EVP_DigestUpdate(ctx, auth_key, OSPF_AUTH_MD5_SIZE);
+       EVP_DigestFinal(ctx, digest, &md5_size);
+       EVP_MD_CTX_free(ctx);
+#elif CRYPTO_INTERNAL
        memset(&ctx, 0, sizeof(ctx));
        MD5Init(&ctx);
        MD5Update(&ctx, ibuf, ntohs(ospfh->length));
        MD5Update(&ctx, auth_key, OSPF_AUTH_MD5_SIZE);
        MD5Final(digest, &ctx);
+#endif
 
        /* Append md5 digest to the end of the stream. */
        stream_put(op->s, digest, OSPF_AUTH_MD5_SIZE);
index e0ff0430f81a4728cbe5524754975a60bdd0ed45..561fbcb52d1b33b3bdc8cd4950b4a18d54fee0b5 100644 (file)
@@ -37,7 +37,9 @@
 #include "if_rmap.h"
 #include "plist.h"
 #include "distribute.h"
+#ifdef CRYPTO_INTERNAL
 #include "md5.h"
+#endif
 #include "keychain.h"
 #include "privs.h"
 #include "lib_errors.h"
@@ -870,7 +872,11 @@ static int rip_auth_md5(struct rip_packet *packet, struct sockaddr_in *from,
        struct rip_md5_data *md5data;
        struct keychain *keychain;
        struct key *key;
+#ifdef CRYPTO_OPENSSL
+       EVP_MD_CTX *ctx;
+#elif CRYPTO_INTERNAL
        MD5_CTX ctx;
+#endif
        uint8_t digest[RIP_AUTH_MD5_SIZE];
        uint16_t packet_len;
        char auth_str[RIP_AUTH_MD5_SIZE] = {};
@@ -934,11 +940,21 @@ static int rip_auth_md5(struct rip_packet *packet, struct sockaddr_in *from,
                return 0;
 
        /* MD5 digest authentication. */
+#ifdef CRYPTO_OPENSSL
+       unsigned int md5_size = RIP_AUTH_MD5_SIZE;
+       ctx = EVP_MD_CTX_new();
+       EVP_DigestInit(ctx, EVP_md5());
+       EVP_DigestUpdate(ctx, packet, packet_len + RIP_HEADER_SIZE);
+       EVP_DigestUpdate(ctx, auth_str, RIP_AUTH_MD5_SIZE);
+       EVP_DigestFinal(ctx, digest, &md5_size);
+       EVP_MD_CTX_free(ctx);
+#elif CRYPTO_INTERNAL
        memset(&ctx, 0, sizeof(ctx));
        MD5Init(&ctx);
        MD5Update(&ctx, packet, packet_len + RIP_HEADER_SIZE);
        MD5Update(&ctx, auth_str, RIP_AUTH_MD5_SIZE);
        MD5Final(digest, &ctx);
+#endif
 
        if (memcmp(md5data->digest, digest, RIP_AUTH_MD5_SIZE) == 0)
                return packet_len;
@@ -1063,7 +1079,11 @@ static void rip_auth_md5_set(struct stream *s, struct rip_interface *ri,
                             size_t doff, char *auth_str, int authlen)
 {
        unsigned long len;
+#ifdef CRYPTO_OPENSSL
+       EVP_MD_CTX *ctx;
+#elif CRYPTO_INTERNAL
        MD5_CTX ctx;
+#endif
        unsigned char digest[RIP_AUTH_MD5_SIZE];
 
        /* Make it sure this interface is configured as MD5
@@ -1092,11 +1112,21 @@ static void rip_auth_md5_set(struct stream *s, struct rip_interface *ri,
        stream_putw(s, RIP_AUTH_DATA);
 
        /* Generate a digest for the RIP packet. */
+#ifdef CRYPTO_OPENSSL
+       unsigned int md5_size = RIP_AUTH_MD5_SIZE;
+       ctx = EVP_MD_CTX_new();
+       EVP_DigestInit(ctx, EVP_md5());
+       EVP_DigestUpdate(ctx, STREAM_DATA(s), stream_get_endp(s));
+       EVP_DigestUpdate(ctx, auth_str, RIP_AUTH_MD5_SIZE);
+       EVP_DigestFinal(ctx, digest, &md5_size);
+       EVP_MD_CTX_free(ctx);
+#elif CRYPTO_INTERNAL
        memset(&ctx, 0, sizeof(ctx));
        MD5Init(&ctx);
        MD5Update(&ctx, STREAM_DATA(s), stream_get_endp(s));
        MD5Update(&ctx, auth_str, RIP_AUTH_MD5_SIZE);
        MD5Final(digest, &ctx);
+#endif
 
        /* Copy the digest to the packet. */
        stream_write(s, digest, RIP_AUTH_MD5_SIZE);