diff --git a/des.c b/des.c
index 28f4f503d12328fd277f85757906aa9b4c966191..0b761a0565c2f4e8ec0617b0526469f90363228c 100644
--- a/des.c
+++ b/des.c
@@ -81,73 +81,77 @@ des_set_key(struct des_ctx *ctx, const uint8_t *key)
   n |= b0[key[6]]; n <<= 4;
   n |= b0[key[7]];
   w  = 0x88888888l;
+
   /* report bad parity in key */
   if ( n & w )
     {
       ctx->status = DES_BAD_PARITY;
       return 0;
     }
-  ctx->status = DES_WEAK_KEY; 
+  ctx->status = DES_OK; 
+
   /* report a weak or semi-weak key */
   if ( !((n - (w >> 3)) & w) ) {	/* 1 in 10^10 keys passes this test */
     if ( n < 0X41415151 ) {
       if ( n < 0X31312121 ) {
 	if ( n < 0X14141515 ) {
 	  /* 01 01 01 01 01 01 01 01 */
-	  if ( n == 0X11111111 ) return 0;
+	  if ( n == 0X11111111 ) goto weak;
 	  /* 01 1F 01 1F 01 0E 01 0E */
-	  if ( n == 0X13131212 ) return 0;
+	  if ( n == 0X13131212 ) goto weak;
 	} else {
 	  /* 01 E0 01 E0 01 F1 01 F1 */
-	  if ( n == 0X14141515 ) return 0;
+	  if ( n == 0X14141515 ) goto weak;
 	  /* 01 FE 01 FE 01 FE 01 FE */
-	  if ( n == 0X16161616 ) return 0;
+	  if ( n == 0X16161616 ) goto weak;
 	}
       } else {
 	if ( n < 0X34342525 ) {
 	  /* 1F 01 1F 01 0E 01 0E 01 */
-	  if ( n == 0X31312121 ) return 0;
+	  if ( n == 0X31312121 ) goto weak;
 	  /* 1F 1F 1F 1F 0E 0E 0E 0E */	/* ? */
-	  if ( n == 0X33332222 ) return 0;;
+	  if ( n == 0X33332222 ) goto weak;
 	} else {
 	  /* 1F E0 1F E0 0E F1 0E F1 */
-	  if ( n == 0X34342525 ) return 0;;
+	  if ( n == 0X34342525 ) goto weak;
 	  /* 1F FE 1F FE 0E FE 0E FE */
-	  if ( n == 0X36362626 ) return 0;;
+	  if ( n == 0X36362626 ) goto weak;
 	}
       }
     } else {
       if ( n < 0X61616161 ) {
 	if ( n < 0X44445555 ) {
 	  /* E0 01 E0 01 F1 01 F1 01 */
-	  if ( n == 0X41415151 ) return 0;
+	  if ( n == 0X41415151 ) goto weak;
 	  /* E0 1F E0 1F F1 0E F1 0E */
-	  if ( n == 0X43435252 ) return 0;
+	  if ( n == 0X43435252 ) goto weak;
 	} else {
 	  /* E0 E0 E0 E0 F1 F1 F1 F1 */	/* ? */
-	  if ( n == 0X44445555 ) return 0;
+	  if ( n == 0X44445555 ) goto weak;
 	  /* E0 FE E0 FE F1 FE F1 FE */
-	  if ( n == 0X46465656 ) return 0;
+	  if ( n == 0X46465656 ) goto weak;
 	}
       } else {
 	if ( n < 0X64646565 ) {
 	  /* FE 01 FE 01 FE 01 FE 01 */
-	  if ( n == 0X61616161 ) return 0;
+	  if ( n == 0X61616161 ) goto weak;
 	  /* FE 1F FE 1F FE 0E FE 0E */
-	  if ( n == 0X63636262 ) return 0;
+	  if ( n == 0X63636262 ) goto weak;
 	} else {
 	  /* FE E0 FE E0 FE F1 FE F1 */
-	  if ( n == 0X64646565 ) return 0;
+	  if ( n == 0X64646565 ) goto weak;
 	  /* FE FE FE FE FE FE FE FE */
-	  if ( n == 0X66666666 ) return 0;
+	  if ( n == 0X66666666 )
+          {
+          weak:
+            ctx->status = DES_WEAK_KEY;
+          }
 	}
       }
     }
   }
 
-  /* key is ok */
-  ctx->status = DES_OK;
-  
+  /* NOTE: We go on and expand the key, even if it was weak */
   /* explode the bits */
   n = 56;
   b0 = bits0;
@@ -209,7 +213,7 @@ des_set_key(struct des_ctx *ctx, const uint8_t *key)
     method	+= 2;
   } while ( --n );
 
-  return 1;
+  return (ctx->status == DES_OK);
 }
 
 void