- rename `st_ptls_raw_pubkey_verify_certificate_t` to `st_ptls_openssl_raw_pubkey_verify_certificate_t`
- store EVP_PKEY in the verify structure
diff --git a/include/picotls/openssl.h b/include/picotls/openssl.h
index 60fb69f..1f27a27 100644
--- a/include/picotls/openssl.h
+++ b/include/picotls/openssl.h
@@ -104,10 +104,10 @@
void ptls_openssl_dispose_sign_certificate(ptls_openssl_sign_certificate_t *self);
int ptls_openssl_load_certificates(ptls_context_t *ctx, X509 *cert, STACK_OF(X509) * chain);
-typedef struct st_ptls_raw_pubkey_verify_certificate_t {
+typedef struct st_ptls_openssl_raw_pubkey_verify_certificate_t {
ptls_verify_certificate_t super;
- ptls_iovec_t expected_pubkey;
-} ptls_raw_pubkey_verify_certificate_t;
+ EVP_PKEY *expected_pubkey;
+} ptls_openssl_raw_pubkey_verify_certificate_t;
typedef struct st_ptls_openssl_verify_certificate_t {
ptls_verify_certificate_t super;
@@ -118,7 +118,7 @@
void ptls_openssl_dispose_verify_certificate(ptls_openssl_verify_certificate_t *self);
X509_STORE *ptls_openssl_create_default_certificate_store(void);
-int ptls_raw_pubkey_init_verify_certificate(ptls_raw_pubkey_verify_certificate_t *self);
+int ptls_openssl_raw_pubkey_init_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self, EVP_PKEY *pubkey);
int ptls_openssl_encrypt_ticket(ptls_buffer_t *dst, ptls_iovec_t src,
int (*cb)(unsigned char *, unsigned char *, EVP_CIPHER_CTX *, HMAC_CTX *, int));
diff --git a/lib/openssl.c b/lib/openssl.c
index 7d1bb19..0bc52cb 100644
--- a/lib/openssl.c
+++ b/lib/openssl.c
@@ -1289,34 +1289,39 @@
static int verify_raw_cert(ptls_verify_certificate_t *_self, ptls_t *tls, int (**verifier)(void *, ptls_iovec_t, ptls_iovec_t),
void **verify_data, ptls_iovec_t *certs, size_t num_certs)
{
- ptls_raw_pubkey_verify_certificate_t *self = (ptls_raw_pubkey_verify_certificate_t *)_self;
+ ptls_openssl_raw_pubkey_verify_certificate_t *self = (ptls_openssl_raw_pubkey_verify_certificate_t *)_self;
int ret = PTLS_ALERT_BAD_CERTIFICATE;
+ ptls_iovec_t expected_pubkey = {};
assert(num_certs != 0);
if (num_certs != 1)
goto Exit;
- if (certs[0].len != self->expected_pubkey.len)
- goto Exit;
-
- if (!ptls_mem_equal(self->expected_pubkey.base, certs[0].base, certs[0].len))
- goto Exit;
-
- const unsigned char *p = self->expected_pubkey.base;
- if ((*verify_data = d2i_PUBKEY(NULL, &p, self->expected_pubkey.len)) == NULL) {
+ int r = i2d_PUBKEY(self->expected_pubkey, &expected_pubkey.base);
+ if (r <= 0) {
ret = PTLS_ALERT_BAD_CERTIFICATE;
goto Exit;
}
+
+ expected_pubkey.len = r;
+ if (certs[0].len != expected_pubkey.len)
+ goto Exit;
+
+ if (!ptls_mem_equal(expected_pubkey.base, certs[0].base, certs[0].len))
+ goto Exit;
+
+ *verify_data = self->expected_pubkey;
*verifier = verify_sign;
ret = 0;
Exit:
+ free(expected_pubkey.base);
return ret;
}
-int ptls_raw_pubkey_init_verify_certificate(ptls_raw_pubkey_verify_certificate_t *self)
+int ptls_openssl_raw_pubkey_init_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self, EVP_PKEY *expected_pubkey)
{
- *self = (ptls_raw_pubkey_verify_certificate_t){{verify_raw_cert}};
+ *self = (ptls_openssl_raw_pubkey_verify_certificate_t){{verify_raw_cert}, expected_pubkey};
return 0;
}
diff --git a/t/cli.c b/t/cli.c
index 04d0625..c3cf2b9 100644
--- a/t/cli.c
+++ b/t/cli.c
@@ -555,8 +555,14 @@
ctx.certificates.count = 1;
} else if (!is_dash) {
ptls_iovec_t raw_pub_key;
+ EVP_PKEY *pubkey;
load_raw_public_key(&raw_pub_key, raw_pub_key_file);
- setup_raw_pubkey_verify_certificate(&ctx, raw_pub_key);
+ pubkey = d2i_PUBKEY(NULL, (const unsigned char **)&raw_pub_key.base, raw_pub_key.len);
+ if (pubkey == NULL) {
+ fprintf(stderr, "Failed to create an EVP_PKEY from the key found in %s\n", raw_pub_key_file);
+ return 1;
+ }
+ setup_raw_pubkey_verify_certificate(&ctx, pubkey);
}
ctx.use_raw_public_keys = 1;
} else {
diff --git a/t/util.h b/t/util.h
index 74d61fb..3890737 100644
--- a/t/util.h
+++ b/t/util.h
@@ -131,11 +131,10 @@
ctx->verify_certificate = &vc.super;
}
-static inline void setup_raw_pubkey_verify_certificate(ptls_context_t *ctx, ptls_iovec_t raw_pub_key)
+static inline void setup_raw_pubkey_verify_certificate(ptls_context_t *ctx, EVP_PKEY *pubkey)
{
- static ptls_raw_pubkey_verify_certificate_t vc;
- ptls_raw_pubkey_init_verify_certificate(&vc);
- vc.expected_pubkey = raw_pub_key;
+ static ptls_openssl_raw_pubkey_verify_certificate_t vc;
+ ptls_openssl_raw_pubkey_init_verify_certificate(&vc, pubkey);
ctx->verify_certificate = &vc.super;
}