As OpenSSL does not store the sign in the ASN1_INTEGER string data,
it is not possible to distinguish positive and negative serial numbers.
While negative serials are forbidden in RFC 5280 4.1.2.2, it also says
that we SHOULD expect these from non-conforming CAs.
The solution is to use full DER-encoding of a signed integer obtained
with i2d_ASN1_INTEGER.
The change also addresses a correctness issue, as ASN1_STRING accessors
should not be used on ASN1_INTEGER.
#endif
-#if (OPENSSL_VERSION_NUMBER < 0x1010000fL)
-#define ASN1_STRING_get0_data(x) (x)->data
-#endif
-
-
#if (OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined SSL_get_peer_certificate)
#define SSL_get_peer_certificate(s) SSL_get1_peer_certificate(s)
#endif
const X509_NAME *name;
serial = X509_get_serialNumber(ctx->cert);
- length = ASN1_STRING_length(serial);
+ length = i2d_ASN1_INTEGER(serial, NULL);
- if (length > 20) {
+ if (length <= 2 || length > 23) {
return NGX_ERROR;
}
p += 20;
- ngx_memcpy(p, ASN1_STRING_get0_data(serial), length);
+ (void) i2d_ASN1_INTEGER(serial, &p);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0,
"ssl ocsp key %xV", &ctx->key);