2 * The contents of this file are subject to the Mozilla Public
3 * License Version 1.1 (the "License"); you may not use this file
4 * except in compliance with the License. You may obtain a copy of
5 * the License at http://www.mozilla.org/MPL/
7 * Software distributed under the License is distributed on an "AS
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9 * implied. See the License for the specific language governing
10 * rights and limitations under the License.
12 * The Original Code is the Netscape security libraries.
14 * The Initial Developer of the Original Code is Netscape
15 * Communications Corporation. Portions created by Netscape are
16 * Copyright (C) 1994-2000 Netscape Communications Corporation. All
21 * Alternatively, the contents of this file may be used under the
22 * terms of the GNU General Public License Version 2 or later (the
23 * "GPL"), in which case the provisions of the GPL are applicable
24 * instead of those above. If you wish to allow use of your
25 * version of this file only under the terms of the GPL and not to
26 * allow others to use your version of this file under the MPL,
27 * indicate your decision by deleting the provisions above and
28 * replace them with the notice and other provisions required by
29 * the GPL. If you do not delete the provisions above, a recipient
30 * may use your version of this file under either the MPL or the
35 * Support for DEcoding ASN.1 data based on BER/DER (Basic/Distinguished
38 * $Id: secasn1d.c,v 1.16 2004/05/13 15:29:13 dmitch Exp $
46 #define DEBUG_DECASN1 0
48 #define DEBUG_DECASN1 1
53 #define dprintf(args...) printf(args)
55 #define dprintf(args...)
56 #endif /* DEBUG_DECASN1 */
67 duringConstructedString
,
72 afterConstructedString
,
86 } sec_asn1d_parse_place
;
89 #define DEBUG_ASN1D_STATES 1
90 /* tweakable by debugger, debug only */
92 #else /* DEBUG_ASN1D_STATES 0 */
93 #endif /* DEBUG_ASN1D_STATES */
95 #if DEBUG_ASN1D_STATES
96 static const char *place_names
[] = {
105 "duringConstructedString",
108 "duringSaveEncoding",
110 "afterConstructedString",
117 "beforeEndOfContents",
118 "duringEndOfContents",
119 "afterEndOfContents",
126 static const char * const class_names
[] = {
133 static const char * const method_names
[] = { "PRIMITIVE", "CONSTRUCTED" };
135 static const char * const type_names
[] = {
170 static const char * const flag_names
[] = { /* flags, right to left */
181 "", /* decoder ignores "MAY_STREAM", */
193 static int /* bool */
194 formatKind(unsigned long kind
, char * buf
)
197 unsigned long k
= kind
& SEC_ASN1_TAGNUM_MASK
;
198 unsigned long notag
= kind
& (SEC_ASN1_CHOICE
| SEC_ASN1_POINTER
|
199 SEC_ASN1_INLINE
| SEC_ASN1_ANY
| SEC_ASN1_SAVE
);
202 if ((kind
& SEC_ASN1_CLASS_MASK
) != SEC_ASN1_UNIVERSAL
) {
203 sprintf(buf
, " %s", class_names
[(kind
& SEC_ASN1_CLASS_MASK
) >> 6] );
206 if (kind
& SEC_ASN1_METHOD_MASK
) {
207 sprintf(buf
, " %s", method_names
[1]);
210 if ((kind
& SEC_ASN1_CLASS_MASK
) == SEC_ASN1_UNIVERSAL
) {
212 sprintf(buf
, " %s", type_names
[k
] );
213 if ((k
== SEC_ASN1_SET
|| k
== SEC_ASN1_SEQUENCE
) &&
214 (kind
& SEC_ASN1_GROUP
)) {
220 sprintf(buf
, " [%lu]", k
);
224 for (k
= kind
>> 8, i
= 0; k
; k
>>= 1, ++i
) {
226 sprintf(buf
, " %s", flag_names
[i
]);
233 #endif /* DEBUG_ASN1D_STATES */
240 } sec_asn1d_parse_status
;
244 unsigned long len
; /* only used for substrings */
245 struct subitem
*next
;
248 typedef struct sec_asn1d_state_struct
{
249 SEC_ASN1DecoderContext
*top
;
250 const SecAsn1Template
*theTemplate
;
253 void *our_mark
; /* free on completion */
255 struct sec_asn1d_state_struct
*parent
; /* aka prev */
256 struct sec_asn1d_state_struct
*child
; /* aka next */
258 sec_asn1d_parse_place place
;
261 * XXX explain the next fields as clearly as possible...
263 unsigned char found_tag_modifiers
;
264 unsigned char expect_tag_modifiers
;
265 unsigned long check_tag_mask
;
266 unsigned long found_tag_number
;
267 unsigned long expect_tag_number
;
268 unsigned long underlying_kind
;
270 unsigned long contents_length
;
271 unsigned long pending
;
272 unsigned long consumed
;
277 * Bit strings have their length adjusted -- the first octet of the
278 * contents contains a value between 0 and 7 which says how many bits
279 * at the end of the octets are not actually part of the bit string;
280 * when parsing bit strings we put that value here because we need it
281 * later, for adjustment of the length (when the whole string is done).
283 unsigned int bit_string_unused_bits
;
286 * The following are used for indefinite-length constructed strings.
288 struct subitem
*subitems_head
;
289 struct subitem
*subitems_tail
;
292 allocate
, /* when true, need to allocate the destination */
293 endofcontents
, /* this state ended up parsing end-of-contents octets */
294 explicit, /* we are handling an explicit header */
295 indefinite
, /* the current item has indefinite-length encoding */
296 missing
, /* an optional field that was not present */
297 optional
, /* the template says this field may be omitted */
298 substring
; /* this is a substring of a constructed string */
301 #define IS_HIGH_TAG_NUMBER(n) ((n) == SEC_ASN1_HIGH_TAG_NUMBER)
302 #define LAST_TAG_NUMBER_BYTE(b) (((b) & 0x80) == 0)
303 #define TAG_NUMBER_BITS 7
304 #define TAG_NUMBER_MASK 0x7f
306 #define LENGTH_IS_SHORT_FORM(b) (((b) & 0x80) == 0)
307 #define LONG_FORM_LENGTH(b) ((b) & 0x7f)
309 #define HIGH_BITS(field,cnt) ((field) >> ((sizeof(field) * 8) - (cnt)))
313 * An "outsider" will have an opaque pointer to this, created by calling
314 * SEC_ASN1DecoderStart(). It will be passed back in to all subsequent
315 * calls to SEC_ASN1DecoderUpdate(), and when done it is passed to
316 * SEC_ASN1DecoderFinish().
318 struct sec_DecoderContext_struct
{
319 PRArenaPool
*our_pool
; /* for our internal allocs */
320 PRArenaPool
*their_pool
; /* for destination structure allocs */
321 #ifdef SEC_ASN1D_FREE_ON_ERROR /*
322 * XXX see comment below (by same
323 * ifdef) that explains why this
324 * does not work (need more smarts
325 * in order to free back to mark)
328 * XXX how to make their_mark work in the case where they do NOT
329 * give us a pool pointer?
331 void *their_mark
; /* free on error */
334 sec_asn1d_state
*current
;
335 sec_asn1d_parse_status status
;
337 SEC_ASN1NotifyProc notify_proc
; /* call before/after handling field */
338 void *notify_arg
; /* argument to notify_proc */
339 PRBool during_notify
; /* true during call to notify_proc */
341 SEC_ASN1WriteProc filter_proc
; /* pass field bytes to this */
342 void *filter_arg
; /* argument to that function */
343 PRBool filter_only
; /* do not allocate/store fields */
348 * XXX this is a fairly generic function that may belong elsewhere
351 sec_asn1d_alloc (PRArenaPool
*poolp
, unsigned long len
)
357 * Allocate from the pool.
359 thing
= PORT_ArenaAlloc (poolp
, len
);
362 * Allocate generically.
364 thing
= PORT_Alloc (len
);
372 * XXX this is a fairly generic function that may belong elsewhere
375 sec_asn1d_zalloc (PRArenaPool
*poolp
, unsigned long len
)
379 thing
= sec_asn1d_alloc (poolp
, len
);
381 PORT_Memset (thing
, 0, len
);
386 static sec_asn1d_state
*
387 sec_asn1d_push_state (SEC_ASN1DecoderContext
*cx
,
388 const SecAsn1Template
*theTemplate
,
389 void *dest
, PRBool new_depth
)
391 sec_asn1d_state
*state
, *new_state
;
395 PORT_Assert (state
== NULL
|| state
->child
== NULL
);
398 PORT_Assert (state
->our_mark
== NULL
);
399 state
->our_mark
= PORT_ArenaMark (cx
->our_pool
);
402 new_state
= (sec_asn1d_state
*)sec_asn1d_zalloc (cx
->our_pool
,
404 if (new_state
== NULL
) {
405 dprintf("decodeError: zalloc failure\n");
410 new_state
->parent
= state
;
411 new_state
->theTemplate
= theTemplate
;
412 new_state
->place
= notInUse
;
414 new_state
->dest
= (char *)dest
+ theTemplate
->offset
;
417 new_state
->depth
= state
->depth
;
419 if (++new_state
->depth
> SEC_ASN1D_MAX_DEPTH
) {
420 PORT_SetError (SEC_ERROR_BAD_DER
);
424 state
->child
= new_state
;
427 cx
->current
= new_state
;
431 cx
->status
= decodeError
;
433 PORT_ArenaRelease(cx
->our_pool
, state
->our_mark
);
434 state
->our_mark
= NULL
;
441 sec_asn1d_scrub_state (sec_asn1d_state
*state
)
444 * Some default "scrubbing".
445 * XXX right set of initializations?
447 state
->place
= beforeIdentifier
;
448 state
->endofcontents
= PR_FALSE
;
449 state
->indefinite
= PR_FALSE
;
450 state
->missing
= PR_FALSE
;
452 PORT_Assert (state
->consumed
== 0);
456 static sec_asn1d_state
*
457 sec_asn1d_get_enclosing_construct(sec_asn1d_state
*state
)
459 for (state
= state
->parent
; state
; state
= state
->parent
) {
460 sec_asn1d_parse_place place
= state
->place
;
461 if (place
!= afterImplicit
&&
462 place
!= afterPointer
&&
463 place
!= afterInline
&&
464 place
!= afterSaveEncoding
&&
465 place
!= duringSaveEncoding
&&
466 place
!= duringChoice
) {
468 /* we've walked up the stack to a state that represents
469 ** the enclosing construct.
479 sec_asn1d_parent_allows_EOC(sec_asn1d_state
*state
)
481 /* get state of enclosing construct. */
482 state
= sec_asn1d_get_enclosing_construct(state
);
484 sec_asn1d_parse_place place
= state
->place
;
485 /* Is it one of the types that permits an unexpected EOC? */
487 (place
== duringGroup
||
488 place
== duringConstructedString
||
489 state
->child
->optional
);
490 return (state
->indefinite
&& eoc_permitted
) ? PR_TRUE
: PR_FALSE
;
497 sec_asn1d_notify_before (SEC_ASN1DecoderContext
*cx
, void *dest
, int depth
)
499 if (cx
->notify_proc
== NULL
)
502 cx
->during_notify
= PR_TRUE
;
503 (* cx
->notify_proc
) (cx
->notify_arg
, PR_TRUE
, dest
, depth
);
504 cx
->during_notify
= PR_FALSE
;
509 sec_asn1d_notify_after (SEC_ASN1DecoderContext
*cx
, void *dest
, int depth
)
511 if (cx
->notify_proc
== NULL
)
514 cx
->during_notify
= PR_TRUE
;
515 (* cx
->notify_proc
) (cx
->notify_arg
, PR_FALSE
, dest
, depth
);
516 cx
->during_notify
= PR_FALSE
;
520 static sec_asn1d_state
*
521 sec_asn1d_init_state_based_on_template (sec_asn1d_state
*state
,
523 const char *buf
/* for SEC_ASN1GetSubtemplate() */
527 PRBool
explicit, optional
, universal
;
528 unsigned char expect_tag_modifiers
;
529 unsigned long encode_kind
, under_kind
;
530 unsigned long check_tag_mask
, expect_tag_number
;
532 unsigned long dynamic
;
536 /* XXX Check that both of these tests are really needed/appropriate. */
537 if (state
== NULL
|| state
->top
->status
== decodeError
|| state
->theTemplate
== NULL
)
540 encode_kind
= state
->theTemplate
->kind
;
542 if (encode_kind
& SEC_ASN1_SAVE
) {
544 * This is a "magic" field that saves away all bytes, allowing
545 * the immediately following field to still be decoded from this
546 * same spot -- sort of a fork.
548 /* check that there are no extraneous bits */
549 PORT_Assert (encode_kind
== SEC_ASN1_SAVE
);
550 if (state
->top
->filter_only
) {
552 * If we are not storing, then we do not do the SAVE field
553 * at all. Just move ahead to the "real" field instead,
554 * doing the appropriate notify calls before and after.
556 sec_asn1d_notify_after (state
->top
, state
->dest
, state
->depth
);
558 * Since we are not storing, allow for our current dest value
559 * to be NULL. (This might not actually occur, but right now I
560 * cannot convince myself one way or the other.) If it is NULL,
561 * assume that our parent dest can help us out.
563 if (state
->dest
== NULL
)
564 state
->dest
= state
->parent
->dest
;
567 (char *)state
->dest
- state
->theTemplate
->offset
;
568 state
->theTemplate
++;
569 if (state
->dest
!= NULL
)
571 (char *)state
->dest
+ state
->theTemplate
->offset
;
572 sec_asn1d_notify_before (state
->top
, state
->dest
, state
->depth
);
573 encode_kind
= state
->theTemplate
->kind
;
574 PORT_Assert ((encode_kind
& SEC_ASN1_SAVE
) == 0);
576 sec_asn1d_scrub_state (state
);
577 state
->place
= duringSaveEncoding
;
578 state
= sec_asn1d_push_state (state
->top
, kSecAsn1AnyTemplate
,
579 state
->dest
, PR_FALSE
);
581 state
= sec_asn1d_init_state_based_on_template (state
,
582 buf
/* __APPLE__ */);
588 universal
= ((encode_kind
& SEC_ASN1_CLASS_MASK
) == SEC_ASN1_UNIVERSAL
)
589 ? PR_TRUE
: PR_FALSE
;
591 explicit = (encode_kind
& SEC_ASN1_EXPLICIT
) ? PR_TRUE
: PR_FALSE
;
592 encode_kind
&= ~SEC_ASN1_EXPLICIT
;
594 optional
= (encode_kind
& SEC_ASN1_OPTIONAL
) ? PR_TRUE
: PR_FALSE
;
595 encode_kind
&= ~SEC_ASN1_OPTIONAL
;
598 dynamic
= (encode_kind
& SEC_ASN1_DYNAMIC
) ? PR_TRUE
: PR_FALSE
;
599 encode_kind
&= ~SEC_ASN1_DYNAMIC
;
602 PORT_Assert (!(explicit && universal
)); /* bad templates */
604 encode_kind
&= ~SEC_ASN1_DYNAMIC
;
605 encode_kind
&= ~SEC_ASN1_MAY_STREAM
;
607 if( encode_kind
& SEC_ASN1_CHOICE
) {
608 #if 0 /* XXX remove? */
609 sec_asn1d_state
*child
= sec_asn1d_push_state(state
->top
, state
->theTemplate
, state
->dest
, PR_FALSE
);
610 if( (sec_asn1d_state
*)NULL
== child
) {
611 return (sec_asn1d_state
*)NULL
;
614 child
->allocate
= state
->allocate
;
615 child
->place
= beforeChoice
;
618 state
->place
= beforeChoice
;
623 if ((encode_kind
& (SEC_ASN1_POINTER
| SEC_ASN1_INLINE
)) || (!universal
625 const SecAsn1Template
*subt
;
627 PRBool child_allocate
;
630 PORT_Assert ((encode_kind
& (SEC_ASN1_ANY
| SEC_ASN1_SKIP
)) == 0);
632 sec_asn1d_scrub_state (state
);
633 child_allocate
= PR_FALSE
;
635 if (encode_kind
& SEC_ASN1_POINTER
) {
637 * A POINTER means we need to allocate the destination for
638 * this field. But, since it may also be an optional field,
639 * we defer the allocation until later; we just record that
640 * it needs to be done.
642 * There are two possible scenarios here -- one is just a
643 * plain POINTER (kind of like INLINE, except with allocation)
644 * and the other is an implicitly-tagged POINTER. We don't
645 * need to do anything special here for the two cases, but
646 * since the template definition can be tricky, we do check
647 * that there are no extraneous bits set in encode_kind.
649 * XXX The same conditions which assert should set an error.
653 * "universal" means this entry is a standalone POINTER;
654 * there should be no other bits set in encode_kind.
656 PORT_Assert (encode_kind
== SEC_ASN1_POINTER
);
659 * If we get here we have an implicitly-tagged field
660 * that needs to be put into a POINTER. The subtemplate
661 * will determine how to decode the field, but encode_kind
662 * describes the (implicit) tag we are looking for.
663 * The non-tag bits of encode_kind will be ignored by
664 * the code below; none of them should be set, however,
665 * except for the POINTER bit itself -- so check that.
667 PORT_Assert ((encode_kind
& ~SEC_ASN1_TAG_MASK
)
668 == SEC_ASN1_POINTER
);
670 if (!state
->top
->filter_only
)
671 child_allocate
= PR_TRUE
;
673 state
->place
= afterPointer
;
676 if (encode_kind
& SEC_ASN1_INLINE
) {
677 /* check that there are no extraneous bits */
678 /* FIXME - why are optional and inline mutually
679 * exclusive? Delete this assert and see what happens...
680 PORT_Assert (encode_kind == SEC_ASN1_INLINE && !optional);
682 state
->place
= afterInline
;
684 state
->place
= afterImplicit
;
688 state
->optional
= optional
;
690 subDest
= state
->dest
;
691 #if defined(__APPLE__)
693 * We might be starting the processing of a group or a
694 * set, in which case state->dest is NULL. Get parent's dest,
695 * or grandparent's, etc... just for the use by
696 * SEC_ASN1GetSubtemplate (specifically, by dynamic
699 sec_asn1d_state
*tempState
= state
;
700 while(subDest
== NULL
) {
701 sec_asn1d_state
*parent
= tempState
->parent
;
703 /* Oh well. Not going to work for this template. */
706 subDest
= parent
->dest
;
709 #endif /* __APPLE__ */
710 subt
= SEC_ASN1GetSubtemplate (state
->theTemplate
, subDest
,
711 PR_FALSE
, buf
/* __APPLE__ */);
712 state
= sec_asn1d_push_state (state
->top
, subt
, dest
, PR_FALSE
);
716 state
->allocate
= child_allocate
;
720 /* Dynamic: restart with new template */
724 state
= sec_asn1d_init_state_based_on_template (state
,
725 buf
/* __APPLE__ */);
728 * If this field is optional, we need to record that on
729 * the pushed child so it won't fail if the field isn't
730 * found. I can't think of a way that this new state
731 * could already have optional set (which we would wipe
732 * out below if our local optional is not set) -- but
733 * just to be sure, assert that it isn't set.
735 PORT_Assert (!state
->optional
);
736 state
->optional
= optional
;
741 under_kind
= state
->theTemplate
->kind
;
742 under_kind
&= ~SEC_ASN1_MAY_STREAM
;
743 } else if (explicit) {
745 * For explicit, we only need to match the encoding tag next,
746 * then we will push another state to handle the entire inner
747 * part. In this case, there is no underlying kind which plays
748 * any part in the determination of the outer, explicit tag.
749 * So we just set under_kind to 0, which is not a valid tag,
750 * and the rest of the tag matching stuff should be okay.
755 * Nothing special; the underlying kind and the given encoding
756 * information are the same.
758 under_kind
= encode_kind
;
761 /* XXX is this the right set of bits to test here? */
762 PORT_Assert ((under_kind
& (SEC_ASN1_EXPLICIT
763 | SEC_ASN1_MAY_STREAM
764 | SEC_ASN1_INLINE
| SEC_ASN1_POINTER
)) == 0);
766 if (encode_kind
& (SEC_ASN1_ANY
| SEC_ASN1_SKIP
)) {
767 PORT_Assert (encode_kind
== under_kind
);
768 if (encode_kind
& SEC_ASN1_SKIP
) {
769 PORT_Assert (!optional
);
770 PORT_Assert (encode_kind
== SEC_ASN1_SKIP
);
774 expect_tag_modifiers
= 0;
775 expect_tag_number
= 0;
777 check_tag_mask
= SEC_ASN1_TAG_MASK
;
778 expect_tag_modifiers
= (unsigned char)encode_kind
& SEC_ASN1_TAG_MASK
779 & ~SEC_ASN1_TAGNUM_MASK
;
781 * XXX This assumes only single-octet identifiers. To handle
782 * the HIGH TAG form we would need to do some more work, especially
783 * in how to specify them in the template, because right now we
784 * do not provide a way to specify more *tag* bits in encode_kind.
786 expect_tag_number
= encode_kind
& SEC_ASN1_TAGNUM_MASK
;
788 switch (under_kind
& SEC_ASN1_TAGNUM_MASK
) {
791 * XXX A plain old SET (as opposed to a SET OF) is not
793 * If it ever is, remove this assert...
795 PORT_Assert ((under_kind
& SEC_ASN1_GROUP
) != 0);
797 case SEC_ASN1_SEQUENCE
:
798 expect_tag_modifiers
|= SEC_ASN1_CONSTRUCTED
;
800 case SEC_ASN1_BIT_STRING
:
801 case SEC_ASN1_BMP_STRING
:
802 case SEC_ASN1_GENERALIZED_TIME
:
803 case SEC_ASN1_IA5_STRING
:
804 case SEC_ASN1_OCTET_STRING
:
805 case SEC_ASN1_PRINTABLE_STRING
:
806 case SEC_ASN1_T61_STRING
:
807 case SEC_ASN1_UNIVERSAL_STRING
:
808 case SEC_ASN1_UTC_TIME
:
809 case SEC_ASN1_UTF8_STRING
:
810 case SEC_ASN1_VISIBLE_STRING
:
811 check_tag_mask
&= ~SEC_ASN1_CONSTRUCTED
;
816 state
->check_tag_mask
= check_tag_mask
;
817 state
->expect_tag_modifiers
= expect_tag_modifiers
;
818 state
->expect_tag_number
= expect_tag_number
;
819 state
->underlying_kind
= under_kind
;
820 state
->explicit = explicit;
821 state
->optional
= optional
;
822 sec_asn1d_scrub_state (state
);
829 sec_asn1d_parse_identifier (sec_asn1d_state
*state
,
830 const char *buf
, unsigned long len
)
833 unsigned char tag_number
;
835 PORT_Assert (state
->place
== beforeIdentifier
);
838 state
->top
->status
= needBytes
;
842 byte
= (unsigned char) *buf
;
843 #ifdef DEBUG_ASN1D_STATES
844 if (doDumpStates
> 0) {
846 formatKind(byte
, kindBuf
);
847 printf("Found tag %02x %s\n", byte
, kindBuf
);
850 tag_number
= byte
& SEC_ASN1_TAGNUM_MASK
;
852 if (IS_HIGH_TAG_NUMBER (tag_number
)) {
853 state
->place
= duringIdentifier
;
854 state
->found_tag_number
= 0;
856 * Actually, we have no idea how many bytes are pending, but we
857 * do know that it is at least 1. That is all we know; we have
858 * to look at each byte to know if there is another, etc.
862 if (byte
== 0 && sec_asn1d_parent_allows_EOC(state
)) {
864 * Our parent has indefinite-length encoding, and the
865 * entire tag found is 0, so it seems that we have hit the
866 * end-of-contents octets. To handle this, we just change
867 * our state to that which expects to get the bytes of the
868 * end-of-contents octets and let that code re-read this byte
869 * so that our categorization of field types is correct.
870 * After that, our parent will then deal with everything else.
872 state
->place
= duringEndOfContents
;
874 state
->found_tag_number
= 0;
875 state
->found_tag_modifiers
= 0;
877 * We might be an optional field that is, as we now find out,
878 * missing. Give our parent a clue that this happened.
881 state
->missing
= PR_TRUE
;
884 state
->place
= afterIdentifier
;
885 state
->found_tag_number
= tag_number
;
887 state
->found_tag_modifiers
= byte
& ~SEC_ASN1_TAGNUM_MASK
;
894 sec_asn1d_parse_more_identifier (sec_asn1d_state
*state
,
895 const char *buf
, unsigned long len
)
900 PORT_Assert (state
->pending
== 1);
901 PORT_Assert (state
->place
== duringIdentifier
);
904 state
->top
->status
= needBytes
;
910 while (len
&& state
->pending
) {
911 if (HIGH_BITS (state
->found_tag_number
, TAG_NUMBER_BITS
) != 0) {
913 * The given high tag number overflows our container;
914 * just give up. This is not likely to *ever* happen.
916 PORT_SetError (SEC_ERROR_BAD_DER
);
917 state
->top
->status
= decodeError
;
918 dprintf("decodeError: parse_more_id high bits oflow\n");
922 state
->found_tag_number
<<= TAG_NUMBER_BITS
;
924 byte
= (unsigned char) buf
[count
++];
925 state
->found_tag_number
|= (byte
& TAG_NUMBER_MASK
);
928 if (LAST_TAG_NUMBER_BYTE (byte
))
932 if (state
->pending
== 0)
933 state
->place
= afterIdentifier
;
940 sec_asn1d_confirm_identifier (sec_asn1d_state
*state
)
944 PORT_Assert (state
->place
== afterIdentifier
);
946 match
= (PRBool
)(((state
->found_tag_modifiers
& state
->check_tag_mask
)
947 == state
->expect_tag_modifiers
)
948 && ((state
->found_tag_number
& state
->check_tag_mask
)
949 == state
->expect_tag_number
));
951 state
->place
= beforeLength
;
953 if (state
->optional
) {
954 state
->missing
= PR_TRUE
;
955 state
->place
= afterEndOfContents
;
957 PORT_SetError (SEC_ERROR_BAD_DER
);
958 state
->top
->status
= decodeError
;
959 //dprintf("decodeError: sec_asn1d_confirm_identifier\n");
966 sec_asn1d_parse_length (sec_asn1d_state
*state
,
967 const char *buf
, unsigned long len
)
971 PORT_Assert (state
->place
== beforeLength
);
974 state
->top
->status
= needBytes
;
979 * The default/likely outcome. It may get adjusted below.
981 state
->place
= afterLength
;
983 byte
= (unsigned char) *buf
;
985 if (LENGTH_IS_SHORT_FORM (byte
)) {
986 state
->contents_length
= byte
;
988 state
->contents_length
= 0;
989 state
->pending
= LONG_FORM_LENGTH (byte
);
990 if (state
->pending
== 0) {
991 state
->indefinite
= PR_TRUE
;
993 state
->place
= duringLength
;
997 /* If we're parsing an ANY, SKIP, or SAVE template, and
998 ** the object being saved is definite length encoded and constructed,
999 ** there's no point in decoding that construct's members.
1000 ** So, just forget it's constructed and treat it as primitive.
1001 ** (SAVE appears as an ANY at this point)
1003 if (!state
->indefinite
&&
1004 (state
->underlying_kind
& (SEC_ASN1_ANY
| SEC_ASN1_SKIP
))) {
1005 state
->found_tag_modifiers
&= ~SEC_ASN1_CONSTRUCTED
;
1012 static unsigned long
1013 sec_asn1d_parse_more_length (sec_asn1d_state
*state
,
1014 const char *buf
, unsigned long len
)
1018 PORT_Assert (state
->pending
> 0);
1019 PORT_Assert (state
->place
== duringLength
);
1022 state
->top
->status
= needBytes
;
1028 while (len
&& state
->pending
) {
1029 if (HIGH_BITS (state
->contents_length
, 9) != 0) {
1031 * The given full content length overflows our container;
1034 PORT_SetError (SEC_ERROR_BAD_DER
);
1035 state
->top
->status
= decodeError
;
1036 dprintf("decodeError: sec_asn1d_parse_more_length\n");
1040 state
->contents_length
<<= 8;
1041 state
->contents_length
|= (unsigned char) buf
[count
++];
1047 if (state
->pending
== 0)
1048 state
->place
= afterLength
;
1055 sec_asn1d_prepare_for_contents (sec_asn1d_state
*state
,
1057 const char *buf
/* needed for SEC_ASN1GetSubtemplate */
1061 SecAsn1Item
*item
=NULL
;
1063 unsigned long alloc_len
;
1065 #ifdef DEBUG_ASN1D_STATES
1066 if (doDumpStates
> 0) {
1067 printf("Found Length %lu %s\n", state
->contents_length
,
1068 state
->indefinite
? "indefinite" : "");
1073 * XXX I cannot decide if this allocation should exclude the case
1074 * where state->endofcontents is true -- figure it out!
1076 if (state
->allocate
) {
1079 PORT_Assert (state
->dest
== NULL
);
1081 * We are handling a POINTER or a member of a GROUP, and need to
1082 * allocate for the data structure.
1084 dest
= sec_asn1d_zalloc (state
->top
->their_pool
,
1085 state
->theTemplate
->size
);
1087 dprintf("decodeError: sec_asn1d_prepare_for_contents zalloc\n");
1088 state
->top
->status
= decodeError
;
1091 /* FIXME _ we're losing the dest pointer after this! */
1092 state
->dest
= (char *)dest
+ state
->theTemplate
->offset
;
1095 * For a member of a GROUP, our parent will later put the
1096 * pointer wherever it belongs. But for a POINTER, we need
1097 * to record the destination now, in case notify or filter
1098 * procs need access to it -- they cannot find it otherwise,
1099 * until it is too late (for one-pass processing).
1101 if (state
->parent
->place
== afterPointer
) {
1104 placep
= state
->parent
->dest
;
1110 * Remember, length may be indefinite here! In that case,
1111 * both contents_length and pending will be zero.
1113 state
->pending
= state
->contents_length
;
1115 /* If this item has definite length encoding, and
1116 ** is enclosed by a definite length constructed type,
1117 ** make sure it isn't longer than the remaining space in that
1118 ** constructed type.
1120 if (state
->contents_length
> 0) {
1121 sec_asn1d_state
*parent
= sec_asn1d_get_enclosing_construct(state
);
1122 if (parent
&& !parent
->indefinite
&&
1123 state
->consumed
+ state
->contents_length
> parent
->pending
) {
1124 PORT_SetError (SEC_ERROR_BAD_DER
);
1125 state
->top
->status
= decodeError
;
1131 * An EXPLICIT is nothing but an outer header, which we have
1132 * already parsed and accepted. Now we need to do the inner
1133 * header and its contents.
1135 if (state
->explicit) {
1136 state
->place
= afterExplicit
;
1137 state
= sec_asn1d_push_state (state
->top
,
1138 SEC_ASN1GetSubtemplate(state
->theTemplate
,
1141 buf
/* __APPLE__ */),
1142 state
->dest
, PR_TRUE
);
1144 state
= sec_asn1d_init_state_based_on_template (state
,
1145 buf
/* __APPLE__ */);
1151 * For GROUP (SET OF, SEQUENCE OF), even if we know the length here
1152 * we cannot tell how many items we will end up with ... so push a
1153 * state that can keep track of "children" (the individual members
1154 * of the group; we will allocate as we go and put them all together
1157 if (state
->underlying_kind
& SEC_ASN1_GROUP
) {
1158 /* XXX If this assertion holds (should be able to confirm it via
1159 * inspection, too) then move this code into the switch statement
1160 * below under cases SET_OF and SEQUENCE_OF; it will be cleaner.
1162 PORT_Assert (state
->underlying_kind
== SEC_ASN1_SET_OF
1163 || state
->underlying_kind
== SEC_ASN1_SEQUENCE_OF
1164 || state
->underlying_kind
== (SEC_ASN1_SEQUENCE_OF
|SEC_ASN1_DYNAMIC
)
1165 || state
->underlying_kind
== (SEC_ASN1_SET_OF
|SEC_ASN1_DYNAMIC
)
1167 if (state
->contents_length
!= 0 || state
->indefinite
) {
1168 const SecAsn1Template
*subt
;
1170 state
->place
= duringGroup
;
1171 subt
= SEC_ASN1GetSubtemplate (state
->theTemplate
, state
->dest
,
1172 PR_FALSE
, buf
/* __APPLE__ */);
1173 state
= sec_asn1d_push_state (state
->top
, subt
, NULL
, PR_TRUE
);
1174 if (state
!= NULL
) {
1175 if (!state
->top
->filter_only
)
1176 state
->allocate
= PR_TRUE
; /* XXX propogate this? */
1178 * Do the "before" field notification for next in group.
1180 sec_asn1d_notify_before (state
->top
, state
->dest
, state
->depth
);
1181 state
= sec_asn1d_init_state_based_on_template (state
,
1182 buf
/* __APPLE__ */);
1186 * A group of zero; we are done.
1187 * Set state to afterGroup and let that code plant the NULL.
1189 state
->place
= afterGroup
;
1195 switch (state
->underlying_kind
) {
1196 case SEC_ASN1_SEQUENCE
:
1198 * We need to push a child to handle the individual fields.
1200 state
->place
= duringSequence
;
1201 state
= sec_asn1d_push_state (state
->top
, state
->theTemplate
+ 1,
1202 state
->dest
, PR_TRUE
);
1203 if (state
!= NULL
) {
1205 * Do the "before" field notification.
1207 sec_asn1d_notify_before (state
->top
, state
->dest
, state
->depth
);
1208 state
= sec_asn1d_init_state_based_on_template (state
,
1209 buf
/* __APPLE__ */);
1214 case SEC_ASN1_SET
: /* XXX SET is not really implemented */
1216 * XXX A plain SET requires special handling; scanning of a
1217 * template to see where a field should go (because by definition,
1218 * they are not in any particular order, and you have to look at
1219 * each tag to disambiguate what the field is). We may never
1220 * implement this because in practice, it seems to be unused.
1222 dprintf("decodeError: prepare for contents SEC_ASN1_SET\n");
1224 PORT_SetError (SEC_ERROR_BAD_DER
); /* XXX */
1225 state
->top
->status
= decodeError
;
1230 * The NULL type, by definition, is "nothing", content length of zero.
1231 * An indefinite-length encoding is not alloweed.
1233 if (state
->contents_length
|| state
->indefinite
) {
1234 dprintf("decodeError: prepare for contents indefinite NULL\n");
1235 PORT_SetError (SEC_ERROR_BAD_DER
);
1236 state
->top
->status
= decodeError
;
1239 if (state
->dest
!= NULL
) {
1240 item
= (SecAsn1Item
*)(state
->dest
);
1244 state
->place
= afterEndOfContents
;
1247 case SEC_ASN1_BMP_STRING
:
1248 /* Error if length is not divisable by 2 */
1249 if (state
->contents_length
% 2) {
1250 dprintf("decodeError: prepare for contents odd length BMP_STRING\n");
1251 PORT_SetError (SEC_ERROR_BAD_DER
);
1252 state
->top
->status
= decodeError
;
1255 /* otherwise, handle as other string types */
1256 goto regular_string_type
;
1258 case SEC_ASN1_UNIVERSAL_STRING
:
1259 /* Error if length is not divisable by 4 */
1260 if (state
->contents_length
% 4) {
1261 dprintf("decodeError: prepare for contents odd length UNIV_STRING\n");
1262 PORT_SetError (SEC_ERROR_BAD_DER
);
1263 state
->top
->status
= decodeError
;
1266 /* otherwise, handle as other string types */
1267 goto regular_string_type
;
1271 case SEC_ASN1_ANY_CONTENTS
:
1273 * These are not (necessarily) strings, but they need nearly
1274 * identical handling (especially when we need to deal with
1275 * constructed sub-pieces), so we pretend they are.
1278 regular_string_type
:
1279 case SEC_ASN1_BIT_STRING
:
1280 case SEC_ASN1_IA5_STRING
:
1281 case SEC_ASN1_OCTET_STRING
:
1282 case SEC_ASN1_PRINTABLE_STRING
:
1283 case SEC_ASN1_T61_STRING
:
1284 case SEC_ASN1_UTC_TIME
:
1285 case SEC_ASN1_UTF8_STRING
:
1286 case SEC_ASN1_VISIBLE_STRING
:
1288 * We are allocating for a primitive or a constructed string.
1289 * If it is a constructed string, it may also be indefinite-length.
1290 * If it is primitive, the length can (legally) be zero.
1291 * Our first order of business is to allocate the memory for
1292 * the string, if we can (if we know the length).
1294 item
= (SecAsn1Item
*)(state
->dest
);
1297 * If the item is a definite-length constructed string, then
1298 * the contents_length is actually larger than what we need
1299 * (because it also counts each intermediate header which we
1300 * will be throwing away as we go), but it is a perfectly good
1301 * upper bound that we just allocate anyway, and then concat
1302 * as we go; we end up wasting a few extra bytes but save a
1305 alloc_len
= state
->contents_length
;
1306 poolp
= NULL
; /* quiet compiler warnings about unused... */
1308 if (item
== NULL
|| state
->top
->filter_only
) {
1314 } else if (state
->substring
) {
1316 * If we are a substring of a constructed string, then we may
1317 * not have to allocate anything (because our parent, the
1318 * actual constructed string, did it for us). If we are a
1319 * substring and we *do* have to allocate, that means our
1320 * parent is an indefinite-length, so we allocate from our pool;
1321 * later our parent will copy our string into the aggregated
1322 * whole and free our pool allocation.
1324 if (item
->Data
== NULL
) {
1325 PORT_Assert (item
->Length
== 0);
1326 poolp
= state
->top
->our_pool
;
1333 poolp
= state
->top
->their_pool
;
1336 if (alloc_len
|| ((! state
->indefinite
)
1337 && (state
->subitems_head
!= NULL
))) {
1338 struct subitem
*subitem
;
1341 PORT_Assert (item
!=NULL
);
1343 PORT_SetError (SEC_ERROR_BAD_DER
);
1344 state
->top
->status
= decodeError
;
1347 PORT_Assert (item
->Length
== 0 && item
->Data
== NULL
);
1349 * Check for and handle an ANY which has stashed aside the
1350 * header (identifier and length) bytes for us to include
1351 * in the saved contents.
1353 if (state
->subitems_head
!= NULL
) {
1354 PORT_Assert (state
->underlying_kind
== SEC_ASN1_ANY
);
1355 for (subitem
= state
->subitems_head
;
1356 subitem
!= NULL
; subitem
= subitem
->next
)
1357 alloc_len
+= subitem
->len
;
1360 item
->Data
= (unsigned char*)sec_asn1d_zalloc (poolp
, alloc_len
);
1361 if (item
->Data
== NULL
) {
1362 dprintf("decodeError: prepare for contents zalloc\n");
1363 state
->top
->status
= decodeError
;
1368 for (subitem
= state
->subitems_head
;
1369 subitem
!= NULL
; subitem
= subitem
->next
) {
1370 PORT_Memcpy (item
->Data
+ len
, subitem
->data
, subitem
->len
);
1371 len
+= subitem
->len
;
1376 * Because we use arenas and have a mark set, we later free
1377 * everything we have allocated, so this does *not* present
1378 * a memory leak (it is just temporarily left dangling).
1380 state
->subitems_head
= state
->subitems_tail
= NULL
;
1383 if (state
->contents_length
== 0 && (! state
->indefinite
)) {
1385 * A zero-length simple or constructed string; we are done.
1387 state
->place
= afterEndOfContents
;
1388 } else if (state
->found_tag_modifiers
& SEC_ASN1_CONSTRUCTED
) {
1389 const SecAsn1Template
*sub
;
1391 switch (state
->underlying_kind
) {
1393 case SEC_ASN1_ANY_CONTENTS
:
1394 sub
= kSecAsn1AnyTemplate
;
1396 case SEC_ASN1_BIT_STRING
:
1397 sub
= kSecAsn1BitStringTemplate
;
1399 case SEC_ASN1_BMP_STRING
:
1400 sub
= kSecAsn1BMPStringTemplate
;
1402 case SEC_ASN1_GENERALIZED_TIME
:
1403 sub
= kSecAsn1GeneralizedTimeTemplate
;
1405 case SEC_ASN1_IA5_STRING
:
1406 sub
= kSecAsn1IA5StringTemplate
;
1408 case SEC_ASN1_OCTET_STRING
:
1409 sub
= kSecAsn1OctetStringTemplate
;
1411 case SEC_ASN1_PRINTABLE_STRING
:
1412 sub
= kSecAsn1PrintableStringTemplate
;
1414 case SEC_ASN1_T61_STRING
:
1415 sub
= kSecAsn1T61StringTemplate
;
1417 case SEC_ASN1_UNIVERSAL_STRING
:
1418 sub
= kSecAsn1UniversalStringTemplate
;
1420 case SEC_ASN1_UTC_TIME
:
1421 sub
= kSecAsn1UTCTimeTemplate
;
1423 case SEC_ASN1_UTF8_STRING
:
1424 sub
= kSecAsn1UTF8StringTemplate
;
1426 case SEC_ASN1_VISIBLE_STRING
:
1427 sub
= kSecAsn1VisibleStringTemplate
;
1430 sub
= kSecAsn1SkipTemplate
;
1432 default: /* redundant given outer switch cases, but */
1433 PORT_Assert(0); /* the compiler does not seem to know that, */
1434 sub
= NULL
; /* so just do enough to quiet it. */
1438 state
->place
= duringConstructedString
;
1439 state
= sec_asn1d_push_state (state
->top
, sub
, item
, PR_TRUE
);
1440 if (state
!= NULL
) {
1441 state
->substring
= PR_TRUE
; /* XXX propogate? */
1442 state
= sec_asn1d_init_state_based_on_template (state
,
1443 buf
/* __APPLE__ */);
1445 } else if (state
->indefinite
) {
1447 * An indefinite-length string *must* be constructed!
1449 dprintf("decodeError: prepare for contents indefinite not construncted\n");
1450 PORT_SetError (SEC_ERROR_BAD_DER
);
1451 state
->top
->status
= decodeError
;
1454 * A non-zero-length simple string.
1456 if (state
->underlying_kind
== SEC_ASN1_BIT_STRING
)
1457 state
->place
= beforeBitString
;
1459 state
->place
= duringLeaf
;
1466 * We are allocating for a simple leaf item.
1468 if (state
->contents_length
) {
1469 if (state
->dest
!= NULL
) {
1470 item
= (SecAsn1Item
*)(state
->dest
);
1472 if (state
->top
->filter_only
) {
1475 item
->Data
= (unsigned char*)
1476 sec_asn1d_zalloc (state
->top
->their_pool
,
1477 state
->contents_length
);
1478 if (item
->Data
== NULL
) {
1479 dprintf("decodeError: prepare for contents zalloc\n");
1480 state
->top
->status
= decodeError
;
1485 state
->place
= duringLeaf
;
1488 * An indefinite-length or zero-length item is not allowed.
1489 * (All legal cases of such were handled above.)
1491 dprintf("decodeError: prepare for contents indefinite zero len \n");
1492 PORT_SetError (SEC_ERROR_BAD_DER
);
1493 state
->top
->status
= decodeError
;
1500 sec_asn1d_free_child (sec_asn1d_state
*state
, PRBool error
)
1502 if (state
->child
!= NULL
) {
1503 PORT_Assert (error
|| state
->child
->consumed
== 0);
1504 PORT_Assert (state
->our_mark
!= NULL
);
1505 PORT_ArenaRelease (state
->top
->our_pool
, state
->our_mark
);
1506 if (error
&& state
->top
->their_pool
== NULL
) {
1508 * XXX We need to free anything allocated.
1509 * At this point, we failed in the middle of decoding. But we
1510 * can't free the data we previously allocated with PR_Malloc
1511 * unless we keep track of every pointer. So instead we have a
1512 * memory leak when decoding fails half-way, unless an arena is
1513 * used. See bug 95311 .
1516 state
->child
= NULL
;
1517 state
->our_mark
= NULL
;
1520 * It is important that we do not leave a mark unreleased/unmarked.
1521 * But I do not think we should ever have one set in this case, only
1522 * if we had a child (handled above). So check for that. If this
1523 * assertion should ever get hit, then we probably need to add code
1524 * here to release back to our_mark (and then set our_mark to NULL).
1526 PORT_Assert (state
->our_mark
== NULL
);
1528 state
->place
= beforeEndOfContents
;
1532 /* We have just saved an entire encoded ASN.1 object (type) for a SAVE
1533 ** template, and now in the next template, we are going to decode that
1534 ** saved data by calling SEC_ASN1DecoderUpdate recursively.
1535 ** If that recursive call fails with needBytes, it is a fatal error,
1536 ** because the encoded object should have been complete.
1537 ** If that recursive call fails with decodeError, it will have already
1538 ** cleaned up the state stack, so we must bail out quickly.
1540 ** These checks of the status returned by the recursive call are now
1541 ** done in the caller of this function, immediately after it returns.
1544 sec_asn1d_reuse_encoding (sec_asn1d_state
*state
)
1546 sec_asn1d_state
*child
;
1547 unsigned long consumed
;
1552 child
= state
->child
;
1553 PORT_Assert (child
!= NULL
);
1555 consumed
= child
->consumed
;
1556 child
->consumed
= 0;
1558 item
= (SecAsn1Item
*)(state
->dest
);
1559 PORT_Assert (item
!= NULL
);
1561 PORT_Assert (item
->Length
== consumed
);
1564 * Free any grandchild.
1566 sec_asn1d_free_child (child
, PR_FALSE
);
1569 * Notify after the SAVE field.
1571 sec_asn1d_notify_after (state
->top
, state
->dest
, state
->depth
);
1574 * Adjust to get new dest and move forward.
1576 dest
= (char *)state
->dest
- state
->theTemplate
->offset
;
1577 state
->theTemplate
++;
1578 child
->dest
= (char *)dest
+ state
->theTemplate
->offset
;
1579 child
->theTemplate
= state
->theTemplate
;
1582 * Notify before the "real" field.
1584 PORT_Assert (state
->depth
== child
->depth
);
1585 sec_asn1d_notify_before (state
->top
, child
->dest
, child
->depth
);
1588 * This will tell DecoderUpdate to return when it is done.
1590 state
->place
= afterSaveEncoding
;
1593 * We already have a child; "push" it by making it current.
1595 state
->top
->current
= child
;
1598 * And initialize it so it is ready to parse.
1600 (void) sec_asn1d_init_state_based_on_template(child
,
1601 (char *) item
->Data
/* __APPLE__ */);
1604 * Now parse that out of our data.
1606 if (SEC_ASN1DecoderUpdate (state
->top
,
1607 (char *) item
->Data
, item
->Length
) != SECSuccess
)
1609 if (state
->top
->status
== needBytes
) {
1613 PORT_Assert (state
->top
->current
== state
);
1614 PORT_Assert (state
->child
== child
);
1617 * That should have consumed what we consumed before.
1619 PORT_Assert (consumed
== child
->consumed
);
1620 child
->consumed
= 0;
1625 state
->consumed
+= consumed
;
1626 child
->place
= notInUse
;
1627 state
->place
= afterEndOfContents
;
1631 static unsigned long
1632 sec_asn1d_parse_leaf (sec_asn1d_state
*state
,
1633 const char *buf
, unsigned long len
)
1636 unsigned long bufLen
;
1639 state
->top
->status
= needBytes
;
1643 if (state
->pending
< len
)
1644 len
= state
->pending
;
1648 item
= (SecAsn1Item
*)(state
->dest
);
1649 if (item
!= NULL
&& item
->Data
!= NULL
) {
1650 /* Strip leading zeroes when target is unsigned integer */
1651 if (state
->underlying_kind
== SEC_ASN1_INTEGER
&& /* INTEGER */
1652 item
->Length
== 0 && /* MSB */
1654 !(state
->underlying_kind
& SEC_ASN1_SIGNED_INT
))
1656 item
->type
== siUnsignedInteger
) /* unsigned */
1659 while (len
> 1 && buf
[0] == 0) { /* leading 0 */
1664 PORT_Memcpy (item
->Data
+ item
->Length
, buf
, len
);
1665 item
->Length
+= len
;
1667 state
->pending
-= bufLen
;
1668 if (state
->pending
== 0)
1669 state
->place
= beforeEndOfContents
;
1675 static unsigned long
1676 sec_asn1d_parse_bit_string (sec_asn1d_state
*state
,
1677 const char *buf
, unsigned long len
)
1681 /*PORT_Assert (state->pending > 0); */
1682 PORT_Assert (state
->place
== beforeBitString
);
1684 if ((state
->pending
== 0) || (state
->contents_length
== 1)) {
1685 if (state
->dest
!= NULL
) {
1686 SecAsn1Item
*item
= (SecAsn1Item
*)(state
->dest
);
1689 state
->place
= beforeEndOfContents
;
1691 if(state
->contents_length
== 1) {
1692 /* skip over (unused) remainder byte */
1701 state
->top
->status
= needBytes
;
1705 byte
= (unsigned char) *buf
;
1707 dprintf("decodeError: parse_bit_string remainder oflow\n");
1708 PORT_SetError (SEC_ERROR_BAD_DER
);
1709 state
->top
->status
= decodeError
;
1713 state
->bit_string_unused_bits
= byte
;
1714 state
->place
= duringBitString
;
1715 state
->pending
-= 1;
1721 static unsigned long
1722 sec_asn1d_parse_more_bit_string (sec_asn1d_state
*state
,
1723 const char *buf
, unsigned long len
)
1725 PORT_Assert (state
->place
== duringBitString
);
1726 if (state
->pending
== 0) {
1727 /* An empty bit string with some unused bits is invalid. */
1728 if (state
->bit_string_unused_bits
) {
1729 PORT_SetError (SEC_ERROR_BAD_DER
);
1730 state
->top
->status
= decodeError
;
1732 /* An empty bit string with no unused bits is OK. */
1733 state
->place
= beforeEndOfContents
;
1738 len
= sec_asn1d_parse_leaf (state
, buf
, len
);
1739 if (state
->place
== beforeEndOfContents
&& state
->dest
!= NULL
) {
1742 item
= (SecAsn1Item
*)(state
->dest
);
1744 item
->Length
= (item
->Length
<< 3) - state
->bit_string_unused_bits
;
1752 * XXX All callers should be looking at return value to detect
1753 * out-of-memory errors (and stop!).
1755 static struct subitem
*
1756 sec_asn1d_add_to_subitems (sec_asn1d_state
*state
,
1757 const void *data
, unsigned long len
,
1760 struct subitem
*thing
;
1762 thing
= (struct subitem
*)sec_asn1d_zalloc (state
->top
->our_pool
,
1763 sizeof (struct subitem
));
1764 if (thing
== NULL
) {
1765 dprintf("decodeError: zalloc\n");
1766 state
->top
->status
= decodeError
;
1772 copy
= sec_asn1d_alloc (state
->top
->our_pool
, len
);
1774 dprintf("decodeError: alloc\n");
1775 state
->top
->status
= decodeError
;
1776 if (!state
->top
->our_pool
)
1780 PORT_Memcpy (copy
, data
, len
);
1788 if (state
->subitems_head
== NULL
) {
1789 PORT_Assert (state
->subitems_tail
== NULL
);
1790 state
->subitems_head
= state
->subitems_tail
= thing
;
1792 state
->subitems_tail
->next
= thing
;
1793 state
->subitems_tail
= thing
;
1801 sec_asn1d_record_any_header (sec_asn1d_state
*state
,
1807 item
= (SecAsn1Item
*)(state
->dest
);
1808 if (item
!= NULL
&& item
->Data
!= NULL
) {
1809 PORT_Assert (state
->substring
);
1810 PORT_Memcpy (item
->Data
+ item
->Length
, buf
, len
);
1811 item
->Length
+= len
;
1813 sec_asn1d_add_to_subitems (state
, buf
, len
, PR_TRUE
);
1819 * We are moving along through the substrings of a constructed string,
1820 * and have just finished parsing one -- we need to save our child data
1821 * (if the child was not already writing directly into the destination)
1822 * and then move forward by one.
1824 * We also have to detect when we are done:
1825 * - a definite-length encoding stops when our pending value hits 0
1826 * - an indefinite-length encoding stops when our child is empty
1827 * (which means it was the end-of-contents octets)
1830 sec_asn1d_next_substring (sec_asn1d_state
*state
)
1832 sec_asn1d_state
*child
;
1834 unsigned long child_consumed
;
1837 PORT_Assert (state
->place
== duringConstructedString
);
1838 PORT_Assert (state
->child
!= NULL
);
1840 child
= state
->child
;
1842 child_consumed
= child
->consumed
;
1843 child
->consumed
= 0;
1844 state
->consumed
+= child_consumed
;
1848 if (state
->pending
) {
1849 PORT_Assert (!state
->indefinite
);
1850 if( child_consumed
> state
->pending
) {
1851 dprintf("decodeError: next_substring consumed > pend\n");
1852 PORT_SetError (SEC_ERROR_BAD_DER
);
1853 state
->top
->status
= decodeError
;
1857 state
->pending
-= child_consumed
;
1858 if (state
->pending
== 0)
1861 PORT_Assert (state
->indefinite
);
1863 item
= (SecAsn1Item
*)(child
->dest
);
1864 if (item
!= NULL
&& item
->Data
!= NULL
) {
1866 * Save the string away for later concatenation.
1868 PORT_Assert (item
->Data
!= NULL
);
1869 sec_asn1d_add_to_subitems (state
, item
->Data
, item
->Length
, PR_FALSE
);
1871 * Clear the child item for the next round.
1878 * If our child was just our end-of-contents octets, we are done.
1880 if (child
->endofcontents
)
1885 * Stop or do the next one.
1888 child
->place
= notInUse
;
1889 state
->place
= afterConstructedString
;
1891 sec_asn1d_scrub_state (child
);
1892 state
->top
->current
= child
;
1898 * We are doing a SET OF or SEQUENCE OF, and have just finished an item.
1901 sec_asn1d_next_in_group (sec_asn1d_state
*state
,
1902 const char *buf
/* __APPLE__ */)
1904 sec_asn1d_state
*child
;
1905 unsigned long child_consumed
;
1907 PORT_Assert (state
->place
== duringGroup
);
1908 PORT_Assert (state
->child
!= NULL
);
1910 child
= state
->child
;
1912 child_consumed
= child
->consumed
;
1913 child
->consumed
= 0;
1914 state
->consumed
+= child_consumed
;
1917 * If our child was just our end-of-contents octets, we are done.
1921 * Without the check for !child->indefinite, this path could
1922 * be taken erroneously if the child is indefinite!
1924 if(child
->endofcontents
&& !child
->indefinite
) {
1926 if (child
->endofcontents
) {
1927 #endif /* __APPLE__ */
1928 /* XXX I removed the PORT_Assert (child->dest == NULL) because there
1929 * was a bug in that a template that was a sequence of which also had
1930 * a child of a sequence of, in an indefinite group was not working
1931 * properly. This fix seems to work, (added the if statement below),
1932 * and nothing appears broken, but I am putting this note here just
1935 * XXX No matter how many times I read that comment,
1936 * I cannot figure out what case he was fixing. I believe what he
1937 * did was deliberate, so I am loathe to touch it. I need to
1938 * understand how it could ever be that child->dest != NULL but
1939 * child->endofcontents is true, and why it is important to check
1940 * that state->subitems_head is NULL. This really needs to be
1941 * figured out, as I am not sure if the following code should be
1942 * compensating for "offset", as is done a little farther below
1943 * in the more normal case.
1945 PORT_Assert (state
->indefinite
);
1946 PORT_Assert (state
->pending
== 0);
1947 if(child
->dest
&& !state
->subitems_head
) {
1948 sec_asn1d_add_to_subitems (state
, child
->dest
, 0, PR_FALSE
);
1952 child
->place
= notInUse
;
1953 state
->place
= afterGroup
;
1958 * Do the "after" field notification for next in group.
1960 sec_asn1d_notify_after (state
->top
, child
->dest
, child
->depth
);
1963 * Save it away (unless we are not storing).
1965 if (child
->dest
!= NULL
) {
1969 dest
= (char *)dest
- child
->theTemplate
->offset
;
1970 sec_asn1d_add_to_subitems (state
, dest
, 0, PR_FALSE
);
1975 * Account for those bytes; see if we are done.
1977 if (state
->pending
) {
1978 PORT_Assert (!state
->indefinite
);
1979 if( child_consumed
> state
->pending
) {
1980 dprintf("decodeError: next_in_group consumed > pend\n");
1981 PORT_SetError (SEC_ERROR_BAD_DER
);
1982 state
->top
->status
= decodeError
;
1986 state
->pending
-= child_consumed
;
1987 if (state
->pending
== 0) {
1988 child
->place
= notInUse
;
1989 state
->place
= afterGroup
;
1995 * Do the "before" field notification for next item in group.
1997 sec_asn1d_notify_before (state
->top
, child
->dest
, child
->depth
);
2000 * Now we do the next one.
2002 sec_asn1d_scrub_state (child
);
2004 /* Initialize child state from the template */
2005 sec_asn1d_init_state_based_on_template(child
, buf
/* __APPLE__ */);
2007 state
->top
->current
= child
;
2012 * We are moving along through a sequence; move forward by one,
2013 * (detecting end-of-sequence when it happens).
2014 * XXX The handling of "missing" is ugly. Fix it.
2017 sec_asn1d_next_in_sequence (sec_asn1d_state
*state
,
2018 const char *buf
/* __APPLE__ */)
2020 sec_asn1d_state
*child
;
2021 unsigned long child_consumed
;
2022 PRBool child_missing
;
2024 PORT_Assert (state
->place
== duringSequence
);
2025 PORT_Assert (state
->child
!= NULL
);
2027 child
= state
->child
;
2030 * Do the "after" field notification.
2032 sec_asn1d_notify_after (state
->top
, child
->dest
, child
->depth
);
2034 child_missing
= (PRBool
) child
->missing
;
2035 child_consumed
= child
->consumed
;
2036 child
->consumed
= 0;
2039 * Take care of accounting.
2041 if (child_missing
) {
2042 PORT_Assert (child
->optional
);
2044 state
->consumed
+= child_consumed
;
2046 * Free any grandchild.
2048 sec_asn1d_free_child (child
, PR_FALSE
);
2049 if (state
->pending
) {
2050 PORT_Assert (!state
->indefinite
);
2051 if( child_consumed
> state
->pending
) {
2052 dprintf("decodeError: next_in_seq consumed > pend\n");
2053 PORT_SetError (SEC_ERROR_BAD_DER
);
2054 state
->top
->status
= decodeError
;
2057 state
->pending
-= child_consumed
;
2058 if (state
->pending
== 0) {
2059 child
->theTemplate
++;
2060 while (child
->theTemplate
->kind
!= 0) {
2061 if ((child
->theTemplate
->kind
& SEC_ASN1_OPTIONAL
) == 0) {
2062 dprintf("decodeError: next_in_seq child not opt\n");
2063 PORT_SetError (SEC_ERROR_BAD_DER
);
2064 state
->top
->status
= decodeError
;
2067 child
->theTemplate
++;
2069 child
->place
= notInUse
;
2070 state
->place
= afterEndOfContents
;
2079 child
->theTemplate
++;
2080 if (child
->theTemplate
->kind
== 0) {
2082 * We are done with this sequence.
2084 child
->place
= notInUse
;
2085 if (state
->pending
) {
2086 dprintf("decodeError: next_in_seq notInUse still pending\n");
2087 PORT_SetError (SEC_ERROR_BAD_DER
);
2088 state
->top
->status
= decodeError
;
2089 } else if (child_missing
) {
2091 * We got to the end, but have a child that started parsing
2092 * and ended up "missing". The only legitimate reason for
2093 * this is that we had one or more optional fields at the
2094 * end of our sequence, and we were encoded indefinite-length,
2095 * so when we went looking for those optional fields we
2096 * found our end-of-contents octets instead.
2097 * (Yes, this is ugly; dunno a better way to handle it.)
2098 * So, first confirm the situation, and then mark that we
2101 if (state
->indefinite
&& child
->endofcontents
) {
2102 PORT_Assert (child_consumed
== 2);
2103 if( child_consumed
!= 2 ) {
2104 dprintf("decodeError: next_in_seq indef len != 2\n");
2105 PORT_SetError (SEC_ERROR_BAD_DER
);
2106 state
->top
->status
= decodeError
;
2108 state
->consumed
+= child_consumed
;
2109 state
->place
= afterEndOfContents
;
2112 dprintf("decodeError: next_in_seq !indef, child missing\n");
2113 PORT_SetError (SEC_ERROR_BAD_DER
);
2114 state
->top
->status
= decodeError
;
2118 * We have to finish out, maybe reading end-of-contents octets;
2119 * let the normal logic do the right thing.
2121 state
->place
= beforeEndOfContents
;
2124 unsigned char child_found_tag_modifiers
= 0;
2125 unsigned long child_found_tag_number
= 0;
2128 * Reset state and push.
2130 if (state
->dest
!= NULL
)
2131 child
->dest
= (char *)state
->dest
+ child
->theTemplate
->offset
;
2134 * Do the "before" field notification.
2136 sec_asn1d_notify_before (state
->top
, child
->dest
, child
->depth
);
2138 if (child_missing
) { /* if previous child was missing, copy the tag data we already have */
2139 child_found_tag_modifiers
= child
->found_tag_modifiers
;
2140 child_found_tag_number
= child
->found_tag_number
;
2142 state
->top
->current
= child
;
2143 child
= sec_asn1d_init_state_based_on_template (child
,
2144 buf
/* __APPLE__ */);
2145 if (child_missing
&& child
) {
2146 child
->place
= afterIdentifier
;
2147 child
->found_tag_modifiers
= child_found_tag_modifiers
;
2148 child
->found_tag_number
= child_found_tag_number
;
2149 child
->consumed
= child_consumed
;
2150 if (child
->underlying_kind
== SEC_ASN1_ANY
2151 && !child
->top
->filter_only
) {
2153 * If the new field is an ANY, and we are storing, then
2154 * we need to save the tag out. We would have done this
2155 * already in the normal case, but since we were looking
2156 * for an optional field, and we did not find it, we only
2157 * now realize we need to save the tag.
2159 unsigned char identifier
;
2162 * Check that we did not end up with a high tag; for that
2163 * we need to re-encode the tag into multiple bytes in order
2164 * to store it back to look like what we parsed originally.
2165 * In practice this does not happen, but for completeness
2166 * sake it should probably be made to work at some point.
2168 PORT_Assert (child_found_tag_number
< SEC_ASN1_HIGH_TAG_NUMBER
);
2169 identifier
= (unsigned char)(child_found_tag_modifiers
| child_found_tag_number
);
2170 sec_asn1d_record_any_header (child
, (char *) &identifier
, 1);
2178 sec_asn1d_concat_substrings (sec_asn1d_state
*state
)
2180 PORT_Assert (state
->place
== afterConstructedString
);
2182 if (state
->subitems_head
!= NULL
) {
2183 struct subitem
*substring
;
2184 unsigned long alloc_len
, item_len
;
2185 unsigned char *where
;
2187 PRBool is_bit_string
;
2190 is_bit_string
= (state
->underlying_kind
== SEC_ASN1_BIT_STRING
)
2191 ? PR_TRUE
: PR_FALSE
;
2193 substring
= state
->subitems_head
;
2194 while (substring
!= NULL
) {
2196 * All bit-string substrings except the last one should be
2197 * a clean multiple of 8 bits.
2199 if (is_bit_string
&& (substring
->next
== NULL
)
2200 && (substring
->len
& 0x7)) {
2201 dprintf("decodeError: sec_asn1d_concat_substrings align\n");
2202 PORT_SetError (SEC_ERROR_BAD_DER
);
2203 state
->top
->status
= decodeError
;
2206 item_len
+= substring
->len
;
2207 substring
= substring
->next
;
2210 if (is_bit_string
) {
2211 #ifdef XP_WIN16 /* win16 compiler gets an internal error otherwise */
2212 alloc_len
= (((long)item_len
+ 7) / 8);
2214 alloc_len
= ((item_len
+ 7) >> 3);
2218 * Add 2 for the end-of-contents octets of an indefinite-length
2219 * ANY that is *not* also an INNER. Because we zero-allocate
2220 * below, all we need to do is increase the length here.
2222 if (state
->underlying_kind
== SEC_ASN1_ANY
&& state
->indefinite
)
2224 alloc_len
= item_len
;
2227 item
= (SecAsn1Item
*)(state
->dest
);
2228 PORT_Assert (item
!= NULL
);
2229 PORT_Assert (item
->Data
== NULL
);
2230 item
->Data
= (unsigned char*)sec_asn1d_zalloc (state
->top
->their_pool
,
2232 if (item
->Data
== NULL
) {
2233 dprintf("decodeError: zalloc\n");
2234 state
->top
->status
= decodeError
;
2237 item
->Length
= item_len
;
2240 substring
= state
->subitems_head
;
2241 while (substring
!= NULL
) {
2243 item_len
= (substring
->len
+ 7) >> 3;
2245 item_len
= substring
->len
;
2246 PORT_Memcpy (where
, substring
->data
, item_len
);
2248 substring
= substring
->next
;
2252 * Because we use arenas and have a mark set, we later free
2253 * everything we have allocated, so this does *not* present
2254 * a memory leak (it is just temporarily left dangling).
2256 state
->subitems_head
= state
->subitems_tail
= NULL
;
2259 state
->place
= afterEndOfContents
;
2264 sec_asn1d_concat_group (sec_asn1d_state
*state
)
2266 const void ***placep
;
2268 PORT_Assert (state
->place
== afterGroup
);
2270 placep
= (const void***)state
->dest
;
2271 PORT_Assert(state
->subitems_head
== NULL
|| placep
!= NULL
);
2272 if (placep
!= NULL
) {
2273 struct subitem
*item
;
2278 item
= state
->subitems_head
;
2279 while (item
!= NULL
) {
2280 PORT_Assert (item
->next
!= NULL
|| item
== state
->subitems_tail
);
2285 group
= (const void**)sec_asn1d_zalloc (state
->top
->their_pool
,
2286 (count
+ 1) * (sizeof(void *)));
2287 if (group
== NULL
) {
2288 dprintf("decodeError: zalloc\n");
2289 state
->top
->status
= decodeError
;
2295 item
= state
->subitems_head
;
2296 while (item
!= NULL
) {
2297 *group
++ = item
->data
;
2303 * Because we use arenas and have a mark set, we later free
2304 * everything we have allocated, so this does *not* present
2305 * a memory leak (it is just temporarily left dangling).
2307 state
->subitems_head
= state
->subitems_tail
= NULL
;
2310 state
->place
= afterEndOfContents
;
2314 * For those states that push a child to handle a subtemplate,
2315 * "absorb" that child (transfer necessary information).
2318 sec_asn1d_absorb_child (sec_asn1d_state
*state
)
2321 * There is absolutely supposed to be a child there.
2323 PORT_Assert (state
->child
!= NULL
);
2326 * Inherit the missing status of our child, and do the ugly
2327 * backing-up if necessary.
2329 state
->missing
= state
->child
->missing
;
2330 if (state
->missing
) {
2331 state
->found_tag_number
= state
->child
->found_tag_number
;
2332 state
->found_tag_modifiers
= state
->child
->found_tag_modifiers
;
2333 state
->endofcontents
= state
->child
->endofcontents
;
2337 * Add in number of bytes consumed by child.
2338 * (Only EXPLICIT should have already consumed bytes itself.)
2340 PORT_Assert (state
->place
== afterExplicit
|| state
->consumed
== 0);
2341 state
->consumed
+= state
->child
->consumed
;
2344 * Subtract from bytes pending; this only applies to a definite-length
2347 if (state
->pending
) {
2348 PORT_Assert (!state
->indefinite
);
2349 PORT_Assert (state
->place
== afterExplicit
);
2352 * If we had a definite-length explicit, then what the child
2353 * consumed should be what was left pending.
2355 if (state
->pending
!= state
->child
->consumed
) {
2356 if (state
->pending
< state
->child
->consumed
) {
2357 dprintf("decodeError: absorb_child pending < consumed\n");
2358 PORT_SetError (SEC_ERROR_BAD_DER
);
2359 state
->top
->status
= decodeError
;
2363 * Okay, this is a hack. It *should* be an error whether
2364 * pending is too big or too small, but it turns out that
2365 * we had a bug in our *old* DER encoder that ended up
2366 * counting an explicit header twice in the case where
2367 * the underlying type was an ANY. So, because we cannot
2368 * prevent receiving these (our own certificate server can
2369 * send them to us), we need to be lenient and accept them.
2370 * To do so, we need to pretend as if we read all of the
2371 * bytes that the header said we would find, even though
2372 * we actually came up short.
2374 state
->consumed
+= (state
->pending
- state
->child
->consumed
);
2380 * Indicate that we are done with child.
2382 state
->child
->consumed
= 0;
2385 * And move on to final state.
2386 * (Technically everybody could move to afterEndOfContents except
2387 * for an indefinite-length EXPLICIT; for simplicity though we assert
2388 * that but let the end-of-contents code do the real determination.)
2390 PORT_Assert (state
->place
== afterExplicit
|| (! state
->indefinite
));
2391 state
->place
= beforeEndOfContents
;
2396 sec_asn1d_prepare_for_end_of_contents (sec_asn1d_state
*state
)
2398 PORT_Assert (state
->place
== beforeEndOfContents
);
2400 if (state
->indefinite
) {
2401 state
->place
= duringEndOfContents
;
2404 state
->place
= afterEndOfContents
;
2409 static unsigned long
2410 sec_asn1d_parse_end_of_contents (sec_asn1d_state
*state
,
2411 const char *buf
, unsigned long len
)
2415 PORT_Assert (state
->pending
<= 2);
2416 PORT_Assert (state
->place
== duringEndOfContents
);
2419 state
->top
->status
= needBytes
;
2423 if (state
->pending
< len
)
2424 len
= state
->pending
;
2426 for (i
= 0; i
< len
; i
++) {
2429 * We expect to find only zeros; if not, just give up.
2431 dprintf("decodeError: end of contents non zero\n");
2432 PORT_SetError (SEC_ERROR_BAD_DER
);
2433 state
->top
->status
= decodeError
;
2438 state
->pending
-= len
;
2440 if (state
->pending
== 0) {
2441 state
->place
= afterEndOfContents
;
2442 state
->endofcontents
= PR_TRUE
;
2450 sec_asn1d_pop_state (sec_asn1d_state
*state
)
2452 #if 0 /* XXX I think this should always be handled explicitly by parent? */
2454 * Account for our child.
2456 if (state
->child
!= NULL
) {
2457 state
->consumed
+= state
->child
->consumed
;
2458 if (state
->pending
) {
2459 PORT_Assert (!state
->indefinite
);
2460 if( state
->child
->consumed
> state
->pending
) {
2461 dprintf("decodeError: pop_state pending < consumed\n");
2462 PORT_SetError (SEC_ERROR_BAD_DER
);
2463 state
->top
->status
= decodeError
;
2465 state
->pending
-= state
->child
->consumed
;
2468 state
->child
->consumed
= 0;
2475 sec_asn1d_free_child (state
, PR_FALSE
);
2478 * Just make my parent be the current state. It will then clean
2479 * up after me and free me (or reuse me).
2481 state
->top
->current
= state
->parent
;
2484 static sec_asn1d_state
*
2485 sec_asn1d_before_choice (sec_asn1d_state
*state
, const char *buf
/* __APPLE__ */)
2487 sec_asn1d_state
*child
;
2489 if( state
->allocate
) {
2492 dest
= sec_asn1d_zalloc(state
->top
->their_pool
,
2493 state
->theTemplate
->size
);
2494 if( (void *)NULL
== dest
) {
2495 dprintf("decodeError: zalloc\n");
2496 state
->top
->status
= decodeError
;
2497 return (sec_asn1d_state
*)NULL
;
2500 state
->dest
= (char *)dest
+ state
->theTemplate
->offset
;
2503 child
= sec_asn1d_push_state(state
->top
, state
->theTemplate
+ 1,
2504 (char *)state
->dest
- state
->theTemplate
->offset
,
2506 if( (sec_asn1d_state
*)NULL
== child
) {
2507 return (sec_asn1d_state
*)NULL
;
2510 sec_asn1d_scrub_state(child
);
2511 child
= sec_asn1d_init_state_based_on_template(child
,
2512 buf
/* __APPLE__ */);
2513 if( (sec_asn1d_state
*)NULL
== child
) {
2514 return (sec_asn1d_state
*)NULL
;
2517 child
->optional
= PR_TRUE
;
2519 state
->place
= duringChoice
;
2524 static sec_asn1d_state
*
2525 sec_asn1d_during_choice (sec_asn1d_state
*state
, const char *buf
/* __APPLE__ */)
2527 sec_asn1d_state
*child
= state
->child
;
2529 PORT_Assert((sec_asn1d_state
*)NULL
!= child
);
2531 if( child
->missing
) {
2532 unsigned char child_found_tag_modifiers
= 0;
2533 unsigned long child_found_tag_number
= 0;
2536 state
->consumed
+= child
->consumed
;
2538 if (child
->endofcontents
) {
2539 /* This choice is probably the first item in a GROUP
2540 ** (e.g. SET_OF) that was indefinite-length encoded.
2541 ** We're actually at the end of that GROUP.
2542 ** We look up the stack to be sure that we find
2543 ** a state with indefinite length encoding before we
2544 ** find a state (like a SEQUENCE) that is definite.
2546 child
->place
= notInUse
;
2547 state
->place
= afterChoice
;
2548 state
->endofcontents
= PR_TRUE
; /* propagate this up */
2549 if (sec_asn1d_parent_allows_EOC(state
))
2551 dprintf("decodeError: during_choice child at EOC by parent does not allow EOC\n");
2552 PORT_SetError(SEC_ERROR_BAD_DER
);
2553 state
->top
->status
= decodeError
;
2557 dest
= (char *)child
->dest
- child
->theTemplate
->offset
;
2558 child
->theTemplate
++;
2560 if( 0 == child
->theTemplate
->kind
) {
2561 /* Ran out of choices */
2562 dprintf("decodeError: during_choice ran out of choice\n");
2563 PORT_SetError(SEC_ERROR_BAD_DER
);
2564 state
->top
->status
= decodeError
;
2565 return (sec_asn1d_state
*)NULL
;
2567 child
->dest
= (char *)dest
+ child
->theTemplate
->offset
;
2569 /* cargo'd from next_in_sequence innards */
2570 if( state
->pending
) {
2571 PORT_Assert(!state
->indefinite
);
2572 if( child
->consumed
> state
->pending
) {
2573 dprintf("decodeError: during_choice consumed > pending\n");
2574 PORT_SetError (SEC_ERROR_BAD_DER
);
2575 state
->top
->status
= decodeError
;
2578 state
->pending
-= child
->consumed
;
2579 if( 0 == state
->pending
) {
2580 /* XXX uh.. not sure if I should have stopped this
2581 * from happening before. */
2583 PORT_SetError(SEC_ERROR_BAD_DER
);
2584 dprintf("decodeError: during_choice !pending\n");
2585 state
->top
->status
= decodeError
;
2586 return (sec_asn1d_state
*)NULL
;
2590 child
->consumed
= 0;
2591 sec_asn1d_scrub_state(child
);
2593 /* move it on top again */
2594 state
->top
->current
= child
;
2596 child_found_tag_modifiers
= child
->found_tag_modifiers
;
2597 child_found_tag_number
= child
->found_tag_number
;
2599 child
= sec_asn1d_init_state_based_on_template(child
, buf
/* __APPLE__*/);
2600 if( (sec_asn1d_state
*)NULL
== child
) {
2601 return (sec_asn1d_state
*)NULL
;
2604 /* copy our findings to the new top */
2605 child
->found_tag_modifiers
= child_found_tag_modifiers
;
2606 child
->found_tag_number
= child_found_tag_number
;
2608 child
->optional
= PR_TRUE
;
2609 child
->place
= afterIdentifier
;
2613 if( (void *)NULL
!= state
->dest
) {
2614 /* Store the enum */
2615 int *which
= (int *)state
->dest
;
2616 *which
= (int)child
->theTemplate
->size
;
2619 child
->place
= notInUse
;
2621 state
->place
= afterChoice
;
2626 sec_asn1d_after_choice (sec_asn1d_state
*state
)
2628 state
->consumed
+= state
->child
->consumed
;
2629 state
->child
->consumed
= 0;
2630 state
->place
= afterEndOfContents
;
2631 sec_asn1d_pop_state(state
);
2636 sec_asn1d_uinteger(SecAsn1Item
*src
)
2638 unsigned long value
;
2641 if (src
->Length
> 5 || (src
->Length
> 4 && src
->Data
[0] == 0))
2648 value
|= src
->Data
[--len
];
2655 SEC_ASN1DecodeInteger(SecAsn1Item
*src
, unsigned long *value
)
2661 PORT_SetError(SEC_ERROR_INVALID_ARGS
);
2665 if (src
->Length
> sizeof(unsigned long)) {
2666 PORT_SetError(SEC_ERROR_INVALID_ARGS
);
2670 if (src
->Data
== NULL
) {
2671 PORT_SetError(SEC_ERROR_INVALID_ARGS
);
2675 if (src
->Data
[0] & 0x80)
2676 v
= -1; /* signed and negative - start with all 1's */
2680 for (i
= 0; i
< src
->Length
; i
++) {
2681 /* shift in next byte */
2689 #ifdef DEBUG_ASN1D_STATES
2691 dump_states(SEC_ASN1DecoderContext
*cx
)
2693 sec_asn1d_state
*state
;
2696 for (state
= cx
->current
; state
->parent
; state
= state
->parent
) {
2700 for (; state
; state
= state
->child
) {
2702 for (i
= 0; i
< state
->depth
; i
++) {
2706 i
= formatKind(state
->theTemplate
->kind
, kindBuf
);
2707 printf("%s: tmpl %p, kind%s",
2708 (state
== cx
->current
) ? "STATE" : "State",
2711 printf(" %s", (state
->place
<= notInUse
)
2712 ? place_names
[ state
->place
]
2715 printf(", expect 0x%02lx",
2716 state
->expect_tag_number
| state
->expect_tag_modifiers
);
2718 printf("%s%s%s %lu\n",
2719 state
->indefinite
? ", indef" : "",
2720 state
->missing
? ", miss" : "",
2721 state
->endofcontents
? ", EOC" : "",
2728 #endif /* DEBUG_ASN1D_STATES */
2731 SEC_ASN1DecoderUpdate (SEC_ASN1DecoderContext
*cx
,
2732 const char *buf
, size_t len
)
2734 sec_asn1d_state
*state
= NULL
;
2735 unsigned long consumed
;
2736 SEC_ASN1EncodingPart what
;
2737 sec_asn1d_state
*stateEnd
= cx
->current
;
2739 if (cx
->status
== needBytes
)
2740 cx
->status
= keepGoing
;
2742 while (cx
->status
== keepGoing
) {
2743 state
= cx
->current
;
2744 what
= SEC_ASN1_Contents
;
2746 #if DEBUG_ASN1D_STATES
2747 if (doDumpStates
> 1) {
2748 printf("\nPLACE = %s, next byte = 0x%02x, %p[%lu]\n",
2749 (state
->place
<= notInUse
) ?
2750 place_names
[ state
->place
] : "(undefined)",
2751 (unsigned int)((unsigned char *)buf
)[ consumed
],
2755 #endif /* DEBUG_ASN1D_STATES */
2756 switch (state
->place
) {
2757 case beforeIdentifier
:
2758 consumed
= sec_asn1d_parse_identifier (state
, buf
, len
);
2759 what
= SEC_ASN1_Identifier
;
2761 case duringIdentifier
:
2762 consumed
= sec_asn1d_parse_more_identifier (state
, buf
, len
);
2763 what
= SEC_ASN1_Identifier
;
2765 case afterIdentifier
:
2766 sec_asn1d_confirm_identifier (state
);
2769 consumed
= sec_asn1d_parse_length (state
, buf
, len
);
2770 what
= SEC_ASN1_Length
;
2773 consumed
= sec_asn1d_parse_more_length (state
, buf
, len
);
2774 what
= SEC_ASN1_Length
;
2777 sec_asn1d_prepare_for_contents (state
, buf
);
2779 case beforeBitString
:
2780 consumed
= sec_asn1d_parse_bit_string (state
, buf
, len
);
2782 case duringBitString
:
2783 consumed
= sec_asn1d_parse_more_bit_string (state
, buf
, len
);
2785 case duringConstructedString
:
2786 sec_asn1d_next_substring (state
);
2789 sec_asn1d_next_in_group (state
, buf
);
2792 consumed
= sec_asn1d_parse_leaf (state
, buf
, len
);
2794 case duringSaveEncoding
:
2795 sec_asn1d_reuse_encoding (state
);
2796 if (cx
->status
== decodeError
) {
2797 /* recursive call has already popped all states from stack.
2798 ** Bail out quickly.
2802 if (cx
->status
== needBytes
) {
2803 /* recursive call wanted more data. Fatal. Clean up below. */
2804 PORT_SetError (SEC_ERROR_BAD_DER
);
2805 cx
->status
= decodeError
;
2808 case duringSequence
:
2809 sec_asn1d_next_in_sequence (state
, buf
);
2811 case afterConstructedString
:
2812 sec_asn1d_concat_substrings (state
);
2818 sec_asn1d_absorb_child (state
);
2821 sec_asn1d_concat_group (state
);
2823 case afterSaveEncoding
:
2824 /* SEC_ASN1DecoderUpdate has called itself recursively to
2825 ** decode SAVEd encoded data, and now is done decoding that.
2826 ** Return to the calling copy of SEC_ASN1DecoderUpdate.
2829 case beforeEndOfContents
:
2830 sec_asn1d_prepare_for_end_of_contents (state
);
2832 case duringEndOfContents
:
2833 consumed
= sec_asn1d_parse_end_of_contents (state
, buf
, len
);
2834 what
= SEC_ASN1_EndOfContents
;
2836 case afterEndOfContents
:
2837 sec_asn1d_pop_state (state
);
2840 state
= sec_asn1d_before_choice(state
, buf
);
2843 state
= sec_asn1d_during_choice(state
, buf
);
2846 sec_asn1d_after_choice(state
);
2850 /* This is not an error, but rather a plain old BUG! */
2852 PORT_SetError (SEC_ERROR_BAD_DER
);
2853 dprintf("decodeError: decoder update bad state->place\n");
2854 cx
->status
= decodeError
;
2858 if (cx
->status
== decodeError
)
2861 /* We should not consume more than we have. */
2862 PORT_Assert (consumed
<= len
);
2863 if( consumed
> len
) {
2864 dprintf("decodeError: decoder update consumed > len\n");
2865 PORT_SetError (SEC_ERROR_BAD_DER
);
2866 cx
->status
= decodeError
;
2870 /* It might have changed, so we have to update our local copy. */
2871 state
= cx
->current
;
2873 /* If it is NULL, we have popped all the way to the top. */
2874 if (state
== NULL
) {
2875 PORT_Assert (consumed
== 0);
2877 /* XXX I want this here, but it seems that we have situations (like
2878 * downloading a pkcs7 cert chain from some issuers) that give us a
2879 * length which is greater than the entire encoding. So, we cannot
2880 * have this be an error.
2883 dprintf("decodeError: decoder update nonzero len\n");
2884 PORT_SetError (SEC_ERROR_BAD_DER
);
2885 cx
->status
= decodeError
;
2889 cx
->status
= allDone
;
2892 else if (state
->theTemplate
->kind
== SEC_ASN1_SKIP_REST
) {
2893 cx
->status
= allDone
;
2901 * The following check is specifically looking for an ANY
2902 * that is *not* also an INNER, because we need to save aside
2903 * all bytes in that case -- the contents parts will get
2904 * handled like all other contents, and the end-of-contents
2905 * bytes are added by the concat code, but the outer header
2906 * bytes need to get saved too, so we do them explicitly here.
2908 if (state
->underlying_kind
== SEC_ASN1_ANY
2909 && !cx
->filter_only
&& (what
== SEC_ASN1_Identifier
2910 || what
== SEC_ASN1_Length
)) {
2911 sec_asn1d_record_any_header (state
, buf
, consumed
);
2915 * We had some number of good, accepted bytes. If the caller
2916 * has registered to see them, pass them along.
2918 if (state
->top
->filter_proc
!= NULL
) {
2921 depth
= state
->depth
;
2922 if (what
== SEC_ASN1_EndOfContents
&& !state
->indefinite
) {
2923 PORT_Assert (state
->parent
!= NULL
2924 && state
->parent
->indefinite
);
2926 PORT_Assert (depth
== state
->parent
->depth
);
2928 (* state
->top
->filter_proc
) (state
->top
->filter_arg
,
2929 buf
, consumed
, depth
, what
);
2932 state
->consumed
+= consumed
;
2935 } /* main decode loop */
2937 if (cx
->status
== decodeError
) {
2938 while (state
!= NULL
&& stateEnd
->parent
!=state
) {
2939 sec_asn1d_free_child (state
, PR_TRUE
);
2940 state
= state
->parent
;
2942 #ifdef SEC_ASN1D_FREE_ON_ERROR /*
2943 * XXX This does not work because we can
2944 * end up leaving behind dangling pointers
2945 * to stuff that was allocated. In order
2946 * to make this really work (which would
2947 * be a good thing, I think), we need to
2948 * keep track of every place/pointer that
2949 * was allocated and make sure to NULL it
2950 * out before we then free back to the mark.
2952 if (cx
->their_pool
!= NULL
) {
2953 PORT_Assert (cx
->their_mark
!= NULL
);
2954 PORT_ArenaRelease (cx
->their_pool
, cx
->their_mark
);
2961 /* XXX This is what I want, but cannot have because it seems we
2962 * have situations (like when downloading a pkcs7 cert chain from
2963 * some issuers) that give us a total length which is greater than
2964 * the entire encoding. So, we have to allow allDone to have a
2965 * remaining length greater than zero. I wanted to catch internal
2966 * bugs with this, noticing when we do not have the right length.
2969 PORT_Assert (len
== 0
2970 && (cx
->status
== needBytes
|| cx
->status
== allDone
));
2972 PORT_Assert ((len
== 0 && cx
->status
== needBytes
)
2973 || cx
->status
== allDone
);
2980 SEC_ASN1DecoderFinish (SEC_ASN1DecoderContext
*cx
)
2984 if (cx
->status
== needBytes
) {
2987 * Special case: need more bytes, but this field and all
2988 * subsequent fields are optional. I'm surprised this case is
2989 * not handled in the original NSS code, and this workaround
2990 * is a bit of a hack...
2992 sec_asn1d_state
*state
= cx
->current
;
2993 assert(state
!= NULL
);
2994 if(state
->place
== beforeIdentifier
) {
2995 int allOptional
= 1;
2996 const SecAsn1Template
*templ
= state
->theTemplate
;
2997 while(templ
->kind
!= 0) {
2998 if(!(templ
->kind
& SEC_ASN1_OPTIONAL
)) {
3005 /* letting this one slide */
3009 PORT_SetError (SEC_ERROR_BAD_DER
);
3014 PORT_SetError (SEC_ERROR_BAD_DER
);
3018 PORT_SetError (SEC_ERROR_BAD_DER
);
3020 #endif /* __APPLE__ */
3026 * XXX anything else that needs to be finished?
3029 PORT_FreeArena (cx
->our_pool
, PR_FALSE
);
3035 SEC_ASN1DecoderContext
*
3036 SEC_ASN1DecoderStart (PRArenaPool
*their_pool
, void *dest
,
3037 const SecAsn1Template
*theTemplate
3040 /* only needed if first element will be SEC_ASN1_DYNAMIC */
3045 PRArenaPool
*our_pool
;
3046 SEC_ASN1DecoderContext
*cx
;
3048 our_pool
= PORT_NewArena (SEC_ASN1_DEFAULT_ARENA_SIZE
);
3049 if (our_pool
== NULL
)
3052 cx
= (SEC_ASN1DecoderContext
*)PORT_ArenaZAlloc (our_pool
, sizeof(*cx
));
3054 PORT_FreeArena (our_pool
, PR_FALSE
);
3058 cx
->our_pool
= our_pool
;
3059 if (their_pool
!= NULL
) {
3060 cx
->their_pool
= their_pool
;
3061 #ifdef SEC_ASN1D_FREE_ON_ERROR
3062 cx
->their_mark
= PORT_ArenaMark (their_pool
);
3066 cx
->status
= needBytes
;
3068 if (sec_asn1d_push_state(cx
, theTemplate
, dest
, PR_FALSE
) == NULL
3069 || sec_asn1d_init_state_based_on_template (cx
->current
,
3070 buf
/* __APPLE__ */) == NULL
) {
3072 * Trouble initializing (probably due to failed allocations)
3073 * requires that we just give up.
3075 PORT_FreeArena (our_pool
, PR_FALSE
);
3084 SEC_ASN1DecoderSetFilterProc (SEC_ASN1DecoderContext
*cx
,
3085 SEC_ASN1WriteProc fn
, void *arg
,
3088 /* check that we are "between" fields here */
3089 PORT_Assert (cx
->during_notify
);
3091 cx
->filter_proc
= fn
;
3092 cx
->filter_arg
= arg
;
3093 cx
->filter_only
= only
;
3098 SEC_ASN1DecoderClearFilterProc (SEC_ASN1DecoderContext
*cx
)
3100 /* check that we are "between" fields here */
3101 PORT_Assert (cx
->during_notify
);
3103 cx
->filter_proc
= NULL
;
3104 cx
->filter_arg
= NULL
;
3105 cx
->filter_only
= PR_FALSE
;
3110 SEC_ASN1DecoderSetNotifyProc (SEC_ASN1DecoderContext
*cx
,
3111 SEC_ASN1NotifyProc fn
, void *arg
)
3113 cx
->notify_proc
= fn
;
3114 cx
->notify_arg
= arg
;
3119 SEC_ASN1DecoderClearNotifyProc (SEC_ASN1DecoderContext
*cx
)
3121 cx
->notify_proc
= NULL
;
3122 cx
->notify_arg
= NULL
; /* not necessary; just being clean */
3127 SEC_ASN1DecoderAbort(SEC_ASN1DecoderContext
*cx
, int error
)
3130 PORT_SetError(error
);
3131 cx
->status
= decodeError
;
3136 SEC_ASN1Decode (PRArenaPool
*poolp
, void *dest
,
3137 const SecAsn1Template
*theTemplate
,
3138 const char *buf
, size_t len
)
3140 SEC_ASN1DecoderContext
*dcx
;
3143 dcx
= SEC_ASN1DecoderStart (poolp
, dest
, theTemplate
,
3144 buf
/* __APPLE__ */);
3148 urv
= SEC_ASN1DecoderUpdate (dcx
, buf
, len
);
3149 frv
= SEC_ASN1DecoderFinish (dcx
);
3151 if (urv
!= SECSuccess
)
3159 SEC_ASN1DecodeItem (PRArenaPool
*poolp
, void *dest
,
3160 const SecAsn1Template
*theTemplate
,
3161 const SecAsn1Item
*item
)
3163 return SEC_ASN1Decode (poolp
, dest
, theTemplate
,
3164 (const char *) item
->Data
, item
->Length
);