/* * ECDSA Signature * (C) 2007 Falko Strenzke, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { ECDSA_Signature::ECDSA_Signature(const secure_vector& ber) { BER_Decoder(ber) .start_cons(SEQUENCE) .decode(m_r) .decode(m_s) .end_cons() .verify_end(); } std::vector ECDSA_Signature::DER_encode() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(get_r()) .encode(get_s()) .end_cons() .get_contents(); } std::vector ECDSA_Signature::get_concatenation() const { // use the larger const size_t enc_len = m_r > m_s ? m_r.bytes() : m_s.bytes(); secure_vector sv_r = BigInt::encode_1363(m_r, enc_len); secure_vector sv_s = BigInt::encode_1363(m_s, enc_len); secure_vector result(sv_r); result += sv_s; return result; } ECDSA_Signature decode_concatenation(const secure_vector& concat) { if(concat.size() % 2 != 0) throw Invalid_Argument("Erroneous length of signature"); const size_t rs_len = concat.size() / 2; BigInt r = BigInt::decode(&concat[0], rs_len); BigInt s = BigInt::decode(&concat[rs_len], rs_len); return ECDSA_Signature(r, s); } }