From d850788574e68742bd936e6a026c62c1839abaab Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sun, 29 Sep 2019 23:28:30 -0400 Subject: Add DEREncodeTextString overload --- asn.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'asn.cpp') diff --git a/asn.cpp b/asn.cpp index e6f3c895..729c7760 100644 --- a/asn.cpp +++ b/asn.cpp @@ -148,12 +148,22 @@ size_t BERDecodeOctetString(BufferedTransformation &bt, BufferedTransformation & return bc; } -size_t DEREncodeTextString(BufferedTransformation &bt, const SecByteBlock &str, byte asnTag) +size_t DEREncodeTextString(BufferedTransformation &bt, const byte* str, size_t strLen, byte asnTag) { bt.Put(asnTag); - size_t lengthBytes = DERLengthEncode(bt, str.size()); - bt.Put(ConstBytePtr(str), BytePtrSize(str)); - return 1+lengthBytes+str.size(); + size_t lengthBytes = DERLengthEncode(bt, strLen); + bt.Put(str, strLen); + return 1+lengthBytes+strLen; +} + +size_t DEREncodeTextString(BufferedTransformation &bt, const SecByteBlock &str, byte asnTag) +{ + return DEREncodeTextString(bt, ConstBytePtr(str), BytePtrSize(str), asnTag); +} + +size_t DEREncodeTextString(BufferedTransformation &bt, const std::string &str, byte asnTag) +{ + return DEREncodeTextString(bt, ConstBytePtr(str), BytePtrSize(str), asnTag); } size_t BERDecodeTextString(BufferedTransformation &bt, SecByteBlock &str, byte asnTag) @@ -276,11 +286,13 @@ void DERReencode(BufferedTransformation &source, BufferedTransformation &dest) size_t BERDecodePeekLength(BufferedTransformation &bt) { ByteQueue tagAndLength; - bt.CopyTo(tagAndLength, 9); + lword count = (std::min)(bt.MaxRetrievable(), static_cast(16)); + bt.CopyTo(tagAndLength, count); // Skip tag tagAndLength.Skip(1); + // BERLengthDecode fails for indefinite length. size_t length; if (!BERLengthDecode(tagAndLength, length)) return 0; -- cgit v1.2.1