static int test_cbb_fixed(void) { CBB cbb; uint8_t buf[1]; uint8_t *out_buf; size_t out_size; if (!CBB_init_fixed(&cbb, NULL, 0) || CBB_add_u8(&cbb, 1) || !CBB_finish(&cbb, &out_buf, &out_size) || out_buf != NULL || out_size != 0) { return 0; } if (!CBB_init_fixed(&cbb, buf, 1) || !CBB_add_u8(&cbb, 1) || CBB_add_u8(&cbb, 2) || !CBB_finish(&cbb, &out_buf, &out_size) || out_buf != buf || out_size != 1 || buf[0] != 1) { return 0; } return 1; }
int ECDSA_sign_ex(int type, const uint8_t *digest, size_t digest_len, uint8_t *sig, unsigned int *sig_len, const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey) { int ret = 0; ECDSA_SIG *s = NULL; s = ECDSA_do_sign_ex(digest, digest_len, kinv, r, eckey); if (s == NULL) { *sig_len = 0; goto err; } CBB cbb; CBB_zero(&cbb); size_t len; if (!CBB_init_fixed(&cbb, sig, ECDSA_size(eckey)) || !ECDSA_SIG_marshal(&cbb, s) || !CBB_finish(&cbb, NULL, &len)) { OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_ENCODE_ERROR); CBB_cleanup(&cbb); *sig_len = 0; goto err; } *sig_len = (unsigned)len; ret = 1; err: ECDSA_SIG_free(s); return ret; }