|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
Extension to support ASN.1-tags of length 2 bytes.Hello! I noticed that class BERGeneralDecoder supports only tags of length 1 byte. ********************************************************** explicit BERGeneralDecoder(BufferedTransformation &inQueue, byte asnTag); explicit BERGeneralDecoder(BERGeneralDecoder &inQueue, byte asnTag); ********************************************************** In my application ASN.1-tags of length 2 bytes exist. I think it can be useful to implement the following constructors that will consider first two bytes as ASN.1-tag. ********************************************************** explicit BERGeneralDecoder(BufferedTransformation &inQueue, word16 asnTag); explicit BERGeneralDecoder(BERGeneralDecoder &inQueue, word16 asnTag); ********************************************************** --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to cryptopp-users-unsubscribe@.... More information about Crypto++ and this group is available at http://www.cryptopp.com. -~----------~----~----~----~------~----~------~--~--- |
|
|
Re: Extension to support ASN.1-tags of length 2 bytes.Hello! I have made the path. It works. But I'm not sure that it's consistent with ASN.1-standard... Here http://luca.ntop.org/Teaching/Appunti/asn1.html in "3.1 Primitive, definite-length method. Identifier octets. High-tag- number form.": Two or more octets. First octet is as in low-tag-number form, except that bits 5-1 all have value "1." Second and following octets give the tag number, base 128, most significant digit first, with as few digits as possible, and with the bit 8 of each octet except the last set to "1." The problem is in my application first octet doesn't correspond to rule above: bits 5-1 not all have value "1".(This tag of 2 byte length is from ICAO standard and I can't change its length.) Path: **********************asn.h********************** //! BER General Decoder class CRYPTOPP_DLL BERGeneralDecoder : public Store { public: explicit BERGeneralDecoder(BufferedTransformation &inQueue, byte asnTag); explicit BERGeneralDecoder(BERGeneralDecoder &inQueue, byte asnTag); explicit BERGeneralDecoder(BufferedTransformation &inQueue, byte hiAsnTag, byte loAsnTag); explicit BERGeneralDecoder(BERGeneralDecoder &inQueue, byte hiAsnTag, byte loAsnTag); ~BERGeneralDecoder(); bool IsDefiniteLength() const {return m_definiteLength;} lword RemainingLength() const {assert(m_definiteLength); return m_length;} bool EndReached() const; byte PeekByte() const; void CheckByte(byte b); size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true); size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const; // call this to denote end of sequence void MessageEnd(); protected: BufferedTransformation &m_inQueue; bool m_finished, m_definiteLength; lword m_length; private: void Init(byte asnTag); void Init(byte hiAsnTag, byte loAsnTag); void StoreInitialize(const NameValuePairs ¶meters) {assert (false);} lword ReduceLength(lword delta); }; ************************************************* *********************asn.cpp********************* BERGeneralDecoder::BERGeneralDecoder(BufferedTransformation &inQueue, byte hiAsnTag, byte loAsnTag) : m_inQueue(inQueue), m_finished(false) { Init(hiAsnTag, loAsnTag); } BERGeneralDecoder::BERGeneralDecoder(BERGeneralDecoder &inQueue, byte hiAsnTag, byte loAsnTag) : m_inQueue(inQueue), m_finished(false) { Init(hiAsnTag, loAsnTag); } void BERGeneralDecoder::Init(byte hiAsnTag, byte loAsnTag) { byte b; if (!m_inQueue.Get(b) || b != hiAsnTag) BERDecodeError(); if (!m_inQueue.Get(b) || b != loAsnTag) BERDecodeError(); if (!BERLengthDecode(m_inQueue, m_length, m_definiteLength)) BERDecodeError(); if (!m_definiteLength && !(loAsnTag & CONSTRUCTED)) BERDecodeError(); // cannot be primitive and have indefinite length } ************************************************* --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to cryptopp-users-unsubscribe@.... More information about Crypto++ and this group is available at http://www.cryptopp.com. -~----------~----~----~----~------~----~------~--~--- |
| Free embeddable forum powered by Nabble | Forum Help |