Crypto++
5.6.5
Free C++ class library of cryptographic schemes
|
6 #ifndef CRYPTOPP_IMPORTS
31 bt.Put(
byte(length >> (j-1)*8));
47 definiteLength =
true;
52 unsigned int lengthBytes = b & 0x7f;
56 definiteLength =
false;
60 definiteLength =
true;
64 if (length >> (8*(
sizeof(length)-1)))
70 length = (length << 8) | b;
84 return definiteLength;
96 if (!in.
Get(b) || b != TAG_NULL)
106 bt.
Put(OCTET_STRING);
109 return 1+lengthBytes+strLen;
120 if (!bt.
Get(b) || b != OCTET_STRING)
128 if (bc != bt.
Get(str, bc))
136 if (!bt.
Get(b) || b != OCTET_STRING)
151 bt.
Put((
const byte *)str.data(), str.size());
152 return 1+lengthBytes+str.size();
158 if (!bt.
Get(b) || b != asnTag)
166 if (bc != bt.
Get(temp, bc))
168 str.assign((
char *)temp.
begin(), bc);
177 bt.
Put((
byte)unusedBits);
179 return 2+lengthBytes+strLen;
185 if (!bt.
Get(b) || b != BIT_STRING)
197 if ((bc-1) != bt.
Get(str, bc-1))
208 if (decoder.IsDefiniteLength())
209 decoder.
TransferTo(encoder, decoder.RemainingLength());
212 while (!decoder.EndReached())
215 decoder.MessageEnd();
216 encoder.MessageEnd();
222 bt.
Put((
byte)(0x80 | ((v >> i) & 0x7f)));
223 bt.
Put((
byte)(v & 0x7f));
236 if (v >> (8*
sizeof(v)-7))
249 temp.
Put(
byte(m_values[0] * 40 + m_values[1]));
250 for (
size_t i=2; i<m_values.size(); i++)
251 EncodeValue(temp, m_values[i]);
252 bt.
Put(OBJECT_IDENTIFIER);
260 if (!bt.
Get(b) || b != OBJECT_IDENTIFIER)
272 m_values[0] = b / 40;
273 m_values[1] = b % 40;
278 size_t valueLen = DecodeValue(bt, v);
279 if (valueLen > length)
281 m_values.push_back(v);
295 if (m_flags & PUT_OBJECTS)
303 if (m_nCurrentObject == m_nObjects)
309 LazyPutter lazyPutter(m_queue, inString, length);
316 if (!m_queue.
Get(m_id))
323 if (m_level > 0 && m_id == 0 && m_queue.
Peek(b) && b == 0)
327 m_state = IDENTIFIER;
334 m_queue.
TransferTo(CurrentTarget(), walker.GetCurrentPosition());
335 if (!((m_id & CONSTRUCTED) || definiteLength))
339 if (!(m_id & CONSTRUCTED))
342 m_state = IDENTIFIER;
348 m_lengthRemaining -= m_queue.
TransferTo(CurrentTarget(), m_lengthRemaining);
350 if (m_lengthRemaining == 0)
351 m_state = IDENTIFIER;
358 if (m_state == IDENTIFIER && m_level == 0)
363 if (m_flags & PUT_MESSANGE_END_AFTER_EACH_OBJECT)
366 if (m_nCurrentObject == m_nObjects)
368 if (m_flags & PUT_MESSANGE_END_AFTER_ALL_OBJECTS)
371 if (m_flags & PUT_MESSANGE_SERIES_END_AFTER_ALL_OBJECTS)
382 : m_inQueue(inQueue), m_finished(false)
388 : m_inQueue(inQueue), m_finished(false)
393 void BERGeneralDecoder::Init(
byte asnTag)
396 if (!m_inQueue.
Get(b) || b != asnTag)
402 if (!m_definiteLength && !(asnTag & CONSTRUCTED))
406 BERGeneralDecoder::~BERGeneralDecoder()
419 bool BERGeneralDecoder::EndReached()
const
421 if (m_definiteLength)
422 return m_length == 0;
430 byte BERGeneralDecoder::PeekByte()
const
438 void BERGeneralDecoder::CheckByte(
byte check)
441 if (!
Get(b) || b != check)
445 void BERGeneralDecoder::MessageEnd()
448 if (m_definiteLength)
456 if (m_inQueue.
GetWord16(i) != 2 || i != 0)
463 if (m_definiteLength && transferBytes > m_length)
464 transferBytes = m_length;
465 size_t blockedBytes = m_inQueue.
TransferTo2(target, transferBytes, channel, blocking);
466 ReduceLength(transferBytes);
472 if (m_definiteLength)
473 end =
STDMIN(m_length, end);
474 return m_inQueue.
CopyRangeTo2(target, begin, end, channel, blocking);
477 lword BERGeneralDecoder::ReduceLength(lword delta)
479 if (m_definiteLength)
481 if (m_length < delta)
489 :
ByteQueue(), m_outQueue(outQueue), m_finished(false), m_asnTag(asnTag)
496 :
ByteQueue(), m_outQueue(outQueue), m_finished(false), m_asnTag(asnTag)
500 DERGeneralEncoder::~DERGeneralEncoder()
513 void DERGeneralEncoder::MessageEnd()
516 lword length = CurrentSize();
517 m_outQueue.
Put(m_asnTag);
529 bool parametersPresent = algorithm.EndReached() ? false : BERDecodeAlgorithmParameters(algorithm);
530 algorithm.MessageEnd();
533 subjectPublicKey.CheckByte(0);
534 BERDecodePublicKey(subjectPublicKey, parametersPresent, (
size_t)subjectPublicKey.RemainingLength());
535 subjectPublicKey.MessageEnd();
536 subjectPublicKeyInfo.MessageEnd();
545 DEREncodeAlgorithmParameters(algorithm);
546 algorithm.MessageEnd();
549 subjectPublicKey.
Put(0);
551 subjectPublicKey.MessageEnd();
553 subjectPublicKeyInfo.MessageEnd();
560 BERDecodeUnsigned<word32>(privateKeyInfo, version, INTEGER, 0, 0);
564 bool parametersPresent = algorithm.EndReached() ? false : BERDecodeAlgorithmParameters(algorithm);
565 algorithm.MessageEnd();
568 BERDecodePrivateKey(octetString, parametersPresent, (
size_t)privateKeyInfo.RemainingLength());
569 octetString.MessageEnd();
571 if (!privateKeyInfo.EndReached())
573 privateKeyInfo.MessageEnd();
579 DEREncodeUnsigned<word32>(privateKeyInfo, 0);
583 DEREncodeAlgorithmParameters(algorithm);
584 algorithm.MessageEnd();
588 octetString.MessageEnd();
591 privateKeyInfo.MessageEnd();
601 m_optionalAttributes.
CopyTo(bt);
size_t BERDecodeOctetString(BufferedTransformation &bt, SecByteBlock &str)
BER decode octet string.
use this to make sure LazyPut is finalized in event of exception
iterator begin()
Provides an iterator pointing to the first element in the memory block.
size_t BERDecodeTextString(BufferedTransformation &bt, std::string &str, byte asnTag)
BER decode text string.
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
void Put(const byte *inString, size_t length)
Input a byte buffer for processing.
void BERDecodeNull(BufferedTransformation &bt)
BER decode NULL.
Data structure used to store byte strings.
void BERDecode(BufferedTransformation &bt)
BER decode an OID.
virtual OID GetAlgorithmID() const =0
Retrieves the OID of the algorithm.
size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const
Copy bytes from this object to another BufferedTransformation.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
virtual void BERDecodeOptionalAttributes(BufferedTransformation &bt)
decode optional attributes including context-specific tag
void DEREncode(BufferedTransformation &bt) const
DER encode this OID.
void DEREncodeNull(BufferedTransformation &bt)
DER encode NULL.
virtual OID GetAlgorithmID() const =0
Retrieves the OID of the algorithm.
size_t DEREncodeBitString(BufferedTransformation &bt, const byte *str, size_t strLen, unsigned int unusedBits=0)
DER encode bit string.
bool SafeConvert(T1 from, T2 &to)
Tests whether a conversion from -> to is safe to perform.
virtual void DEREncodePrivateKey(BufferedTransformation &bt) const =0
encode privateKey part of privateKeyInfo, without the OCTET STRING header
void resize(size_type newSize)
Change size and preserve contents.
void BERDecodeError()
Raises a BERDecodeErr.
size_t BERDecodeBitString(BufferedTransformation &bt, SecByteBlock &str, unsigned int &unusedBits)
DER decode bit string.
unsigned int BytePrecision(const T &value)
Returns the number of 8-bit bytes or octets required for a value.
void DERReencode(BufferedTransformation &bt, BufferedTransformation &dest)
BER decode and DER re-encode.
Base class for all exceptions thrown by the library.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
size_t Peek(byte &outByte) const
Peek a 8-bit byte.
const T & STDMAX(const T &a, const T &b)
Replacement function for std::max.
virtual void DEREncodeOptionalAttributes(BufferedTransformation &bt) const
encode optional attributes including context-specific tag
virtual void BERDecodePrivateKey(BufferedTransformation &bt, bool parametersPresent, size_t size)=0
decode privateKey part of privateKeyInfo, without the OCTET STRING header
size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true)
Transfer bytes from this object to another BufferedTransformation.
Classes and functions for working with ANS.1 objects.
void BERDecode(BufferedTransformation &bt)
Decode this object from a BufferedTransformation.
void DEREncode(BufferedTransformation &bt) const
Encode this object into a BufferedTransformation.
void New(size_type newSize)
Change size without preserving contents.
void DEREncode(BufferedTransformation &bt) const
Encode this object into a BufferedTransformation.
size_t DEREncodeOctetString(BufferedTransformation &bt, const byte *str, size_t strLen)
DER encode octet string.
unsigned int BitPrecision(const T &value)
Returns the number of bits required for a value.
size_type size() const
Provides the count of elements in the SecBlock.
virtual void BERDecodePublicKey(BufferedTransformation &bt, bool parametersPresent, size_t size)=0
decode subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header
size_t DEREncodeTextString(BufferedTransformation &bt, const std::string &str, byte asnTag)
DER encode text string.
bool BERLengthDecode(BufferedTransformation &bt, size_t &length)
BER decode a length.
bool AnyRetrievable() const
Determines whether bytes are ready for retrieval.
virtual void DEREncodePublicKey(BufferedTransformation &bt) const =0
encode subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header
BufferedTransformation & TheBitBucket()
An input discarding BufferedTransformation.
BufferedTransformation * AttachedTransformation()
Retrieve attached transformation.
Crypto++ library namespace.
size_t DERLengthEncode(BufferedTransformation &bt, lword length)
DER encode a length.
void BERDecode(BufferedTransformation &bt)
Decode this object from a BufferedTransformation.
Library configuration file.
void BERDecodeAndCheck(BufferedTransformation &bt) const
BER decode an OID.
size_t Get(byte &outByte)
Retrieve a 8-bit byte.