summaryrefslogtreecommitdiff
path: root/security/pvk/files/patch-pvkwrite.c
blob: 308c9680627c8a63b31c861e0f71296d7ec69d01 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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);