From db22c6ce50cb5e3900acc24695c2055ccc51e930 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sun, 29 Sep 2019 22:56:12 -0400 Subject: Add ASN.1 Date type support --- asn.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) (limited to 'asn.cpp') diff --git a/asn.cpp b/asn.cpp index b2e86e06..e6f3c895 100644 --- a/asn.cpp +++ b/asn.cpp @@ -148,14 +148,33 @@ size_t BERDecodeOctetString(BufferedTransformation &bt, BufferedTransformation & return bc; } -size_t DEREncodeTextString(BufferedTransformation &bt, const std::string &str, byte asnTag) +size_t DEREncodeTextString(BufferedTransformation &bt, const SecByteBlock &str, byte asnTag) { bt.Put(asnTag); size_t lengthBytes = DERLengthEncode(bt, str.size()); - bt.Put((const byte *)str.data(), str.size()); + bt.Put(ConstBytePtr(str), BytePtrSize(str)); return 1+lengthBytes+str.size(); } +size_t BERDecodeTextString(BufferedTransformation &bt, SecByteBlock &str, byte asnTag) +{ + byte b; + if (!bt.Get(b) || b != asnTag) + BERDecodeError(); + + size_t bc; + if (!BERLengthDecode(bt, bc)) + BERDecodeError(); + if (bc > bt.MaxRetrievable()) // Issue 346 + BERDecodeError(); + + str.resize(bc); + if (bc != bt.Get(BytePtr(str), BytePtrSize(str))) + BERDecodeError(); + + return bc; +} + size_t BERDecodeTextString(BufferedTransformation &bt, std::string &str, byte asnTag) { byte b; @@ -175,6 +194,33 @@ size_t BERDecodeTextString(BufferedTransformation &bt, std::string &str, byte as return bc; } +size_t DEREncodeDate(BufferedTransformation &bt, const SecByteBlock &str, 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 BERDecodeDate(BufferedTransformation &bt, SecByteBlock &str, byte asnTag) +{ + byte b; + if (!bt.Get(b) || b != asnTag) + BERDecodeError(); + + size_t bc; + if (!BERLengthDecode(bt, bc)) + BERDecodeError(); + if (bc > bt.MaxRetrievable()) // Issue 346 + BERDecodeError(); + + str.resize(bc); + if (bc != bt.Get(BytePtr(str), BytePtrSize(str))) + BERDecodeError(); + + return bc; +} + /// ASN BitString size_t DEREncodeBitString(BufferedTransformation &bt, const byte *str, size_t strLen, unsigned int unusedBits) { @@ -227,6 +273,21 @@ void DERReencode(BufferedTransformation &source, BufferedTransformation &dest) encoder.MessageEnd(); } +size_t BERDecodePeekLength(BufferedTransformation &bt) +{ + ByteQueue tagAndLength; + bt.CopyTo(tagAndLength, 9); + + // Skip tag + tagAndLength.Skip(1); + + size_t length; + if (!BERLengthDecode(tagAndLength, length)) + return 0; + + return length; +} + void OID::EncodeValue(BufferedTransformation &bt, word32 v) { for (unsigned int i=RoundUpToMultipleOf(STDMAX(7U,BitPrecision(v)), 7U)-7; i != 0; i-=7) -- cgit v1.2.1