Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Mar 2021 02:16:30 +0000 (UTC)
From:      Alexey Dokuchaev <danfe@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r568770 - in head/security/pvk: . files
Message-ID:  <202103190216.12J2GUEM001966@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: danfe
Date: Fri Mar 19 02:16:30 2021
New Revision: 568770
URL: https://svnweb.freebsd.org/changeset/ports/568770

Log:
  - Unbreak the build against modern OpenSSL versions and also on 64-bit
    architectures by using explicit 32-bit `int' types instead of `long'
    which length is not constant (machine/compiler-dependent)
  - Don't patch and then sed(1)-patch the Makefile, just pass the needed
    header files and library paths via MAKE_ARGS
  - Install documentation in the dedicated DOCS option helper target
  - Convert two-line pkg-plist into PLIST_FILES and PORTDOCS
  - Provide fallback distfile download locations
  
  Tested on:	i386, amd64

Added:
  head/security/pvk/files/patch-pvk.h   (contents, props changed)
  head/security/pvk/files/patch-pvkread.c   (contents, props changed)
  head/security/pvk/files/patch-pvkwrite.c   (contents, props changed)
Deleted:
  head/security/pvk/files/patch-Makefile
  head/security/pvk/pkg-plist
Modified:
  head/security/pvk/Makefile

Modified: head/security/pvk/Makefile
==============================================================================
--- head/security/pvk/Makefile	Fri Mar 19 02:04:26 2021	(r568769)
+++ head/security/pvk/Makefile	Fri Mar 19 02:16:30 2021	(r568770)
@@ -3,8 +3,11 @@
 
 PORTNAME=	pvk
 PORTVERSION=	20070406
+PORTREVISION=	1
 CATEGORIES=	security
-MASTER_SITES=	http://www.drh-consultancy.demon.co.uk/
+MASTER_SITES=	http://www.drh-consultancy.demon.co.uk/ \
+		http://vault.101011010.xyz/distfiles/ \
+		http://freebsd.nsu.ru/distfiles/
 DISTNAME=	pvksrc
 EXTRACT_SUFX=	.tgz.bin
 
@@ -12,25 +15,20 @@ MAINTAINER=	sobomax@FreeBSD.org
 COMMENT=	Tool to convert a RSA key in PEM format into a PVK file and vice versa
 
 USES=		ssl
-CFLAGS+=	-I${OPENSSLINC}
-LDFLAGS+=	-L${OPENSSLLIB}
+MAKE_ARGS=	SSLINC=${OPENSSLINC} SSLLIB=${OPENSSLLIB}
 
 NO_WRKSUBDIR=	yes
 
-.include <bsd.port.pre.mk>
+PLIST_FILES=	bin/pvk
+PORTDOCS=	README
 
-.if ${SSL_DEFAULT} == base
-BROKEN_FreeBSD_12=	variable has incomplete type 'EVP_MD_CTX' (aka 'struct evp_md_ctx_st')
-BROKEN_FreeBSD_13=	variable has incomplete type 'EVP_MD_CTX' (aka 'struct evp_md_ctx_st')
-.endif
+OPTIONS_DEFINE=	DOCS
 
-post-patch:
-	${REINPLACE_CMD} -e 's|\(-lcrypto\)|$$(LDFLAGS) \1|g' \
-		${WRKSRC}/Makefile
-
 do-install:
 	${INSTALL_PROGRAM} ${WRKSRC}/pvk ${STAGEDIR}${PREFIX}/bin
-	${MKDIR} ${STAGEDIR}${DOCSDIR}
+
+do-install-DOCS-on:
+	@${MKDIR} ${STAGEDIR}${DOCSDIR}
 	${INSTALL_DATA} ${WRKSRC}/README ${STAGEDIR}${DOCSDIR}
 
-.include <bsd.port.post.mk>
+.include <bsd.port.mk>

Added: head/security/pvk/files/patch-pvk.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/security/pvk/files/patch-pvk.h	Fri Mar 19 02:16:30 2021	(r568770)
@@ -0,0 +1,37 @@
+--- pvk.h.orig	2001-04-10 12:00:08 UTC
++++ pvk.h
+@@ -77,18 +77,18 @@ extern "C" {
+ /* PVK file information */
+ 
+ typedef struct {
+-long magic;
+-long res;
+-long keytype;
+-long crypt;
+-long saltlen;
+-long keylen;
++int32_t magic;
++int32_t res;
++int32_t keytype;
++int32_t crypt;
++int32_t saltlen;
++int32_t keylen;
+ int encr;
+ unsigned char *salt;
+ unsigned char btype;
+ unsigned char version;
+ unsigned short reserved;
+-unsigned long keyalg;
++uint32_t keyalg;
+ unsigned char *key;
+ } PVK_DAT;
+ 
+@@ -116,7 +116,7 @@ RSA *pvk2rsa (PVK_DAT *pvk);
+ int pvk_read(BIO *in, PVK_DAT *pvk);
+ int pvk_write(BIO *out, PVK_DAT *pvk);
+ int pvk_encrypt (PVK_DAT *pvk, char *pass, int encr);
+-int rsa2pvk (RSA *rsa, PVK_DAT *pvk, unsigned long alg);
++int rsa2pvk (RSA *rsa, PVK_DAT *pvk, uint32_t alg);
+ 
+ /* BEGIN ERROR CODES */
+ /* The following lines are auto generated by the script mkerr.pl. Any changes

Added: head/security/pvk/files/patch-pvkread.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/security/pvk/files/patch-pvkread.c	Fri Mar 19 02:16:30 2021	(r568770)
@@ -0,0 +1,137 @@
+--- pvkread.c.orig	2000-07-03 00:02:30 UTC
++++ pvkread.c
+@@ -64,10 +64,10 @@
+ #include "pvk.h"
+ 
+ static int read_word(BIO *in, unsigned short *dat);
+-static int read_dword(BIO *in, unsigned long *dat);
+-static unsigned long get_dword(unsigned char **p);
++static int read_dword(BIO *in, uint32_t *dat);
++static uint32_t get_dword(unsigned char **p);
+ static BIGNUM *lend2BN(unsigned char **nptr, int len);
+-static int scan_magic(BIO *in, unsigned long *magic);
++static int scan_magic(BIO *in, uint32_t *magic);
+ 
+ static int read_word(BIO *in, unsigned short *dat)
+ {
+@@ -77,7 +77,7 @@ static int read_word(BIO *in, unsigned short *dat)
+ 	return 1;
+ }
+ 
+-static int read_dword(BIO *in, unsigned long *dat)
++static int read_dword(BIO *in, uint32_t *dat)
+ {
+ 	unsigned char buf[4];
+ 	if (BIO_read(in, buf, 4) != 4) return 0;
+@@ -85,9 +85,9 @@ static int read_dword(BIO *in, unsigned long *dat)
+ 	return 1;
+ }
+ 
+-static unsigned long get_dword(unsigned char **p)
++static uint32_t get_dword(unsigned char **p)
+ {
+-	unsigned long ret;
++	uint32_t ret;
+ 	unsigned char *buf;
+ 	buf = *p;
+ 	ret = buf[0] + (buf[1] << 8) + (buf[2] << 16) + (buf[3] << 24);
+@@ -95,7 +95,7 @@ static unsigned long get_dword(unsigned char **p)
+ 	return ret;
+ }
+ 
+-static int scan_magic(BIO *in, unsigned long *magic)
++static int scan_magic(BIO *in, uint32_t *magic)
+ {
+ 	int i;
+ 	char dummy[4];
+@@ -157,8 +157,8 @@ int pvk_read(BIO *in, PVK_DAT *pvk)
+ 
+ int pvk_decrypt(PVK_DAT *pvk, char *pass)
+ {
+-	EVP_MD_CTX ctx;
+-	EVP_CIPHER_CTX cctx;
++	EVP_MD_CTX *ctx;
++	EVP_CIPHER_CTX *cctx;
+ 	unsigned char *buf;
+ 	unsigned char tmpkey[EVP_MAX_KEY_LENGTH];
+ 	int outlen;
+@@ -171,18 +171,21 @@ int pvk_decrypt(PVK_DAT *pvk, char *pass)
+ 		PVKerr(PVK_F_PVK_DECRYPT,ERR_R_MALLOC_FAILURE);
+ 		return 0;
+ 	}
+-	EVP_DigestInit(&ctx, EVP_sha1());
+-	EVP_DigestUpdate(&ctx, pvk->salt, pvk->saltlen);
+-	EVP_DigestUpdate(&ctx, pass, strlen(pass));
+-	EVP_DigestFinal(&ctx, tmpkey, NULL);
+-        EVP_DecryptInit(&cctx, EVP_rc4(), tmpkey, NULL);
+-	EVP_DecryptUpdate(&cctx, buf, &outlen, pvk->key, pvk->keylen);
++	ctx = EVP_MD_CTX_new();
++	EVP_DigestInit(ctx, EVP_sha1());
++	EVP_DigestUpdate(ctx, pvk->salt, pvk->saltlen);
++	EVP_DigestUpdate(ctx, pass, strlen(pass));
++	EVP_DigestFinal(ctx, tmpkey, NULL);
++	EVP_MD_CTX_free(ctx);
++	cctx = EVP_CIPHER_CTX_new();
++	EVP_DecryptInit(cctx, EVP_rc4(), tmpkey, NULL);
++	EVP_DecryptUpdate(cctx, buf, &outlen, pvk->key, pvk->keylen);
+ 	if(strncmp(buf, "RSA2", 4)) {
+                 /* Didn't work: try weak encryption */
+                 memset(tmpkey+5, 0, 11);
+-                EVP_DecryptFinal(&cctx, buf + outlen, &outlen);
+-                EVP_DecryptInit(&cctx, EVP_rc4(), tmpkey, NULL);
+-                EVP_DecryptUpdate(&cctx, buf, &outlen, pvk->key, pvk->keylen);
++                EVP_DecryptFinal(cctx, buf + outlen, &outlen);
++                EVP_DecryptInit(cctx, EVP_rc4(), tmpkey, NULL);
++                EVP_DecryptUpdate(cctx, buf, &outlen, pvk->key, pvk->keylen);
+                 if(strncmp(buf, "RSA2", 4)) {
+ 			PVKerr(PVK_F_PVK_DECRYPT,PVK_R_DECRYPT_ERROR);
+                         OPENSSL_free(buf);
+@@ -190,7 +193,8 @@ int pvk_decrypt(PVK_DAT *pvk, char *pass)
+                 } else pvk->encr = PVK_WEAK;
+         } else pvk->encr = PVK_STRONG;
+ 	/* Not needed but do it to cleanup */
+-	EVP_DecryptFinal(&cctx, buf + outlen, &outlen);
++	EVP_DecryptFinal(cctx, buf + outlen, &outlen);
++	EVP_CIPHER_CTX_free(cctx);
+ 	OPENSSL_free(pvk->key);
+ 	pvk->key = buf;
+         memset(tmpkey, 0, EVP_MAX_KEY_LENGTH);
+@@ -203,6 +207,7 @@ RSA *pvk2rsa (PVK_DAT *pvk)
+ 	RSA *rsa;
+ 	unsigned char *keytmp;
+ 	int pubexp, keylen, pvklen;
++	BIGNUM *e, *n, *p, *q, *dmp1, *dmq1, *iqmp, *d;
+ 	rsa = RSA_new();
+ 	if (!rsa) return NULL;
+ 	keytmp = pvk->key + 4;
+@@ -216,15 +221,21 @@ RSA *pvk2rsa (PVK_DAT *pvk)
+ 
+  	if (pvklen < ((keylen/2)* 9)) goto err;
+ 
+-	if(!(rsa->e = BN_new ())) goto err;
+-	BN_set_word (rsa->e, pubexp);
+-	if(!(rsa->n = lend2BN (&keytmp, keylen))) goto err;
+-	if(!(rsa->p = lend2BN (&keytmp, keylen/2))) goto err;
+-	if(!(rsa->q = lend2BN (&keytmp, keylen/2))) goto err;
+-	if(!(rsa->dmp1 = lend2BN (&keytmp, keylen/2))) goto err;
+-	if(!(rsa->dmq1 = lend2BN (&keytmp, keylen/2))) goto err;
+-	if(!(rsa->iqmp = lend2BN (&keytmp, keylen/2))) goto err;
+-	if(!(rsa->d = lend2BN (&keytmp, keylen))) goto err;
++	if (!(e = BN_new())) goto err;
++	BN_set_word (e, pubexp);
++
++	if(!(n = lend2BN (&keytmp, keylen))) goto err;
++	if(!(p = lend2BN (&keytmp, keylen/2))) goto err;
++	if(!(q = lend2BN (&keytmp, keylen/2))) goto err;
++	if(!(dmp1 = lend2BN (&keytmp, keylen/2))) goto err;
++	if(!(dmq1 = lend2BN (&keytmp, keylen/2))) goto err;
++	if(!(iqmp = lend2BN (&keytmp, keylen/2))) goto err;
++	if(!(d = lend2BN (&keytmp, keylen))) goto err;
++
++	RSA_set0_key(rsa, n, e, d);
++	RSA_set0_factors(rsa, p, q);
++	RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp);
++
+ 	return rsa;
+ 	err:
+ 	PVKerr(PVK_F_PVK2RSA,PVK_R_INVALID_PRIVATE_KEY_FORMAT);

Added: head/security/pvk/files/patch-pvkwrite.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/security/pvk/files/patch-pvkwrite.c	Fri Mar 19 02:16:30 2021	(r568770)
@@ -0,0 +1,119 @@
+--- pvkwrite.c.orig	2000-07-03 00:02:30 UTC
++++ pvkwrite.c
+@@ -73,7 +73,7 @@ static int write_word(BIO *out, unsigned short dat)
+ 	return 1;
+ }
+ 
+-static int write_dword(BIO *out, unsigned long dat)
++static int write_dword(BIO *out, uint32_t dat)
+ {
+ 	unsigned char buf[4];
+ 	buf[0] = dat & 0xff;
+@@ -84,7 +84,7 @@ static int write_dword(BIO *out, unsigned long dat)
+ 	return 1;
+ }
+ 
+-static void put_dword(unsigned char **p, unsigned long dat)
++static void put_dword(unsigned char **p, uint32_t dat)
+ {
+ 	unsigned char *buf;
+ 	buf = *p;
+@@ -125,8 +125,8 @@ int pvk_write(BIO *out, PVK_DAT *pvk)
+ 
+ int pvk_encrypt(PVK_DAT *pvk, char *pass, int encr)
+ {
+-	EVP_MD_CTX ctx;
+-	EVP_CIPHER_CTX cctx;
++	EVP_MD_CTX *ctx;
++	EVP_CIPHER_CTX *cctx;
+ 	unsigned char *buf;
+ 	unsigned char tmpkey[EVP_MAX_KEY_LENGTH];
+ 	int outlen;
+@@ -141,17 +141,21 @@ int pvk_encrypt(PVK_DAT *pvk, char *pass, int encr)
+ 		PVKerr(PVK_F_PVK_ENCRYPT,ERR_R_MALLOC_FAILURE);
+ 		return 0;
+ 	}
+-	EVP_DigestInit(&ctx, EVP_sha1());
+-	EVP_DigestUpdate(&ctx, pvk->salt, pvk->saltlen);
+-	EVP_DigestUpdate(&ctx, pass, strlen(pass));
+-	EVP_DigestFinal(&ctx, tmpkey, NULL);
++	ctx = EVP_MD_CTX_new();
++	EVP_DigestInit(ctx, EVP_sha1());
++	EVP_DigestUpdate(ctx, pvk->salt, pvk->saltlen);
++	EVP_DigestUpdate(ctx, pass, strlen(pass));
++	EVP_DigestFinal(ctx, tmpkey, NULL);
++	EVP_MD_CTX_free(ctx);
+ 
+         if(encr == PVK_WEAK) memset(tmpkey + 5, 0, 11);
+ 
+-	EVP_EncryptInit(&cctx, EVP_rc4(), tmpkey, NULL);
+-	EVP_EncryptUpdate(&cctx, buf, &outlen, pvk->key, pvk->keylen);
++	cctx = EVP_CIPHER_CTX_new();
++	EVP_EncryptInit(cctx, EVP_rc4(), tmpkey, NULL);
++	EVP_EncryptUpdate(cctx, buf, &outlen, pvk->key, pvk->keylen);
+ 	/* Not needed but do it to cleanup */
+-	EVP_EncryptFinal(&cctx, buf + outlen, &outlen);
++	EVP_EncryptFinal(cctx, buf + outlen, &outlen);
++	EVP_CIPHER_CTX_free(cctx);
+ 	OPENSSL_free(pvk->key);
+ 	pvk->key = buf;
+         pvk->crypt = 1;
+@@ -161,7 +165,7 @@ int pvk_encrypt(PVK_DAT *pvk, char *pass, int encr)
+ }
+ 
+ /* Convert bignum to little endian format */ 
+-static int BN2lend (BIGNUM *num, unsigned char *p)
++static int BN2lend (const BIGNUM *num, unsigned char *p)
+ {
+ 	int nbyte, i;
+ 	unsigned char c;
+@@ -178,7 +182,7 @@ static int BN2lend (BIGNUM *num, unsigned char *p)
+ 
+ /* Convert RSA key into PVK structure */
+ 
+-int rsa2pvk(RSA *rsa, PVK_DAT *pvk, unsigned long alg)
++int rsa2pvk(RSA *rsa, PVK_DAT *pvk, uint32_t alg)
+ {
+ 	int numbytes;
+ 	unsigned char *p;
+@@ -202,7 +206,7 @@ int rsa2pvk(RSA *rsa, PVK_DAT *pvk, unsigned long alg)
+         else if(pvk->keyalg == RSA_SIG) pvk->keytype = PVK_SIG;
+ 
+ 	/* Set up a private key blob */
+-	numbytes = BN_num_bytes (rsa->n);
++	numbytes = BN_num_bytes (RSA_get0_n(rsa));
+ 	/* Allocate enough room for blob */
+ 	if (!(pvk->key = calloc(1, 12 + numbytes * 5))) {
+ 		PVKerr(PVK_F_RSA2PVK,ERR_R_MALLOC_FAILURE);
+@@ -216,23 +220,23 @@ int rsa2pvk(RSA *rsa, PVK_DAT *pvk, unsigned long alg)
+ 	p+= 4;
+ 
+ 	put_dword(&p, numbytes << 3);	/* Number of bits */
+-	put_dword(&p, BN_get_word(rsa->e)); /* Public exponent */
++	put_dword(&p, BN_get_word(RSA_get0_e(rsa))); /* Public exponent */
+ 
+ 	/* Convert each element */
+ 
+-	BN2lend (rsa->n, p);
++	BN2lend (RSA_get0_n(rsa), p);
+ 	p += numbytes;
+-	BN2lend (rsa->p, p);
++	BN2lend (RSA_get0_p(rsa), p);
+ 	p += numbytes/2;
+-	BN2lend (rsa->q, p);
++	BN2lend (RSA_get0_q(rsa), p);
+ 	p += numbytes/2;
+-	BN2lend (rsa->dmp1, p);
++	BN2lend (RSA_get0_dmp1(rsa), p);
+ 	p += numbytes/2;
+-	BN2lend (rsa->dmq1, p);
++	BN2lend (RSA_get0_dmq1(rsa), p);
+ 	p += numbytes/2;
+-	BN2lend (rsa->iqmp,p);
++	BN2lend (RSA_get0_iqmp(rsa), p);
+ 	p += numbytes/2;
+-	BN2lend (rsa->d, p);
++	BN2lend (RSA_get0_d(rsa), p);
+ 	p += numbytes;
+ 	pvk->keylen = p - pvk->key + 8;
+ 	RAND_seed(pvk->key, pvk->keylen);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103190216.12J2GUEM001966>