/* * 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 MemoryRegion& ber) { BER_Decoder(ber) .start_cons(SEQUENCE) .decode(m_r) .decode(m_s) .end_cons() .verify_end(); } MemoryVector ECDSA_Signature::DER_encode() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(get_r()) .encode(get_s()) .end_cons() .get_contents(); } MemoryVector ECDSA_Signature::get_concatenation() const { u32bit enc_len = m_r > m_s ? m_r.bytes() : m_s.bytes(); // use the larger SecureVector sv_r = BigInt::encode_1363(m_r, enc_len); SecureVector sv_s = BigInt::encode_1363(m_s, enc_len); SecureVector result(sv_r); result.append(sv_s); return result; } ECDSA_Signature decode_concatenation(const MemoryRegion& concat) { if(concat.size() % 2 != 0) throw Invalid_Argument("Erroneous length of signature"); u32bit rs_len = concat.size()/2; SecureVector sv_r; SecureVector sv_s; sv_r.set(concat.begin(), rs_len); sv_s.set(&concat[rs_len], rs_len); BigInt r = BigInt::decode(sv_r, sv_r.size()); BigInt s = BigInt::decode(sv_s, sv_s.size()); return ECDSA_Signature(r, s); } }