summaryrefslogtreecommitdiff
path: root/asn.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2019-09-29 22:56:12 -0400
committerJeffrey Walton <noloader@gmail.com>2019-09-29 22:56:12 -0400
commitdb22c6ce50cb5e3900acc24695c2055ccc51e930 (patch)
tree530bc14e3c2f34d6866bcddb64093cd705d93db7 /asn.cpp
parent1e093e12e3159b88f04beb4cb1cca7bec7537f03 (diff)
downloadcryptopp-git-db22c6ce50cb5e3900acc24695c2055ccc51e930.tar.gz
Add ASN.1 Date type support
Diffstat (limited to 'asn.cpp')
-rw-r--r--asn.cpp65
1 files changed, 63 insertions, 2 deletions
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)