diff options
author | Jack Lloyd <[email protected]> | 2018-05-22 11:04:15 -0400 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2018-05-22 11:04:15 -0400 |
commit | 3789138906cecbcc5e33bb0d5784e6b576171080 (patch) | |
tree | 147c442020bec8ad6effe62727fdb6b300d0f7f7 /src/lib/pubkey/dl_group | |
parent | cd0bcd90817ece3e4fcba32e06a372580bbe3008 (diff) |
DER improvements
Let DER_Encoder write to a user specified vector instead of only to an
internal vector. This allows encoding to a std::vector without having
to first write to a locked vector and then copying out the result.
Add ASN1_Object::BER_encode convenience method. Replaces
X509_Object::BER_encode which had the same logic but was restricted to
a subtype. This replaces many cases where DER_Encoder was just used
to encode a single object (X509_DN, AlgorithmIdentifier, etc).
Diffstat (limited to 'src/lib/pubkey/dl_group')
-rw-r--r-- | src/lib/pubkey/dl_group/dl_group.cpp | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/lib/pubkey/dl_group/dl_group.cpp b/src/lib/pubkey/dl_group/dl_group.cpp index 9bab123cb..6a2d21c8b 100644 --- a/src/lib/pubkey/dl_group/dl_group.cpp +++ b/src/lib/pubkey/dl_group/dl_group.cpp @@ -457,37 +457,36 @@ std::vector<uint8_t> DL_Group::DER_encode(Format format) const if(get_q().is_zero() && (format == ANSI_X9_57 || format == ANSI_X9_42)) throw Encoding_Error("Cannot encode DL_Group in ANSI formats when q param is missing"); + std::vector<uint8_t> output; + DER_Encoder der(output); + if(format == ANSI_X9_57) { - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(get_p()) .encode(get_q()) .encode(get_g()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } else if(format == ANSI_X9_42) { - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(get_p()) .encode(get_g()) .encode(get_q()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } else if(format == PKCS_3) { - return DER_Encoder() - .start_cons(SEQUENCE) + der.start_cons(SEQUENCE) .encode(get_p()) .encode(get_g()) - .end_cons() - .get_contents_unlocked(); + .end_cons(); } + else + throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); - throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); + return output; } /* |