5 #ifndef CRYPTOPP_IMPORTS
12 NAMESPACE_BEGIN(CryptoPP)
26 bt.Put(byte(BytePrecision(length) | 0x80));
28 for (
int j=BytePrecision(length); j; --j)
30 bt.Put(byte(length >> (j-1)*8));
46 definiteLength =
true;
51 unsigned int lengthBytes = b & 0x7f;
55 definiteLength =
false;
59 definiteLength =
true;
63 if (length >> (8*(
sizeof(length)-1)))
69 length = (length << 8) | b;
79 if (!BERLengthDecode(bt, lw, definiteLength))
81 if (!SafeConvert(lw, length))
83 return definiteLength;
95 if (!in.
Get(b) || b != TAG_NULL)
98 if (!BERLengthDecode(in, length) || length != 0)
105 bt.
Put(OCTET_STRING);
106 size_t lengthBytes = DERLengthEncode(bt, strLen);
108 return 1+lengthBytes+strLen;
113 return DEREncodeOctetString(bt, str.begin(), str.size());
119 if (!bt.
Get(b) || b != OCTET_STRING)
123 if (!BERLengthDecode(bt, bc))
127 if (bc != bt.
Get(str, bc))
135 if (!bt.
Get(b) || b != OCTET_STRING)
139 if (!BERLengthDecode(bt, bc))
149 size_t lengthBytes = DERLengthEncode(bt, str.size());
150 bt.
Put((
const byte *)str.data(), str.size());
151 return 1+lengthBytes+str.size();
157 if (!bt.
Get(b) || b != asnTag)
161 if (!BERLengthDecode(bt, bc))
165 if (bc != bt.
Get(temp, bc))
167 str.assign((
char *)temp.begin(), bc);
172 size_t DEREncodeBitString(
BufferedTransformation &bt,
const byte *str,
size_t strLen,
unsigned int unusedBits)
175 size_t lengthBytes = DERLengthEncode(bt, strLen+1);
176 bt.
Put((byte)unusedBits);
178 return 2+lengthBytes+strLen;
184 if (!bt.
Get(b) || b != BIT_STRING)
188 if (!BERLengthDecode(bt, bc))
196 if ((bc-1) != bt.
Get(str, bc-1))
207 if (decoder.IsDefiniteLength())
208 decoder.TransferTo(encoder, decoder.RemainingLength());
211 while (!decoder.EndReached())
212 DERReencode(decoder, encoder);
214 decoder.MessageEnd();
215 encoder.MessageEnd();
220 for (
unsigned int i=RoundUpToMultipleOf(STDMAX(7U,BitPrecision(v)), 7U)-7; i != 0; i-=7)
221 bt.
Put((byte)(0x80 | ((v >> i) & 0x7f)));
222 bt.
Put((byte)(v & 0x7f));
235 if (v >> (8*
sizeof(v)-7))
246 assert(m_values.size() >= 2);
248 temp.
Put(byte(m_values[0] * 40 + m_values[1]));
249 for (
size_t i=2; i<m_values.size(); i++)
250 EncodeValue(temp, m_values[i]);
251 bt.
Put(OBJECT_IDENTIFIER);
252 DERLengthEncode(bt, temp.CurrentSize());
259 if (!bt.
Get(b) || b != OBJECT_IDENTIFIER)
263 if (!BERLengthDecode(bt, length) || length < 1)
271 m_values[0] = b / 40;
272 m_values[1] = b % 40;
277 size_t valueLen = DecodeValue(bt, v);
278 if (valueLen > length)
280 m_values.push_back(v);
294 if (m_flags & PUT_OBJECTS)
297 return TheBitBucket();
300 void EncodedObjectFilter::Put(
const byte *inString,
size_t length)
302 if (m_nCurrentObject == m_nObjects)
308 LazyPutter lazyPutter(m_queue, inString, length);
315 if (!m_queue.
Get(m_id))
322 if (m_level > 0 && m_id == 0 && m_queue.
Peek(b) && b == 0)
326 m_state = IDENTIFIER;
331 if (!BERLengthDecode(walker, m_lengthRemaining, definiteLength))
333 m_queue.
TransferTo(CurrentTarget(), walker.GetCurrentPosition());
334 if (!((m_id & CONSTRUCTED) || definiteLength))
338 if (!(m_id & CONSTRUCTED))
341 m_state = IDENTIFIER;
347 m_lengthRemaining -= m_queue.
TransferTo(CurrentTarget(), m_lengthRemaining);
349 if (m_lengthRemaining == 0)
350 m_state = IDENTIFIER;
353 if (m_state == IDENTIFIER && m_level == 0)
358 if (m_flags & PUT_MESSANGE_END_AFTER_EACH_OBJECT)
361 if (m_nCurrentObject == m_nObjects)
363 if (m_flags & PUT_MESSANGE_END_AFTER_ALL_OBJECTS)
366 if (m_flags & PUT_MESSANGE_SERIES_END_AFTER_ALL_OBJECTS)
377 : m_inQueue(inQueue), m_finished(false)
383 : m_inQueue(inQueue), m_finished(false)
388 void BERGeneralDecoder::Init(byte asnTag)
391 if (!m_inQueue.
Get(b) || b != asnTag)
394 if (!BERLengthDecode(m_inQueue, m_length, m_definiteLength))
397 if (!m_definiteLength && !(asnTag & CONSTRUCTED))
401 BERGeneralDecoder::~BERGeneralDecoder()
413 bool BERGeneralDecoder::EndReached()
const
415 if (m_definiteLength)
416 return m_length == 0;
424 byte BERGeneralDecoder::PeekByte()
const
432 void BERGeneralDecoder::CheckByte(byte check)
435 if (!
Get(b) || b != check)
439 void BERGeneralDecoder::MessageEnd()
442 if (m_definiteLength)
450 if (m_inQueue.
GetWord16(i) != 2 || i != 0)
457 if (m_definiteLength && transferBytes > m_length)
458 transferBytes = m_length;
459 size_t blockedBytes = m_inQueue.
TransferTo2(target, transferBytes, channel, blocking);
460 ReduceLength(transferBytes);
466 if (m_definiteLength)
467 end = STDMIN(m_length, end);
468 return m_inQueue.
CopyRangeTo2(target, begin, end, channel, blocking);
471 lword BERGeneralDecoder::ReduceLength(lword delta)
473 if (m_definiteLength)
475 if (m_length < delta)
483 : m_outQueue(outQueue), m_finished(false), m_asnTag(asnTag)
488 : m_outQueue(outQueue), m_finished(false), m_asnTag(asnTag)
492 DERGeneralEncoder::~DERGeneralEncoder()
504 void DERGeneralEncoder::MessageEnd()
507 lword length = CurrentSize();
508 m_outQueue.
Put(m_asnTag);
509 DERLengthEncode(m_outQueue, length);
519 GetAlgorithmID().BERDecodeAndCheck(algorithm);
520 bool parametersPresent = algorithm.EndReached() ?
false : BERDecodeAlgorithmParameters(algorithm);
521 algorithm.MessageEnd();
524 subjectPublicKey.CheckByte(0);
525 BERDecodePublicKey(subjectPublicKey, parametersPresent, (
size_t)subjectPublicKey.RemainingLength());
526 subjectPublicKey.MessageEnd();
527 subjectPublicKeyInfo.MessageEnd();
535 GetAlgorithmID().DEREncode(algorithm);
536 DEREncodeAlgorithmParameters(algorithm);
537 algorithm.MessageEnd();
540 subjectPublicKey.
Put(0);
542 subjectPublicKey.MessageEnd();
544 subjectPublicKeyInfo.MessageEnd();
551 BERDecodeUnsigned<word32>(privateKeyInfo, version, INTEGER, 0, 0);
554 GetAlgorithmID().BERDecodeAndCheck(algorithm);
555 bool parametersPresent = algorithm.EndReached() ?
false : BERDecodeAlgorithmParameters(algorithm);
556 algorithm.MessageEnd();
559 BERDecodePrivateKey(octetString, parametersPresent, (
size_t)privateKeyInfo.RemainingLength());
560 octetString.MessageEnd();
562 if (!privateKeyInfo.EndReached())
564 privateKeyInfo.MessageEnd();
570 DEREncodeUnsigned<word32>(privateKeyInfo, 0);
573 GetAlgorithmID().DEREncode(algorithm);
574 DEREncodeAlgorithmParameters(algorithm);
575 algorithm.MessageEnd();
579 octetString.MessageEnd();
582 privateKeyInfo.MessageEnd();
587 DERReencode(bt, m_optionalAttributes);
592 m_optionalAttributes.
CopyTo(bt);