diff options
author | Jeffrey Walton <noloader@gmail.com> | 2019-09-29 22:56:12 -0400 |
---|---|---|
committer | Jeffrey Walton <noloader@gmail.com> | 2019-09-29 22:56:12 -0400 |
commit | db22c6ce50cb5e3900acc24695c2055ccc51e930 (patch) | |
tree | 530bc14e3c2f34d6866bcddb64093cd705d93db7 /asn.cpp | |
parent | 1e093e12e3159b88f04beb4cb1cca7bec7537f03 (diff) | |
download | cryptopp-git-db22c6ce50cb5e3900acc24695c2055ccc51e930.tar.gz |
Add ASN.1 Date type support
Diffstat (limited to 'asn.cpp')
-rw-r--r-- | asn.cpp | 65 |
1 files changed, 63 insertions, 2 deletions
@@ -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)
|