1 /*
2  * asner.h
3  *
4  * Abstract Syntax Notation Encoding Rules classes
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 1993-2002 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Contributor(s): ______________________________________.
25  *
26  * $Revision: 24177 $
27  * $Author: rjongbloed $
28  * $Date: 2010-04-05 06:52:04 -0500 (Mon, 05 Apr 2010) $
29  */
30 
31 #ifndef PTLIB_ASNER_H
32 #define PTLIB_ASNER_H
33 
34 #ifdef P_USE_PRAGMA
35 #pragma interface
36 #endif
37 
38 // provide options to omit vertain encodings, if needed
39 #define     P_INCLUDE_PER
40 #define     P_INCLUDE_BER
41 #define     P_INCLUDE_XER
42 
43 class PASN_Stream;
44 class PBER_Stream;
45 class PPER_Stream;
46 
47 #ifdef P_EXPAT
48 class PXER_Stream;
49 class PXMLElement;
50 #else
51 #undef      P_INCLUDE_XER
52 #endif
53 
54 
55 /////////////////////////////////////////////////////////////////////////////
56 
57 /** Base class for ASN encoding/decoding.
58 */
59 class PASN_Object : public PObject
60 {
61     PCLASSINFO(PASN_Object, PObject);
62   public:
63     /** Return a string giving the type of the object */
64     virtual PString GetTypeAsString() const = 0;
65 
66     PINDEX GetObjectLength() const;
67     virtual PINDEX GetDataLength() const = 0;
IsPrimitive()68     virtual PBoolean IsPrimitive() const { return true; }
69 
70     virtual PBoolean Decode(PASN_Stream &) = 0;
71     virtual void Encode(PASN_Stream &) const = 0;
72 
IsExtendable()73     PBoolean IsExtendable() const { return extendable; }
74     void SetExtendable(PBoolean ext = true) { extendable = ext; }
75 
76     enum TagClass {
77       UniversalTagClass,
78       ApplicationTagClass,
79       ContextSpecificTagClass,
80       PrivateTagClass,
81       DefaultTagClass
82     };
GetTagClass()83     TagClass GetTagClass() const { return tagClass; }
84 
85     enum UniversalTags {
86       InvalidUniversalTag,
87       UniversalBoolean,
88       UniversalInteger,
89       UniversalBitString,
90       UniversalOctetString,
91       UniversalNull,
92       UniversalObjectId,
93       UniversalObjectDescriptor,
94       UniversalExternalType,
95       UniversalReal,
96       UniversalEnumeration,
97       UniversalEmbeddedPDV,
98       UniversalSequence = 16,
99       UniversalSet,
100       UniversalNumericString,
101       UniversalPrintableString,
102       UniversalTeletexString,
103       UniversalVideotexString,
104       UniversalIA5String,
105       UniversalUTCTime,
106       UniversalGeneralisedTime,
107       UniversalGeneralizedTime = UniversalGeneralisedTime,
108       UniversalGraphicString,
109       UniversalVisibleString,
110       UniversalGeneralString,
111       UniversalUniversalString,
112       UniversalBMPString = 30
113     };
114 
GetTag()115     unsigned GetTag() const  { return tag; }
116     virtual void SetTag(unsigned newTag, TagClass tagClass = DefaultTagClass);
117 
118     enum ConstraintType {
119       Unconstrained,
120       PartiallyConstrained,
121       FixedConstraint,
122       ExtendableConstraint
123     };
124 
125     enum MinimumValueTag { MinimumValue = INT_MIN };
126     enum MaximumValueTag { MaximumValue = INT_MAX };
SetConstraints(ConstraintType type,int value)127     void SetConstraints(ConstraintType type, int value)
128       { SetConstraintBounds(type, value, value); }
SetConstraints(ConstraintType,int lower,MaximumValueTag)129     void SetConstraints(ConstraintType, int lower, MaximumValueTag /*upper*/)
130       { SetConstraintBounds(PartiallyConstrained, (int)lower, lower < 0 ? INT_MAX : UINT_MAX); }
SetConstraints(ConstraintType,MinimumValueTag lower,unsigned upper)131     void SetConstraints(ConstraintType, MinimumValueTag lower, unsigned upper)
132       { SetConstraintBounds(PartiallyConstrained, (int)lower, (unsigned)upper); }
SetConstraints(ConstraintType,MinimumValueTag lower,MaximumValueTag upper)133     void SetConstraints(ConstraintType, MinimumValueTag lower, MaximumValueTag upper)
134       { SetConstraintBounds(PartiallyConstrained, (int)lower, (unsigned)upper); }
SetConstraints(ConstraintType type,int lower,unsigned upper)135     void SetConstraints(ConstraintType type, int lower, unsigned upper)
136       { SetConstraintBounds(type, lower, upper); }
137 
138     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
139     virtual void SetCharacterSet(ConstraintType ctype, const char * charSet);
140     virtual void SetCharacterSet(ConstraintType ctype, unsigned firstChar, unsigned lastChar);
141 
142     static PINDEX GetMaximumArraySize();
143     static void SetMaximumArraySize(PINDEX sz);
144     static PINDEX GetMaximumStringSize();
145     static void SetMaximumStringSize(PINDEX sz);
146 
147   protected:
148     PASN_Object(unsigned tag, TagClass tagClass, PBoolean extend = false);
149 
150     /// PER extension capability
151     PBoolean extendable;
152     /// BER tag class
153     TagClass tagClass;
154     /// ASN object tag
155     unsigned tag;
156 };
157 
158 
159 /** Base class for constrained ASN encoding/decoding.
160 */
161 class PASN_ConstrainedObject : public PASN_Object
162 {
163     PCLASSINFO(PASN_ConstrainedObject, PASN_Object);
164   public:
IsConstrained()165     PBoolean IsConstrained() const { return constraint != Unconstrained; }
GetLowerLimit()166     int GetLowerLimit() const { return lowerLimit; }
GetUpperLimit()167     unsigned GetUpperLimit() const { return upperLimit; }
168 
169     PBoolean ConstrainedLengthDecode(PPER_Stream & strm, unsigned & length);
170     void ConstrainedLengthEncode(PPER_Stream & strm, unsigned length) const;
171 
172     PBoolean ConstraintEncode(PPER_Stream & strm, unsigned value) const;
173 
174   protected:
175     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
176     PASN_ConstrainedObject(unsigned tag, TagClass tagClass);
177 
178     ConstraintType constraint;
179     int lowerLimit;
180     unsigned upperLimit;
181 };
182 
183 
184 /** Class for ASN Null type.
185 */
186 class PASN_Null : public PASN_Object
187 {
188     PCLASSINFO(PASN_Null, PASN_Object);
189   public:
190     PASN_Null(unsigned tag = UniversalNull,
191               TagClass tagClass = UniversalTagClass);
192 
193     virtual Comparison Compare(const PObject & obj) const;
194     virtual PObject * Clone() const;
195     virtual void PrintOn(ostream & strm) const;
196 
197     virtual PString GetTypeAsString() const;
198     virtual PINDEX GetDataLength() const;
199     virtual PBoolean Decode(PASN_Stream &);
200     virtual void Encode(PASN_Stream &) const;
201 };
202 
203 
204 /** Class for ASN Boolean type.
205 */
206 class PASN_Boolean : public PASN_Object
207 {
208     PCLASSINFO(PASN_Boolean, PASN_Object);
209   public:
210     PASN_Boolean(PBoolean val = false);
211     PASN_Boolean(unsigned tag, TagClass tagClass, PBoolean val = false);
212 
213     PASN_Boolean & operator=(PBoolean v) { value = v; return *this; }
PBoolean()214     operator PBoolean() const { return value; }
GetValue()215     PBoolean GetValue() const { return value; }
SetValue(PBoolean v)216     void SetValue(PBoolean v) { value = v; }
217 
218     virtual Comparison Compare(const PObject & obj) const;
219     virtual PObject * Clone() const;
220     virtual void PrintOn(ostream & strm) const;
221 
222     virtual PString GetTypeAsString() const;
223     virtual PINDEX GetDataLength() const;
224     virtual PBoolean Decode(PASN_Stream &);
225     virtual void Encode(PASN_Stream &) const;
226 
227   protected:
228     PBoolean value;
229 };
230 
231 
232 /** Class for ASN Integer type.
233 */
234 class PASN_Integer : public PASN_ConstrainedObject
235 {
236     PCLASSINFO(PASN_Integer, PASN_ConstrainedObject);
237   public:
238     PASN_Integer(unsigned val = 0);
239     PASN_Integer(unsigned tag, TagClass tagClass, unsigned val = 0);
240 
241     PASN_Integer & operator=(unsigned value);
242     operator unsigned() const { return value; }
GetValue()243     unsigned GetValue() const { return value; }
SetValue(unsigned v)244     void SetValue(unsigned v) { operator=(v); }
245 
246     virtual Comparison Compare(const PObject & obj) const;
247     virtual PObject * Clone() const;
248     virtual void PrintOn(ostream & strm) const;
249 
250     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
251     virtual PString GetTypeAsString() const;
252     virtual PINDEX GetDataLength() const;
253     virtual PBoolean Decode(PASN_Stream &);
254     virtual void Encode(PASN_Stream &) const;
255 
256 #ifdef P_INCLUDE_PER
257     PBoolean DecodePER(PPER_Stream & strm);
258     void EncodePER(PPER_Stream & strm) const;
259 #endif
260 
261     PBoolean IsUnsigned() const;
262 
263   protected:
264     unsigned value;
265 };
266 
267 struct PASN_Names{
268     const char * name;
269     PINDEX value;
270 };
271 
272 /** Class for ASN Enumerated type.
273 */
274 class PASN_Enumeration : public PASN_Object
275 {
276     PCLASSINFO(PASN_Enumeration, PASN_Object);
277   public:
278     PASN_Enumeration(unsigned val = 0);
279     PASN_Enumeration(unsigned tag,
280                      TagClass tagClass,
281                      unsigned nEnums = P_MAX_INDEX,
282                      PBoolean extendable = false,
283                      unsigned val = 0);
284     PASN_Enumeration(unsigned tag,
285                      TagClass tagClass,
286                      unsigned nEnums,
287                      PBoolean extendable,
288                      const PASN_Names * nameSpec,
289                      unsigned namesCnt,
290                      unsigned val = 0);
291 
292     PASN_Enumeration & operator=(unsigned v) { value = v; return *this; }
293     operator unsigned() const { return value; }
GetValue()294     unsigned GetValue() const { return value; }
SetValue(unsigned v)295     void SetValue(unsigned v) { value = v; }
296 
GetMaximum()297     unsigned GetMaximum() const { return maxEnumValue; }
298 
299     virtual Comparison Compare(const PObject & obj) const;
300     virtual PObject * Clone() const;
301     virtual void PrintOn(ostream & strm) const;
302 
303     virtual PString GetTypeAsString() const;
304     virtual PINDEX GetDataLength() const;
305     virtual PBoolean Decode(PASN_Stream &);
306     virtual void Encode(PASN_Stream &) const;
307 
308 #ifdef P_INCLUDE_PER
309     PBoolean DecodePER(PPER_Stream & strm);
310     void EncodePER(PPER_Stream & strm) const;
311 #endif
312 
313 #ifdef P_INCLUDE_XER
314     virtual PBoolean DecodeXER(PXER_Stream & strm);
315     virtual void EncodeXER(PXER_Stream & strm) const;
316 #endif
317 
318     PINDEX GetValueByName(PString name) const;
319   protected:
320     unsigned maxEnumValue;
321     unsigned value;
322     const PASN_Names *names;
323     unsigned namesCount;
324 };
325 
326 
327 /** Class for ASN floating point type.
328 */
329 class PASN_Real : public PASN_Object
330 {
331     PCLASSINFO(PASN_Real, PASN_Object);
332   public:
333     PASN_Real(double val = 0);
334     PASN_Real(unsigned tag, TagClass tagClass, double val = 0);
335 
336     PASN_Real & operator=(double val) { value = val; return *this; }
337     operator double() const { return value; }
GetValue()338     double GetValue() const { return value; }
SetValue(double v)339     void SetValue(double v) { value = v; }
340 
341     virtual Comparison Compare(const PObject & obj) const;
342     virtual PObject * Clone() const;
343     virtual void PrintOn(ostream & strm) const;
344 
345     virtual PString GetTypeAsString() const;
346     virtual PINDEX GetDataLength() const;
347     virtual PBoolean Decode(PASN_Stream &);
348     virtual void Encode(PASN_Stream &) const;
349 
350   protected:
351     double value;
352 };
353 
354 
355 /** Class for ASN Object Identifier type.
356 */
357 class PASN_ObjectId : public PASN_Object
358 {
359     PCLASSINFO(PASN_ObjectId, PASN_Object);
360   public:
361     PASN_ObjectId(const char * dotstr = NULL);
362     PASN_ObjectId(unsigned tag, TagClass tagClass);
363 
364     PASN_ObjectId(const PASN_ObjectId & other);
365     PASN_ObjectId & operator=(const PASN_ObjectId & other);
366 
367     PASN_ObjectId & operator=(const char * dotstr);
368     PASN_ObjectId & operator=(const PString & dotstr);
369     PASN_ObjectId & operator=(const PUnsignedArray & numbers);
370     void SetValue(const PString & dotstr);
SetValue(const PUnsignedArray & numbers)371     void SetValue(const PUnsignedArray & numbers) { value = numbers; }
372     void SetValue(const unsigned * numbers, PINDEX size);
373 
374     bool operator==(const char * dotstr) const;
375     bool operator!=(const char * dotstr) const      { return !operator==(dotstr); }
376     bool operator==(const PString & dotstr) const   { return  operator==((const char *)dotstr); }
377     bool operator!=(const PString & dotstr) const   { return !operator==((const char *)dotstr); }
378     bool operator==(const PASN_ObjectId & id) const { return value == id.value; }
379 
GetSize()380     PINDEX GetSize() const { return value.GetSize(); }
381     unsigned operator[](PINDEX idx) const { return value[idx]; }
GetValue()382     const PUnsignedArray & GetValue() const { return value; }
383     PString AsString() const;
384 
385     virtual Comparison Compare(const PObject & obj) const;
386     virtual PObject * Clone() const;
387     virtual void PrintOn(ostream & strm) const;
388 
389     virtual PString GetTypeAsString() const;
390     virtual PINDEX GetDataLength() const;
391     virtual PBoolean Decode(PASN_Stream &);
392     virtual void Encode(PASN_Stream &) const;
393 
394     PBoolean CommonDecode(PASN_Stream & strm, unsigned dataLen);
395     void CommonEncode(PBYTEArray & eObjId) const;
396 
397   protected:
398     PUnsignedArray value;
399 };
400 
401 
402 /** Class for ASN Bit String type.
403 */
404 class PASN_BitString : public PASN_ConstrainedObject
405 {
406     PCLASSINFO(PASN_BitString, PASN_ConstrainedObject);
407   public:
408     PASN_BitString(unsigned nBits = 0, const BYTE * buf = NULL);
409     PASN_BitString(unsigned tag, TagClass tagClass, unsigned nBits = 0);
410 
411     PASN_BitString(const PASN_BitString & other);
412     PASN_BitString & operator=(const PASN_BitString & other);
413 
414     void SetData(unsigned nBits, const PBYTEArray & bytes);
415     void SetData(unsigned nBits, const BYTE * buf, PINDEX size = 0);
416 
GetDataPointer()417     const BYTE * GetDataPointer() const { return bitData; }
418 
GetSize()419     unsigned GetSize() const { return totalBits; }
420     PBoolean SetSize(unsigned nBits);
421 
422     bool operator[](PINDEX bit) const;
423     void Set(unsigned bit);
424     void Clear(unsigned bit);
425     void Invert(unsigned bit);
426 
427     virtual Comparison Compare(const PObject & obj) const;
428     virtual PObject * Clone() const;
429     virtual void PrintOn(ostream & strm) const;
430 
431     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
432     virtual PString GetTypeAsString() const;
433     virtual PINDEX GetDataLength() const;
434     virtual PBoolean Decode(PASN_Stream &);
435     virtual void Encode(PASN_Stream &) const;
436 
437 #ifdef P_INCLUDE_BER
438     PBoolean DecodeBER(PBER_Stream & strm, unsigned len);
439     void EncodeBER(PBER_Stream & strm) const;
440 #endif
441 
442 #ifdef P_INCLUDE_PER
443     PBoolean DecodePER(PPER_Stream & strm);
444     void EncodePER(PPER_Stream & strm) const;
445 #endif
446 
447     PBoolean DecodeSequenceExtensionBitmap(PPER_Stream & strm);
448     void EncodeSequenceExtensionBitmap(PPER_Stream & strm) const;
449 
450   protected:
451     unsigned totalBits;
452     PBYTEArray bitData;
453 };
454 
455 
456 /** Class for ASN Octet String type.
457 */
458 class PASN_OctetString : public PASN_ConstrainedObject
459 {
460     PCLASSINFO(PASN_OctetString, PASN_ConstrainedObject);
461   public:
462     PASN_OctetString(const char * str = NULL, PINDEX size = 0);
463     PASN_OctetString(unsigned tag, TagClass tagClass);
464 
465     PASN_OctetString(const PASN_OctetString & other);
466     PASN_OctetString & operator=(const PASN_OctetString & other);
467 
468     PASN_OctetString & operator=(const char * str);
469     PASN_OctetString & operator=(const PString & str);
470     PASN_OctetString & operator=(const PBYTEArray & arr);
SetValue(const char * str)471     void SetValue(const char * str) { operator=(str); }
SetValue(const PString & str)472     void SetValue(const PString & str) { operator=(str); }
SetValue(const PBYTEArray & arr)473     void SetValue(const PBYTEArray & arr) { operator=(arr); }
474     void SetValue(const BYTE * data, PINDEX len);
GetValue()475     const PBYTEArray & GetValue() const { return value; }
476     operator const PBYTEArray &() const { return value; }
477     operator const BYTE *() const { return value; }
478     PString AsString() const;
479     BYTE operator[](PINDEX i) const { return value[i]; }
480     BYTE & operator[](PINDEX i) { return value[i]; }
481     BYTE * GetPointer(PINDEX sz = 0) { return value.GetPointer(sz); }
GetSize()482     PINDEX GetSize() const { return value.GetSize(); }
483     PBoolean SetSize(PINDEX newSize);
484 
485     virtual Comparison Compare(const PObject & obj) const;
486     virtual PObject * Clone() const;
487     virtual void PrintOn(ostream & strm) const;
488 
489     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
490     virtual PString GetTypeAsString() const;
491     virtual PINDEX GetDataLength() const;
492     virtual PBoolean Decode(PASN_Stream &);
493     virtual void Encode(PASN_Stream &) const;
494 
495 #ifdef P_INCLUDE_PER
496     PBoolean DecodePER(PPER_Stream & strm);
497     void EncodePER(PPER_Stream & strm) const;
498 #endif
499 
500     PBoolean DecodeSubType(PASN_Object &) const;
501     void EncodeSubType(const PASN_Object &);
502 
503   protected:
504     PBYTEArray value;
505 };
506 
507 
508 /** Base class for ASN String types.
509 */
510 class PASN_ConstrainedString : public PASN_ConstrainedObject
511 {
512     PCLASSINFO(PASN_ConstrainedString, PASN_ConstrainedObject);
513   public:
514     PASN_ConstrainedString & operator=(const char * str);
515     PASN_ConstrainedString & operator=(const PString & str) { return operator=((const char *)str); }
516     operator const PString &() const { return value; }
GetValue()517     const PString & GetValue() const { return value; }
SetValue(const char * v)518     void SetValue(const char * v) { operator=(v); }
SetValue(const PString & v)519     void SetValue(const PString & v) { operator=(v); }
520     char operator[](PINDEX idx) const { return value[idx]; }
521 
522     void SetCharacterSet(ConstraintType ctype, const char * charSet);
523     void SetCharacterSet(ConstraintType ctype, unsigned firstChar = 0, unsigned lastChar = 255);
524     void SetCharacterSet(const char * charSet, PINDEX size, ConstraintType ctype);
525 
526     virtual Comparison Compare(const PObject & obj) const;
527     virtual void PrintOn(ostream & strm) const;
528 
529     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
530     virtual PINDEX GetDataLength() const;
531     virtual PBoolean Decode(PASN_Stream &);
532     virtual void Encode(PASN_Stream &) const;
533 
534 #ifdef P_INCLUDE_BER
535     PBoolean DecodeBER(PBER_Stream & strm, unsigned len);
536     void EncodeBER(PBER_Stream & strm) const;
537 #endif
538 
539 #ifdef P_INCLUDE_PER
540     PBoolean DecodePER(PPER_Stream & strm);
541     void EncodePER(PPER_Stream & strm) const;
542 #endif
543 
544   protected:
545     PASN_ConstrainedString(const char * canonicalSet, PINDEX setSize,
546                            unsigned tag, TagClass tagClass);
547 
548     PString value;
549     PCharArray characterSet;
550     const char * canonicalSet;
551     PINDEX canonicalSetSize;
552     unsigned canonicalSetBits;
553     unsigned charSetUnalignedBits;
554     unsigned charSetAlignedBits;
555 };
556 
557 
558 #define DECLARE_STRING_CLASS(name) \
559   class PASN_##name##String : public PASN_ConstrainedString { \
560     PCLASSINFO(PASN_##name##String, PASN_ConstrainedString); \
561     public: \
562       PASN_##name##String(const char * str = NULL); \
563       PASN_##name##String(unsigned tag, TagClass tagClass); \
564       PASN_##name##String & operator=(const char * str); \
565       PASN_##name##String & operator=(const PString & str); \
566       virtual PObject * Clone() const; \
567       virtual PString GetTypeAsString() const; \
568   }
569 
570 DECLARE_STRING_CLASS(Numeric);
571 DECLARE_STRING_CLASS(Printable);
572 DECLARE_STRING_CLASS(Visible);
573 DECLARE_STRING_CLASS(IA5);
574 DECLARE_STRING_CLASS(General);
575 
576 
577 /** Class for ASN BMP (16 bit) String type.
578 */
579 class PASN_BMPString : public PASN_ConstrainedObject
580 {
581     PCLASSINFO(PASN_BMPString, PASN_ConstrainedObject);
582   public:
583     PASN_BMPString(const char * str = NULL);
584     PASN_BMPString(const PWCharArray & wstr);
585     PASN_BMPString(unsigned tag, TagClass tagClass);
586 
587     PASN_BMPString(const PASN_BMPString & other);
588     PASN_BMPString & operator=(const PASN_BMPString & other);
589 
590     PASN_BMPString & operator=(const char * v) { return operator=(PString(v).AsUCS2()); }
591     PASN_BMPString & operator=(const PString & v) { return operator=(v.AsUCS2()); }
592     PASN_BMPString & operator=(const PWCharArray & v);
PString()593     operator PString() const { return GetValue(); }
PWCharArray()594     operator PWCharArray() const { return value; }
GetValue()595     PString GetValue() const { return value; }
GetValue(PWCharArray & v)596     void GetValue(PWCharArray & v) const { v = value; }
SetValue(const char * v)597     void SetValue(const char * v) { operator=(PString(v).AsUCS2()); }
SetValue(const PString & v)598     void SetValue(const PString & v) { operator=(v.AsUCS2()); }
SetValue(const PWCharArray & v)599     void SetValue(const PWCharArray & v) { operator=(v); }
SetValue(const PASN_BMPString & v)600     void SetValue(const PASN_BMPString & v) { operator=(v.value); }
SetValueRaw(const PWCharArray & v)601     void SetValueRaw(const PWCharArray & v) { SetValueRaw(v, v.GetSize()); }
602     void SetValueRaw(const wchar_t * val, PINDEX len);
603 
604     void SetCharacterSet(ConstraintType ctype, const char * charSet);
605     void SetCharacterSet(ConstraintType ctype, const PWCharArray & charSet);
606     void SetCharacterSet(ConstraintType ctype, unsigned firstChar, unsigned lastChar);
607 
608     virtual Comparison Compare(const PObject & obj) const;
609     virtual PObject * Clone() const;
610     virtual void PrintOn(ostream & strm) const;
611 
612     virtual PString GetTypeAsString() const;
613     virtual PINDEX GetDataLength() const;
614     virtual PBoolean Decode(PASN_Stream &);
615     virtual void Encode(PASN_Stream &) const;
616 
617 #ifdef P_INCLUDE_BER
618     PBoolean DecodeBER(PBER_Stream & strm, unsigned len);
619     void EncodeBER(PBER_Stream & strm) const;
620 #endif
621 
622 #ifdef P_INCLUDE_PER
623     PBoolean DecodePER(PPER_Stream & strm);
624     void EncodePER(PPER_Stream & strm) const;
625 #endif
626 
627   protected:
628     void Construct();
629     PBoolean IsLegalCharacter(WORD ch);
630 
631     PWCharArray value;
632     PWCharArray characterSet;
633     wchar_t firstChar, lastChar;
634     unsigned charSetUnalignedBits;
635     unsigned charSetAlignedBits;
636 };
637 
638 
639 class PASN_GeneralisedTime : public PASN_VisibleString
640 {
641     PCLASSINFO(PASN_GeneralisedTime, PASN_VisibleString);
642   public:
PASN_GeneralisedTime()643     PASN_GeneralisedTime()
644       : PASN_VisibleString(UniversalGeneralisedTime, UniversalTagClass) { }
PASN_GeneralisedTime(const PTime & time)645     PASN_GeneralisedTime(const PTime & time)
646       : PASN_VisibleString(UniversalGeneralisedTime, UniversalTagClass) { SetValue(time); }
PASN_GeneralisedTime(unsigned theTag,TagClass theTagClass)647     PASN_GeneralisedTime(unsigned theTag, TagClass theTagClass)
648       : PASN_VisibleString(theTag, theTagClass) { }
649 
650     PASN_GeneralisedTime & operator=(const PTime & time);
SetValue(const PTime & time)651     void SetValue(const PTime & time) { operator=(time); }
652     PTime GetValue() const;
653 };
654 
655 
656 class PASN_UniversalTime : public PASN_VisibleString
657 {
658     PCLASSINFO(PASN_UniversalTime, PASN_VisibleString);
659   public:
PASN_UniversalTime()660     PASN_UniversalTime()
661       : PASN_VisibleString(UniversalUTCTime, UniversalTagClass) { }
PASN_UniversalTime(const PTime & time)662     PASN_UniversalTime(const PTime & time)
663       : PASN_VisibleString(UniversalUTCTime, UniversalTagClass) { SetValue(time); }
PASN_UniversalTime(unsigned theTag,TagClass theTagClass)664     PASN_UniversalTime(unsigned theTag, TagClass theTagClass)
665       : PASN_VisibleString(theTag, theTagClass) { }
666 
667     PASN_UniversalTime & operator=(const PTime & time);
SetValue(const PTime & time)668     void SetValue(const PTime & time) { operator=(time); }
669     PTime GetValue() const;
670 };
671 
672 
673 class PASN_Sequence;
674 
675 /** Class for ASN Choice type.
676 */
677 class PASN_Choice : public PASN_Object
678 {
679     PCLASSINFO(PASN_Choice, PASN_Object);
680   public:
681     ~PASN_Choice();
682 
683     virtual void SetTag(unsigned newTag, TagClass tagClass = DefaultTagClass);
684     PString GetTagName() const;
685     PASN_Object & GetObject() const;
IsValid()686     PBoolean IsValid() const { return choice != NULL; }
687 
688 #if defined(__GNUC__) && __GNUC__ <= 2 && __GNUC_MINOR__ < 9
689 
690     operator PASN_Null &() const;
691     operator PASN_Boolean &() const;
692     operator PASN_Integer &() const;
693     operator PASN_Enumeration &() const;
694     operator PASN_Real &() const;
695     operator PASN_ObjectId &() const;
696     operator PASN_BitString &() const;
697     operator PASN_OctetString &() const;
698     operator PASN_NumericString &() const;
699     operator PASN_PrintableString &() const;
700     operator PASN_VisibleString &() const;
701     operator PASN_IA5String &() const;
702     operator PASN_GeneralString &() const;
703     operator PASN_BMPString &() const;
704     operator PASN_Sequence &() const;
705 
706 #else
707 
708     operator PASN_Null &();
709     operator PASN_Boolean &();
710     operator PASN_Integer &();
711     operator PASN_Enumeration &();
712     operator PASN_Real &();
713     operator PASN_ObjectId &();
714     operator PASN_BitString &();
715     operator PASN_OctetString &();
716     operator PASN_NumericString &();
717     operator PASN_PrintableString &();
718     operator PASN_VisibleString &();
719     operator PASN_IA5String &();
720     operator PASN_GeneralString &();
721     operator PASN_BMPString &();
722     operator PASN_Sequence &();
723 
724     operator const PASN_Null &() const;
725     operator const PASN_Boolean &() const;
726     operator const PASN_Integer &() const;
727     operator const PASN_Enumeration &() const;
728     operator const PASN_Real &() const;
729     operator const PASN_ObjectId &() const;
730     operator const PASN_BitString &() const;
731     operator const PASN_OctetString &() const;
732     operator const PASN_NumericString &() const;
733     operator const PASN_PrintableString &() const;
734     operator const PASN_VisibleString &() const;
735     operator const PASN_IA5String &() const;
736     operator const PASN_GeneralString &() const;
737     operator const PASN_BMPString &() const;
738     operator const PASN_Sequence &() const;
739 
740 #endif
741 
742     virtual PBoolean CreateObject() = 0;
743 
744     virtual Comparison Compare(const PObject & obj) const;
745     virtual void PrintOn(ostream & strm) const;
746 
747     virtual PString GetTypeAsString() const;
748     virtual PINDEX GetDataLength() const;
749     virtual PBoolean IsPrimitive() const;
750     virtual PBoolean Decode(PASN_Stream &);
751     virtual void Encode(PASN_Stream &) const;
752 
753 #ifdef P_INCLUDE_PER
754     virtual PBoolean DecodePER(PPER_Stream &);
755     virtual void EncodePER(PPER_Stream &) const;
756 #endif
757 
758 #ifdef P_INCLUDE_XER
759     PBoolean DecodeXER(PXER_Stream &);
760     void EncodeXER(PXER_Stream &) const;
761 #endif
762 
763     PASN_Choice & operator=(const PASN_Choice & other);
764 
765     PINDEX GetValueByName(PString name) const;
766   protected:
767     PASN_Choice(unsigned nChoices = 0, PBoolean extend = false);
768     PASN_Choice(unsigned tag, TagClass tagClass, unsigned nChoices, PBoolean extend);
769     PASN_Choice(unsigned tag, TagClass tagClass, unsigned nChoices, PBoolean extend, const PASN_Names * nameSpec,unsigned namesCnt);
770 
771     PASN_Choice(const PASN_Choice & other);
772 
773     PBoolean CheckCreate() const;
774 
775     unsigned numChoices;
776     PASN_Object * choice;
777     const PASN_Names *names;
778     unsigned namesCount;
779 };
780 
781 
782 PARRAY(PASN_ObjectArray, PASN_Object);
783 
784 
785 /** Class for ASN Sequence type.
786 */
787 class PASN_Sequence : public PASN_Object
788 {
789     PCLASSINFO(PASN_Sequence, PASN_Object);
790   public:
791     PASN_Sequence(unsigned tag = UniversalSequence,
792                   TagClass tagClass = UniversalTagClass,
793                   unsigned nOpts = 0, PBoolean extend = false, unsigned nExtend = 0);
794 
795     PASN_Sequence(const PASN_Sequence & other);
796     PASN_Sequence & operator=(const PASN_Sequence & other);
797 
GetSize()798     PINDEX GetSize() const { return fields.GetSize(); }
799     PBoolean SetSize(PINDEX newSize);
800     PASN_Object & operator[](PINDEX i) const { return fields[i]; }
801 
802     PBoolean HasOptionalField(PINDEX opt) const;
803     void IncludeOptionalField(PINDEX opt);
804     void RemoveOptionalField(PINDEX opt);
805 
806     virtual Comparison Compare(const PObject & obj) const;
807     virtual PObject * Clone() const;
808     virtual void PrintOn(ostream & strm) const;
809 
810     virtual PString GetTypeAsString() const;
811     virtual PINDEX GetDataLength() const;
812     virtual PBoolean IsPrimitive() const;
813     virtual PBoolean Decode(PASN_Stream &);
814     virtual void Encode(PASN_Stream &) const;
815 
816     PBoolean PreambleDecode(PASN_Stream & strm);
817     void PreambleEncode(PASN_Stream & strm) const;
818     PBoolean KnownExtensionDecode(PASN_Stream & strm, PINDEX fld, PASN_Object & field);
819     void KnownExtensionEncode(PASN_Stream & strm, PINDEX fld, const PASN_Object & field) const;
820     PBoolean UnknownExtensionsDecode(PASN_Stream & strm);
821     void UnknownExtensionsEncode(PASN_Stream & strm) const;
822 
823 #ifdef P_INCLUDE_BER
824     PBoolean PreambleDecodeBER(PBER_Stream & strm);
825     void PreambleEncodeBER(PBER_Stream & strm) const;
826     PBoolean KnownExtensionDecodeBER(PBER_Stream & strm, PINDEX fld, PASN_Object & field);
827     void KnownExtensionEncodeBER(PBER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
828     PBoolean UnknownExtensionsDecodeBER(PBER_Stream & strm);
829     void UnknownExtensionsEncodeBER(PBER_Stream & strm) const;
830 #endif
831 
832 #ifdef P_INCLUDE_PER
833     PBoolean PreambleDecodePER(PPER_Stream & strm);
834     void PreambleEncodePER(PPER_Stream & strm) const;
835     PBoolean KnownExtensionDecodePER(PPER_Stream & strm, PINDEX fld, PASN_Object & field);
836     void KnownExtensionEncodePER(PPER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
837     PBoolean UnknownExtensionsDecodePER(PPER_Stream & strm);
838     void UnknownExtensionsEncodePER(PPER_Stream & strm) const;
839 #endif
840 
841 #ifdef P_INCLUDE_XER
842     virtual PBoolean PreambleDecodeXER(PXER_Stream & strm);
843     virtual void PreambleEncodeXER(PXER_Stream & strm) const;
844     virtual PBoolean KnownExtensionDecodeXER(PXER_Stream & strm, PINDEX fld, PASN_Object & field);
845     virtual void KnownExtensionEncodeXER(PXER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
846     virtual PBoolean UnknownExtensionsDecodeXER(PXER_Stream & strm);
847     virtual void UnknownExtensionsEncodeXER(PXER_Stream & strm) const;
848 #endif
849 
850   protected:
851     PBoolean NoExtensionsToDecode(PPER_Stream & strm);
852     PBoolean NoExtensionsToEncode(PPER_Stream & strm);
853 
854     PASN_ObjectArray fields;
855     PASN_BitString optionMap;
856     int knownExtensions;
857     int totalExtensions;
858     PASN_BitString extensionMap;
859     PINDEX endBasicEncoding;
860 };
861 
862 
863 /** Class for ASN Set type.
864 */
865 class PASN_Set : public PASN_Sequence
866 {
867     PCLASSINFO(PASN_Set, PASN_Sequence);
868   public:
869     PASN_Set(unsigned tag = UniversalSet,
870              TagClass tagClass = UniversalTagClass,
871              unsigned nOpts = 0, PBoolean extend = false, unsigned nExtend = 0);
872 
873     virtual PObject * Clone() const;
874     virtual PString GetTypeAsString() const;
875 };
876 
877 
878 /** Class for ASN Array type.
879 */
880 class PASN_Array : public PASN_ConstrainedObject
881 {
882     PCLASSINFO(PASN_Array, PASN_ConstrainedObject);
883   public:
GetSize()884     PINDEX GetSize() const { return array.GetSize(); }
885     PBoolean SetSize(PINDEX newSize);
886     PASN_Object & operator[](PINDEX i) const { return array[i]; }
Append(PASN_Object * obj)887     void Append(PASN_Object * obj) { array.SetAt(array.GetSize(), obj); }
RemoveAt(PINDEX i)888     void RemoveAt(PINDEX i) { array.RemoveAt(i); }
RemoveAll()889     void RemoveAll() { array.RemoveAll(); }
890 
891     virtual Comparison Compare(const PObject & obj) const;
892     virtual void PrintOn(ostream & strm) const;
893 
894     virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
895     virtual PString GetTypeAsString() const;
896     virtual PINDEX GetDataLength() const;
897     virtual PBoolean IsPrimitive() const;
898     virtual PBoolean Decode(PASN_Stream &);
899     virtual void Encode(PASN_Stream &) const;
900 
901     virtual PASN_Object * CreateObject() const = 0;
902 
903     PASN_Array & operator=(const PASN_Array & other);
904 
905   protected:
906     PASN_Array(unsigned tag = UniversalSequence,
907                TagClass tagClass = UniversalTagClass);
908 
909     PASN_Array(const PASN_Array & other);
910 
911     PASN_ObjectArray array;
912 };
913 
914 
915 /////////////////////////////////////////////////////////////////////////////
916 
917 /** Base class for ASN decoder/encoder stream.
918 */
919 class PASN_Stream : public PBYTEArray
920 {
921     PCLASSINFO(PASN_Stream, PBYTEArray);
922   public:
923     PASN_Stream();
924     PASN_Stream(const PBYTEArray & bytes);
925     PASN_Stream(const BYTE * buf, PINDEX size);
926 
927     void PrintOn(ostream & strm) const;
928 
GetPosition()929     PINDEX GetPosition() const { return byteOffset; }
930     void SetPosition(PINDEX newPos);
IsAtEnd()931     PBoolean IsAtEnd() { return byteOffset >= GetSize(); }
932     void ResetDecoder();
933     void BeginEncoding();
934     void CompleteEncoding();
935 
936     virtual PBoolean Read(PChannel & chan) = 0;
937     virtual PBoolean Write(PChannel & chan) = 0;
938 
939     virtual PBoolean NullDecode(PASN_Null &) = 0;
940     virtual void NullEncode(const PASN_Null &) = 0;
941     virtual PBoolean BooleanDecode(PASN_Boolean &) = 0;
942     virtual void BooleanEncode(const PASN_Boolean &) = 0;
943     virtual PBoolean IntegerDecode(PASN_Integer &) = 0;
944     virtual void IntegerEncode(const PASN_Integer &) = 0;
945     virtual PBoolean EnumerationDecode(PASN_Enumeration &) = 0;
946     virtual void EnumerationEncode(const PASN_Enumeration &) = 0;
947     virtual PBoolean RealDecode(PASN_Real &) = 0;
948     virtual void RealEncode(const PASN_Real &) = 0;
949     virtual PBoolean ObjectIdDecode(PASN_ObjectId &) = 0;
950     virtual void ObjectIdEncode(const PASN_ObjectId &) = 0;
951     virtual PBoolean BitStringDecode(PASN_BitString &) = 0;
952     virtual void BitStringEncode(const PASN_BitString &) = 0;
953     virtual PBoolean OctetStringDecode(PASN_OctetString &) = 0;
954     virtual void OctetStringEncode(const PASN_OctetString &) = 0;
955     virtual PBoolean ConstrainedStringDecode(PASN_ConstrainedString &) = 0;
956     virtual void ConstrainedStringEncode(const PASN_ConstrainedString &) = 0;
957     virtual PBoolean BMPStringDecode(PASN_BMPString &) = 0;
958     virtual void BMPStringEncode(const PASN_BMPString &) = 0;
959     virtual PBoolean ChoiceDecode(PASN_Choice &) = 0;
960     virtual void ChoiceEncode(const PASN_Choice &) = 0;
961     virtual PBoolean ArrayDecode(PASN_Array &) = 0;
962     virtual void ArrayEncode(const PASN_Array &) = 0;
963     virtual PBoolean SequencePreambleDecode(PASN_Sequence &) = 0;
964     virtual void SequencePreambleEncode(const PASN_Sequence &) = 0;
965     virtual PBoolean SequenceKnownDecode(PASN_Sequence &, PINDEX, PASN_Object &) = 0;
966     virtual void SequenceKnownEncode(const PASN_Sequence &, PINDEX, const PASN_Object &) = 0;
967     virtual PBoolean SequenceUnknownDecode(PASN_Sequence &) = 0;
968     virtual void SequenceUnknownEncode(const PASN_Sequence &) = 0;
969 
970     BYTE ByteDecode();
971     void ByteEncode(unsigned value);
972 
973     unsigned BlockDecode(BYTE * bufptr, unsigned nBytes);
974     void BlockEncode(const BYTE * bufptr, PINDEX nBytes);
975 
976     void ByteAlign();
977 
978   protected:
979     PINDEX byteOffset;
980     unsigned bitOffset;
981 
982   private:
983     void Construct();
984 };
985 
986 #ifdef  P_INCLUDE_PER
987 #include "asnper.h"
988 #endif
989 
990 #ifdef  P_INCLUDE_BER
991 #include "asnber.h"
992 #endif
993 
994 #ifdef  P_INCLUDE_XER
995 #include "asnxer.h"
996 #endif
997 
998 #endif // PTLIB_ASNER_H
999 
1000 
1001 // End Of File ///////////////////////////////////////////////////////////////
1002