View | Details | Raw Unified | Return to bug 3005 | Differences between
and this patch

Collapse All | Expand All

(-)a/digest-openssl.c (+16 lines)
Lines 63-68 const struct ssh_digest digests[] = { Link Here
63
	{ -1,			NULL,		0,	NULL },
63
	{ -1,			NULL,		0,	NULL },
64
};
64
};
65
65
66
const EVP_MD *
67
ssh_digest_to_md(int digest_type)
68
{
69
	switch (digest_type) {
70
	case SSH_DIGEST_SHA1:
71
		return EVP_sha1();
72
	case SSH_DIGEST_SHA256:
73
		return EVP_sha256();
74
	case SSH_DIGEST_SHA384:
75
		return EVP_sha384();
76
	case SSH_DIGEST_SHA512:
77
		return EVP_sha512();
78
	}
79
	return NULL;
80
}
81
66
static const struct ssh_digest *
82
static const struct ssh_digest *
67
ssh_digest_by_alg(int alg)
83
ssh_digest_by_alg(int alg)
68
{
84
{
(-)a/digest.h (+6 lines)
Lines 32-37 Link Here
32
struct sshbuf;
32
struct sshbuf;
33
struct ssh_digest_ctx;
33
struct ssh_digest_ctx;
34
34
35
#ifdef WITH_OPENSSL
36
#include <openssl/evp.h>
37
/* Converts internal digest representation to the OpenSSL one */
38
const EVP_MD *ssh_digest_to_md(int digest_type);
39
#endif
40
35
/* Looks up a digest algorithm by name */
41
/* Looks up a digest algorithm by name */
36
int ssh_digest_alg_by_name(const char *name);
42
int ssh_digest_alg_by_name(const char *name);
37
43
(-)a/regress/unittests/sshkey/common.c (-14 / +28 lines)
Lines 88-97 const BIGNUM * Link Here
88
rsa_n(struct sshkey *k)
88
rsa_n(struct sshkey *k)
89
{
89
{
90
	const BIGNUM *n = NULL;
90
	const BIGNUM *n = NULL;
91
	const RSA *rsa = NULL;
91
92
92
	ASSERT_PTR_NE(k, NULL);
93
	ASSERT_PTR_NE(k, NULL);
93
	ASSERT_PTR_NE(k->rsa, NULL);
94
	rsa = EVP_PKEY_get0_RSA(k->pkey);
94
	RSA_get0_key(k->rsa, &n, NULL, NULL);
95
	ASSERT_PTR_NE(rsa, NULL);
96
	RSA_get0_key(rsa, &n, NULL, NULL);
95
	return n;
97
	return n;
96
}
98
}
97
99
Lines 99-108 const BIGNUM * Link Here
99
rsa_e(struct sshkey *k)
101
rsa_e(struct sshkey *k)
100
{
102
{
101
	const BIGNUM *e = NULL;
103
	const BIGNUM *e = NULL;
104
	const RSA *rsa = NULL;
102
105
103
	ASSERT_PTR_NE(k, NULL);
106
	ASSERT_PTR_NE(k, NULL);
104
	ASSERT_PTR_NE(k->rsa, NULL);
107
	rsa = EVP_PKEY_get0_RSA(k->pkey);
105
	RSA_get0_key(k->rsa, NULL, &e, NULL);
108
	ASSERT_PTR_NE(rsa, NULL);
109
	RSA_get0_key(rsa, NULL, &e, NULL);
106
	return e;
110
	return e;
107
}
111
}
108
112
Lines 110-119 const BIGNUM * Link Here
110
rsa_p(struct sshkey *k)
114
rsa_p(struct sshkey *k)
111
{
115
{
112
	const BIGNUM *p = NULL;
116
	const BIGNUM *p = NULL;
117
	const RSA *rsa = NULL;
113
118
114
	ASSERT_PTR_NE(k, NULL);
119
	ASSERT_PTR_NE(k, NULL);
115
	ASSERT_PTR_NE(k->rsa, NULL);
120
	rsa = EVP_PKEY_get0_RSA(k->pkey);
116
	RSA_get0_factors(k->rsa, &p, NULL);
121
	ASSERT_PTR_NE(rsa, NULL);
122
	RSA_get0_factors(rsa, &p, NULL);
117
	return p;
123
	return p;
118
}
124
}
119
125
Lines 121-130 const BIGNUM * Link Here
121
rsa_q(struct sshkey *k)
127
rsa_q(struct sshkey *k)
122
{
128
{
123
	const BIGNUM *q = NULL;
129
	const BIGNUM *q = NULL;
130
	const RSA *rsa = NULL;
124
131
125
	ASSERT_PTR_NE(k, NULL);
132
	ASSERT_PTR_NE(k, NULL);
126
	ASSERT_PTR_NE(k->rsa, NULL);
133
	rsa = EVP_PKEY_get0_RSA(k->pkey);
127
	RSA_get0_factors(k->rsa, NULL, &q);
134
	ASSERT_PTR_NE(rsa, NULL);
135
	RSA_get0_factors(rsa, NULL, &q);
128
	return q;
136
	return q;
129
}
137
}
130
138
Lines 132-141 const BIGNUM * Link Here
132
dsa_g(struct sshkey *k)
140
dsa_g(struct sshkey *k)
133
{
141
{
134
	const BIGNUM *g = NULL;
142
	const BIGNUM *g = NULL;
143
	const DSA *dsa = NULL;
135
144
136
	ASSERT_PTR_NE(k, NULL);
145
	ASSERT_PTR_NE(k, NULL);
137
	ASSERT_PTR_NE(k->dsa, NULL);
146
	dsa = EVP_PKEY_get0_DSA(k->pkey);
138
	DSA_get0_pqg(k->dsa, NULL, NULL, &g);
147
	ASSERT_PTR_NE(dsa, NULL);
148
	DSA_get0_pqg(dsa, NULL, NULL, &g);
139
	return g;
149
	return g;
140
}
150
}
141
151
Lines 143-152 const BIGNUM * Link Here
143
dsa_pub_key(struct sshkey *k)
153
dsa_pub_key(struct sshkey *k)
144
{
154
{
145
	const BIGNUM *pub_key = NULL;
155
	const BIGNUM *pub_key = NULL;
156
	const DSA *dsa = NULL;
146
157
147
	ASSERT_PTR_NE(k, NULL);
158
	ASSERT_PTR_NE(k, NULL);
148
	ASSERT_PTR_NE(k->dsa, NULL);
159
	dsa = EVP_PKEY_get0_DSA(k->pkey);
149
	DSA_get0_key(k->dsa, &pub_key, NULL);
160
	ASSERT_PTR_NE(dsa, NULL);
161
	DSA_get0_key(dsa, &pub_key, NULL);
150
	return pub_key;
162
	return pub_key;
151
}
163
}
152
164
Lines 154-163 const BIGNUM * Link Here
154
dsa_priv_key(struct sshkey *k)
166
dsa_priv_key(struct sshkey *k)
155
{
167
{
156
	const BIGNUM *priv_key = NULL;
168
	const BIGNUM *priv_key = NULL;
169
	const DSA *dsa = NULL;
157
170
158
	ASSERT_PTR_NE(k, NULL);
171
	ASSERT_PTR_NE(k, NULL);
159
	ASSERT_PTR_NE(k->dsa, NULL);
172
	dsa = EVP_PKEY_get0_DSA(k->pkey);
160
	DSA_get0_key(k->dsa, NULL, &priv_key);
173
	ASSERT_PTR_NE(dsa, NULL);
174
	DSA_get0_key(dsa, NULL, &priv_key);
161
	return priv_key;
175
	return priv_key;
162
}
176
}
163
177
(-)a/regress/unittests/sshkey/test_file.c (-3 / +5 lines)
Lines 45-50 sshkey_file_tests(void) Link Here
45
	struct sshkey *k1, *k2;
45
	struct sshkey *k1, *k2;
46
	struct sshbuf *buf, *pw;
46
	struct sshbuf *buf, *pw;
47
	BIGNUM *a, *b, *c;
47
	BIGNUM *a, *b, *c;
48
	EC_KEY *ecdsa;
48
	char *cp;
49
	char *cp;
49
50
50
	TEST_START("load passphrase");
51
	TEST_START("load passphrase");
Lines 264-274 sshkey_file_tests(void) Link Here
264
	sshbuf_free(buf);
265
	sshbuf_free(buf);
265
	a = load_bignum("ecdsa_1.param.priv");
266
	a = load_bignum("ecdsa_1.param.priv");
266
	b = load_bignum("ecdsa_1.param.pub");
267
	b = load_bignum("ecdsa_1.param.pub");
267
	c = EC_POINT_point2bn(EC_KEY_get0_group(k1->ecdsa),
268
	ecdsa = EVP_PKEY_get0_EC_KEY(k1->pkey);
268
	    EC_KEY_get0_public_key(k1->ecdsa), POINT_CONVERSION_UNCOMPRESSED,
269
	c = EC_POINT_point2bn(EC_KEY_get0_group(ecdsa),
270
	    EC_KEY_get0_public_key(ecdsa), POINT_CONVERSION_UNCOMPRESSED,
269
	    NULL, NULL);
271
	    NULL, NULL);
270
	ASSERT_PTR_NE(c, NULL);
272
	ASSERT_PTR_NE(c, NULL);
271
	ASSERT_BIGNUM_EQ(EC_KEY_get0_private_key(k1->ecdsa), a);
273
	ASSERT_BIGNUM_EQ(EC_KEY_get0_private_key(ecdsa), a);
272
	ASSERT_BIGNUM_EQ(b, c);
274
	ASSERT_BIGNUM_EQ(b, c);
273
	BN_free(a);
275
	BN_free(a);
274
	BN_free(b);
276
	BN_free(b);
(-)a/regress/unittests/sshkey/test_sshkey.c (-13 / +26 lines)
Lines 180-185 sshkey_tests(void) Link Here
180
#ifdef OPENSSL_HAS_ECC
180
#ifdef OPENSSL_HAS_ECC
181
	struct sshkey *ke;
181
	struct sshkey *ke;
182
#endif
182
#endif
183
	const RSA *rsa;
184
	const DSA *dsa;
185
	const EC_KEY *ecdsa;
183
	struct sshbuf *b;
186
	struct sshbuf *b;
184
187
185
	TEST_START("new invalid");
188
	TEST_START("new invalid");
Lines 196-209 sshkey_tests(void) Link Here
196
	TEST_START("new/free KEY_RSA");
199
	TEST_START("new/free KEY_RSA");
197
	k1 = sshkey_new(KEY_RSA);
200
	k1 = sshkey_new(KEY_RSA);
198
	ASSERT_PTR_NE(k1, NULL);
201
	ASSERT_PTR_NE(k1, NULL);
199
	ASSERT_PTR_NE(k1->rsa, NULL);
202
	rsa = EVP_PKEY_get0_RSA(k1->pkey);
203
	ASSERT_PTR_NE(rsa, NULL);
200
	sshkey_free(k1);
204
	sshkey_free(k1);
201
	TEST_DONE();
205
	TEST_DONE();
202
206
203
	TEST_START("new/free KEY_DSA");
207
	TEST_START("new/free KEY_DSA");
204
	k1 = sshkey_new(KEY_DSA);
208
	k1 = sshkey_new(KEY_DSA);
205
	ASSERT_PTR_NE(k1, NULL);
209
	ASSERT_PTR_NE(k1, NULL);
206
	ASSERT_PTR_NE(k1->dsa, NULL);
210
	dsa = EVP_PKEY_get0_DSA(k1->pkey);
211
	ASSERT_PTR_NE(dsa, NULL);
207
	sshkey_free(k1);
212
	sshkey_free(k1);
208
	TEST_DONE();
213
	TEST_DONE();
209
214
Lines 211-217 sshkey_tests(void) Link Here
211
	TEST_START("new/free KEY_ECDSA");
216
	TEST_START("new/free KEY_ECDSA");
212
	k1 = sshkey_new(KEY_ECDSA);
217
	k1 = sshkey_new(KEY_ECDSA);
213
	ASSERT_PTR_NE(k1, NULL);
218
	ASSERT_PTR_NE(k1, NULL);
214
	ASSERT_PTR_EQ(k1->ecdsa, NULL);  /* Can't allocate without NID */
219
	ecdsa = EVP_PKEY_get0_EC_KEY(k1->pkey);
220
	ASSERT_PTR_EQ(ecdsa, NULL);  /* Can't allocate without NID */
215
	sshkey_free(k1);
221
	sshkey_free(k1);
216
	TEST_DONE();
222
	TEST_DONE();
217
#endif
223
#endif
Lines 258-264 sshkey_tests(void) Link Here
258
	    SSH_ERR_KEY_LENGTH);
264
	    SSH_ERR_KEY_LENGTH);
259
	ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 1024, &kr), 0);
265
	ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 1024, &kr), 0);
260
	ASSERT_PTR_NE(kr, NULL);
266
	ASSERT_PTR_NE(kr, NULL);
261
	ASSERT_PTR_NE(kr->rsa, NULL);
267
	rsa = EVP_PKEY_get0_RSA(kr->pkey);
268
	ASSERT_PTR_NE(rsa, NULL);
262
	ASSERT_PTR_NE(rsa_n(kr), NULL);
269
	ASSERT_PTR_NE(rsa_n(kr), NULL);
263
	ASSERT_PTR_NE(rsa_e(kr), NULL);
270
	ASSERT_PTR_NE(rsa_e(kr), NULL);
264
	ASSERT_PTR_NE(rsa_p(kr), NULL);
271
	ASSERT_PTR_NE(rsa_p(kr), NULL);
Lines 268-274 sshkey_tests(void) Link Here
268
	TEST_START("generate KEY_DSA");
275
	TEST_START("generate KEY_DSA");
269
	ASSERT_INT_EQ(sshkey_generate(KEY_DSA, 1024, &kd), 0);
276
	ASSERT_INT_EQ(sshkey_generate(KEY_DSA, 1024, &kd), 0);
270
	ASSERT_PTR_NE(kd, NULL);
277
	ASSERT_PTR_NE(kd, NULL);
271
	ASSERT_PTR_NE(kd->dsa, NULL);
278
	dsa = EVP_PKEY_get0_DSA(kd->pkey);
279
	ASSERT_PTR_NE(dsa, NULL);
272
	ASSERT_PTR_NE(dsa_g(kd), NULL);
280
	ASSERT_PTR_NE(dsa_g(kd), NULL);
273
	ASSERT_PTR_NE(dsa_priv_key(kd), NULL);
281
	ASSERT_PTR_NE(dsa_priv_key(kd), NULL);
274
	TEST_DONE();
282
	TEST_DONE();
Lines 277-285 sshkey_tests(void) Link Here
277
	TEST_START("generate KEY_ECDSA");
285
	TEST_START("generate KEY_ECDSA");
278
	ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 256, &ke), 0);
286
	ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 256, &ke), 0);
279
	ASSERT_PTR_NE(ke, NULL);
287
	ASSERT_PTR_NE(ke, NULL);
280
	ASSERT_PTR_NE(ke->ecdsa, NULL);
288
	ecdsa = EVP_PKEY_get0_EC_KEY(ke->pkey);
281
	ASSERT_PTR_NE(EC_KEY_get0_public_key(ke->ecdsa), NULL);
289
	ASSERT_PTR_NE(ecdsa, NULL);
282
	ASSERT_PTR_NE(EC_KEY_get0_private_key(ke->ecdsa), NULL);
290
	ASSERT_PTR_NE(EC_KEY_get0_public_key(ecdsa), NULL);
291
	ASSERT_PTR_NE(EC_KEY_get0_private_key(ecdsa), NULL);
283
	TEST_DONE();
292
	TEST_DONE();
284
#endif
293
#endif
285
294
Lines 296-302 sshkey_tests(void) Link Here
296
	ASSERT_PTR_NE(k1, NULL);
305
	ASSERT_PTR_NE(k1, NULL);
297
	ASSERT_PTR_NE(kr, k1);
306
	ASSERT_PTR_NE(kr, k1);
298
	ASSERT_INT_EQ(k1->type, KEY_RSA);
307
	ASSERT_INT_EQ(k1->type, KEY_RSA);
299
	ASSERT_PTR_NE(k1->rsa, NULL);
308
	rsa = EVP_PKEY_get0_RSA(k1->pkey);
309
	ASSERT_PTR_NE(rsa, NULL);
300
	ASSERT_PTR_NE(rsa_n(k1), NULL);
310
	ASSERT_PTR_NE(rsa_n(k1), NULL);
301
	ASSERT_PTR_NE(rsa_e(k1), NULL);
311
	ASSERT_PTR_NE(rsa_e(k1), NULL);
302
	ASSERT_PTR_EQ(rsa_p(k1), NULL);
312
	ASSERT_PTR_EQ(rsa_p(k1), NULL);
Lines 312-318 sshkey_tests(void) Link Here
312
	ASSERT_PTR_NE(k1, NULL);
322
	ASSERT_PTR_NE(k1, NULL);
313
	ASSERT_PTR_NE(kd, k1);
323
	ASSERT_PTR_NE(kd, k1);
314
	ASSERT_INT_EQ(k1->type, KEY_DSA);
324
	ASSERT_INT_EQ(k1->type, KEY_DSA);
315
	ASSERT_PTR_NE(k1->dsa, NULL);
325
	dsa = EVP_PKEY_get0_DSA(k1->pkey);
326
	ASSERT_PTR_NE(dsa, NULL);
316
	ASSERT_PTR_NE(dsa_g(k1), NULL);
327
	ASSERT_PTR_NE(dsa_g(k1), NULL);
317
	ASSERT_PTR_EQ(dsa_priv_key(k1), NULL);
328
	ASSERT_PTR_EQ(dsa_priv_key(k1), NULL);
318
	TEST_DONE();
329
	TEST_DONE();
Lines 328-337 sshkey_tests(void) Link Here
328
	ASSERT_PTR_NE(k1, NULL);
339
	ASSERT_PTR_NE(k1, NULL);
329
	ASSERT_PTR_NE(ke, k1);
340
	ASSERT_PTR_NE(ke, k1);
330
	ASSERT_INT_EQ(k1->type, KEY_ECDSA);
341
	ASSERT_INT_EQ(k1->type, KEY_ECDSA);
331
	ASSERT_PTR_NE(k1->ecdsa, NULL);
342
	ecdsa = EVP_PKEY_get0_EC_KEY(k1->pkey);
343
	ASSERT_PTR_NE(ecdsa, NULL);
332
	ASSERT_INT_EQ(k1->ecdsa_nid, ke->ecdsa_nid);
344
	ASSERT_INT_EQ(k1->ecdsa_nid, ke->ecdsa_nid);
333
	ASSERT_PTR_NE(EC_KEY_get0_public_key(ke->ecdsa), NULL);
345
	ASSERT_PTR_EQ(EC_KEY_get0_private_key(ecdsa), NULL);
334
	ASSERT_PTR_EQ(EC_KEY_get0_private_key(k1->ecdsa), NULL);
346
	ecdsa = EVP_PKEY_get0_EC_KEY(ke->pkey);
347
	ASSERT_PTR_NE(EC_KEY_get0_public_key(ecdsa), NULL);
335
	TEST_DONE();
348
	TEST_DONE();
336
349
337
	TEST_START("equal KEY_ECDSA/demoted KEY_ECDSA");
350
	TEST_START("equal KEY_ECDSA/demoted KEY_ECDSA");
(-)a/ssh-dss.c (-26 / +30 lines)
Lines 54-62 ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
54
{
54
{
55
	DSA_SIG *sig = NULL;
55
	DSA_SIG *sig = NULL;
56
	const BIGNUM *sig_r, *sig_s;
56
	const BIGNUM *sig_r, *sig_s;
57
	u_char digest[SSH_DIGEST_MAX_LENGTH], sigblob[SIGBLOB_LEN];
57
	u_char sigblob[SIGBLOB_LEN];
58
	size_t rlen, slen, len, dlen = ssh_digest_bytes(SSH_DIGEST_SHA1);
58
	size_t rlen, slen;
59
	int len;
59
	struct sshbuf *b = NULL;
60
	struct sshbuf *b = NULL;
61
	u_char *sigb = NULL;
62
	const u_char *psig = NULL;
60
	int ret = SSH_ERR_INVALID_ARGUMENT;
63
	int ret = SSH_ERR_INVALID_ARGUMENT;
61
64
62
	if (lenp != NULL)
65
	if (lenp != NULL)
Lines 64-83 ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
64
	if (sigp != NULL)
67
	if (sigp != NULL)
65
		*sigp = NULL;
68
		*sigp = NULL;
66
69
67
	if (key == NULL || key->dsa == NULL ||
70
	if (key == NULL || EVP_PKEY_get0_DSA(key->pkey) == NULL ||
68
	    sshkey_type_plain(key->type) != KEY_DSA)
71
	    sshkey_type_plain(key->type) != KEY_DSA)
69
		return SSH_ERR_INVALID_ARGUMENT;
72
		return SSH_ERR_INVALID_ARGUMENT;
70
	if (dlen == 0)
71
		return SSH_ERR_INTERNAL_ERROR;
72
73
73
	if ((ret = ssh_digest_memory(SSH_DIGEST_SHA1, data, datalen,
74
	ret = sshkey_calculate_signature(key->pkey, SSH_DIGEST_SHA1, &sigb, &len,
74
	    digest, sizeof(digest))) != 0)
75
	    data, datalen);
76
	if (ret < 0) {
75
		goto out;
77
		goto out;
78
	}
76
79
77
	if ((sig = DSA_do_sign(digest, dlen, key->dsa)) == NULL) {
80
	psig = sigb;
81
	if ((sig = d2i_DSA_SIG(NULL, &psig, len)) == NULL) {
78
		ret = SSH_ERR_LIBCRYPTO_ERROR;
82
		ret = SSH_ERR_LIBCRYPTO_ERROR;
79
		goto out;
83
		goto out;
80
	}
84
	}
85
	free(sigb);
86
	sigb = NULL;
81
87
82
	DSA_SIG_get0(sig, &sig_r, &sig_s);
88
	DSA_SIG_get0(sig, &sig_r, &sig_s);
83
	rlen = BN_num_bytes(sig_r);
89
	rlen = BN_num_bytes(sig_r);
Lines 110-116 ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
110
		*lenp = len;
116
		*lenp = len;
111
	ret = 0;
117
	ret = 0;
112
 out:
118
 out:
113
	explicit_bzero(digest, sizeof(digest));
119
	free(sigb);
114
	DSA_SIG_free(sig);
120
	DSA_SIG_free(sig);
115
	sshbuf_free(b);
121
	sshbuf_free(b);
116
	return ret;
122
	return ret;
Lines 123-140 ssh_dss_verify(const struct sshkey *key, Link Here
123
{
129
{
124
	DSA_SIG *sig = NULL;
130
	DSA_SIG *sig = NULL;
125
	BIGNUM *sig_r = NULL, *sig_s = NULL;
131
	BIGNUM *sig_r = NULL, *sig_s = NULL;
126
	u_char digest[SSH_DIGEST_MAX_LENGTH], *sigblob = NULL;
132
	u_char *sigblob = NULL;
127
	size_t len, dlen = ssh_digest_bytes(SSH_DIGEST_SHA1);
133
	size_t len, slen;
128
	int ret = SSH_ERR_INTERNAL_ERROR;
134
	int ret = SSH_ERR_INTERNAL_ERROR;
129
	struct sshbuf *b = NULL;
135
	struct sshbuf *b = NULL;
130
	char *ktype = NULL;
136
	char *ktype = NULL;
137
	u_char *sigb = NULL, *psig = NULL;
131
138
132
	if (key == NULL || key->dsa == NULL ||
139
	if (key == NULL || EVP_PKEY_get0_DSA(key->pkey) == NULL ||
133
	    sshkey_type_plain(key->type) != KEY_DSA ||
140
	    sshkey_type_plain(key->type) != KEY_DSA ||
134
	    signature == NULL || signaturelen == 0)
141
	    signature == NULL || signaturelen == 0)
135
		return SSH_ERR_INVALID_ARGUMENT;
142
		return SSH_ERR_INVALID_ARGUMENT;
136
	if (dlen == 0)
137
		return SSH_ERR_INTERNAL_ERROR;
138
143
139
	/* fetch signature */
144
	/* fetch signature */
140
	if ((b = sshbuf_from(signature, signaturelen)) == NULL)
145
	if ((b = sshbuf_from(signature, signaturelen)) == NULL)
Lines 176-200 ssh_dss_verify(const struct sshkey *key, Link Here
176
	}
181
	}
177
	sig_r = sig_s = NULL; /* transferred */
182
	sig_r = sig_s = NULL; /* transferred */
178
183
179
	/* sha1 the data */
184
	if ((slen = i2d_DSA_SIG(sig, NULL)) == 0) {
180
	if ((ret = ssh_digest_memory(SSH_DIGEST_SHA1, data, datalen,
185
		ret = SSH_ERR_LIBCRYPTO_ERROR;
181
	    digest, sizeof(digest))) != 0)
182
		goto out;
186
		goto out;
183
187
	}
184
	switch (DSA_do_verify(digest, dlen, sig, key->dsa)) {
188
	if ((sigb = malloc(slen)) == NULL) {
185
	case 1:
189
		ret = SSH_ERR_ALLOC_FAIL;
186
		ret = 0;
187
		break;
188
	case 0:
189
		ret = SSH_ERR_SIGNATURE_INVALID;
190
		goto out;
190
		goto out;
191
	default:
191
	}
192
	psig = sigb;
193
	if ((slen = i2d_DSA_SIG(sig, &psig)) == 0) {
192
		ret = SSH_ERR_LIBCRYPTO_ERROR;
194
		ret = SSH_ERR_LIBCRYPTO_ERROR;
193
		goto out;
195
		goto out;
194
	}
196
	}
195
197
198
	ret = sshkey_verify_signature(key->pkey, SSH_DIGEST_SHA1, data, datalen,
199
	    sigb, slen);
200
196
 out:
201
 out:
197
	explicit_bzero(digest, sizeof(digest));
198
	DSA_SIG_free(sig);
202
	DSA_SIG_free(sig);
199
	BN_clear_free(sig_r);
203
	BN_clear_free(sig_r);
200
	BN_clear_free(sig_s);
204
	BN_clear_free(sig_s);
(-)a/ssh-ecdsa.c (-30 / +34 lines)
Lines 51-60 ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
51
    const u_char *data, size_t datalen, u_int compat)
51
    const u_char *data, size_t datalen, u_int compat)
52
{
52
{
53
	ECDSA_SIG *sig = NULL;
53
	ECDSA_SIG *sig = NULL;
54
	unsigned char *sigb = NULL;
55
	const unsigned char *psig;
54
	const BIGNUM *sig_r, *sig_s;
56
	const BIGNUM *sig_r, *sig_s;
55
	int hash_alg;
57
	int hash_alg;
56
	u_char digest[SSH_DIGEST_MAX_LENGTH];
58
	int len;
57
	size_t len, dlen;
58
	struct sshbuf *b = NULL, *bb = NULL;
59
	struct sshbuf *b = NULL, *bb = NULL;
59
	int ret = SSH_ERR_INTERNAL_ERROR;
60
	int ret = SSH_ERR_INTERNAL_ERROR;
60
61
Lines 63-84 ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
63
	if (sigp != NULL)
64
	if (sigp != NULL)
64
		*sigp = NULL;
65
		*sigp = NULL;
65
66
66
	if (key == NULL || key->ecdsa == NULL ||
67
	if (key == NULL || EVP_PKEY_get0_EC_KEY(key->pkey) == NULL ||
67
	    sshkey_type_plain(key->type) != KEY_ECDSA)
68
	    sshkey_type_plain(key->type) != KEY_ECDSA)
68
		return SSH_ERR_INVALID_ARGUMENT;
69
		return SSH_ERR_INVALID_ARGUMENT;
69
70
70
	if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1 ||
71
	if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1)
71
	    (dlen = ssh_digest_bytes(hash_alg)) == 0)
72
		return SSH_ERR_INTERNAL_ERROR;
72
		return SSH_ERR_INTERNAL_ERROR;
73
	if ((ret = ssh_digest_memory(hash_alg, data, datalen,
73
74
	    digest, sizeof(digest))) != 0)
74
	ret = sshkey_calculate_signature(key->pkey, hash_alg, &sigb, &len, data,
75
	    datalen);
76
	if (ret < 0) {
75
		goto out;
77
		goto out;
78
	}
76
79
77
	if ((sig = ECDSA_do_sign(digest, dlen, key->ecdsa)) == NULL) {
80
	psig = sigb;
81
	if ((sig = d2i_ECDSA_SIG(NULL, &psig, len)) == NULL) {
78
		ret = SSH_ERR_LIBCRYPTO_ERROR;
82
		ret = SSH_ERR_LIBCRYPTO_ERROR;
79
		goto out;
83
		goto out;
80
	}
84
	}
81
82
	if ((bb = sshbuf_new()) == NULL || (b = sshbuf_new()) == NULL) {
85
	if ((bb = sshbuf_new()) == NULL || (b = sshbuf_new()) == NULL) {
83
		ret = SSH_ERR_ALLOC_FAIL;
86
		ret = SSH_ERR_ALLOC_FAIL;
84
		goto out;
87
		goto out;
Lines 102-110 ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
102
		*lenp = len;
105
		*lenp = len;
103
	ret = 0;
106
	ret = 0;
104
 out:
107
 out:
105
	explicit_bzero(digest, sizeof(digest));
106
	sshbuf_free(b);
108
	sshbuf_free(b);
107
	sshbuf_free(bb);
109
	sshbuf_free(bb);
110
	free(sigb);
108
	ECDSA_SIG_free(sig);
111
	ECDSA_SIG_free(sig);
109
	return ret;
112
	return ret;
110
}
113
}
Lines 117-136 ssh_ecdsa_verify(const struct sshkey *key, Link Here
117
{
120
{
118
	ECDSA_SIG *sig = NULL;
121
	ECDSA_SIG *sig = NULL;
119
	BIGNUM *sig_r = NULL, *sig_s = NULL;
122
	BIGNUM *sig_r = NULL, *sig_s = NULL;
120
	int hash_alg;
123
	int hash_alg, len;
121
	u_char digest[SSH_DIGEST_MAX_LENGTH];
122
	size_t dlen;
123
	int ret = SSH_ERR_INTERNAL_ERROR;
124
	int ret = SSH_ERR_INTERNAL_ERROR;
124
	struct sshbuf *b = NULL, *sigbuf = NULL;
125
	struct sshbuf *b = NULL, *sigbuf = NULL;
125
	char *ktype = NULL;
126
	char *ktype = NULL;
127
	unsigned char *sigb = NULL, *psig = NULL;
126
128
127
	if (key == NULL || key->ecdsa == NULL ||
129
	if (key == NULL || EVP_PKEY_get0_EC_KEY(key->pkey) == NULL ||
128
	    sshkey_type_plain(key->type) != KEY_ECDSA ||
130
	    sshkey_type_plain(key->type) != KEY_ECDSA ||
129
	    signature == NULL || signaturelen == 0)
131
	    signature == NULL || signaturelen == 0)
130
		return SSH_ERR_INVALID_ARGUMENT;
132
		return SSH_ERR_INVALID_ARGUMENT;
131
133
132
	if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1 ||
134
	if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1)
133
	    (dlen = ssh_digest_bytes(hash_alg)) == 0)
134
		return SSH_ERR_INTERNAL_ERROR;
135
		return SSH_ERR_INTERNAL_ERROR;
135
136
136
	/* fetch signature */
137
	/* fetch signature */
Lines 166-199 ssh_ecdsa_verify(const struct sshkey *key, Link Here
166
	}
167
	}
167
	sig_r = sig_s = NULL; /* transferred */
168
	sig_r = sig_s = NULL; /* transferred */
168
169
169
	if (sshbuf_len(sigbuf) != 0) {
170
	/* Figure out the length */
170
		ret = SSH_ERR_UNEXPECTED_TRAILING_DATA;
171
	if ((len = i2d_ECDSA_SIG(sig, NULL)) == 0) {
172
		ret = SSH_ERR_LIBCRYPTO_ERROR;
171
		goto out;
173
		goto out;
172
	}
174
	}
173
	if ((ret = ssh_digest_memory(hash_alg, data, datalen,
175
	if ((sigb = malloc(len)) == NULL) {
174
	    digest, sizeof(digest))) != 0)
176
		ret = SSH_ERR_ALLOC_FAIL;
175
		goto out;
176
177
	switch (ECDSA_do_verify(digest, dlen, sig, key->ecdsa)) {
178
	case 1:
179
		ret = 0;
180
		break;
181
	case 0:
182
		ret = SSH_ERR_SIGNATURE_INVALID;
183
		goto out;
177
		goto out;
184
	default:
178
	}
179
	psig = sigb;
180
	if ((len = i2d_ECDSA_SIG(sig, &psig)) == 0) {
185
		ret = SSH_ERR_LIBCRYPTO_ERROR;
181
		ret = SSH_ERR_LIBCRYPTO_ERROR;
186
		goto out;
182
		goto out;
187
	}
183
	}
188
184
185
	if (sshbuf_len(sigbuf) != 0) {
186
		ret = SSH_ERR_UNEXPECTED_TRAILING_DATA;
187
		goto out;
188
	}
189
190
	ret = sshkey_verify_signature(key->pkey, hash_alg, data, datalen,
191
	    sigb, len);
192
189
 out:
193
 out:
190
	explicit_bzero(digest, sizeof(digest));
191
	sshbuf_free(sigbuf);
194
	sshbuf_free(sigbuf);
192
	sshbuf_free(b);
195
	sshbuf_free(b);
193
	ECDSA_SIG_free(sig);
196
	ECDSA_SIG_free(sig);
194
	BN_clear_free(sig_r);
197
	BN_clear_free(sig_r);
195
	BN_clear_free(sig_s);
198
	BN_clear_free(sig_s);
196
	free(ktype);
199
	free(ktype);
200
	free(sigb);
197
	return ret;
201
	return ret;
198
}
202
}
199
203
(-)a/ssh-keygen.c (-16 / +34 lines)
Lines 328-343 do_convert_to_pkcs8(struct sshkey *k) Link Here
328
{
328
{
329
	switch (sshkey_type_plain(k->type)) {
329
	switch (sshkey_type_plain(k->type)) {
330
	case KEY_RSA:
330
	case KEY_RSA:
331
		if (!PEM_write_RSA_PUBKEY(stdout, k->rsa))
331
		if (!PEM_write_RSA_PUBKEY(stdout, EVP_PKEY_get0_RSA(k->pkey)))
332
			fatal("PEM_write_RSA_PUBKEY failed");
332
			fatal("PEM_write_RSA_PUBKEY failed");
333
		break;
333
		break;
334
	case KEY_DSA:
334
	case KEY_DSA:
335
		if (!PEM_write_DSA_PUBKEY(stdout, k->dsa))
335
		if (!PEM_write_DSA_PUBKEY(stdout, EVP_PKEY_get0_DSA(k->pkey)))
336
			fatal("PEM_write_DSA_PUBKEY failed");
336
			fatal("PEM_write_DSA_PUBKEY failed");
337
		break;
337
		break;
338
#ifdef OPENSSL_HAS_ECC
338
#ifdef OPENSSL_HAS_ECC
339
	case KEY_ECDSA:
339
	case KEY_ECDSA:
340
		if (!PEM_write_EC_PUBKEY(stdout, k->ecdsa))
340
		if (!PEM_write_EC_PUBKEY(stdout, EVP_PKEY_get0_EC_KEY(k->pkey)))
341
			fatal("PEM_write_EC_PUBKEY failed");
341
			fatal("PEM_write_EC_PUBKEY failed");
342
		break;
342
		break;
343
#endif
343
#endif
Lines 352-358 do_convert_to_pem(struct sshkey *k) Link Here
352
{
352
{
353
	switch (sshkey_type_plain(k->type)) {
353
	switch (sshkey_type_plain(k->type)) {
354
	case KEY_RSA:
354
	case KEY_RSA:
355
		if (!PEM_write_RSAPublicKey(stdout, k->rsa))
355
		if (!PEM_write_RSAPublicKey(stdout, EVP_PKEY_get1_RSA(k->pkey)))
356
			fatal("PEM_write_RSAPublicKey failed");
356
			fatal("PEM_write_RSAPublicKey failed");
357
		break;
357
		break;
358
	default:
358
	default:
Lines 427-432 do_convert_private_ssh2_from_blob(u_char *blob, u_int blen) Link Here
427
	BIGNUM *dsa_pub_key = NULL, *dsa_priv_key = NULL;
427
	BIGNUM *dsa_pub_key = NULL, *dsa_priv_key = NULL;
428
	BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
428
	BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
429
	BIGNUM *rsa_p = NULL, *rsa_q = NULL, *rsa_iqmp = NULL;
429
	BIGNUM *rsa_p = NULL, *rsa_q = NULL, *rsa_iqmp = NULL;
430
	RSA *rsa;
431
	DSA *dsa;
432
430
	if ((b = sshbuf_from(blob, blen)) == NULL)
433
	if ((b = sshbuf_from(blob, blen)) == NULL)
431
		fatal("%s: sshbuf_from failed", __func__);
434
		fatal("%s: sshbuf_from failed", __func__);
432
	if ((r = sshbuf_get_u32(b, &magic)) != 0)
435
	if ((r = sshbuf_get_u32(b, &magic)) != 0)
Lines 481-490 do_convert_private_ssh2_from_blob(u_char *blob, u_int blen) Link Here
481
		buffer_get_bignum_bits(b, dsa_q);
484
		buffer_get_bignum_bits(b, dsa_q);
482
		buffer_get_bignum_bits(b, dsa_pub_key);
485
		buffer_get_bignum_bits(b, dsa_pub_key);
483
		buffer_get_bignum_bits(b, dsa_priv_key);
486
		buffer_get_bignum_bits(b, dsa_priv_key);
484
		if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g))
487
		dsa = EVP_PKEY_get0_DSA(key->pkey);
488
		if (!DSA_set0_pqg(dsa, dsa_p, dsa_q, dsa_g))
485
			fatal("%s: DSA_set0_pqg failed", __func__);
489
			fatal("%s: DSA_set0_pqg failed", __func__);
486
		dsa_p = dsa_q = dsa_g = NULL; /* transferred */
490
		dsa_p = dsa_q = dsa_g = NULL; /* transferred */
487
		if (!DSA_set0_key(key->dsa, dsa_pub_key, dsa_priv_key))
491
		if (!DSA_set0_key(dsa, dsa_pub_key, dsa_priv_key))
488
			fatal("%s: DSA_set0_key failed", __func__);
492
			fatal("%s: DSA_set0_key failed", __func__);
489
		dsa_pub_key = dsa_priv_key = NULL; /* transferred */
493
		dsa_pub_key = dsa_priv_key = NULL; /* transferred */
490
		break;
494
		break;
Lines 522-531 do_convert_private_ssh2_from_blob(u_char *blob, u_int blen) Link Here
522
		buffer_get_bignum_bits(b, rsa_iqmp);
526
		buffer_get_bignum_bits(b, rsa_iqmp);
523
		buffer_get_bignum_bits(b, rsa_q);
527
		buffer_get_bignum_bits(b, rsa_q);
524
		buffer_get_bignum_bits(b, rsa_p);
528
		buffer_get_bignum_bits(b, rsa_p);
525
		if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, rsa_d))
529
		rsa = EVP_PKEY_get0_RSA(key->pkey);
530
		if (!RSA_set0_key(rsa, rsa_n, rsa_e, rsa_d))
526
			fatal("%s: RSA_set0_key failed", __func__);
531
			fatal("%s: RSA_set0_key failed", __func__);
527
		rsa_n = rsa_e = rsa_d = NULL; /* transferred */
532
		rsa_n = rsa_e = rsa_d = NULL; /* transferred */
528
		if (!RSA_set0_factors(key->rsa, rsa_p, rsa_q))
533
		if (!RSA_set0_factors(rsa, rsa_p, rsa_q))
529
			fatal("%s: RSA_set0_factors failed", __func__);
534
			fatal("%s: RSA_set0_factors failed", __func__);
530
		rsa_p = rsa_q = NULL; /* transferred */
535
		rsa_p = rsa_q = NULL; /* transferred */
531
		if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0)
536
		if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0)
Lines 643-663 do_convert_from_pkcs8(struct sshkey **k, int *private) Link Here
643
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
648
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
644
			fatal("sshkey_new failed");
649
			fatal("sshkey_new failed");
645
		(*k)->type = KEY_RSA;
650
		(*k)->type = KEY_RSA;
646
		(*k)->rsa = EVP_PKEY_get1_RSA(pubkey);
651
		EVP_PKEY_free((*k)->pkey);
652
		(*k)->pkey = pubkey;
653
		pubkey = NULL;
647
		break;
654
		break;
648
	case EVP_PKEY_DSA:
655
	case EVP_PKEY_DSA:
649
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
656
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
650
			fatal("sshkey_new failed");
657
			fatal("sshkey_new failed");
651
		(*k)->type = KEY_DSA;
658
		(*k)->type = KEY_DSA;
652
		(*k)->dsa = EVP_PKEY_get1_DSA(pubkey);
659
		EVP_PKEY_free((*k)->pkey);
660
		(*k)->pkey = pubkey;
661
		pubkey = NULL;
653
		break;
662
		break;
654
#ifdef OPENSSL_HAS_ECC
663
#ifdef OPENSSL_HAS_ECC
655
	case EVP_PKEY_EC:
664
	case EVP_PKEY_EC:
656
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
665
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
657
			fatal("sshkey_new failed");
666
			fatal("sshkey_new failed");
658
		(*k)->type = KEY_ECDSA;
667
		(*k)->type = KEY_ECDSA;
659
		(*k)->ecdsa = EVP_PKEY_get1_EC_KEY(pubkey);
668
		EVP_PKEY_free((*k)->pkey);
660
		(*k)->ecdsa_nid = sshkey_ecdsa_key_to_nid((*k)->ecdsa);
669
		(*k)->pkey = pubkey;
670
		pubkey = NULL;
671
		(*k)->ecdsa_nid = sshkey_ecdsa_key_to_nid(*k);
661
		break;
672
		break;
662
#endif
673
#endif
663
	default:
674
	default:
Lines 680-686 do_convert_from_pem(struct sshkey **k, int *private) Link Here
680
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
691
		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
681
			fatal("sshkey_new failed");
692
			fatal("sshkey_new failed");
682
		(*k)->type = KEY_RSA;
693
		(*k)->type = KEY_RSA;
683
		(*k)->rsa = rsa;
694
		(*k)->pkey = EVP_PKEY_new();
695
		EVP_PKEY_set1_RSA((*k)->pkey, rsa);
684
		fclose(fp);
696
		fclose(fp);
685
		return;
697
		return;
686
	}
698
	}
Lines 693-698 do_convert_from(struct passwd *pw) Link Here
693
	struct sshkey *k = NULL;
705
	struct sshkey *k = NULL;
694
	int r, private = 0, ok = 0;
706
	int r, private = 0, ok = 0;
695
	struct stat st;
707
	struct stat st;
708
	RSA *rsa;
709
	DSA *dsa;
710
	EC_KEY *ecdsa;
696
711
697
	if (!have_identity)
712
	if (!have_identity)
698
		ask_filename(pw, "Enter file in which the key is");
713
		ask_filename(pw, "Enter file in which the key is");
Lines 721-737 do_convert_from(struct passwd *pw) Link Here
721
	} else {
736
	} else {
722
		switch (k->type) {
737
		switch (k->type) {
723
		case KEY_DSA:
738
		case KEY_DSA:
724
			ok = PEM_write_DSAPrivateKey(stdout, k->dsa, NULL,
739
			dsa = EVP_PKEY_get0_DSA(k->pkey);
740
			ok = PEM_write_DSAPrivateKey(stdout, dsa, NULL,
725
			    NULL, 0, NULL, NULL);
741
			    NULL, 0, NULL, NULL);
726
			break;
742
			break;
727
#ifdef OPENSSL_HAS_ECC
743
#ifdef OPENSSL_HAS_ECC
728
		case KEY_ECDSA:
744
		case KEY_ECDSA:
729
			ok = PEM_write_ECPrivateKey(stdout, k->ecdsa, NULL,
745
			ecdsa = EVP_PKEY_get0_EC_KEY(k->pkey);
746
			ok = PEM_write_ECPrivateKey(stdout, ecdsa, NULL,
730
			    NULL, 0, NULL, NULL);
747
			    NULL, 0, NULL, NULL);
731
			break;
748
			break;
732
#endif
749
#endif
733
		case KEY_RSA:
750
		case KEY_RSA:
734
			ok = PEM_write_RSAPrivateKey(stdout, k->rsa, NULL,
751
			rsa = EVP_PKEY_get0_RSA(k->pkey);
752
			ok = PEM_write_RSAPrivateKey(stdout, rsa, NULL,
735
			    NULL, 0, NULL, NULL);
753
			    NULL, 0, NULL, NULL);
736
			break;
754
			break;
737
		default:
755
		default:
(-)a/ssh-pkcs11-client.c (-16 / +23 lines)
Lines 130-138 rsa_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa, int padding) Link Here
130
		error("%s: sshkey_new failed", __func__);
130
		error("%s: sshkey_new failed", __func__);
131
		goto fail;
131
		goto fail;
132
	}
132
	}
133
	key->pkey = EVP_PKEY_new();
134
	if (key->pkey == NULL) {
135
		error("%s: EVP_PKEY_new failed", __func__);
136
		goto fail;
137
	}
138
133
	key->type = KEY_RSA;
139
	key->type = KEY_RSA;
134
	RSA_up_ref(rsa);
140
	EVP_PKEY_set1_RSA(key->pkey, rsa);
135
	key->rsa = rsa;
136
	if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) {
141
	if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) {
137
		error("%s: sshkey_to_blob: %s", __func__, ssh_err(r));
142
		error("%s: sshkey_to_blob: %s", __func__, ssh_err(r));
138
		goto fail;
143
		goto fail;
Lines 174-197 ecdsa_do_sign(const unsigned char *dgst, int dgst_len, const BIGNUM *inv, Link Here
174
	const u_char *cp;
179
	const u_char *cp;
175
	u_char *blob = NULL, *signature = NULL;
180
	u_char *blob = NULL, *signature = NULL;
176
	size_t blen, slen = 0;
181
	size_t blen, slen = 0;
177
	int r, nid;
182
	int r;
178
179
	nid = sshkey_ecdsa_key_to_nid(ec);
180
	if (nid < 0) {
181
		error("%s: couldn't get curve nid", __func__);
182
		goto fail;
183
	}
184
183
185
	key = sshkey_new(KEY_UNSPEC);
184
	key = sshkey_new(KEY_UNSPEC);
186
	if (key == NULL) {
185
	if (key == NULL) {
187
		error("%s: sshkey_new failed", __func__);
186
		error("%s: sshkey_new failed", __func__);
188
		goto fail;
187
		goto fail;
189
	}
188
	}
190
	key->ecdsa = ec;
189
191
	key->ecdsa_nid = nid;
192
	key->type = KEY_ECDSA;
190
	key->type = KEY_ECDSA;
191
	EVP_PKEY_set1_EC_KEY(key->pkey, ec);
193
	EC_KEY_up_ref(ec);
192
	EC_KEY_up_ref(ec);
194
193
194
	key->ecdsa_nid = sshkey_ecdsa_key_to_nid(key);
195
	if (key->ecdsa_nid < 0) {
196
		error("%s: couldn't get curve nid", __func__);
197
		goto fail;
198
	}
199
195
	if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) {
200
	if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) {
196
		error("%s: sshkey_to_blob: %s", __func__, ssh_err(r));
201
		error("%s: sshkey_to_blob: %s", __func__, ssh_err(r));
197
		goto fail;
202
		goto fail;
Lines 231-243 static EC_KEY_METHOD *helper_ecdsa; Link Here
231
static void
236
static void
232
wrap_key(struct sshkey *k)
237
wrap_key(struct sshkey *k)
233
{
238
{
234
	if (k->type == KEY_RSA)
239
	if (k->type == KEY_RSA) {
235
		RSA_set_method(k->rsa, helper_rsa);
240
		RSA *rsa = EVP_PKEY_get0_RSA(k->pkey);
241
		RSA_set_method(rsa, helper_rsa);
236
#ifdef HAVE_EC_KEY_METHOD_NEW
242
#ifdef HAVE_EC_KEY_METHOD_NEW
237
	else if (k->type == KEY_ECDSA)
243
	} else if (k->type == KEY_ECDSA) {
238
		EC_KEY_set_method(k->ecdsa, helper_ecdsa);
244
		EC_KEY *ecdsa = EVP_PKEY_get0_EC_KEY(k->pkey);
245
		EC_KEY_set_method(ecdsa, helper_ecdsa);
239
#endif /* HAVE_EC_KEY_METHOD_NEW */
246
#endif /* HAVE_EC_KEY_METHOD_NEW */
240
	else
247
	} else
241
		fatal("%s: unknown key type", __func__);
248
		fatal("%s: unknown key type", __func__);
242
}
249
}
243
250
(-)a/ssh-pkcs11-helper.c (-4 / +10 lines)
Lines 39-44 Link Here
39
#include "ssh-pkcs11.h"
39
#include "ssh-pkcs11.h"
40
#include "ssherr.h"
40
#include "ssherr.h"
41
41
42
#ifdef WITH_OPENSSL
43
#include <openssl/rsa.h>
44
#endif
45
42
#ifdef ENABLE_PKCS11
46
#ifdef ENABLE_PKCS11
43
47
44
/* borrows code from sftp-server and ssh-agent */
48
/* borrows code from sftp-server and ssh-agent */
Lines 200-219 process_sign(void) Link Here
200
204
201
			pkcs11_refresh_key(found);
205
			pkcs11_refresh_key(found);
202
			if (key->type == KEY_RSA) {
206
			if (key->type == KEY_RSA) {
203
				slen = RSA_size(key->rsa);
207
				RSA *rsa = EVP_PKEY_get0_RSA(found->pkey);
208
				slen = RSA_size(rsa);
204
				signature = xmalloc(slen);
209
				signature = xmalloc(slen);
205
				ret = RSA_private_encrypt(dlen, data, signature,
210
				ret = RSA_private_encrypt(dlen, data, signature,
206
				    found->rsa, RSA_PKCS1_PADDING);
211
				    rsa, RSA_PKCS1_PADDING);
207
				if (ret != -1) {
212
				if (ret != -1) {
208
					slen = ret;
213
					slen = ret;
209
					ok = 0;
214
					ok = 0;
210
				}
215
				}
211
			} else if (key->type == KEY_ECDSA) {
216
			} else if (key->type == KEY_ECDSA) {
212
				xslen = ECDSA_size(key->ecdsa);
217
				EC_KEY *ecdsa = EVP_PKEY_get0_EC_KEY(found->pkey);
218
				xslen = ECDSA_size(ecdsa);
213
				signature = xmalloc(xslen);
219
				signature = xmalloc(xslen);
214
				/* "The parameter type is ignored." */
220
				/* "The parameter type is ignored." */
215
				ret = ECDSA_sign(-1, data, dlen, signature,
221
				ret = ECDSA_sign(-1, data, dlen, signature,
216
				    &xslen, found->ecdsa);
222
				    &xslen, ecdsa);
217
				if (ret != 0)
223
				if (ret != 0)
218
					ok = 0;
224
					ok = 0;
219
				else
225
				else
(-)a/ssh-pkcs11.c (-32 / +38 lines)
Lines 399-422 static int pkcs11_reload_key(struct sshkey *key, struct pkcs11_key *k11) Link Here
399
399
400
int pkcs11_refresh_key(struct sshkey *key)
400
int pkcs11_refresh_key(struct sshkey *key)
401
{
401
{
402
	struct pkcs11_key	*k11;
402
	struct pkcs11_key	*k11 = NULL;
403
	RSA *rsa;
404
	EC_KEY *ecdsa;
403
405
404
	switch (key->type) {
406
	switch (key->type) {
405
	case KEY_RSA:
407
	case KEY_RSA:
406
		if ((k11 = RSA_get_ex_data(key->rsa, rsa_idx)) == NULL) {
408
		if ((rsa = EVP_PKEY_get0_RSA(key->pkey)) == NULL ||
407
			error("RSA_get_ex_data failed for rsa %p", key->rsa);
409
		    (k11 = RSA_get_ex_data(rsa, rsa_idx)) == NULL) {
410
			error("RSA_get_ex_data failed for rsa %p", rsa);
408
			return (-1);
411
			return (-1);
409
		}
412
		}
410
		break;
413
		break;
411
	case KEY_ECDSA:
414
	case KEY_ECDSA:
412
		if ((k11 = EC_KEY_get_ex_data(key->ecdsa, ec_key_idx)) == NULL) {
415
		if ((ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey)) == NULL ||
413
			error("EC_KEY_get_ex_data failed for ecdsa %p", key->ecdsa);
416
		    (k11 = EC_KEY_get_ex_data(ecdsa, ec_key_idx)) == NULL) {
417
			error("EC_KEY_get_ex_data failed for ecdsa %p", ecdsa);
414
			return (-1);
418
			return (-1);
415
		}
419
		}
416
		break;
420
		break;
417
	}
421
	}
418
	if (!k11->provider || !k11->provider->valid) {
422
	if (!k11 || !k11->provider || !k11->provider->valid) {
419
		error("no pkcs11 (valid) provider for rsa %p", key->rsa);
423
		error("no pkcs11 (valid) provider for key");
420
		return (-1);
424
		return (-1);
421
	}
425
	}
422
426
Lines 817-823 pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
817
	struct sshkey		*key = NULL;
821
	struct sshkey		*key = NULL;
818
	const unsigned char	*attrp = NULL;
822
	const unsigned char	*attrp = NULL;
819
	int			 i;
823
	int			 i;
820
	int			 nid;
821
824
822
	memset(&key_attr, 0, sizeof(key_attr));
825
	memset(&key_attr, 0, sizeof(key_attr));
823
	key_attr[0].type = CKA_ID;
826
	key_attr[0].type = CKA_ID;
Lines 892-903 pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
892
		goto fail;
895
		goto fail;
893
	}
896
	}
894
897
895
	nid = sshkey_ecdsa_key_to_nid(ec);
896
	if (nid < 0) {
897
		error("couldn't get curve nid");
898
		goto fail;
899
	}
900
901
	if (pkcs11_ecdsa_wrap(p, slotidx, &key_attr[0], ec))
898
	if (pkcs11_ecdsa_wrap(p, slotidx, &key_attr[0], ec))
902
		goto fail;
899
		goto fail;
903
900
Lines 906-918 pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
906
		error("sshkey_new failed");
903
		error("sshkey_new failed");
907
		goto fail;
904
		goto fail;
908
	}
905
	}
909
910
	key->ecdsa = ec;
911
	key->ecdsa_nid = nid;
912
	key->type = KEY_ECDSA;
906
	key->type = KEY_ECDSA;
913
	key->flags |= SSHKEY_FLAG_EXT;
907
	key->flags |= SSHKEY_FLAG_EXT;
908
	EVP_PKEY_set1_EC_KEY(key->pkey, ec);
914
	ec = NULL;	/* now owned by key */
909
	ec = NULL;	/* now owned by key */
915
910
911
	key->ecdsa_nid = sshkey_ecdsa_key_to_nid(key);
912
	if (key->ecdsa_nid < 0) {
913
		error("couldn't get curve nid");
914
		goto fail;
915
	}
916
917
916
fail:
918
fail:
917
	for (i = 0; i < 3; i++)
919
	for (i = 0; i < 3; i++)
918
		free(key_attr[i].pValue);
920
		free(key_attr[i].pValue);
Lines 1003-1009 pkcs11_fetch_rsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
1003
		goto fail;
1005
		goto fail;
1004
	}
1006
	}
1005
1007
1006
	key->rsa = rsa;
1008
	key->pkey = EVP_PKEY_new();
1009
	if (key == NULL) {
1010
		error("EVP_PKEY_new failed");
1011
		goto fail;
1012
	}
1013
	EVP_PKEY_set1_RSA(key->pkey, rsa);
1007
	key->type = KEY_RSA;
1014
	key->type = KEY_RSA;
1008
	key->flags |= SSHKEY_FLAG_EXT;
1015
	key->flags |= SSHKEY_FLAG_EXT;
1009
	rsa = NULL;	/* now owned by key */
1016
	rsa = NULL;	/* now owned by key */
Lines 1030-1038 pkcs11_fetch_x509_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
1030
	EC_KEY			*ec = NULL;
1037
	EC_KEY			*ec = NULL;
1031
	struct sshkey		*key = NULL;
1038
	struct sshkey		*key = NULL;
1032
	int			 i;
1039
	int			 i;
1033
#ifdef HAVE_EC_KEY_METHOD_NEW
1034
	int			 nid;
1035
#endif
1036
	const u_char		 *cp;
1040
	const u_char		 *cp;
1037
1041
1038
	memset(&cert_attr, 0, sizeof(cert_attr));
1042
	memset(&cert_attr, 0, sizeof(cert_attr));
Lines 1109-1116 pkcs11_fetch_x509_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
1109
			error("sshkey_new failed");
1113
			error("sshkey_new failed");
1110
			goto fail;
1114
			goto fail;
1111
		}
1115
		}
1112
1116
		if (key == NULL) {
1113
		key->rsa = rsa;
1117
			error("EVP_PKEY_new failed");
1118
			goto fail;
1119
		}
1120
		EVP_PKEY_set1_RSA(key->pkey, rsa);
1114
		key->type = KEY_RSA;
1121
		key->type = KEY_RSA;
1115
		key->flags |= SSHKEY_FLAG_EXT;
1122
		key->flags |= SSHKEY_FLAG_EXT;
1116
		rsa = NULL;	/* now owned by key */
1123
		rsa = NULL;	/* now owned by key */
Lines 1125-1136 pkcs11_fetch_x509_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
1125
			goto fail;
1132
			goto fail;
1126
		}
1133
		}
1127
1134
1128
		nid = sshkey_ecdsa_key_to_nid(ec);
1129
		if (nid < 0) {
1130
			error("couldn't get curve nid");
1131
			goto fail;
1132
		}
1133
1134
		if (pkcs11_ecdsa_wrap(p, slotidx, &cert_attr[0], ec))
1135
		if (pkcs11_ecdsa_wrap(p, slotidx, &cert_attr[0], ec))
1135
			goto fail;
1136
			goto fail;
1136
1137
Lines 1139-1150 pkcs11_fetch_x509_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, Link Here
1139
			error("sshkey_new failed");
1140
			error("sshkey_new failed");
1140
			goto fail;
1141
			goto fail;
1141
		}
1142
		}
1142
1143
		key->ecdsa = ec;
1144
		key->ecdsa_nid = nid;
1145
		key->type = KEY_ECDSA;
1143
		key->type = KEY_ECDSA;
1146
		key->flags |= SSHKEY_FLAG_EXT;
1144
		key->flags |= SSHKEY_FLAG_EXT;
1145
		EVP_PKEY_set1_EC_KEY(key->pkey, ec);
1147
		ec = NULL;	/* now owned by key */
1146
		ec = NULL;	/* now owned by key */
1147
1148
		key->ecdsa_nid = sshkey_ecdsa_key_to_nid(key);
1149
		if (key->ecdsa_nid < 0) {
1150
			error("couldn't get curve nid");
1151
			goto fail;
1152
		}
1153
1148
#endif /* HAVE_EC_KEY_METHOD_NEW */
1154
#endif /* HAVE_EC_KEY_METHOD_NEW */
1149
	} else
1155
	} else
1150
		error("unknown certificate key type");
1156
		error("unknown certificate key type");
(-)a/ssh-rsa.c (-167 / +38 lines)
Lines 37-43 Link Here
37
37
38
#include "openbsd-compat/openssl-compat.h"
38
#include "openbsd-compat/openssl-compat.h"
39
39
40
static int openssh_RSA_verify(int, u_char *, size_t, u_char *, size_t, RSA *);
40
static int openssh_RSA_verify(int, const u_char *, size_t, u_char *, size_t, EVP_PKEY *);
41
41
42
static const char *
42
static const char *
43
rsa_hash_alg_ident(int hash_alg)
43
rsa_hash_alg_ident(int hash_alg)
Lines 90-110 rsa_hash_id_from_keyname(const char *alg) Link Here
90
	return -1;
90
	return -1;
91
}
91
}
92
92
93
static int
94
rsa_hash_alg_nid(int type)
95
{
96
	switch (type) {
97
	case SSH_DIGEST_SHA1:
98
		return NID_sha1;
99
	case SSH_DIGEST_SHA256:
100
		return NID_sha256;
101
	case SSH_DIGEST_SHA512:
102
		return NID_sha512;
103
	default:
104
		return -1;
105
	}
106
}
107
108
int
93
int
109
ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp)
94
ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp)
110
{
95
{
Lines 112-125 ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp) Link Here
112
	BIGNUM *aux = NULL, *d_consttime = NULL;
97
	BIGNUM *aux = NULL, *d_consttime = NULL;
113
	BIGNUM *rsa_dmq1 = NULL, *rsa_dmp1 = NULL, *rsa_iqmp = NULL;
98
	BIGNUM *rsa_dmq1 = NULL, *rsa_dmp1 = NULL, *rsa_iqmp = NULL;
114
	BN_CTX *ctx = NULL;
99
	BN_CTX *ctx = NULL;
100
	RSA *rsa;
115
	int r;
101
	int r;
116
102
117
	if (key == NULL || key->rsa == NULL ||
103
	rsa = EVP_PKEY_get0_RSA(key->pkey);
104
	if (key == NULL || rsa == NULL ||
118
	    sshkey_type_plain(key->type) != KEY_RSA)
105
	    sshkey_type_plain(key->type) != KEY_RSA)
119
		return SSH_ERR_INVALID_ARGUMENT;
106
		return SSH_ERR_INVALID_ARGUMENT;
120
107
121
	RSA_get0_key(key->rsa, NULL, NULL, &rsa_d);
108
	RSA_get0_key(rsa, NULL, NULL, &rsa_d);
122
	RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
109
	RSA_get0_factors(rsa, &rsa_p, &rsa_q);
123
110
124
	if ((ctx = BN_CTX_new()) == NULL)
111
	if ((ctx = BN_CTX_new()) == NULL)
125
		return SSH_ERR_ALLOC_FAIL;
112
		return SSH_ERR_ALLOC_FAIL;
Lines 142-148 ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp) Link Here
142
		r = SSH_ERR_LIBCRYPTO_ERROR;
129
		r = SSH_ERR_LIBCRYPTO_ERROR;
143
		goto out;
130
		goto out;
144
	}
131
	}
145
	if (!RSA_set0_crt_params(key->rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp)) {
132
	if (!RSA_set0_crt_params(rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp)) {
146
		r = SSH_ERR_LIBCRYPTO_ERROR;
133
		r = SSH_ERR_LIBCRYPTO_ERROR;
147
		goto out;
134
		goto out;
148
	}
135
	}
Lines 164-174 int Link Here
164
ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
151
ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
165
    const u_char *data, size_t datalen, const char *alg_ident)
152
    const u_char *data, size_t datalen, const char *alg_ident)
166
{
153
{
167
	const BIGNUM *rsa_n;
154
	const RSA *rsa;
168
	u_char digest[SSH_DIGEST_MAX_LENGTH], *sig = NULL;
155
	u_char *sig = NULL;
169
	size_t slen = 0;
156
	int len, slen = 0;
170
	u_int dlen, len;
157
	int hash_alg, ret = SSH_ERR_INTERNAL_ERROR;
171
	int nid, hash_alg, ret = SSH_ERR_INTERNAL_ERROR;
172
	struct sshbuf *b = NULL;
158
	struct sshbuf *b = NULL;
173
159
174
	if (lenp != NULL)
160
	if (lenp != NULL)
Lines 180-212 ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
180
		hash_alg = SSH_DIGEST_SHA1;
166
		hash_alg = SSH_DIGEST_SHA1;
181
	else
167
	else
182
		hash_alg = rsa_hash_id_from_keyname(alg_ident);
168
		hash_alg = rsa_hash_id_from_keyname(alg_ident);
183
	if (key == NULL || key->rsa == NULL || hash_alg == -1 ||
169
170
	rsa = EVP_PKEY_get0_RSA(key->pkey);
171
	if (key == NULL || rsa == NULL || hash_alg == -1 ||
184
	    sshkey_type_plain(key->type) != KEY_RSA)
172
	    sshkey_type_plain(key->type) != KEY_RSA)
185
		return SSH_ERR_INVALID_ARGUMENT;
173
		return SSH_ERR_INVALID_ARGUMENT;
186
	RSA_get0_key(key->rsa, &rsa_n, NULL, NULL);
174
	slen = RSA_size(rsa);
187
	if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
175
	if (RSA_bits(rsa) < SSH_RSA_MINIMUM_MODULUS_SIZE)
188
		return SSH_ERR_KEY_LENGTH;
176
		return SSH_ERR_KEY_LENGTH;
189
	slen = RSA_size(key->rsa);
190
	if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM)
191
		return SSH_ERR_INVALID_ARGUMENT;
192
177
193
	/* hash the data */
178
	ret = sshkey_calculate_signature(key->pkey, hash_alg, &sig, &len, data,
194
	nid = rsa_hash_alg_nid(hash_alg);
179
	    datalen);
195
	if ((dlen = ssh_digest_bytes(hash_alg)) == 0)
180
	if (ret < 0) {
196
		return SSH_ERR_INTERNAL_ERROR;
197
	if ((ret = ssh_digest_memory(hash_alg, data, datalen,
198
	    digest, sizeof(digest))) != 0)
199
		goto out;
200
201
	if ((sig = malloc(slen)) == NULL) {
202
		ret = SSH_ERR_ALLOC_FAIL;
203
		goto out;
181
		goto out;
204
	}
182
	}
205
183
206
	if (RSA_sign(nid, digest, dlen, sig, &len, key->rsa) != 1) {
207
		ret = SSH_ERR_LIBCRYPTO_ERROR;
208
		goto out;
209
	}
210
	if (len < slen) {
184
	if (len < slen) {
211
		size_t diff = slen - len;
185
		size_t diff = slen - len;
212
		memmove(sig + diff, sig, len);
186
		memmove(sig + diff, sig, len);
Lines 215-220 ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
215
		ret = SSH_ERR_INTERNAL_ERROR;
189
		ret = SSH_ERR_INTERNAL_ERROR;
216
		goto out;
190
		goto out;
217
	}
191
	}
192
218
	/* encode signature */
193
	/* encode signature */
219
	if ((b = sshbuf_new()) == NULL) {
194
	if ((b = sshbuf_new()) == NULL) {
220
		ret = SSH_ERR_ALLOC_FAIL;
195
		ret = SSH_ERR_ALLOC_FAIL;
Lines 235-241 ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, Link Here
235
		*lenp = len;
210
		*lenp = len;
236
	ret = 0;
211
	ret = 0;
237
 out:
212
 out:
238
	explicit_bzero(digest, sizeof(digest));
239
	freezero(sig, slen);
213
	freezero(sig, slen);
240
	sshbuf_free(b);
214
	sshbuf_free(b);
241
	return ret;
215
	return ret;
Lines 246-264 ssh_rsa_verify(const struct sshkey *key, Link Here
246
    const u_char *sig, size_t siglen, const u_char *data, size_t datalen,
220
    const u_char *sig, size_t siglen, const u_char *data, size_t datalen,
247
    const char *alg)
221
    const char *alg)
248
{
222
{
249
	const BIGNUM *rsa_n;
223
	const RSA *rsa;
250
	char *sigtype = NULL;
224
	char *sigtype = NULL;
251
	int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR;
225
	int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR;
252
	size_t len = 0, diff, modlen, dlen;
226
	size_t len = 0, diff, modlen;
253
	struct sshbuf *b = NULL;
227
	struct sshbuf *b = NULL;
254
	u_char digest[SSH_DIGEST_MAX_LENGTH], *osigblob, *sigblob = NULL;
228
	u_char digest[SSH_DIGEST_MAX_LENGTH], *osigblob, *sigblob = NULL;
255
229
256
	if (key == NULL || key->rsa == NULL ||
230
	rsa = EVP_PKEY_get0_RSA(key->pkey);
231
	if (key == NULL || rsa == NULL ||
257
	    sshkey_type_plain(key->type) != KEY_RSA ||
232
	    sshkey_type_plain(key->type) != KEY_RSA ||
258
	    sig == NULL || siglen == 0)
233
	    sig == NULL || siglen == 0)
259
		return SSH_ERR_INVALID_ARGUMENT;
234
		return SSH_ERR_INVALID_ARGUMENT;
260
	RSA_get0_key(key->rsa, &rsa_n, NULL, NULL);
235
	if (RSA_bits(rsa) < SSH_RSA_MINIMUM_MODULUS_SIZE)
261
	if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
262
		return SSH_ERR_KEY_LENGTH;
236
		return SSH_ERR_KEY_LENGTH;
263
237
264
	if ((b = sshbuf_from(sig, siglen)) == NULL)
238
	if ((b = sshbuf_from(sig, siglen)) == NULL)
Lines 294-300 ssh_rsa_verify(const struct sshkey *key, Link Here
294
		goto out;
268
		goto out;
295
	}
269
	}
296
	/* RSA_verify expects a signature of RSA_size */
270
	/* RSA_verify expects a signature of RSA_size */
297
	modlen = RSA_size(key->rsa);
271
	modlen = RSA_size(rsa);
298
	if (len > modlen) {
272
	if (len > modlen) {
299
		ret = SSH_ERR_KEY_BITS_MISMATCH;
273
		ret = SSH_ERR_KEY_BITS_MISMATCH;
300
		goto out;
274
		goto out;
Lines 310-325 ssh_rsa_verify(const struct sshkey *key, Link Here
310
		explicit_bzero(sigblob, diff);
284
		explicit_bzero(sigblob, diff);
311
		len = modlen;
285
		len = modlen;
312
	}
286
	}
313
	if ((dlen = ssh_digest_bytes(hash_alg)) == 0) {
314
		ret = SSH_ERR_INTERNAL_ERROR;
315
		goto out;
316
	}
317
	if ((ret = ssh_digest_memory(hash_alg, data, datalen,
318
	    digest, sizeof(digest))) != 0)
319
		goto out;
320
287
321
	ret = openssh_RSA_verify(hash_alg, digest, dlen, sigblob, len,
288
	ret = openssh_RSA_verify(hash_alg, data, datalen, sigblob, len,
322
	    key->rsa);
289
	    key->pkey);
323
 out:
290
 out:
324
	freezero(sigblob, len);
291
	freezero(sigblob, len);
325
	free(sigtype);
292
	free(sigtype);
Lines 328-449 ssh_rsa_verify(const struct sshkey *key, Link Here
328
	return ret;
295
	return ret;
329
}
296
}
330
297
331
/*
332
 * See:
333
 * http://www.rsasecurity.com/rsalabs/pkcs/pkcs-1/
334
 * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.asn
335
 */
336
337
/*
338
 * id-sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
339
 *	oiw(14) secsig(3) algorithms(2) 26 }
340
 */
341
static const u_char id_sha1[] = {
342
	0x30, 0x21, /* type Sequence, length 0x21 (33) */
343
	0x30, 0x09, /* type Sequence, length 0x09 */
344
	0x06, 0x05, /* type OID, length 0x05 */
345
	0x2b, 0x0e, 0x03, 0x02, 0x1a, /* id-sha1 OID */
346
	0x05, 0x00, /* NULL */
347
	0x04, 0x14  /* Octet string, length 0x14 (20), followed by sha1 hash */
348
};
349
350
/*
351
 * See http://csrc.nist.gov/groups/ST/crypto_apps_infra/csor/algorithms.html
352
 * id-sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840)
353
 *      organization(1) gov(101) csor(3) nistAlgorithm(4) hashAlgs(2)
354
 *      id-sha256(1) }
355
 */
356
static const u_char id_sha256[] = {
357
	0x30, 0x31, /* type Sequence, length 0x31 (49) */
358
	0x30, 0x0d, /* type Sequence, length 0x0d (13) */
359
	0x06, 0x09, /* type OID, length 0x09 */
360
	0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, /* id-sha256 */
361
	0x05, 0x00, /* NULL */
362
	0x04, 0x20  /* Octet string, length 0x20 (32), followed by sha256 hash */
363
};
364
365
/*
366
 * See http://csrc.nist.gov/groups/ST/crypto_apps_infra/csor/algorithms.html
367
 * id-sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840)
368
 *      organization(1) gov(101) csor(3) nistAlgorithm(4) hashAlgs(2)
369
 *      id-sha256(3) }
370
 */
371
static const u_char id_sha512[] = {
372
	0x30, 0x51, /* type Sequence, length 0x51 (81) */
373
	0x30, 0x0d, /* type Sequence, length 0x0d (13) */
374
	0x06, 0x09, /* type OID, length 0x09 */
375
	0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, /* id-sha512 */
376
	0x05, 0x00, /* NULL */
377
	0x04, 0x40  /* Octet string, length 0x40 (64), followed by sha512 hash */
378
};
379
380
static int
298
static int
381
rsa_hash_alg_oid(int hash_alg, const u_char **oidp, size_t *oidlenp)
299
openssh_RSA_verify(int hash_alg, const u_char *data, size_t datalen,
300
    u_char *sigbuf, size_t siglen, EVP_PKEY *pkey)
382
{
301
{
383
	switch (hash_alg) {
302
	size_t rsasize = 0;
384
	case SSH_DIGEST_SHA1:
303
	const RSA *rsa;
385
		*oidp = id_sha1;
304
	int ret;
386
		*oidlenp = sizeof(id_sha1);
387
		break;
388
	case SSH_DIGEST_SHA256:
389
		*oidp = id_sha256;
390
		*oidlenp = sizeof(id_sha256);
391
		break;
392
	case SSH_DIGEST_SHA512:
393
		*oidp = id_sha512;
394
		*oidlenp = sizeof(id_sha512);
395
		break;
396
	default:
397
		return SSH_ERR_INVALID_ARGUMENT;
398
	}
399
	return 0;
400
}
401
305
402
static int
306
	rsa = EVP_PKEY_get0_RSA(pkey);
403
openssh_RSA_verify(int hash_alg, u_char *hash, size_t hashlen,
404
    u_char *sigbuf, size_t siglen, RSA *rsa)
405
{
406
	size_t rsasize = 0, oidlen = 0, hlen = 0;
407
	int ret, len, oidmatch, hashmatch;
408
	const u_char *oid = NULL;
409
	u_char *decrypted = NULL;
410
411
	if ((ret = rsa_hash_alg_oid(hash_alg, &oid, &oidlen)) != 0)
412
		return ret;
413
	ret = SSH_ERR_INTERNAL_ERROR;
414
	hlen = ssh_digest_bytes(hash_alg);
415
	if (hashlen != hlen) {
416
		ret = SSH_ERR_INVALID_ARGUMENT;
417
		goto done;
418
	}
419
	rsasize = RSA_size(rsa);
307
	rsasize = RSA_size(rsa);
420
	if (rsasize <= 0 || rsasize > SSHBUF_MAX_BIGNUM ||
308
	if (rsasize <= 0 || rsasize > SSHBUF_MAX_BIGNUM ||
421
	    siglen == 0 || siglen > rsasize) {
309
	    siglen == 0 || siglen > rsasize) {
422
		ret = SSH_ERR_INVALID_ARGUMENT;
310
		ret = SSH_ERR_INVALID_ARGUMENT;
423
		goto done;
311
		goto done;
424
	}
312
	}
425
	if ((decrypted = malloc(rsasize)) == NULL) {
313
426
		ret = SSH_ERR_ALLOC_FAIL;
314
	ret = sshkey_verify_signature(pkey, hash_alg, data, datalen,
427
		goto done;
315
	    sigbuf, siglen);
428
	}
316
429
	if ((len = RSA_public_decrypt(siglen, sigbuf, decrypted, rsa,
430
	    RSA_PKCS1_PADDING)) < 0) {
431
		ret = SSH_ERR_LIBCRYPTO_ERROR;
432
		goto done;
433
	}
434
	if (len < 0 || (size_t)len != hlen + oidlen) {
435
		ret = SSH_ERR_INVALID_FORMAT;
436
		goto done;
437
	}
438
	oidmatch = timingsafe_bcmp(decrypted, oid, oidlen) == 0;
439
	hashmatch = timingsafe_bcmp(decrypted + oidlen, hash, hlen) == 0;
440
	if (!oidmatch || !hashmatch) {
441
		ret = SSH_ERR_SIGNATURE_INVALID;
442
		goto done;
443
	}
444
	ret = 0;
445
done:
317
done:
446
	freezero(decrypted, rsasize);
447
	return ret;
318
	return ret;
448
}
319
}
449
#endif /* WITH_OPENSSL */
320
#endif /* WITH_OPENSSL */
(-)a/sshkey.c (-150 / +410 lines)
Lines 285-305 sshkey_size(const struct sshkey *k) Link Here
285
{
285
{
286
#ifdef WITH_OPENSSL
286
#ifdef WITH_OPENSSL
287
	const BIGNUM *rsa_n, *dsa_p;
287
	const BIGNUM *rsa_n, *dsa_p;
288
	RSA *rsa = NULL;
289
	DSA *dsa = NULL;
288
#endif /* WITH_OPENSSL */
290
#endif /* WITH_OPENSSL */
289
291
290
	switch (k->type) {
292
	switch (k->type) {
291
#ifdef WITH_OPENSSL
293
#ifdef WITH_OPENSSL
292
	case KEY_RSA:
294
	case KEY_RSA:
293
	case KEY_RSA_CERT:
295
	case KEY_RSA_CERT:
294
		if (k->rsa == NULL)
296
		rsa = EVP_PKEY_get0_RSA(k->pkey);
297
		if (rsa == NULL)
295
			return 0;
298
			return 0;
296
		RSA_get0_key(k->rsa, &rsa_n, NULL, NULL);
299
		RSA_get0_key(rsa, &rsa_n, NULL, NULL);
297
		return BN_num_bits(rsa_n);
300
		return BN_num_bits(rsa_n);
298
	case KEY_DSA:
301
	case KEY_DSA:
299
	case KEY_DSA_CERT:
302
	case KEY_DSA_CERT:
300
		if (k->dsa == NULL)
303
		dsa = EVP_PKEY_get0_DSA(k->pkey);
304
		if (dsa == NULL)
301
			return 0;
305
			return 0;
302
		DSA_get0_pqg(k->dsa, &dsa_p, NULL, NULL);
306
		DSA_get0_pqg(dsa, &dsa_p, NULL, NULL);
303
		return BN_num_bits(dsa_p);
307
		return BN_num_bits(dsa_p);
304
	case KEY_ECDSA:
308
	case KEY_ECDSA:
305
	case KEY_ECDSA_CERT:
309
	case KEY_ECDSA_CERT:
Lines 358-363 sshkey_type_plain(int type) Link Here
358
}
362
}
359
363
360
#ifdef WITH_OPENSSL
364
#ifdef WITH_OPENSSL
365
int
366
sshkey_calculate_signature(EVP_PKEY *pkey, int hash_alg, u_char **sigp,
367
    int *lenp, const u_char *data, size_t datalen)
368
{
369
	EVP_MD_CTX *ctx = NULL;
370
	u_char *sig = NULL;
371
	int ret, slen, len;
372
373
	if (sigp == NULL || lenp == NULL) {
374
		return SSH_ERR_INVALID_ARGUMENT;
375
	}
376
377
	slen = EVP_PKEY_size(pkey);
378
	if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM)
379
		return SSH_ERR_INVALID_ARGUMENT;
380
381
	len = slen;
382
	if ((sig = malloc(slen)) == NULL) {
383
		return SSH_ERR_ALLOC_FAIL;
384
	}
385
386
	if ((ctx = EVP_MD_CTX_new()) == NULL) {
387
		ret = SSH_ERR_ALLOC_FAIL;
388
		goto error;
389
	}
390
	if (EVP_SignInit_ex(ctx, ssh_digest_to_md(hash_alg), NULL) <= 0 ||
391
	    EVP_SignUpdate(ctx, data, datalen) <= 0 ||
392
	    EVP_SignFinal(ctx, sig, &len, pkey) <= 0) {
393
		ret = SSH_ERR_LIBCRYPTO_ERROR;
394
		goto error;
395
	}
396
397
	*sigp = sig;
398
	*lenp = len;
399
	/* Now owned by the caller */
400
	sig = NULL;
401
	ret = 0;
402
403
error:
404
	EVP_MD_CTX_free(ctx);
405
	free(sig);
406
	return ret;
407
}
408
409
int
410
sshkey_verify_signature(EVP_PKEY *pkey, int hash_alg, const u_char *data,
411
    size_t datalen, u_char *sigbuf, int siglen)
412
{
413
	EVP_MD_CTX *ctx = NULL;
414
	int ret;
415
416
	if ((ctx = EVP_MD_CTX_new()) == NULL) {
417
		return SSH_ERR_ALLOC_FAIL;
418
	}
419
	if (EVP_VerifyInit_ex(ctx, ssh_digest_to_md(hash_alg), NULL) <= 0 ||
420
	    EVP_VerifyUpdate(ctx, data, datalen) <= 0) {
421
		ret = SSH_ERR_LIBCRYPTO_ERROR;
422
		goto done;
423
	}
424
	ret = EVP_VerifyFinal(ctx, sigbuf, siglen, pkey);
425
	switch (ret) {
426
	case 1:
427
		ret = 0;
428
		break;
429
	case 0:
430
		ret = SSH_ERR_SIGNATURE_INVALID;
431
		break;
432
	default:
433
		ret = SSH_ERR_LIBCRYPTO_ERROR;
434
		break;
435
	}
436
437
done:
438
	EVP_MD_CTX_free(ctx);
439
	return ret;
440
}
441
361
/* XXX: these are really begging for a table-driven approach */
442
/* XXX: these are really begging for a table-driven approach */
362
int
443
int
363
sshkey_curve_name_to_nid(const char *name)
444
sshkey_curve_name_to_nid(const char *name)
Lines 494-503 sshkey_new(int type) Link Here
494
	if ((k = calloc(1, sizeof(*k))) == NULL)
575
	if ((k = calloc(1, sizeof(*k))) == NULL)
495
		return NULL;
576
		return NULL;
496
	k->type = type;
577
	k->type = type;
497
	k->ecdsa = NULL;
498
	k->ecdsa_nid = -1;
578
	k->ecdsa_nid = -1;
499
	k->dsa = NULL;
579
	k->pkey = NULL;
500
	k->rsa = NULL;
501
	k->cert = NULL;
580
	k->cert = NULL;
502
	k->ed25519_sk = NULL;
581
	k->ed25519_sk = NULL;
503
	k->ed25519_pk = NULL;
582
	k->ed25519_pk = NULL;
Lines 507-528 sshkey_new(int type) Link Here
507
#ifdef WITH_OPENSSL
586
#ifdef WITH_OPENSSL
508
	case KEY_RSA:
587
	case KEY_RSA:
509
	case KEY_RSA_CERT:
588
	case KEY_RSA_CERT:
589
		if ((k->pkey = EVP_PKEY_new()) == NULL) {
590
			free(k);
591
			return NULL;
592
		}
510
		if ((rsa = RSA_new()) == NULL) {
593
		if ((rsa = RSA_new()) == NULL) {
594
			EVP_PKEY_free(k->pkey);
511
			free(k);
595
			free(k);
512
			return NULL;
596
			return NULL;
513
		}
597
		}
514
		k->rsa = rsa;
598
		if (EVP_PKEY_set1_RSA(k->pkey, rsa) != 1) {
599
			EVP_PKEY_free(k->pkey);
600
			free(k);
601
			RSA_free(rsa);
602
			return NULL;
603
		}
515
		break;
604
		break;
516
	case KEY_DSA:
605
	case KEY_DSA:
517
	case KEY_DSA_CERT:
606
	case KEY_DSA_CERT:
607
		if ((k->pkey = EVP_PKEY_new()) == NULL) {
608
			free(k);
609
			return NULL;
610
		}
518
		if ((dsa = DSA_new()) == NULL) {
611
		if ((dsa = DSA_new()) == NULL) {
612
			EVP_PKEY_free(k->pkey);
613
			free(k);
614
			return NULL;
615
		}
616
		if (EVP_PKEY_set1_DSA(k->pkey, dsa) != 1) {
617
			EVP_PKEY_free(k->pkey);
618
			DSA_free(dsa);
519
			free(k);
619
			free(k);
520
			return NULL;
620
			return NULL;
521
		}
621
		}
522
		k->dsa = dsa;
523
		break;
622
		break;
524
	case KEY_ECDSA:
623
	case KEY_ECDSA:
525
	case KEY_ECDSA_CERT:
624
	case KEY_ECDSA_CERT:
625
		if ((k->pkey = EVP_PKEY_new()) == NULL) {
626
			free(k);
627
			return NULL;
628
		}
526
		/* Cannot do anything until we know the group */
629
		/* Cannot do anything until we know the group */
527
		break;
630
		break;
528
#endif /* WITH_OPENSSL */
631
#endif /* WITH_OPENSSL */
Lines 558-578 sshkey_free(struct sshkey *k) Link Here
558
#ifdef WITH_OPENSSL
661
#ifdef WITH_OPENSSL
559
	case KEY_RSA:
662
	case KEY_RSA:
560
	case KEY_RSA_CERT:
663
	case KEY_RSA_CERT:
561
		RSA_free(k->rsa);
562
		k->rsa = NULL;
563
		break;
564
	case KEY_DSA:
664
	case KEY_DSA:
565
	case KEY_DSA_CERT:
665
	case KEY_DSA_CERT:
566
		DSA_free(k->dsa);
567
		k->dsa = NULL;
568
		break;
569
# ifdef OPENSSL_HAS_ECC
666
# ifdef OPENSSL_HAS_ECC
570
	case KEY_ECDSA:
667
	case KEY_ECDSA:
571
	case KEY_ECDSA_CERT:
668
	case KEY_ECDSA_CERT:
572
		EC_KEY_free(k->ecdsa);
573
		k->ecdsa = NULL;
574
		break;
575
# endif /* OPENSSL_HAS_ECC */
669
# endif /* OPENSSL_HAS_ECC */
670
		EVP_PKEY_free(k->pkey);
671
		k->pkey = NULL;
672
		break;
576
#endif /* WITH_OPENSSL */
673
#endif /* WITH_OPENSSL */
577
	case KEY_ED25519:
674
	case KEY_ED25519:
578
	case KEY_ED25519_CERT:
675
	case KEY_ED25519_CERT:
Lines 628-633 int Link Here
628
sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
725
sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
629
{
726
{
630
#if defined(WITH_OPENSSL)
727
#if defined(WITH_OPENSSL)
728
	const RSA *rsa_a, *rsa_b;
729
	const DSA *dsa_a, *dsa_b;
730
	const EC_KEY *ecdsa_a, *ecdsa_b;
631
	const BIGNUM *rsa_e_a, *rsa_n_a;
731
	const BIGNUM *rsa_e_a, *rsa_n_a;
632
	const BIGNUM *rsa_e_b, *rsa_n_b;
732
	const BIGNUM *rsa_e_b, *rsa_n_b;
633
	const BIGNUM *dsa_p_a, *dsa_q_a, *dsa_g_a, *dsa_pub_key_a;
733
	const BIGNUM *dsa_p_a, *dsa_q_a, *dsa_g_a, *dsa_pub_key_a;
Lines 645-664 sshkey_equal_public(const struct sshkey *a, const struct sshkey *b) Link Here
645
#ifdef WITH_OPENSSL
745
#ifdef WITH_OPENSSL
646
	case KEY_RSA_CERT:
746
	case KEY_RSA_CERT:
647
	case KEY_RSA:
747
	case KEY_RSA:
648
		if (a->rsa == NULL || b->rsa == NULL)
748
		rsa_a = EVP_PKEY_get0_RSA(a->pkey);
749
		rsa_b = EVP_PKEY_get0_RSA(b->pkey);
750
		if (rsa_a == NULL || rsa_b == NULL)
649
			return 0;
751
			return 0;
650
		RSA_get0_key(a->rsa, &rsa_n_a, &rsa_e_a, NULL);
752
		RSA_get0_key(rsa_a, &rsa_n_a, &rsa_e_a, NULL);
651
		RSA_get0_key(b->rsa, &rsa_n_b, &rsa_e_b, NULL);
753
		RSA_get0_key(rsa_b, &rsa_n_b, &rsa_e_b, NULL);
652
		return BN_cmp(rsa_e_a, rsa_e_b) == 0 &&
754
		return BN_cmp(rsa_e_a, rsa_e_b) == 0 &&
653
		    BN_cmp(rsa_n_a, rsa_n_b) == 0;
755
		    BN_cmp(rsa_n_a, rsa_n_b) == 0;
654
	case KEY_DSA_CERT:
756
	case KEY_DSA_CERT:
655
	case KEY_DSA:
757
	case KEY_DSA:
656
		if (a->dsa == NULL || b->dsa == NULL)
758
		dsa_a = EVP_PKEY_get0_DSA(a->pkey);
759
		dsa_b = EVP_PKEY_get0_DSA(b->pkey);
760
		if (dsa_a == NULL || dsa_b == NULL)
657
			return 0;
761
			return 0;
658
		DSA_get0_pqg(a->dsa, &dsa_p_a, &dsa_q_a, &dsa_g_a);
762
		DSA_get0_pqg(dsa_a, &dsa_p_a, &dsa_q_a, &dsa_g_a);
659
		DSA_get0_pqg(b->dsa, &dsa_p_b, &dsa_q_b, &dsa_g_b);
763
		DSA_get0_pqg(dsa_b, &dsa_p_b, &dsa_q_b, &dsa_g_b);
660
		DSA_get0_key(a->dsa, &dsa_pub_key_a, NULL);
764
		DSA_get0_key(dsa_a, &dsa_pub_key_a, NULL);
661
		DSA_get0_key(b->dsa, &dsa_pub_key_b, NULL);
765
		DSA_get0_key(dsa_b, &dsa_pub_key_b, NULL);
662
		return BN_cmp(dsa_p_a, dsa_p_b) == 0 &&
766
		return BN_cmp(dsa_p_a, dsa_p_b) == 0 &&
663
		    BN_cmp(dsa_q_a, dsa_q_b) == 0 &&
767
		    BN_cmp(dsa_q_a, dsa_q_b) == 0 &&
664
		    BN_cmp(dsa_g_a, dsa_g_b) == 0 &&
768
		    BN_cmp(dsa_g_a, dsa_g_b) == 0 &&
Lines 666-682 sshkey_equal_public(const struct sshkey *a, const struct sshkey *b) Link Here
666
# ifdef OPENSSL_HAS_ECC
770
# ifdef OPENSSL_HAS_ECC
667
	case KEY_ECDSA_CERT:
771
	case KEY_ECDSA_CERT:
668
	case KEY_ECDSA:
772
	case KEY_ECDSA:
669
		if (a->ecdsa == NULL || b->ecdsa == NULL ||
773
		ecdsa_a = EVP_PKEY_get0_EC_KEY(a->pkey);
670
		    EC_KEY_get0_public_key(a->ecdsa) == NULL ||
774
		ecdsa_b = EVP_PKEY_get0_EC_KEY(b->pkey);
671
		    EC_KEY_get0_public_key(b->ecdsa) == NULL)
775
		if (ecdsa_a == NULL || ecdsa_b == NULL ||
776
		    EC_KEY_get0_public_key(ecdsa_a) == NULL ||
777
		    EC_KEY_get0_public_key(ecdsa_b) == NULL)
672
			return 0;
778
			return 0;
673
		if ((bnctx = BN_CTX_new()) == NULL)
779
		if ((bnctx = BN_CTX_new()) == NULL)
674
			return 0;
780
			return 0;
675
		if (EC_GROUP_cmp(EC_KEY_get0_group(a->ecdsa),
781
		if (EC_GROUP_cmp(EC_KEY_get0_group(ecdsa_a),
676
		    EC_KEY_get0_group(b->ecdsa), bnctx) != 0 ||
782
		    EC_KEY_get0_group(ecdsa_b), bnctx) != 0 ||
677
		    EC_POINT_cmp(EC_KEY_get0_group(a->ecdsa),
783
		    EC_POINT_cmp(EC_KEY_get0_group(ecdsa_a),
678
		    EC_KEY_get0_public_key(a->ecdsa),
784
		    EC_KEY_get0_public_key(ecdsa_a),
679
		    EC_KEY_get0_public_key(b->ecdsa), bnctx) != 0) {
785
		    EC_KEY_get0_public_key(ecdsa_b), bnctx) != 0) {
680
			BN_CTX_free(bnctx);
786
			BN_CTX_free(bnctx);
681
			return 0;
787
			return 0;
682
		}
788
		}
Lines 720-725 to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain, Link Here
720
	int type, ret = SSH_ERR_INTERNAL_ERROR;
826
	int type, ret = SSH_ERR_INTERNAL_ERROR;
721
	const char *typename;
827
	const char *typename;
722
#ifdef WITH_OPENSSL
828
#ifdef WITH_OPENSSL
829
	const RSA *rsa;
830
	const DSA *dsa;
831
	const EC_KEY *ecdsa;
723
	const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
832
	const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
724
#endif /* WITH_OPENSSL */
833
#endif /* WITH_OPENSSL */
725
834
Lines 752-761 to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain, Link Here
752
		break;
861
		break;
753
#ifdef WITH_OPENSSL
862
#ifdef WITH_OPENSSL
754
	case KEY_DSA:
863
	case KEY_DSA:
755
		if (key->dsa == NULL)
864
		dsa = EVP_PKEY_get0_DSA(key->pkey);
865
		if (dsa == NULL)
756
			return SSH_ERR_INVALID_ARGUMENT;
866
			return SSH_ERR_INVALID_ARGUMENT;
757
		DSA_get0_pqg(key->dsa, &dsa_p, &dsa_q, &dsa_g);
867
		DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g);
758
		DSA_get0_key(key->dsa, &dsa_pub_key, NULL);
868
		DSA_get0_key(dsa, &dsa_pub_key, NULL);
759
		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
869
		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
760
		    (ret = sshbuf_put_bignum2(b, dsa_p)) != 0 ||
870
		    (ret = sshbuf_put_bignum2(b, dsa_p)) != 0 ||
761
		    (ret = sshbuf_put_bignum2(b, dsa_q)) != 0 ||
871
		    (ret = sshbuf_put_bignum2(b, dsa_q)) != 0 ||
Lines 765-783 to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain, Link Here
765
		break;
875
		break;
766
# ifdef OPENSSL_HAS_ECC
876
# ifdef OPENSSL_HAS_ECC
767
	case KEY_ECDSA:
877
	case KEY_ECDSA:
768
		if (key->ecdsa == NULL)
878
		ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey);
879
		if (ecdsa == NULL)
769
			return SSH_ERR_INVALID_ARGUMENT;
880
			return SSH_ERR_INVALID_ARGUMENT;
770
		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
881
		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
771
		    (ret = sshbuf_put_cstring(b,
882
		    (ret = sshbuf_put_cstring(b,
772
		    sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 ||
883
		    sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 ||
773
		    (ret = sshbuf_put_eckey(b, key->ecdsa)) != 0)
884
		    (ret = sshbuf_put_eckey(b, ecdsa)) != 0)
774
			return ret;
885
			return ret;
775
		break;
886
		break;
776
# endif
887
# endif
777
	case KEY_RSA:
888
	case KEY_RSA:
778
		if (key->rsa == NULL)
889
		rsa = EVP_PKEY_get0_RSA(key->pkey);
890
		if (rsa == NULL)
779
			return SSH_ERR_INVALID_ARGUMENT;
891
			return SSH_ERR_INVALID_ARGUMENT;
780
		RSA_get0_key(key->rsa, &rsa_n, &rsa_e, NULL);
892
		RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL);
781
		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
893
		if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
782
		    (ret = sshbuf_put_bignum2(b, rsa_e)) != 0 ||
894
		    (ret = sshbuf_put_bignum2(b, rsa_e)) != 0 ||
783
		    (ret = sshbuf_put_bignum2(b, rsa_n)) != 0)
895
		    (ret = sshbuf_put_bignum2(b, rsa_n)) != 0)
Lines 1312-1341 sshkey_read(struct sshkey *ret, char **cpp) Link Here
1312
	switch (sshkey_type_plain(ret->type)) {
1424
	switch (sshkey_type_plain(ret->type)) {
1313
#ifdef WITH_OPENSSL
1425
#ifdef WITH_OPENSSL
1314
	case KEY_RSA:
1426
	case KEY_RSA:
1315
		RSA_free(ret->rsa);
1427
		EVP_PKEY_free(ret->pkey);
1316
		ret->rsa = k->rsa;
1428
		ret->pkey = k->pkey;
1317
		k->rsa = NULL;
1429
		k->pkey = NULL;
1318
#ifdef DEBUG_PK
1430
#ifdef DEBUG_PK
1319
		RSA_print_fp(stderr, ret->rsa, 8);
1431
		RSA_print_fp(stderr, EVP_PKEY_get0_RSA(ret->pkey), 8);
1320
#endif
1432
#endif
1321
		break;
1433
		break;
1322
	case KEY_DSA:
1434
	case KEY_DSA:
1323
		DSA_free(ret->dsa);
1435
		EVP_PKEY_free(ret->pkey);
1324
		ret->dsa = k->dsa;
1436
		ret->pkey = k->pkey;
1325
		k->dsa = NULL;
1437
		k->pkey = NULL;
1326
#ifdef DEBUG_PK
1438
#ifdef DEBUG_PK
1327
		DSA_print_fp(stderr, ret->dsa, 8);
1439
		DSA_print_fp(stderr, EVP_PKEY_get0_DSA(ret->pkey), 8);
1328
#endif
1440
#endif
1329
		break;
1441
		break;
1330
# ifdef OPENSSL_HAS_ECC
1442
# ifdef OPENSSL_HAS_ECC
1331
	case KEY_ECDSA:
1443
	case KEY_ECDSA:
1332
		EC_KEY_free(ret->ecdsa);
1444
		EVP_PKEY_free(ret->pkey);
1333
		ret->ecdsa = k->ecdsa;
1445
		ret->pkey = k->pkey;
1334
		ret->ecdsa_nid = k->ecdsa_nid;
1446
		ret->ecdsa_nid = k->ecdsa_nid;
1335
		k->ecdsa = NULL;
1447
		k->pkey = NULL;
1336
		k->ecdsa_nid = -1;
1448
		k->ecdsa_nid = -1;
1337
#ifdef DEBUG_PK
1449
#ifdef DEBUG_PK
1338
		sshkey_dump_ec_key(ret->ecdsa);
1450
		sshkey_dump_ec_key(EVP_PKEY_get0_EC_KEY(ret->pkey));
1339
#endif
1451
#endif
1340
		break;
1452
		break;
1341
# endif /* OPENSSL_HAS_ECC */
1453
# endif /* OPENSSL_HAS_ECC */
Lines 1463-1480 sshkey_cert_type(const struct sshkey *k) Link Here
1463
1575
1464
#ifdef WITH_OPENSSL
1576
#ifdef WITH_OPENSSL
1465
static int
1577
static int
1466
rsa_generate_private_key(u_int bits, RSA **rsap)
1578
rsa_generate_private_key(u_int bits, EVP_PKEY **pkeyp)
1467
{
1579
{
1468
	RSA *private = NULL;
1580
	RSA *private = NULL;
1469
	BIGNUM *f4 = NULL;
1581
	BIGNUM *f4 = NULL;
1470
	int ret = SSH_ERR_INTERNAL_ERROR;
1582
	int ret = SSH_ERR_INTERNAL_ERROR;
1471
1583
1472
	if (rsap == NULL)
1584
	if (pkeyp == NULL)
1473
		return SSH_ERR_INVALID_ARGUMENT;
1585
		return SSH_ERR_INVALID_ARGUMENT;
1474
	if (bits < SSH_RSA_MINIMUM_MODULUS_SIZE ||
1586
	if (bits < SSH_RSA_MINIMUM_MODULUS_SIZE ||
1475
	    bits > SSHBUF_MAX_BIGNUM * 8)
1587
	    bits > SSHBUF_MAX_BIGNUM * 8)
1476
		return SSH_ERR_KEY_LENGTH;
1588
		return SSH_ERR_KEY_LENGTH;
1477
	*rsap = NULL;
1589
	*pkeyp = NULL;
1478
	if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) {
1590
	if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) {
1479
		ret = SSH_ERR_ALLOC_FAIL;
1591
		ret = SSH_ERR_ALLOC_FAIL;
1480
		goto out;
1592
		goto out;
Lines 1484-1490 rsa_generate_private_key(u_int bits, RSA **rsap) Link Here
1484
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1596
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1485
		goto out;
1597
		goto out;
1486
	}
1598
	}
1487
	*rsap = private;
1599
	*pkeyp = EVP_PKEY_new();
1600
	if (*pkeyp == NULL) {
1601
		ret = SSH_ERR_ALLOC_FAIL;
1602
		goto out;
1603
	}
1604
	if (EVP_PKEY_set1_RSA(*pkeyp, private) != 1) {
1605
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1606
		goto out;
1607
	}
1488
	private = NULL;
1608
	private = NULL;
1489
	ret = 0;
1609
	ret = 0;
1490
 out:
1610
 out:
Lines 1494-1505 rsa_generate_private_key(u_int bits, RSA **rsap) Link Here
1494
}
1614
}
1495
1615
1496
static int
1616
static int
1497
dsa_generate_private_key(u_int bits, DSA **dsap)
1617
dsa_generate_private_key(u_int bits, EVP_PKEY **pkeyp)
1498
{
1618
{
1499
	DSA *private;
1619
	DSA *private;
1500
	int ret = SSH_ERR_INTERNAL_ERROR;
1620
	int ret = SSH_ERR_INTERNAL_ERROR;
1501
1621
1502
	if (dsap == NULL)
1622
	if (pkeyp == NULL)
1503
		return SSH_ERR_INVALID_ARGUMENT;
1623
		return SSH_ERR_INVALID_ARGUMENT;
1504
	if (bits != 1024)
1624
	if (bits != 1024)
1505
		return SSH_ERR_KEY_LENGTH;
1625
		return SSH_ERR_KEY_LENGTH;
Lines 1507-1519 dsa_generate_private_key(u_int bits, DSA **dsap) Link Here
1507
		ret = SSH_ERR_ALLOC_FAIL;
1627
		ret = SSH_ERR_ALLOC_FAIL;
1508
		goto out;
1628
		goto out;
1509
	}
1629
	}
1510
	*dsap = NULL;
1630
	*pkeyp = NULL;
1511
	if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL,
1631
	if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL,
1512
	    NULL, NULL) || !DSA_generate_key(private)) {
1632
	    NULL, NULL) || !DSA_generate_key(private)) {
1513
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1633
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1514
		goto out;
1634
		goto out;
1515
	}
1635
	}
1516
	*dsap = private;
1636
	*pkeyp = EVP_PKEY_new();
1637
	if (*pkeyp == NULL) {
1638
		ret = SSH_ERR_ALLOC_FAIL;
1639
		goto out;
1640
	}
1641
	if (EVP_PKEY_set1_DSA(*pkeyp, private) != 1) {
1642
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1643
		goto out;
1644
	}
1517
	private = NULL;
1645
	private = NULL;
1518
	ret = 0;
1646
	ret = 0;
1519
 out:
1647
 out:
Lines 1523-1530 dsa_generate_private_key(u_int bits, DSA **dsap) Link Here
1523
1651
1524
# ifdef OPENSSL_HAS_ECC
1652
# ifdef OPENSSL_HAS_ECC
1525
int
1653
int
1526
sshkey_ecdsa_key_to_nid(EC_KEY *k)
1654
sshkey_ecdsa_key_to_nid(struct sshkey *key)
1527
{
1655
{
1656
	EC_KEY *k;
1528
	EC_GROUP *eg;
1657
	EC_GROUP *eg;
1529
	int nids[] = {
1658
	int nids[] = {
1530
		NID_X9_62_prime256v1,
1659
		NID_X9_62_prime256v1,
Lines 1537-1543 sshkey_ecdsa_key_to_nid(EC_KEY *k) Link Here
1537
	int nid;
1666
	int nid;
1538
	u_int i;
1667
	u_int i;
1539
	BN_CTX *bnctx;
1668
	BN_CTX *bnctx;
1540
	const EC_GROUP *g = EC_KEY_get0_group(k);
1669
	const EC_GROUP *g;
1670
1671
	if ((k = EVP_PKEY_get0_EC_KEY(key->pkey)) == NULL ||
1672
	    (g = EC_KEY_get0_group(k)) == NULL) {
1673
		return -1;
1674
	}
1541
1675
1542
	/*
1676
	/*
1543
	 * The group may be stored in a ASN.1 encoded private key in one of two
1677
	 * The group may be stored in a ASN.1 encoded private key in one of two
Lines 1573-1588 sshkey_ecdsa_key_to_nid(EC_KEY *k) Link Here
1573
}
1707
}
1574
1708
1575
static int
1709
static int
1576
ecdsa_generate_private_key(u_int bits, int *nid, EC_KEY **ecdsap)
1710
ecdsa_generate_private_key(u_int bits, int *nid, EVP_PKEY **pkeyp)
1577
{
1711
{
1578
	EC_KEY *private;
1712
	EC_KEY *private;
1579
	int ret = SSH_ERR_INTERNAL_ERROR;
1713
	int ret = SSH_ERR_INTERNAL_ERROR;
1580
1714
1581
	if (nid == NULL || ecdsap == NULL)
1715
	if (nid == NULL || pkeyp == NULL)
1582
		return SSH_ERR_INVALID_ARGUMENT;
1716
		return SSH_ERR_INVALID_ARGUMENT;
1583
	if ((*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1)
1717
	if ((*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1)
1584
		return SSH_ERR_KEY_LENGTH;
1718
		return SSH_ERR_KEY_LENGTH;
1585
	*ecdsap = NULL;
1719
	*pkeyp = NULL;
1586
	if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL) {
1720
	if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL) {
1587
		ret = SSH_ERR_ALLOC_FAIL;
1721
		ret = SSH_ERR_ALLOC_FAIL;
1588
		goto out;
1722
		goto out;
Lines 1592-1598 ecdsa_generate_private_key(u_int bits, int *nid, EC_KEY **ecdsap) Link Here
1592
		goto out;
1726
		goto out;
1593
	}
1727
	}
1594
	EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE);
1728
	EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE);
1595
	*ecdsap = private;
1729
	*pkeyp = EVP_PKEY_new();
1730
	if (*pkeyp == NULL) {
1731
		ret = SSH_ERR_ALLOC_FAIL;
1732
		goto out;
1733
	}
1734
	if (EVP_PKEY_set1_EC_KEY(*pkeyp, private) != 1) {
1735
		ret = SSH_ERR_LIBCRYPTO_ERROR;
1736
		goto out;
1737
	}
1596
	private = NULL;
1738
	private = NULL;
1597
	ret = 0;
1739
	ret = 0;
1598
 out:
1740
 out:
Lines 1630-1645 sshkey_generate(int type, u_int bits, struct sshkey **keyp) Link Here
1630
#endif /* WITH_XMSS */
1772
#endif /* WITH_XMSS */
1631
#ifdef WITH_OPENSSL
1773
#ifdef WITH_OPENSSL
1632
	case KEY_DSA:
1774
	case KEY_DSA:
1633
		ret = dsa_generate_private_key(bits, &k->dsa);
1775
		ret = dsa_generate_private_key(bits, &k->pkey);
1634
		break;
1776
		break;
1635
# ifdef OPENSSL_HAS_ECC
1777
# ifdef OPENSSL_HAS_ECC
1636
	case KEY_ECDSA:
1778
	case KEY_ECDSA:
1637
		ret = ecdsa_generate_private_key(bits, &k->ecdsa_nid,
1779
		ret = ecdsa_generate_private_key(bits, &k->ecdsa_nid,
1638
		    &k->ecdsa);
1780
		    &k->pkey);
1639
		break;
1781
		break;
1640
# endif /* OPENSSL_HAS_ECC */
1782
# endif /* OPENSSL_HAS_ECC */
1641
	case KEY_RSA:
1783
	case KEY_RSA:
1642
		ret = rsa_generate_private_key(bits, &k->rsa);
1784
		ret = rsa_generate_private_key(bits, &k->pkey);
1643
		break;
1785
		break;
1644
#endif /* WITH_OPENSSL */
1786
#endif /* WITH_OPENSSL */
1645
	default:
1787
	default:
Lines 1729-1734 sshkey_from_private(const struct sshkey *k, struct sshkey **pkp) Link Here
1729
	struct sshkey *n = NULL;
1871
	struct sshkey *n = NULL;
1730
	int r = SSH_ERR_INTERNAL_ERROR;
1872
	int r = SSH_ERR_INTERNAL_ERROR;
1731
#ifdef WITH_OPENSSL
1873
#ifdef WITH_OPENSSL
1874
	RSA *rsa;
1875
	DSA *dsa;
1876
	EC_KEY *ecdsa;
1877
	const EC_POINT *ec_point;
1732
	const BIGNUM *rsa_n, *rsa_e;
1878
	const BIGNUM *rsa_n, *rsa_e;
1733
	BIGNUM *rsa_n_dup = NULL, *rsa_e_dup = NULL;
1879
	BIGNUM *rsa_n_dup = NULL, *rsa_e_dup = NULL;
1734
	const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
1880
	const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
Lines 1746-1753 sshkey_from_private(const struct sshkey *k, struct sshkey **pkp) Link Here
1746
			goto out;
1892
			goto out;
1747
		}
1893
		}
1748
1894
1749
		DSA_get0_pqg(k->dsa, &dsa_p, &dsa_q, &dsa_g);
1895
		dsa = EVP_PKEY_get0_DSA(k->pkey);
1750
		DSA_get0_key(k->dsa, &dsa_pub_key, NULL);
1896
		if (dsa == NULL) {
1897
			r = SSH_ERR_LIBCRYPTO_ERROR;
1898
			goto out;
1899
		}
1900
		DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g);
1901
		DSA_get0_key(dsa, &dsa_pub_key, NULL);
1751
		if ((dsa_p_dup = BN_dup(dsa_p)) == NULL ||
1902
		if ((dsa_p_dup = BN_dup(dsa_p)) == NULL ||
1752
		    (dsa_q_dup = BN_dup(dsa_q)) == NULL ||
1903
		    (dsa_q_dup = BN_dup(dsa_q)) == NULL ||
1753
		    (dsa_g_dup = BN_dup(dsa_g)) == NULL ||
1904
		    (dsa_g_dup = BN_dup(dsa_g)) == NULL ||
Lines 1755-1766 sshkey_from_private(const struct sshkey *k, struct sshkey **pkp) Link Here
1755
			r = SSH_ERR_ALLOC_FAIL;
1906
			r = SSH_ERR_ALLOC_FAIL;
1756
			goto out;
1907
			goto out;
1757
		}
1908
		}
1758
		if (!DSA_set0_pqg(n->dsa, dsa_p_dup, dsa_q_dup, dsa_g_dup)) {
1909
		dsa = EVP_PKEY_get0_DSA(n->pkey);
1910
		if (!dsa || !DSA_set0_pqg(dsa, dsa_p_dup, dsa_q_dup, dsa_g_dup)) {
1759
			r = SSH_ERR_LIBCRYPTO_ERROR;
1911
			r = SSH_ERR_LIBCRYPTO_ERROR;
1760
			goto out;
1912
			goto out;
1761
		}
1913
		}
1762
		dsa_p_dup = dsa_q_dup = dsa_g_dup = NULL; /* transferred */
1914
		dsa_p_dup = dsa_q_dup = dsa_g_dup = NULL; /* transferred */
1763
		if (!DSA_set0_key(n->dsa, dsa_pub_key_dup, NULL)) {
1915
		if (!DSA_set0_key(dsa, dsa_pub_key_dup, NULL)) {
1764
			r = SSH_ERR_LIBCRYPTO_ERROR;
1916
			r = SSH_ERR_LIBCRYPTO_ERROR;
1765
			goto out;
1917
			goto out;
1766
		}
1918
		}
Lines 1775-1787 sshkey_from_private(const struct sshkey *k, struct sshkey **pkp) Link Here
1775
			goto out;
1927
			goto out;
1776
		}
1928
		}
1777
		n->ecdsa_nid = k->ecdsa_nid;
1929
		n->ecdsa_nid = k->ecdsa_nid;
1778
		n->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
1930
		ecdsa = EVP_PKEY_get0_EC_KEY(k->pkey);
1779
		if (n->ecdsa == NULL) {
1931
		if (ecdsa == NULL) {
1932
			r = SSH_ERR_LIBCRYPTO_ERROR;
1933
			goto out;
1934
		}
1935
		ec_point = EC_KEY_get0_public_key(ecdsa);
1936
		ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
1937
		if (ecdsa == NULL) {
1780
			r = SSH_ERR_ALLOC_FAIL;
1938
			r = SSH_ERR_ALLOC_FAIL;
1781
			goto out;
1939
			goto out;
1782
		}
1940
		}
1783
		if (EC_KEY_set_public_key(n->ecdsa,
1941
		if (EC_KEY_set_public_key(ecdsa, ec_point) != 1) {
1784
		    EC_KEY_get0_public_key(k->ecdsa)) != 1) {
1942
			r = SSH_ERR_LIBCRYPTO_ERROR;
1943
			goto out;
1944
		}
1945
		if (EVP_PKEY_set1_EC_KEY(n->pkey, ecdsa) != 1) {
1785
			r = SSH_ERR_LIBCRYPTO_ERROR;
1946
			r = SSH_ERR_LIBCRYPTO_ERROR;
1786
			goto out;
1947
			goto out;
1787
		}
1948
		}
Lines 1793-1805 sshkey_from_private(const struct sshkey *k, struct sshkey **pkp) Link Here
1793
			r = SSH_ERR_ALLOC_FAIL;
1954
			r = SSH_ERR_ALLOC_FAIL;
1794
			goto out;
1955
			goto out;
1795
		}
1956
		}
1796
		RSA_get0_key(k->rsa, &rsa_n, &rsa_e, NULL);
1957
		rsa = EVP_PKEY_get0_RSA(k->pkey);
1958
		if (rsa == NULL) {
1959
			r = SSH_ERR_LIBCRYPTO_ERROR;
1960
			goto out;
1961
		}
1962
		RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL);
1797
		if ((rsa_n_dup = BN_dup(rsa_n)) == NULL ||
1963
		if ((rsa_n_dup = BN_dup(rsa_n)) == NULL ||
1798
		    (rsa_e_dup = BN_dup(rsa_e)) == NULL) {
1964
		    (rsa_e_dup = BN_dup(rsa_e)) == NULL) {
1799
			r = SSH_ERR_ALLOC_FAIL;
1965
			r = SSH_ERR_ALLOC_FAIL;
1800
			goto out;
1966
			goto out;
1801
		}
1967
		}
1802
		if (!RSA_set0_key(n->rsa, rsa_n_dup, rsa_e_dup, NULL)) {
1968
		rsa = EVP_PKEY_get0_RSA(n->pkey);
1969
		if (!rsa || !RSA_set0_key(rsa, rsa_n_dup, rsa_e_dup, NULL)) {
1803
			r = SSH_ERR_LIBCRYPTO_ERROR;
1970
			r = SSH_ERR_LIBCRYPTO_ERROR;
1804
			goto out;
1971
			goto out;
1805
		}
1972
		}
Lines 1994-2002 cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf) Link Here
1994
2161
1995
#ifdef WITH_OPENSSL
2162
#ifdef WITH_OPENSSL
1996
static int
2163
static int
1997
check_rsa_length(const RSA *rsa)
2164
check_rsa_length(const struct sshkey *key)
1998
{
2165
{
1999
	const BIGNUM *rsa_n;
2166
	const BIGNUM *rsa_n;
2167
	const RSA *rsa;
2168
2169
	rsa = EVP_PKEY_get0_RSA(key->pkey);
2170
	if (rsa == NULL)
2171
		return SSH_ERR_INTERNAL_ERROR;
2000
2172
2001
	RSA_get0_key(rsa, &rsa_n, NULL, NULL);
2173
	RSA_get0_key(rsa, &rsa_n, NULL, NULL);
2002
	if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
2174
	if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
Lines 2016-2021 sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp, Link Here
2016
	u_char *pk = NULL;
2188
	u_char *pk = NULL;
2017
	struct sshbuf *copy;
2189
	struct sshbuf *copy;
2018
#if defined(WITH_OPENSSL)
2190
#if defined(WITH_OPENSSL)
2191
	RSA *rsa;
2192
	DSA *dsa;
2193
	EC_KEY *ecdsa;
2019
	BIGNUM *rsa_n = NULL, *rsa_e = NULL;
2194
	BIGNUM *rsa_n = NULL, *rsa_e = NULL;
2020
	BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL, *dsa_pub_key = NULL;
2195
	BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL, *dsa_pub_key = NULL;
2021
# if defined(OPENSSL_HAS_ECC)
2196
# if defined(OPENSSL_HAS_ECC)
Lines 2061-2075 sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp, Link Here
2061
			ret = SSH_ERR_INVALID_FORMAT;
2236
			ret = SSH_ERR_INVALID_FORMAT;
2062
			goto out;
2237
			goto out;
2063
		}
2238
		}
2064
		if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, NULL)) {
2239
		rsa = EVP_PKEY_get0_RSA(key->pkey);
2240
		if (!rsa || !RSA_set0_key(rsa, rsa_n, rsa_e, NULL)) {
2065
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2241
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2066
			goto out;
2242
			goto out;
2067
		}
2243
		}
2068
		rsa_n = rsa_e = NULL; /* transferred */
2244
		rsa_n = rsa_e = NULL; /* transferred */
2069
		if ((ret = check_rsa_length(key->rsa)) != 0)
2245
		if ((ret = check_rsa_length(key)) != 0)
2070
			goto out;
2246
			goto out;
2071
#ifdef DEBUG_PK
2247
#ifdef DEBUG_PK
2072
		RSA_print_fp(stderr, key->rsa, 8);
2248
		RSA_print_fp(stderr, rsa, 8);
2073
#endif
2249
#endif
2074
		break;
2250
		break;
2075
	case KEY_DSA_CERT:
2251
	case KEY_DSA_CERT:
Lines 2091-2108 sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp, Link Here
2091
			ret = SSH_ERR_INVALID_FORMAT;
2267
			ret = SSH_ERR_INVALID_FORMAT;
2092
			goto out;
2268
			goto out;
2093
		}
2269
		}
2094
		if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g)) {
2270
		dsa = EVP_PKEY_get0_DSA(key->pkey);
2271
		if (!dsa || !DSA_set0_pqg(dsa, dsa_p, dsa_q, dsa_g)) {
2095
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2272
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2096
			goto out;
2273
			goto out;
2097
		}
2274
		}
2098
		dsa_p = dsa_q = dsa_g = NULL; /* transferred */
2275
		dsa_p = dsa_q = dsa_g = NULL; /* transferred */
2099
		if (!DSA_set0_key(key->dsa, dsa_pub_key, NULL)) {
2276
		if (!DSA_set0_key(dsa, dsa_pub_key, NULL)) {
2100
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2277
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2101
			goto out;
2278
			goto out;
2102
		}
2279
		}
2103
		dsa_pub_key = NULL; /* transferred */
2280
		dsa_pub_key = NULL; /* transferred */
2104
#ifdef DEBUG_PK
2281
#ifdef DEBUG_PK
2105
		DSA_print_fp(stderr, key->dsa, 8);
2282
		DSA_print_fp(stderr, dsa, 8);
2106
#endif
2283
#endif
2107
		break;
2284
		break;
2108
	case KEY_ECDSA_CERT:
2285
	case KEY_ECDSA_CERT:
Lines 2127-2158 sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp, Link Here
2127
			ret = SSH_ERR_EC_CURVE_MISMATCH;
2304
			ret = SSH_ERR_EC_CURVE_MISMATCH;
2128
			goto out;
2305
			goto out;
2129
		}
2306
		}
2130
		EC_KEY_free(key->ecdsa);
2307
		if ((ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid))
2131
		if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid))
2132
		    == NULL) {
2308
		    == NULL) {
2133
			ret = SSH_ERR_EC_CURVE_INVALID;
2309
			ret = SSH_ERR_EC_CURVE_INVALID;
2134
			goto out;
2310
			goto out;
2135
		}
2311
		}
2136
		if ((q = EC_POINT_new(EC_KEY_get0_group(key->ecdsa))) == NULL) {
2312
		if ((q = EC_POINT_new(EC_KEY_get0_group(ecdsa))) == NULL) {
2137
			ret = SSH_ERR_ALLOC_FAIL;
2313
			ret = SSH_ERR_ALLOC_FAIL;
2138
			goto out;
2314
			goto out;
2139
		}
2315
		}
2140
		if (sshbuf_get_ec(b, q, EC_KEY_get0_group(key->ecdsa)) != 0) {
2316
		if (sshbuf_get_ec(b, q, EC_KEY_get0_group(ecdsa)) != 0) {
2141
			ret = SSH_ERR_INVALID_FORMAT;
2317
			ret = SSH_ERR_INVALID_FORMAT;
2142
			goto out;
2318
			goto out;
2143
		}
2319
		}
2144
		if (sshkey_ec_validate_public(EC_KEY_get0_group(key->ecdsa),
2320
		if (sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa),
2145
		    q) != 0) {
2321
		    q) != 0) {
2146
			ret = SSH_ERR_KEY_INVALID_EC_VALUE;
2322
			ret = SSH_ERR_KEY_INVALID_EC_VALUE;
2147
			goto out;
2323
			goto out;
2148
		}
2324
		}
2149
		if (EC_KEY_set_public_key(key->ecdsa, q) != 1) {
2325
		if (EC_KEY_set_public_key(ecdsa, q) != 1) {
2150
			/* XXX assume it is a allocation error */
2326
			/* XXX assume it is a allocation error */
2151
			ret = SSH_ERR_ALLOC_FAIL;
2327
			ret = SSH_ERR_ALLOC_FAIL;
2152
			goto out;
2328
			goto out;
2153
		}
2329
		}
2330
		if (EVP_PKEY_set1_EC_KEY(key->pkey, ecdsa) != 1) {
2331
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2332
			goto out;
2333
		}
2334
		ecdsa = NULL;
2154
#ifdef DEBUG_PK
2335
#ifdef DEBUG_PK
2155
		sshkey_dump_ec_point(EC_KEY_get0_group(key->ecdsa), q);
2336
		sshkey_dump_ec_point(EC_KEY_get0_group(ecdsa), q);
2156
#endif
2337
#endif
2157
		break;
2338
		break;
2158
# endif /* OPENSSL_HAS_ECC */
2339
# endif /* OPENSSL_HAS_ECC */
Lines 2505-2510 sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg, Link Here
2505
	struct sshbuf *cert = NULL;
2686
	struct sshbuf *cert = NULL;
2506
	char *sigtype = NULL;
2687
	char *sigtype = NULL;
2507
#ifdef WITH_OPENSSL
2688
#ifdef WITH_OPENSSL
2689
	const RSA *rsa;
2690
	const DSA *dsa;
2691
	const EC_KEY *ecdsa;
2508
	const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
2692
	const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
2509
#endif /* WITH_OPENSSL */
2693
#endif /* WITH_OPENSSL */
2510
2694
Lines 2543-2550 sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg, Link Here
2543
	switch (k->type) {
2727
	switch (k->type) {
2544
#ifdef WITH_OPENSSL
2728
#ifdef WITH_OPENSSL
2545
	case KEY_DSA_CERT:
2729
	case KEY_DSA_CERT:
2546
		DSA_get0_pqg(k->dsa, &dsa_p, &dsa_q, &dsa_g);
2730
		dsa = EVP_PKEY_get0_DSA(k->pkey);
2547
		DSA_get0_key(k->dsa, &dsa_pub_key, NULL);
2731
		if (dsa == NULL) {
2732
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2733
			goto out;
2734
		}
2735
		DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g);
2736
		DSA_get0_key(dsa, &dsa_pub_key, NULL);
2548
		if ((ret = sshbuf_put_bignum2(cert, dsa_p)) != 0 ||
2737
		if ((ret = sshbuf_put_bignum2(cert, dsa_p)) != 0 ||
2549
		    (ret = sshbuf_put_bignum2(cert, dsa_q)) != 0 ||
2738
		    (ret = sshbuf_put_bignum2(cert, dsa_q)) != 0 ||
2550
		    (ret = sshbuf_put_bignum2(cert, dsa_g)) != 0 ||
2739
		    (ret = sshbuf_put_bignum2(cert, dsa_g)) != 0 ||
Lines 2553-2568 sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg, Link Here
2553
		break;
2742
		break;
2554
# ifdef OPENSSL_HAS_ECC
2743
# ifdef OPENSSL_HAS_ECC
2555
	case KEY_ECDSA_CERT:
2744
	case KEY_ECDSA_CERT:
2745
		ecdsa = EVP_PKEY_get1_EC_KEY(k->pkey);
2746
		if (ecdsa == NULL) {
2747
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2748
			goto out;
2749
		}
2556
		if ((ret = sshbuf_put_cstring(cert,
2750
		if ((ret = sshbuf_put_cstring(cert,
2557
		    sshkey_curve_nid_to_name(k->ecdsa_nid))) != 0 ||
2751
		    sshkey_curve_nid_to_name(k->ecdsa_nid))) != 0 ||
2558
		    (ret = sshbuf_put_ec(cert,
2752
		    (ret = sshbuf_put_ec(cert,
2559
		    EC_KEY_get0_public_key(k->ecdsa),
2753
		    EC_KEY_get0_public_key(ecdsa),
2560
		    EC_KEY_get0_group(k->ecdsa))) != 0)
2754
		    EC_KEY_get0_group(ecdsa))) != 0)
2561
			goto out;
2755
			goto out;
2562
		break;
2756
		break;
2563
# endif /* OPENSSL_HAS_ECC */
2757
# endif /* OPENSSL_HAS_ECC */
2564
	case KEY_RSA_CERT:
2758
	case KEY_RSA_CERT:
2565
		RSA_get0_key(k->rsa, &rsa_n, &rsa_e, NULL);
2759
		rsa = EVP_PKEY_get0_RSA(k->pkey);
2760
		if (rsa == NULL) {
2761
			ret = SSH_ERR_LIBCRYPTO_ERROR;
2762
			goto out;
2763
		}
2764
		RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL);
2566
		if ((ret = sshbuf_put_bignum2(cert, rsa_e)) != 0 ||
2765
		if ((ret = sshbuf_put_bignum2(cert, rsa_e)) != 0 ||
2567
		    (ret = sshbuf_put_bignum2(cert, rsa_n)) != 0)
2766
		    (ret = sshbuf_put_bignum2(cert, rsa_n)) != 0)
2568
			goto out;
2767
			goto out;
Lines 2758-2763 sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b, Link Here
2758
{
2957
{
2759
	int r = SSH_ERR_INTERNAL_ERROR;
2958
	int r = SSH_ERR_INTERNAL_ERROR;
2760
#ifdef WITH_OPENSSL
2959
#ifdef WITH_OPENSSL
2960
	const RSA *rsa;
2961
	const DSA *dsa;
2962
	const EC_KEY *ecdsa;
2761
	const BIGNUM *rsa_n, *rsa_e, *rsa_d, *rsa_iqmp, *rsa_p, *rsa_q;
2963
	const BIGNUM *rsa_n, *rsa_e, *rsa_d, *rsa_iqmp, *rsa_p, *rsa_q;
2762
	const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key, *dsa_priv_key;
2964
	const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key, *dsa_priv_key;
2763
#endif /* WITH_OPENSSL */
2965
#endif /* WITH_OPENSSL */
Lines 2767-2775 sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b, Link Here
2767
	switch (key->type) {
2969
	switch (key->type) {
2768
#ifdef WITH_OPENSSL
2970
#ifdef WITH_OPENSSL
2769
	case KEY_RSA:
2971
	case KEY_RSA:
2770
		RSA_get0_key(key->rsa, &rsa_n, &rsa_e, &rsa_d);
2972
		rsa = EVP_PKEY_get0_RSA(key->pkey);
2771
		RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
2973
		if (rsa == NULL) {
2772
		RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp);
2974
			r = SSH_ERR_LIBCRYPTO_ERROR;
2975
			goto out;
2976
		}
2977
		RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d);
2978
		RSA_get0_factors(rsa, &rsa_p, &rsa_q);
2979
		RSA_get0_crt_params(rsa, NULL, NULL, &rsa_iqmp);
2773
		if ((r = sshbuf_put_bignum2(b, rsa_n)) != 0 ||
2980
		if ((r = sshbuf_put_bignum2(b, rsa_n)) != 0 ||
2774
		    (r = sshbuf_put_bignum2(b, rsa_e)) != 0 ||
2981
		    (r = sshbuf_put_bignum2(b, rsa_e)) != 0 ||
2775
		    (r = sshbuf_put_bignum2(b, rsa_d)) != 0 ||
2982
		    (r = sshbuf_put_bignum2(b, rsa_d)) != 0 ||
Lines 2783-2791 sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b, Link Here
2783
			r = SSH_ERR_INVALID_ARGUMENT;
2990
			r = SSH_ERR_INVALID_ARGUMENT;
2784
			goto out;
2991
			goto out;
2785
		}
2992
		}
2786
		RSA_get0_key(key->rsa, NULL, NULL, &rsa_d);
2993
		rsa = EVP_PKEY_get0_RSA(key->pkey);
2787
		RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
2994
		if (rsa == NULL) {
2788
		RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp);
2995
			r = SSH_ERR_LIBCRYPTO_ERROR;
2996
			goto out;
2997
		}
2998
		RSA_get0_key(rsa, NULL, NULL, &rsa_d);
2999
		RSA_get0_factors(rsa, &rsa_p, &rsa_q);
3000
		RSA_get0_crt_params(rsa, NULL, NULL, &rsa_iqmp);
2789
		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
3001
		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2790
		    (r = sshbuf_put_bignum2(b, rsa_d)) != 0 ||
3002
		    (r = sshbuf_put_bignum2(b, rsa_d)) != 0 ||
2791
		    (r = sshbuf_put_bignum2(b, rsa_iqmp)) != 0 ||
3003
		    (r = sshbuf_put_bignum2(b, rsa_iqmp)) != 0 ||
Lines 2794-2801 sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b, Link Here
2794
			goto out;
3006
			goto out;
2795
		break;
3007
		break;
2796
	case KEY_DSA:
3008
	case KEY_DSA:
2797
		DSA_get0_pqg(key->dsa, &dsa_p, &dsa_q, &dsa_g);
3009
		dsa = EVP_PKEY_get0_DSA(key->pkey);
2798
		DSA_get0_key(key->dsa, &dsa_pub_key, &dsa_priv_key);
3010
		if (dsa == NULL) {
3011
			r = SSH_ERR_LIBCRYPTO_ERROR;
3012
			goto out;
3013
		}
3014
		DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g);
3015
		DSA_get0_key(dsa, &dsa_pub_key, &dsa_priv_key);
2799
		if ((r = sshbuf_put_bignum2(b, dsa_p)) != 0 ||
3016
		if ((r = sshbuf_put_bignum2(b, dsa_p)) != 0 ||
2800
		    (r = sshbuf_put_bignum2(b, dsa_q)) != 0 ||
3017
		    (r = sshbuf_put_bignum2(b, dsa_q)) != 0 ||
2801
		    (r = sshbuf_put_bignum2(b, dsa_g)) != 0 ||
3018
		    (r = sshbuf_put_bignum2(b, dsa_g)) != 0 ||
Lines 2808-2835 sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b, Link Here
2808
			r = SSH_ERR_INVALID_ARGUMENT;
3025
			r = SSH_ERR_INVALID_ARGUMENT;
2809
			goto out;
3026
			goto out;
2810
		}
3027
		}
2811
		DSA_get0_key(key->dsa, NULL, &dsa_priv_key);
3028
		dsa = EVP_PKEY_get0_DSA(key->pkey);
3029
		if (dsa == NULL) {
3030
			r = SSH_ERR_LIBCRYPTO_ERROR;
3031
			goto out;
3032
		}
3033
		DSA_get0_key(dsa, NULL, &dsa_priv_key);
2812
		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
3034
		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2813
		    (r = sshbuf_put_bignum2(b, dsa_priv_key)) != 0)
3035
		    (r = sshbuf_put_bignum2(b, dsa_priv_key)) != 0)
2814
			goto out;
3036
			goto out;
2815
		break;
3037
		break;
2816
# ifdef OPENSSL_HAS_ECC
3038
# ifdef OPENSSL_HAS_ECC
2817
	case KEY_ECDSA:
3039
	case KEY_ECDSA:
2818
		if ((r = sshbuf_put_cstring(b,
3040
		ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey);
3041
		if (!ecdsa || (r = sshbuf_put_cstring(b,
2819
		    sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 ||
3042
		    sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 ||
2820
		    (r = sshbuf_put_eckey(b, key->ecdsa)) != 0 ||
3043
		    (r = sshbuf_put_eckey(b, ecdsa)) != 0 ||
2821
		    (r = sshbuf_put_bignum2(b,
3044
		    (r = sshbuf_put_bignum2(b,
2822
		    EC_KEY_get0_private_key(key->ecdsa))) != 0)
3045
		    EC_KEY_get0_private_key(ecdsa))) != 0)
2823
			goto out;
3046
			goto out;
2824
		break;
3047
		break;
2825
	case KEY_ECDSA_CERT:
3048
	case KEY_ECDSA_CERT:
2826
		if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
3049
		ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey);
3050
		if (!ecdsa || key->cert == NULL ||
3051
		    sshbuf_len(key->cert->certblob) == 0) {
2827
			r = SSH_ERR_INVALID_ARGUMENT;
3052
			r = SSH_ERR_INVALID_ARGUMENT;
2828
			goto out;
3053
			goto out;
2829
		}
3054
		}
2830
		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
3055
		if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2831
		    (r = sshbuf_put_bignum2(b,
3056
		    (r = sshbuf_put_bignum2(b,
2832
		    EC_KEY_get0_private_key(key->ecdsa))) != 0)
3057
		    EC_KEY_get0_private_key(ecdsa))) != 0)
2833
			goto out;
3058
			goto out;
2834
		break;
3059
		break;
2835
# endif /* OPENSSL_HAS_ECC */
3060
# endif /* OPENSSL_HAS_ECC */
Lines 2910-2915 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
2910
	u_char *ed25519_pk = NULL, *ed25519_sk = NULL;
3135
	u_char *ed25519_pk = NULL, *ed25519_sk = NULL;
2911
	u_char *xmss_pk = NULL, *xmss_sk = NULL;
3136
	u_char *xmss_pk = NULL, *xmss_sk = NULL;
2912
#ifdef WITH_OPENSSL
3137
#ifdef WITH_OPENSSL
3138
	RSA *rsa;
3139
	DSA *dsa;
3140
	EC_KEY *ecdsa;
2913
	BIGNUM *exponent = NULL;
3141
	BIGNUM *exponent = NULL;
2914
	BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
3142
	BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
2915
	BIGNUM *rsa_iqmp = NULL, *rsa_p = NULL, *rsa_q = NULL;
3143
	BIGNUM *rsa_iqmp = NULL, *rsa_p = NULL, *rsa_q = NULL;
Lines 2935-2946 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
2935
		    (r = sshbuf_get_bignum2(buf, &dsa_pub_key)) != 0 ||
3163
		    (r = sshbuf_get_bignum2(buf, &dsa_pub_key)) != 0 ||
2936
		    (r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0)
3164
		    (r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0)
2937
			goto out;
3165
			goto out;
2938
		if (!DSA_set0_pqg(k->dsa, dsa_p, dsa_q, dsa_g)) {
3166
		dsa = EVP_PKEY_get0_DSA(k->pkey);
3167
		if (!dsa || !DSA_set0_pqg(dsa, dsa_p, dsa_q, dsa_g)) {
2939
			r = SSH_ERR_LIBCRYPTO_ERROR;
3168
			r = SSH_ERR_LIBCRYPTO_ERROR;
2940
			goto out;
3169
			goto out;
2941
		}
3170
		}
2942
		dsa_p = dsa_q = dsa_g = NULL; /* transferred */
3171
		dsa_p = dsa_q = dsa_g = NULL; /* transferred */
2943
		if (!DSA_set0_key(k->dsa, dsa_pub_key, dsa_priv_key)) {
3172
		if (!DSA_set0_key(dsa, dsa_pub_key, dsa_priv_key)) {
2944
			r = SSH_ERR_LIBCRYPTO_ERROR;
3173
			r = SSH_ERR_LIBCRYPTO_ERROR;
2945
			goto out;
3174
			goto out;
2946
		}
3175
		}
Lines 2950-2956 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
2950
		if ((r = sshkey_froms(buf, &k)) != 0 ||
3179
		if ((r = sshkey_froms(buf, &k)) != 0 ||
2951
		    (r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0)
3180
		    (r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0)
2952
			goto out;
3181
			goto out;
2953
		if (!DSA_set0_key(k->dsa, NULL, dsa_priv_key)) {
3182
		dsa = EVP_PKEY_get0_DSA(k->pkey);
3183
		if (!dsa || !DSA_set0_key(dsa, NULL, dsa_priv_key)) {
2954
			r = SSH_ERR_LIBCRYPTO_ERROR;
3184
			r = SSH_ERR_LIBCRYPTO_ERROR;
2955
			goto out;
3185
			goto out;
2956
		}
3186
		}
Lines 2972-3005 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
2972
			r = SSH_ERR_EC_CURVE_MISMATCH;
3202
			r = SSH_ERR_EC_CURVE_MISMATCH;
2973
			goto out;
3203
			goto out;
2974
		}
3204
		}
2975
		k->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
3205
		ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
2976
		if (k->ecdsa  == NULL) {
3206
		if (ecdsa  == NULL) {
2977
			r = SSH_ERR_LIBCRYPTO_ERROR;
3207
			r = SSH_ERR_LIBCRYPTO_ERROR;
2978
			goto out;
3208
			goto out;
2979
		}
3209
		}
2980
		if ((r = sshbuf_get_eckey(buf, k->ecdsa)) != 0 ||
3210
		if ((r = sshbuf_get_eckey(buf, ecdsa)) != 0 ||
2981
		    (r = sshbuf_get_bignum2(buf, &exponent)))
3211
		    (r = sshbuf_get_bignum2(buf, &exponent)))
2982
			goto out;
3212
			goto out;
2983
		if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) {
3213
		if (EC_KEY_set_private_key(ecdsa, exponent) != 1) {
2984
			r = SSH_ERR_LIBCRYPTO_ERROR;
3214
			r = SSH_ERR_LIBCRYPTO_ERROR;
2985
			goto out;
3215
			goto out;
2986
		}
3216
		}
2987
		if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(k->ecdsa),
3217
		if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa),
2988
		    EC_KEY_get0_public_key(k->ecdsa))) != 0 ||
3218
		    EC_KEY_get0_public_key(ecdsa))) != 0 ||
2989
		    (r = sshkey_ec_validate_private(k->ecdsa)) != 0)
3219
		    (r = sshkey_ec_validate_private(ecdsa)) != 0)
3220
			goto out;
3221
		if (EVP_PKEY_set1_EC_KEY(k->pkey, ecdsa) != 1) {
3222
			r = SSH_ERR_LIBCRYPTO_ERROR;
2990
			goto out;
3223
			goto out;
3224
		}
2991
		break;
3225
		break;
2992
	case KEY_ECDSA_CERT:
3226
	case KEY_ECDSA_CERT:
2993
		if ((r = sshkey_froms(buf, &k)) != 0 ||
3227
		if ((r = sshkey_froms(buf, &k)) != 0 ||
2994
		    (r = sshbuf_get_bignum2(buf, &exponent)) != 0)
3228
		    (r = sshbuf_get_bignum2(buf, &exponent)) != 0)
2995
			goto out;
3229
			goto out;
2996
		if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) {
3230
		ecdsa = EVP_PKEY_get0_EC_KEY(k->pkey);
3231
		if (!ecdsa || EC_KEY_set_private_key(ecdsa, exponent) != 1) {
2997
			r = SSH_ERR_LIBCRYPTO_ERROR;
3232
			r = SSH_ERR_LIBCRYPTO_ERROR;
2998
			goto out;
3233
			goto out;
2999
		}
3234
		}
3000
		if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(k->ecdsa),
3235
		if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa),
3001
		    EC_KEY_get0_public_key(k->ecdsa))) != 0 ||
3236
		    EC_KEY_get0_public_key(ecdsa))) != 0 ||
3002
		    (r = sshkey_ec_validate_private(k->ecdsa)) != 0)
3237
		    (r = sshkey_ec_validate_private(ecdsa)) != 0)
3003
			goto out;
3238
			goto out;
3004
		break;
3239
		break;
3005
# endif /* OPENSSL_HAS_ECC */
3240
# endif /* OPENSSL_HAS_ECC */
Lines 3015-3031 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
3015
		    (r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 ||
3250
		    (r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 ||
3016
		    (r = sshbuf_get_bignum2(buf, &rsa_q)) != 0)
3251
		    (r = sshbuf_get_bignum2(buf, &rsa_q)) != 0)
3017
			goto out;
3252
			goto out;
3018
		if (!RSA_set0_key(k->rsa, rsa_n, rsa_e, rsa_d)) {
3253
		rsa = EVP_PKEY_get0_RSA(k->pkey);
3254
		if (!rsa || !RSA_set0_key(rsa, rsa_n, rsa_e, rsa_d)) {
3019
			r = SSH_ERR_LIBCRYPTO_ERROR;
3255
			r = SSH_ERR_LIBCRYPTO_ERROR;
3020
			goto out;
3256
			goto out;
3021
		}
3257
		}
3022
		rsa_n = rsa_e = rsa_d = NULL; /* transferred */
3258
		rsa_n = rsa_e = rsa_d = NULL; /* transferred */
3023
		if (!RSA_set0_factors(k->rsa, rsa_p, rsa_q)) {
3259
		if (!RSA_set0_factors(rsa, rsa_p, rsa_q)) {
3024
			r = SSH_ERR_LIBCRYPTO_ERROR;
3260
			r = SSH_ERR_LIBCRYPTO_ERROR;
3025
			goto out;
3261
			goto out;
3026
		}
3262
		}
3027
		rsa_p = rsa_q = NULL; /* transferred */
3263
		rsa_p = rsa_q = NULL; /* transferred */
3028
		if ((r = check_rsa_length(k->rsa)) != 0)
3264
		if ((r = check_rsa_length(k)) != 0)
3029
			goto out;
3265
			goto out;
3030
		if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
3266
		if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
3031
			goto out;
3267
			goto out;
Lines 3037-3053 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
3037
		    (r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 ||
3273
		    (r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 ||
3038
		    (r = sshbuf_get_bignum2(buf, &rsa_q)) != 0)
3274
		    (r = sshbuf_get_bignum2(buf, &rsa_q)) != 0)
3039
			goto out;
3275
			goto out;
3040
		if (!RSA_set0_key(k->rsa, NULL, NULL, rsa_d)) {
3276
		rsa = EVP_PKEY_get0_RSA(k->pkey);
3277
		if (!rsa || !RSA_set0_key(rsa, NULL, NULL, rsa_d)) {
3041
			r = SSH_ERR_LIBCRYPTO_ERROR;
3278
			r = SSH_ERR_LIBCRYPTO_ERROR;
3042
			goto out;
3279
			goto out;
3043
		}
3280
		}
3044
		rsa_d = NULL; /* transferred */
3281
		rsa_d = NULL; /* transferred */
3045
		if (!RSA_set0_factors(k->rsa, rsa_p, rsa_q)) {
3282
		if (!RSA_set0_factors(rsa, rsa_p, rsa_q)) {
3046
			r = SSH_ERR_LIBCRYPTO_ERROR;
3283
			r = SSH_ERR_LIBCRYPTO_ERROR;
3047
			goto out;
3284
			goto out;
3048
		}
3285
		}
3049
		rsa_p = rsa_q = NULL; /* transferred */
3286
		rsa_p = rsa_q = NULL; /* transferred */
3050
		if ((r = check_rsa_length(k->rsa)) != 0)
3287
		if ((r = check_rsa_length(k)) != 0)
3051
			goto out;
3288
			goto out;
3052
		if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
3289
		if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
3053
			goto out;
3290
			goto out;
Lines 3137-3143 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) Link Here
3137
	switch (k->type) {
3374
	switch (k->type) {
3138
	case KEY_RSA:
3375
	case KEY_RSA:
3139
	case KEY_RSA_CERT:
3376
	case KEY_RSA_CERT:
3140
		if (RSA_blinding_on(k->rsa, NULL) != 1) {
3377
		rsa = EVP_PKEY_get0_RSA(k->pkey);
3378
		if (!rsa || RSA_blinding_on(rsa, NULL) != 1) {
3141
			r = SSH_ERR_LIBCRYPTO_ERROR;
3379
			r = SSH_ERR_LIBCRYPTO_ERROR;
3142
			goto out;
3380
			goto out;
3143
		}
3381
		}
Lines 3728-3733 sshkey_private_pem_to_blob(struct sshkey *key, struct sshbuf *blob, Link Here
3728
	const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL;
3966
	const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL;
3729
	char *bptr;
3967
	char *bptr;
3730
	BIO *bio = NULL;
3968
	BIO *bio = NULL;
3969
	RSA *rsa;
3970
	DSA *dsa;
3971
	EC_KEY *ecdsa;
3731
3972
3732
	if (len > 0 && len <= 4)
3973
	if (len > 0 && len <= 4)
3733
		return SSH_ERR_PASSPHRASE_TOO_SHORT;
3974
		return SSH_ERR_PASSPHRASE_TOO_SHORT;
Lines 3736-3752 sshkey_private_pem_to_blob(struct sshkey *key, struct sshbuf *blob, Link Here
3736
3977
3737
	switch (key->type) {
3978
	switch (key->type) {
3738
	case KEY_DSA:
3979
	case KEY_DSA:
3739
		success = PEM_write_bio_DSAPrivateKey(bio, key->dsa,
3980
		dsa = EVP_PKEY_get0_DSA(key->pkey);
3981
		success = PEM_write_bio_DSAPrivateKey(bio, dsa,
3740
		    cipher, passphrase, len, NULL, NULL);
3982
		    cipher, passphrase, len, NULL, NULL);
3741
		break;
3983
		break;
3742
#ifdef OPENSSL_HAS_ECC
3984
#ifdef OPENSSL_HAS_ECC
3743
	case KEY_ECDSA:
3985
	case KEY_ECDSA:
3744
		success = PEM_write_bio_ECPrivateKey(bio, key->ecdsa,
3986
		ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey);
3987
		success = PEM_write_bio_ECPrivateKey(bio, ecdsa,
3745
		    cipher, passphrase, len, NULL, NULL);
3988
		    cipher, passphrase, len, NULL, NULL);
3746
		break;
3989
		break;
3747
#endif
3990
#endif
3748
	case KEY_RSA:
3991
	case KEY_RSA:
3749
		success = PEM_write_bio_RSAPrivateKey(bio, key->rsa,
3992
		rsa = EVP_PKEY_get0_RSA(key->pkey);
3993
		success = PEM_write_bio_RSAPrivateKey(bio, rsa,
3750
		    cipher, passphrase, len, NULL, NULL);
3994
		    cipher, passphrase, len, NULL, NULL);
3751
		break;
3995
		break;
3752
	default:
3996
	default:
Lines 3912-3931 sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, Link Here
3912
	}
4156
	}
3913
	if (EVP_PKEY_base_id(pk) == EVP_PKEY_RSA &&
4157
	if (EVP_PKEY_base_id(pk) == EVP_PKEY_RSA &&
3914
	    (type == KEY_UNSPEC || type == KEY_RSA)) {
4158
	    (type == KEY_UNSPEC || type == KEY_RSA)) {
4159
		RSA *rsa;
3915
		if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
4160
		if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
3916
			r = SSH_ERR_ALLOC_FAIL;
4161
			r = SSH_ERR_ALLOC_FAIL;
3917
			goto out;
4162
			goto out;
3918
		}
4163
		}
3919
		prv->rsa = EVP_PKEY_get1_RSA(pk);
4164
		rsa = EVP_PKEY_get0_RSA(pk);
4165
		if (rsa == NULL) {
4166
			r = SSH_ERR_LIBCRYPTO_ERROR;
4167
			goto out;
4168
		}
4169
		prv->pkey = pk;
4170
		pk = NULL;
3920
		prv->type = KEY_RSA;
4171
		prv->type = KEY_RSA;
3921
#ifdef DEBUG_PK
4172
#ifdef DEBUG_PK
3922
		RSA_print_fp(stderr, prv->rsa, 8);
4173
		RSA_print_fp(stderr, rsa, 8);
3923
#endif
4174
#endif
3924
		if (RSA_blinding_on(prv->rsa, NULL) != 1) {
4175
		if (RSA_blinding_on(rsa, NULL) != 1) {
3925
			r = SSH_ERR_LIBCRYPTO_ERROR;
4176
			r = SSH_ERR_LIBCRYPTO_ERROR;
3926
			goto out;
4177
			goto out;
3927
		}
4178
		}
3928
		if ((r = check_rsa_length(prv->rsa)) != 0)
4179
		if ((r = check_rsa_length(prv)) != 0)
3929
			goto out;
4180
			goto out;
3930
	} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA &&
4181
	} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA &&
3931
	    (type == KEY_UNSPEC || type == KEY_DSA)) {
4182
	    (type == KEY_UNSPEC || type == KEY_DSA)) {
Lines 3933-3964 sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, Link Here
3933
			r = SSH_ERR_ALLOC_FAIL;
4184
			r = SSH_ERR_ALLOC_FAIL;
3934
			goto out;
4185
			goto out;
3935
		}
4186
		}
3936
		prv->dsa = EVP_PKEY_get1_DSA(pk);
4187
		prv->pkey = pk;
4188
		pk = NULL;
3937
		prv->type = KEY_DSA;
4189
		prv->type = KEY_DSA;
3938
#ifdef DEBUG_PK
4190
#ifdef DEBUG_PK
3939
		DSA_print_fp(stderr, prv->dsa, 8);
4191
		DSA_print_fp(stderr, EVP_PKEY_get0_DSA(pk), 8);
3940
#endif
4192
#endif
3941
#ifdef OPENSSL_HAS_ECC
4193
#ifdef OPENSSL_HAS_ECC
3942
	} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_EC &&
4194
	} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_EC &&
3943
	    (type == KEY_UNSPEC || type == KEY_ECDSA)) {
4195
	    (type == KEY_UNSPEC || type == KEY_ECDSA)) {
4196
		EC_KEY *ecdsa;
3944
		if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
4197
		if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
3945
			r = SSH_ERR_ALLOC_FAIL;
4198
			r = SSH_ERR_ALLOC_FAIL;
3946
			goto out;
4199
			goto out;
3947
		}
4200
		}
3948
		prv->ecdsa = EVP_PKEY_get1_EC_KEY(pk);
4201
		ecdsa = EVP_PKEY_get0_EC_KEY(pk);
4202
		if (ecdsa == NULL) {
4203
			r = SSH_ERR_LIBCRYPTO_ERROR;
4204
			goto out;
4205
		}
3949
		prv->type = KEY_ECDSA;
4206
		prv->type = KEY_ECDSA;
3950
		prv->ecdsa_nid = sshkey_ecdsa_key_to_nid(prv->ecdsa);
4207
		EVP_PKEY_free(prv->pkey);
4208
		prv->pkey = pk;
4209
		pk = NULL;
4210
		prv->ecdsa_nid = sshkey_ecdsa_key_to_nid(prv);
3951
		if (prv->ecdsa_nid == -1 ||
4211
		if (prv->ecdsa_nid == -1 ||
3952
		    sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL ||
4212
		    sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL ||
3953
		    sshkey_ec_validate_public(EC_KEY_get0_group(prv->ecdsa),
4213
		    sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa),
3954
		    EC_KEY_get0_public_key(prv->ecdsa)) != 0 ||
4214
		    EC_KEY_get0_public_key(ecdsa)) != 0 ||
3955
		    sshkey_ec_validate_private(prv->ecdsa) != 0) {
4215
		    sshkey_ec_validate_private(ecdsa) != 0) {
3956
			r = SSH_ERR_INVALID_FORMAT;
4216
			r = SSH_ERR_INVALID_FORMAT;
3957
			goto out;
4217
			goto out;
3958
		}
4218
		}
3959
# ifdef DEBUG_PK
4219
# ifdef DEBUG_PK
3960
		if (prv != NULL && prv->ecdsa != NULL)
4220
		if (prv != NULL && ecdsa != NULL)
3961
			sshkey_dump_ec_key(prv->ecdsa);
4221
			sshkey_dump_ec_key(ecdsa);
3962
# endif
4222
# endif
3963
#endif /* OPENSSL_HAS_ECC */
4223
#endif /* OPENSSL_HAS_ECC */
3964
	} else {
4224
	} else {
(-)a/sshkey.h (-18 / +9 lines)
Lines 29-49 Link Here
29
#include <sys/types.h>
29
#include <sys/types.h>
30
30
31
#ifdef WITH_OPENSSL
31
#ifdef WITH_OPENSSL
32
#include <openssl/rsa.h>
32
#include <openssl/evp.h>
33
#include <openssl/dsa.h>
33
#include <openssl/ec.h>
34
# ifdef OPENSSL_HAS_ECC
35
#  include <openssl/ec.h>
36
#  include <openssl/ecdsa.h>
37
# else /* OPENSSL_HAS_ECC */
38
#  define EC_KEY	void
39
#  define EC_GROUP	void
40
#  define EC_POINT	void
41
# endif /* OPENSSL_HAS_ECC */
42
#else /* WITH_OPENSSL */
34
#else /* WITH_OPENSSL */
43
# define BIGNUM		void
35
# define EVP_PKEY	void
44
# define RSA		void
45
# define DSA		void
46
# define EC_KEY		void
47
# define EC_GROUP	void
36
# define EC_GROUP	void
48
# define EC_POINT	void
37
# define EC_POINT	void
49
#endif /* WITH_OPENSSL */
38
#endif /* WITH_OPENSSL */
Lines 111-120 struct sshkey_cert { Link Here
111
struct sshkey {
100
struct sshkey {
112
	int	 type;
101
	int	 type;
113
	int	 flags;
102
	int	 flags;
114
	RSA	*rsa;
103
	EVP_PKEY *pkey;
115
	DSA	*dsa;
116
	int	 ecdsa_nid;	/* NID of curve */
104
	int	 ecdsa_nid;	/* NID of curve */
117
	EC_KEY	*ecdsa;
118
	u_char	*ed25519_sk;
105
	u_char	*ed25519_sk;
119
	u_char	*ed25519_pk;
106
	u_char	*ed25519_pk;
120
	char	*xmss_name;
107
	char	*xmss_name;
Lines 171-177 int sshkey_curve_name_to_nid(const char *); Link Here
171
const char *	 sshkey_curve_nid_to_name(int);
158
const char *	 sshkey_curve_nid_to_name(int);
172
u_int		 sshkey_curve_nid_to_bits(int);
159
u_int		 sshkey_curve_nid_to_bits(int);
173
int		 sshkey_ecdsa_bits_to_nid(int);
160
int		 sshkey_ecdsa_bits_to_nid(int);
174
int		 sshkey_ecdsa_key_to_nid(EC_KEY *);
161
int		 sshkey_ecdsa_key_to_nid(struct sshkey *);
175
int		 sshkey_ec_nid_to_hash_alg(int nid);
162
int		 sshkey_ec_nid_to_hash_alg(int nid);
176
int		 sshkey_ec_validate_public(const EC_GROUP *, const EC_POINT *);
163
int		 sshkey_ec_validate_public(const EC_GROUP *, const EC_POINT *);
177
int		 sshkey_ec_validate_private(const EC_KEY *);
164
int		 sshkey_ec_validate_private(const EC_KEY *);
Lines 179-184 const char *sshkey_ssh_name(const struct sshkey *); Link Here
179
const char	*sshkey_ssh_name_plain(const struct sshkey *);
166
const char	*sshkey_ssh_name_plain(const struct sshkey *);
180
int		 sshkey_names_valid2(const char *, int);
167
int		 sshkey_names_valid2(const char *, int);
181
char		*sshkey_alg_list(int, int, int, char);
168
char		*sshkey_alg_list(int, int, int, char);
169
int		 sshkey_calculate_signature(EVP_PKEY*, int, u_char **,
170
    int *, const u_char *, size_t);
171
int		 sshkey_verify_signature(EVP_PKEY *, int, const u_char *,
172
    size_t, u_char *, int);
182
173
183
int	 sshkey_from_blob(const u_char *, size_t, struct sshkey **);
174
int	 sshkey_from_blob(const u_char *, size_t, struct sshkey **);
184
int	 sshkey_fromb(struct sshbuf *, struct sshkey **);
175
int	 sshkey_fromb(struct sshbuf *, struct sshkey **);

Return to bug 3005