From 2409d03e10a0588361db3cc2ee8d0fab94c7fc33 Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Mon, 5 Sep 2016 09:29:24 +0200 Subject: Introduced helper function _gnutls_decode_ber_rs_raw() --- lib/libgnutls.map | 1 + lib/pk.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ lib/pk.h | 4 ++++ 3 files changed, 49 insertions(+) diff --git a/lib/libgnutls.map b/lib/libgnutls.map index ef802043c6..b15da7f74f 100644 --- a/lib/libgnutls.map +++ b/lib/libgnutls.map @@ -1124,6 +1124,7 @@ GNUTLS_FIPS140_3_4 { dsa_generate_dss_keypair; _gnutls_prf_raw; _gnutls_encode_ber_rs_raw; + _gnutls_decode_ber_rs_raw; _rsa_generate_fips186_4_keypair; _gnutls_dh_compute_key; _gnutls_dh_generate_key; diff --git a/lib/pk.c b/lib/pk.c index d724d65a9a..efdb9fe17a 100644 --- a/lib/pk.c +++ b/lib/pk.c @@ -195,6 +195,50 @@ _gnutls_decode_ber_rs(const gnutls_datum_t * sig_value, bigint_t * r, return 0; } +int +_gnutls_decode_ber_rs_raw(const gnutls_datum_t * sig_value, gnutls_datum_t *r, + gnutls_datum_t *s) +{ + ASN1_TYPE sig; + int result; + + if ((result = + asn1_create_element(_gnutls_get_gnutls_asn(), + "GNUTLS.DSASignatureValue", + &sig)) != ASN1_SUCCESS) { + gnutls_assert(); + return _gnutls_asn2err(result); + } + + result = + asn1_der_decoding(&sig, sig_value->data, sig_value->size, + NULL); + if (result != ASN1_SUCCESS) { + gnutls_assert(); + asn1_delete_structure(&sig); + return _gnutls_asn2err(result); + } + + result = _gnutls_x509_read_value(sig, "r", r); + if (result < 0) { + gnutls_assert(); + asn1_delete_structure(&sig); + return result; + } + + result = _gnutls_x509_read_value(sig, "s", s); + if (result < 0) { + gnutls_assert(); + gnutls_free(r->data); + asn1_delete_structure(&sig); + return result; + } + + asn1_delete_structure(&sig); + + return 0; +} + /* some generic pk functions */ int _gnutls_pk_params_copy(gnutls_pk_params_st * dst, diff --git a/lib/pk.h b/lib/pk.h index 6892119c1d..9c075e4054 100644 --- a/lib/pk.h +++ b/lib/pk.h @@ -64,6 +64,10 @@ int _gnutls_decode_ber_rs(const gnutls_datum_t * sig_value, bigint_t * r, bigint_t * s); +int +_gnutls_decode_ber_rs_raw(const gnutls_datum_t * sig_value, gnutls_datum_t *r, + gnutls_datum_t *s); + int encode_ber_digest_info(const mac_entry_st * e, const gnutls_datum_t * digest, -- cgit v1.2.1