The build fix is relatively straightforward, mostly based on Debian's
patch set.

https://sources.debian.org/patches/dsniff/2.4b1+debian-30/24_Fix-OpenSSL1.1.0-Build.patch/

If anyone uses this, a quick test would be appreciated.

Index: Makefile
===================================================================
RCS file: /cvs/ports/security/dsniff/Makefile,v
retrieving revision 1.63
diff -u -p -r1.63 Makefile
--- Makefile    12 Jul 2019 20:49:01 -0000      1.63
+++ Makefile    25 Nov 2021 22:35:42 -0000
@@ -3,7 +3,7 @@
 COMMENT=       sniffing tools for penetration testing
 
 DISTNAME=      dsniff-2.3
-REVISION=      16
+REVISION=      17
 CATEGORIES=    security
 
 MASTER_SITES=  http://monkey.org/~dugsong/dsniff/
Index: patches/patch-arp_c
===================================================================
RCS file: patches/patch-arp_c
diff -N patches/patch-arp_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-arp_c 25 Nov 2021 22:34:41 -0000
@@ -0,0 +1,13 @@
+$OpenBSD$
+
+Index: arp.c
+--- arp.c.orig
++++ arp.c
+@@ -32,6 +32,7 @@
+ #include <netinet/if_ether.h>
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <unistd.h>
+ 
+ #ifdef BSD
Index: patches/patch-buf_c
===================================================================
RCS file: patches/patch-buf_c
diff -N patches/patch-buf_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-buf_c 25 Nov 2021 22:28:38 -0000
@@ -0,0 +1,13 @@
+$OpenBSD$
+
+Index: buf.c
+--- buf.c.orig
++++ buf.c
+@@ -12,6 +12,7 @@
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <stdarg.h>
+ #include <unistd.h>
+ #include <ctype.h>
Index: patches/patch-ssh_c
===================================================================
RCS file: patches/patch-ssh_c
diff -N patches/patch-ssh_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-ssh_c 26 Nov 2021 07:04:59 -0000
@@ -0,0 +1,161 @@
+$OpenBSD$
+
+Based on 
https://sources.debian.org/patches/dsniff/2.4b1+debian-30/24_Fix-OpenSSL1.1.0-Build.patch/
+
+Index: ssh.c
+--- ssh.c.orig
++++ ssh.c
+@@ -13,6 +13,8 @@
+ #include <sys/param.h>
+ #include <sys/types.h>
+ #include <arpa/nameser.h>
++#include <openssl/err.h>
++#include <openssl/md5.h>
+ #include <openssl/ssl.h>
+ #include <openssl/rand.h>
+ 
+@@ -86,7 +88,7 @@ static u_int crc32_tab[] = {
+ static u_char pkt[4 + 8 + SSH_MAX_PKTLEN];
+ 
+ static void
+-put_bn(BIGNUM *bn, u_char **pp)
++put_bn(const BIGNUM *bn, u_char **pp)
+ {
+       short i;
+       
+@@ -116,7 +118,7 @@ get_bn(BIGNUM *bn, u_char **pp, int *lenp)
+ }
+ 
+ static u_char *
+-ssh_session_id(u_char *cookie, BIGNUM *hostkey_n, BIGNUM *servkey_n)
++ssh_session_id(u_char *cookie, const BIGNUM *hostkey_n, const BIGNUM 
*servkey_n)
+ {
+       static u_char sessid[16];
+       u_int i, j;
+@@ -231,7 +233,10 @@ SSH_accept(SSH *ssh)
+       u_char *p, cipher, cookie[8], msg[1024];
+       u_int32_t num;
+       int i;
+-      
++    
++      const BIGNUM *servkey_e, *servkey_n;
++      const BIGNUM *hostkey_e, *hostkey_n;
++
+       /* Generate anti-spoofing cookie. */
+       RAND_bytes(cookie, sizeof(cookie));
+       
+@@ -240,11 +245,13 @@ SSH_accept(SSH *ssh)
+       *p++ = SSH_SMSG_PUBLIC_KEY;                     /* type */
+       memcpy(p, cookie, 8); p += 8;                   /* cookie */
+       num = 768; PUTLONG(num, p);                     /* servkey bits */
+-      put_bn(ssh->ctx->servkey->e, &p);               /* servkey exponent */
+-      put_bn(ssh->ctx->servkey->n, &p);               /* servkey modulus */
++      RSA_get0_key(ssh->ctx->servkey, &servkey_n, &servkey_e, NULL);
++      put_bn(servkey_e, &p);          /* servkey exponent */
++      put_bn(servkey_n, &p);          /* servkey modulus */
+       num = 1024; PUTLONG(num, p);                    /* hostkey bits */
+-      put_bn(ssh->ctx->hostkey->e, &p);               /* hostkey exponent */
+-      put_bn(ssh->ctx->hostkey->n, &p);               /* hostkey modulus */
++      RSA_get0_key(ssh->ctx->hostkey, &hostkey_n, &hostkey_e, NULL);
++      put_bn(hostkey_e, &p);          /* hostkey exponent */
++      put_bn(hostkey_n, &p);          /* hostkey modulus */
+       num = 0; PUTLONG(num, p);                       /* protocol flags */
+       num = ssh->ctx->encmask; PUTLONG(num, p);       /* ciphers */
+       num = ssh->ctx->authmask; PUTLONG(num, p);      /* authmask */
+@@ -295,7 +302,7 @@ SSH_accept(SSH *ssh)
+       SKIP(p, i, 4);
+ 
+       /* Decrypt session key. */
+-      if (BN_cmp(ssh->ctx->servkey->n, ssh->ctx->hostkey->n) > 0) {
++      if (BN_cmp(servkey_n, hostkey_n) > 0) {
+               rsa_private_decrypt(enckey, enckey, ssh->ctx->servkey);
+               rsa_private_decrypt(enckey, enckey, ssh->ctx->hostkey);
+       }
+@@ -315,8 +322,8 @@ SSH_accept(SSH *ssh)
+       BN_clear_free(enckey);
+       
+       /* Derive real session key using session id. */
+-      if ((p = ssh_session_id(cookie, ssh->ctx->hostkey->n,
+-                              ssh->ctx->servkey->n)) == NULL) {
++      if ((p = ssh_session_id(cookie, hostkey_n,
++                              servkey_n)) == NULL) {
+               warn("ssh_session_id");
+               return (-1);
+       }
+@@ -325,10 +332,8 @@ SSH_accept(SSH *ssh)
+       }
+       /* Set cipher. */
+       if (cipher == SSH_CIPHER_3DES) {
+-              ssh->estate = des3_init(ssh->sesskey, sizeof(ssh->sesskey));
+-              ssh->dstate = des3_init(ssh->sesskey, sizeof(ssh->sesskey));
+-              ssh->encrypt = des3_encrypt;
+-              ssh->decrypt = des3_decrypt;
++              warnx("cipher 3des no longer supported");
++              return (-1);
+       }
+       else if (cipher == SSH_CIPHER_BLOWFISH) {
+               ssh->estate = blowfish_init(ssh->sesskey,sizeof(ssh->sesskey));
+@@ -354,7 +359,10 @@ SSH_connect(SSH *ssh)
+       u_char *p, cipher, cookie[8], msg[1024];
+       u_int32_t num;
+       int i;
+-      
++
++      BIGNUM *servkey_n, *servkey_e;
++      BIGNUM *hostkey_n, *hostkey_e;
++
+       /* Get public key. */
+       if ((i = SSH_recv(ssh, pkt, sizeof(pkt))) <= 0) {
+               warn("SSH_recv");
+@@ -376,21 +384,23 @@ SSH_connect(SSH *ssh)
+ 
+       /* Get servkey. */
+       ssh->ctx->servkey = RSA_new();
+-      ssh->ctx->servkey->n = BN_new();
+-      ssh->ctx->servkey->e = BN_new();
++      servkey_n = BN_new();
++      servkey_e = BN_new();
++      RSA_set0_key(ssh->ctx->servkey, servkey_n, servkey_e, NULL);
+ 
+       SKIP(p, i, 4);
+-      get_bn(ssh->ctx->servkey->e, &p, &i);
+-      get_bn(ssh->ctx->servkey->n, &p, &i);
++      get_bn(servkey_e, &p, &i);
++      get_bn(servkey_n, &p, &i);
+ 
+       /* Get hostkey. */
+       ssh->ctx->hostkey = RSA_new();
+-      ssh->ctx->hostkey->n = BN_new();
+-      ssh->ctx->hostkey->e = BN_new();
++      hostkey_n = BN_new();
++      hostkey_e = BN_new();
++      RSA_set0_key(ssh->ctx->hostkey, hostkey_n, hostkey_e, NULL);
+ 
+       SKIP(p, i, 4);
+-      get_bn(ssh->ctx->hostkey->e, &p, &i);
+-      get_bn(ssh->ctx->hostkey->n, &p, &i);
++      get_bn(hostkey_e, &p, &i);
++      get_bn(hostkey_n, &p, &i);
+ 
+       /* Get cipher, auth masks. */
+       SKIP(p, i, 4);
+@@ -402,8 +412,8 @@ SSH_connect(SSH *ssh)
+       RAND_bytes(ssh->sesskey, sizeof(ssh->sesskey));
+ 
+       /* Obfuscate with session id. */
+-      if ((p = ssh_session_id(cookie, ssh->ctx->hostkey->n,
+-                              ssh->ctx->servkey->n)) == NULL) {
++      if ((p = ssh_session_id(cookie, hostkey_n,
++                              servkey_n)) == NULL) {
+               warn("ssh_session_id");
+               return (-1);
+       }
+@@ -419,7 +429,7 @@ SSH_connect(SSH *ssh)
+               else BN_add_word(bn, ssh->sesskey[i]);
+       }
+       /* Encrypt session key. */
+-      if (BN_cmp(ssh->ctx->servkey->n, ssh->ctx->hostkey->n) < 0) {
++      if (BN_cmp(servkey_n, hostkey_n) < 0) {
+               rsa_public_encrypt(bn, bn, ssh->ctx->servkey);
+               rsa_public_encrypt(bn, bn, ssh->ctx->hostkey);
+       }
Index: patches/patch-sshcrypto_c
===================================================================
RCS file: /cvs/ports/security/dsniff/patches/patch-sshcrypto_c,v
retrieving revision 1.3
diff -u -p -r1.3 patch-sshcrypto_c
--- patches/patch-sshcrypto_c   29 May 2015 15:57:29 -0000      1.3
+++ patches/patch-sshcrypto_c   26 Nov 2021 07:06:11 -0000
@@ -1,6 +1,13 @@
 $OpenBSD: patch-sshcrypto_c,v 1.3 2015/05/29 15:57:29 jca Exp $
---- sshcrypto.c.orig   Tue Nov 28 22:23:28 2000
-+++ sshcrypto.c        Fri May 29 17:56:22 2015
+
+Use DES API instead of des
+
+OpenSSL 1.1 API conversion based on
+https://sources.debian.org/patches/dsniff/2.4b1+debian-30/24_Fix-OpenSSL1.1.0-Build.patch/
+
+Index: sshcrypto.c
+--- sshcrypto.c.orig
++++ sshcrypto.c
 @@ -15,7 +15,9 @@
  #include <sys/types.h>
  #include <openssl/ssl.h>
@@ -22,7 +29,33 @@ $OpenBSD: patch-sshcrypto_c,v 1.3 2015/0
  };
  
  void
-@@ -153,13 +155,13 @@ des3_init(u_char *sesskey, int len)
+@@ -37,10 +39,12 @@ rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA *key)
+       u_char *inbuf, *outbuf;
+       int len, ilen, olen;
+ 
+-      if (BN_num_bits(key->e) < 2 || !BN_is_odd(key->e))
++      const BIGNUM *n, *e;
++      RSA_get0_key(key, &n, &e, NULL);
++      if (BN_num_bits(e) < 2 || !BN_is_odd(e))
+               errx(1, "rsa_public_encrypt() exponent too small or not odd");
+ 
+-      olen = BN_num_bytes(key->n);
++      olen = BN_num_bytes(n);
+       outbuf = malloc(olen);
+ 
+       ilen = BN_num_bytes(in);
+@@ -69,7 +73,9 @@ rsa_private_decrypt(BIGNUM *out, BIGNUM *in, RSA *key)
+       u_char *inbuf, *outbuf;
+       int len, ilen, olen;
+ 
+-      olen = BN_num_bytes(key->n);
++      const BIGNUM *n;
++      RSA_get0_key(key, &n, NULL, NULL);
++      olen = BN_num_bytes(n);
+       outbuf = malloc(olen);
+ 
+       ilen = BN_num_bytes(in);
+@@ -153,13 +159,13 @@ des3_init(u_char *sesskey, int len)
        if ((state = malloc(sizeof(*state))) == NULL)
                err(1, "malloc");
  
@@ -40,7 +73,7 @@ $OpenBSD: patch-sshcrypto_c,v 1.3 2015/0
        
        memset(state->iv1, 0, 8);
        memset(state->iv2, 0, 8);
-@@ -175,9 +177,9 @@ des3_encrypt(u_char *src, u_char *dst, int len, void *
+@@ -175,9 +181,9 @@ des3_encrypt(u_char *src, u_char *dst, int len, void *
        estate = (struct des3_state *)state;
        memcpy(estate->iv1, estate->iv2, 8);
        
@@ -53,7 +86,7 @@ $OpenBSD: patch-sshcrypto_c,v 1.3 2015/0
  }
  
  void
-@@ -188,7 +190,7 @@ des3_decrypt(u_char *src, u_char *dst, int len, void *
+@@ -188,7 +194,7 @@ des3_decrypt(u_char *src, u_char *dst, int len, void *
        dstate = (struct des3_state *)state;
        memcpy(dstate->iv1, dstate->iv2, 8);
        

Reply via email to