https://sources.debian.org/patches/lsh-utils/2.1-12/nettle3.patch/
--- src/spki/verify.c.orig
+++ src/spki/verify.c
@@ -25,7 +25,7 @@
 #endif
 
 #include <nettle/bignum.h>
-#include <nettle/dsa.h>
+#include <nettle/dsa-compat.h>
 #include <nettle/rsa.h>
 
 #include "certificate.h"
@@ -74,7 +74,7 @@ spki_verify_dsa(const uint8_t *digest,
   dsa_public_key_init(&dsa);
   dsa_signature_init(&rs);
 
-  res = (dsa_keypair_from_sexp_alist(&dsa, NULL,
+  res = (dsa_keypair_from_sexp_alist((struct dsa_params *)&dsa, dsa.y, NULL,
 				     RSA_KEYSIZE_LIMIT, DSA_SHA1_Q_BITS, &key->sexp)
 	 && spki_parse_type(key)
 	 && dsa_signature_from_sexp(&rs, &signature->sexp, DSA_SHA1_Q_BITS)
--- src/crypto.c.orig
+++ src/crypto.c
@@ -322,7 +322,7 @@ make_cast128_cbc_instance(struct crypto_
 			? do_cast128_encrypt
 			: do_cast128_decrypt);
 
-  cast128_set_key(&self->ctx.ctx, algorithm->key_size, key);
+  cast5_set_key(&self->ctx.ctx, algorithm->key_size, key);
   CBC_SET_IV(&self->ctx, iv);
 
   return(&self->super);
--- src/dsa.c.orig
+++ src/dsa.c
@@ -28,7 +28,7 @@
 #include <assert.h>
 
 #include <nettle/bignum.h>
-#include <nettle/dsa.h>
+#include <nettle/dsa-compat.h>
 #include <nettle/sexp.h>
 #include <nettle/sha.h>
 
@@ -322,7 +322,7 @@ make_dsa_verifier(struct signature_algor
   NEW(dsa_verifier, res);
   init_dsa_verifier(res);
 
-  if (dsa_keypair_from_sexp_alist(&res->key, NULL, DSA_MAX_BITS, DSA_SHA1_Q_BITS, i))
+  if (dsa_keypair_from_sexp_alist((struct dsa_params *)&res->key, res->key.y, NULL, DSA_MAX_BITS, DSA_SHA1_Q_BITS, i))
     return &res->super;
 
   KILL(res);
@@ -341,7 +341,7 @@ make_dsa_signer(struct signature_algorit
   
   dsa_private_key_init(&res->key);
 
-  if (dsa_keypair_from_sexp_alist(&verifier->key, &res->key, DSA_MAX_BITS, DSA_SHA1_Q_BITS, i))
+  if (dsa_keypair_from_sexp_alist((struct dsa_params *)&verifier->key, verifier->key.y, res->key.x, DSA_MAX_BITS, DSA_SHA1_Q_BITS, i))
     {
       res->random = self->random;
       res->verifier = verifier;
--- src/dummy.c.orig
+++ src/dummy.c
@@ -41,84 +41,84 @@
 #include "lsh.h"
 
 /* Referenced by ssh_format.c */
-unsigned
+size_t
 nettle_mpz_sizeinbase_256_s(const mpz_t x UNUSED)
 { abort(); }
 
-unsigned
+size_t
 nettle_mpz_sizeinbase_256_u(const mpz_t x UNUSED)
 { abort(); }
 
 void
-cbc_encrypt(void *ctx UNUSED, nettle_crypt_func f UNUSED,
-	    unsigned block_size UNUSED, uint8_t *iv UNUSED,
-	    unsigned length UNUSED, uint8_t *dst UNUSED,
+cbc_encrypt(const void *ctx UNUSED, nettle_cipher_func *f UNUSED,
+	    size_t block_size UNUSED, uint8_t *iv UNUSED,
+	    size_t length UNUSED, uint8_t *dst UNUSED,
 	    const uint8_t *src UNUSED)
 { abort(); }
 
 void
-cbc_decrypt(void *ctx UNUSED, nettle_crypt_func f UNUSED,
-	    unsigned block_size UNUSED, uint8_t *iv UNUSED,
-	    unsigned length UNUSED, uint8_t *dst UNUSED,
+cbc_decrypt(const void *ctx UNUSED, nettle_cipher_func *f UNUSED,
+	    size_t block_size UNUSED, uint8_t *iv UNUSED,
+	    size_t length UNUSED, uint8_t *dst UNUSED,
 	    const uint8_t *src UNUSED)
 { abort(); }
 
 void
-ctr_crypt(void *ctx UNUSED, nettle_crypt_func f UNUSED,
-	  unsigned block_size UNUSED, uint8_t *iv UNUSED,
-	  unsigned length UNUSED, uint8_t *dst UNUSED,
+ctr_crypt(const void *ctx UNUSED, nettle_cipher_func *f UNUSED,
+	  size_t block_size UNUSED, uint8_t *iv UNUSED,
+	  size_t length UNUSED, uint8_t *dst UNUSED,
 	  const uint8_t *src UNUSED)
 { abort(); }
 
 void
 hmac_digest(const void *outer UNUSED, const void *inner UNUSED, void *state UNUSED,
 	    const struct nettle_hash *hash UNUSED,
-	    unsigned length UNUSED, uint8_t *digest UNUSED)
+	    size_t length UNUSED, uint8_t *digest UNUSED)
 { abort(); }
 
-unsigned
+size_t
 sexp_vformat(struct nettle_buffer *buffer UNUSED,
 	     const char *format UNUSED, va_list args UNUSED)
 { abort(); }
 
-unsigned
+size_t
 sexp_transport_vformat(struct nettle_buffer *buffer UNUSED,
 		       const char *format UNUSED, va_list args UNUSED)
 { abort(); }
 
 int
 sexp_transport_iterator_first(struct sexp_iterator *iterator UNUSED,
-			      unsigned length UNUSED, uint8_t *input UNUSED)
+			      size_t length UNUSED, uint8_t *input UNUSED)
 { abort(); }
 
 void
 nettle_buffer_init_size(struct nettle_buffer *buffer UNUSED,
-			unsigned length UNUSED, uint8_t *space UNUSED)
+			size_t length UNUSED, uint8_t *space UNUSED)
 			
 { abort(); }
 
 
 /* Referenced by lsh_string.c */
-uint8_t *
-memxor(uint8_t *dst UNUSED, const uint8_t *src UNUSED, size_t n UNUSED)
+void *
+memxor(void *dst UNUSED, const void *src UNUSED, size_t n UNUSED)
 { abort(); }
 
 void
-nettle_mpz_get_str_256(unsigned length UNUSED, uint8_t *s UNUSED, const mpz_t x UNUSED)
+nettle_mpz_get_str_256(size_t length UNUSED, uint8_t *s UNUSED, const mpz_t x UNUSED)
 { abort(); }
 
 void
 base64_encode_init(struct base64_encode_ctx *ctx UNUSED)
 { abort(); }
 
-unsigned
+size_t
 base64_encode_update(struct base64_encode_ctx *ctx UNUSED,
 		     uint8_t *dst UNUSED,
-		     unsigned length UNUSED,
+		     size_t length UNUSED,
 		     const uint8_t *src UNUSED)
 { abort(); }
 
-unsigned
+size_t
 base64_encode_final(struct base64_encode_ctx *ctx UNUSED,
 		    uint8_t *dst UNUSED)
 { abort(); }
@@ -129,9 +129,9 @@ base64_decode_init(struct base64_decode_
 
 int
 base64_decode_update(struct base64_decode_ctx *ctx UNUSED,
-		     unsigned *dst_length UNUSED,
+		     size_t *dst_length UNUSED,
 		     uint8_t *dst UNUSED,
-		     unsigned src_length UNUSED,
+		     size_t src_length UNUSED,
 		     const uint8_t *src UNUSED)
 { abort(); }
 
@@ -142,7 +142,7 @@ base64_decode_final(struct base64_decode
 /* Referenced by parse.c */
 void
 nettle_mpz_set_str_256_s(mpz_t x UNUSED,
-			 unsigned length UNUSED, const uint8_t *s UNUSED)
+			 size_t length UNUSED, const uint8_t *s UNUSED)
 { abort(); }
 
 /* Referenced by werror.c */
--- src/lsh-keygen.c.orig
+++ src/lsh-keygen.c
@@ -39,7 +39,7 @@
 #include <unistd.h>
 #endif
 
-#include <nettle/dsa.h>
+#include <nettle/dsa-compat.h>
 #include <nettle/rsa.h>
 
 #include "crypto.h"
@@ -214,7 +214,7 @@ dsa_generate_key(struct randomness *r, u
 
   assert(r->quality == RANDOM_GOOD);
   
-  if (dsa_generate_keypair(&public, &private,
+  if (dsa_compat_generate_keypair(&public, &private,
 			   r, lsh_random,
 			   NULL, progress,
 			   512 + 64 * level, DSA_SHA1_Q_BITS))
--- src/lsh_string.c.orig
+++ src/lsh_string.c
@@ -367,10 +367,10 @@ lsh_string_format_sexp(int transport, co
 {
   struct lsh_string *s;
   va_list args;
-  unsigned length;
+  size_t length;
   struct nettle_buffer buffer;
 
-  unsigned (*vformat)(struct nettle_buffer *, const char *, va_list)
+  size_t (*vformat)(struct nettle_buffer *, const char *, va_list)
     = transport ? sexp_transport_vformat : sexp_vformat;
   
   va_start(args, format);
@@ -415,7 +415,7 @@ int
 lsh_string_base64_decode(struct lsh_string *s)
 {
   struct base64_decode_ctx ctx;
-  uint32_t done = s->length;
+  size_t done = s->length;
 
   base64_decode_init(&ctx);
 
--- src/randomness.c.orig
+++ src/randomness.c
@@ -35,7 +35,7 @@
 /* Wrapper for using lsh's randomness generator with nettle
  * functions. */
 void
-lsh_random(void *x, unsigned length, uint8_t *data)
+lsh_random(void *x, size_t length, uint8_t *data)
 {
   CAST_SUBTYPE(randomness, r, x);
   RANDOM(r, length, data);
--- src/randomness.h.orig
+++ src/randomness.h
@@ -84,6 +84,6 @@ make_system_random(void);
 
 /* Randomness function matching nettle's expectations. */
 void
-lsh_random(void *x, unsigned length, uint8_t *data);
+lsh_random(void *x, size_t length, uint8_t *data);
 
 #endif /* LSH_RANDOMNESS_H_INCLUDED */
--- src/sexp.c.orig
+++ src/sexp.c
@@ -97,7 +97,7 @@ lsh_sexp_to_string(struct sexp_iterator
 struct lsh_string *
 lsh_sexp_copy(struct sexp_iterator *i)
 {
-  unsigned length;
+  size_t length;
   const uint8_t *subexpr = sexp_iterator_subexpr(i, &length);
 
   return subexpr ? ssh_format("%ls", length, subexpr) : NULL;
--- src/lsh.c.orig
+++ src/lsh.c
@@ -524,8 +524,8 @@ do_lsh_lookup(struct lookup_verifier *c,
 	}
 
       acl = lsh_string_format_sexp(0, "(acl(entry(subject%l)%l))",
-				   subject->key_length, subject->key,
-				   STRING_LD(self->access));
+				   (size_t)subject->key_length, subject->key,
+				   (size_t)STRING_LD(self->access));
       
       /* FIXME: Seems awkward to pick the acl apart again. */
       if (!spki_iterator_first(&i, STRING_LD(acl)))
@@ -540,7 +540,7 @@ do_lsh_lookup(struct lookup_verifier *c,
 	  A_WRITE(self->file,
 		  ssh_format("\n; ACL for host %lz\n"
 			     "%lfS\n",
-			     self->host, lsh_string_format_sexp(1, "%l", STRING_LD(acl))));
+			     self->host, lsh_string_format_sexp(1, "%l", (size_t)STRING_LD(acl))));
 
 	  lsh_string_free(acl);
 	}
--- src/spki.c.orig
+++ src/spki.c
@@ -98,7 +98,7 @@ make_ssh_hostkey_tag(const char *host)
     }
 
   tag = lsh_string_format_sexp(0, "(tag(ssh-hostkey%s))",
-			       STRING_LD(reversed));
+			       (size_t)STRING_LD(reversed));
   lsh_string_free(reversed);
 
   return tag;
@@ -207,7 +207,7 @@ spki_hash_data(const struct hash_algorit
 
   out = lsh_string_format_sexp(0, "(hash%0s%s)",
 			       "hash", get_atom_name(algorithm_name),
-			       STRING_LD(digest));
+			       (size_t)STRING_LD(digest));
   KILL(hash);
   lsh_string_free(digest);
 
@@ -376,13 +376,13 @@ spki_pkcs5_encrypt(struct randomness *r,
   value = lsh_string_format_sexp(0, "(password-encrypted%s(Xpkcs5v2%0s"
 				 "(iterations%i)(salt%s))"
 				 "(%0s(iv%s)(data%s)))",
-				 STRING_LD(label),
+				 (size_t)STRING_LD(label),
 				 get_atom_name(prf_name),
 				 iterations,
-				 STRING_LD(salt),
+				 (size_t)STRING_LD(salt),
 				 get_atom_name(crypto_name),
-				 STRING_LD(iv),
-				 STRING_LD(encrypted));
+				 (size_t)STRING_LD(iv),
+				 (size_t)STRING_LD(encrypted));
 
   lsh_string_free(key);
   lsh_string_free(salt);
--- src/srp_exchange.c.orig
+++ src/srp_exchange.c
@@ -112,7 +112,7 @@ srp_make_verifier(const struct zn_group
   zn_exp(G, x, G->generator, x);
 
   expr = lsh_string_format_sexp(0, "(srp-verifier ssh-ring1%s%b)",
-				STRING_LD(salt),
+				(size_t)STRING_LD(salt),
 				x);
 
   mpz_clear(x);