| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 /* | 5 /* |
| 6 * Support for DEcoding ASN.1 data based on BER/DER (Basic/Distinguished | 6 * Support for DEcoding ASN.1 data based on BER/DER (Basic/Distinguished |
| 7 * Encoding Rules). | 7 * Encoding Rules). |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 /* #define DEBUG_ASN1D_STATES 1 */ | 10 /* #define DEBUG_ASN1D_STATES 1 */ |
| (...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 978 *remaining -= consumed; | 978 *remaining -= consumed; |
| 979 return PR_TRUE; | 979 return PR_TRUE; |
| 980 } | 980 } |
| 981 | 981 |
| 982 static void | 982 static void |
| 983 sec_asn1d_prepare_for_contents (sec_asn1d_state *state) | 983 sec_asn1d_prepare_for_contents (sec_asn1d_state *state) |
| 984 { | 984 { |
| 985 SECItem *item; | 985 SECItem *item; |
| 986 PLArenaPool *poolp; | 986 PLArenaPool *poolp; |
| 987 unsigned long alloc_len; | 987 unsigned long alloc_len; |
| 988 sec_asn1d_state *parent; |
| 988 | 989 |
| 989 #ifdef DEBUG_ASN1D_STATES | 990 #ifdef DEBUG_ASN1D_STATES |
| 990 { | 991 { |
| 991 printf("Found Length %d %s\n", state->contents_length, | 992 printf("Found Length %d %s\n", state->contents_length, |
| 992 state->indefinite ? "indefinite" : ""); | 993 state->indefinite ? "indefinite" : ""); |
| 993 } | 994 } |
| 994 #endif | 995 #endif |
| 995 | 996 |
| 996 /** | 997 /** |
| 997 * The maximum length for a child element should be constrained to the | 998 * The maximum length for a child element should be constrained to the |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1013 * elements that may have been read). | 1014 * elements that may have been read). |
| 1014 * | 1015 * |
| 1015 * It's slightly complicated by the need to account both for integer | 1016 * It's slightly complicated by the need to account both for integer |
| 1016 * underflow and overflow, as well as ensure that for indefinite length | 1017 * underflow and overflow, as well as ensure that for indefinite length |
| 1017 * encodings, there's also enough space for the End-of-Contents (EOC) | 1018 * encodings, there's also enough space for the End-of-Contents (EOC) |
| 1018 * octets (Tag = 0x00, Length = 0x00, or two bytes). | 1019 * octets (Tag = 0x00, Length = 0x00, or two bytes). |
| 1019 */ | 1020 */ |
| 1020 | 1021 |
| 1021 /* Determine the maximum length available for this element by finding the | 1022 /* Determine the maximum length available for this element by finding the |
| 1022 * first definite length ancestor, if any. */ | 1023 * first definite length ancestor, if any. */ |
| 1023 sec_asn1d_state *parent = sec_asn1d_get_enclosing_construct(state); | 1024 parent = sec_asn1d_get_enclosing_construct(state); |
| 1024 while (parent && parent->indefinite) { | 1025 while (parent && parent->indefinite) { |
| 1025 parent = sec_asn1d_get_enclosing_construct(parent); | 1026 parent = sec_asn1d_get_enclosing_construct(parent); |
| 1026 } | 1027 } |
| 1027 /* If parent is null, state is either the outermost state / at the top of | 1028 /* If parent is null, state is either the outermost state / at the top of |
| 1028 * the stack, or the outermost state uses indefinite length encoding. In | 1029 * the stack, or the outermost state uses indefinite length encoding. In |
| 1029 * these cases, there's nothing external to constrain this element, so | 1030 * these cases, there's nothing external to constrain this element, so |
| 1030 * there's nothing to check. */ | 1031 * there's nothing to check. */ |
| 1031 if (parent) { | 1032 if (parent) { |
| 1032 unsigned long remaining = parent->pending; | 1033 unsigned long remaining = parent->pending; |
| 1033 parent = state; | 1034 parent = state; |
| (...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1782 if (child_consumed > state->pending) { | 1783 if (child_consumed > state->pending) { |
| 1783 PORT_SetError (SEC_ERROR_BAD_DER); | 1784 PORT_SetError (SEC_ERROR_BAD_DER); |
| 1784 state->top->status = decodeError; | 1785 state->top->status = decodeError; |
| 1785 return; | 1786 return; |
| 1786 } | 1787 } |
| 1787 | 1788 |
| 1788 state->pending -= child_consumed; | 1789 state->pending -= child_consumed; |
| 1789 if (state->pending == 0) | 1790 if (state->pending == 0) |
| 1790 done = PR_TRUE; | 1791 done = PR_TRUE; |
| 1791 } else { | 1792 } else { |
| 1793 PRBool preallocatedString; |
| 1794 sec_asn1d_state *temp_state; |
| 1792 PORT_Assert (state->indefinite); | 1795 PORT_Assert (state->indefinite); |
| 1793 | 1796 |
| 1794 item = (SECItem *)(child->dest); | 1797 item = (SECItem *)(child->dest); |
| 1795 | 1798 |
| 1796 /** | 1799 /** |
| 1797 * At this point, there's three states at play: | 1800 * At this point, there's three states at play: |
| 1798 * child: The element that was just parsed | 1801 * child: The element that was just parsed |
| 1799 * state: The currently processed element | 1802 * state: The currently processed element |
| 1800 * 'parent' (aka state->parent): The enclosing construct | 1803 * 'parent' (aka state->parent): The enclosing construct |
| 1801 * of state, or NULL if this is the top-most element. | 1804 * of state, or NULL if this is the top-most element. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1854 * any type, then the enclosing construct is either an any type (#3/#4) | 1857 * any type, then the enclosing construct is either an any type (#3/#4) |
| 1855 * or some other type (#5). Since this is BER, this nesting relationship | 1858 * or some other type (#5). Since this is BER, this nesting relationship |
| 1856 * between 'state' and 'parent' may go through several levels of | 1859 * between 'state' and 'parent' may go through several levels of |
| 1857 * constructed encoding, so continue walking the ancestor chain until a | 1860 * constructed encoding, so continue walking the ancestor chain until a |
| 1858 * clear determination can be made. | 1861 * clear determination can be made. |
| 1859 * | 1862 * |
| 1860 * The variable preallocatedString is used to indicate Case #1/#3, | 1863 * The variable preallocatedString is used to indicate Case #1/#3, |
| 1861 * indicating an in-place copy has already occurred, and Cases #2, #4, | 1864 * indicating an in-place copy has already occurred, and Cases #2, #4, |
| 1862 * and #5 all have the same behaviour of adding a new substring. | 1865 * and #5 all have the same behaviour of adding a new substring. |
| 1863 */ | 1866 */ |
| 1864 » PRBool preallocatedString = PR_FALSE; | 1867 » preallocatedString = PR_FALSE; |
| 1865 » sec_asn1d_state *temp_state = state; | 1868 » temp_state = state; |
| 1866 while (temp_state && item == temp_state->dest && temp_state->indefinite)
{ | 1869 while (temp_state && item == temp_state->dest && temp_state->indefinite)
{ |
| 1867 sec_asn1d_state *parent = sec_asn1d_get_enclosing_construct(temp_sta
te); | 1870 sec_asn1d_state *parent = sec_asn1d_get_enclosing_construct(temp_sta
te); |
| 1868 if (!parent || parent->underlying_kind != temp_state->underlying_kin
d) { | 1871 if (!parent || parent->underlying_kind != temp_state->underlying_kin
d) { |
| 1869 /* Case #5 - Either this is a top-level construct or it is part | 1872 /* Case #5 - Either this is a top-level construct or it is part |
| 1870 * of some other element (e.g. a SEQUENCE), in which case, a | 1873 * of some other element (e.g. a SEQUENCE), in which case, a |
| 1871 * new item should be allocated. */ | 1874 * new item should be allocated. */ |
| 1872 break; | 1875 break; |
| 1873 } | 1876 } |
| 1874 if (!parent->indefinite) { | 1877 if (!parent->indefinite) { |
| 1875 /* Cases #1 / #3 - A definite length ancestor exists, for which | 1878 /* Cases #1 / #3 - A definite length ancestor exists, for which |
| (...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3391 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_EnumeratedTemplate) | 3394 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_EnumeratedTemplate) |
| 3392 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToEnumeratedTemplate) | 3395 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToEnumeratedTemplate) |
| 3393 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SequenceOfAnyTemplate) | 3396 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SequenceOfAnyTemplate) |
| 3394 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SequenceOfObjectIDTemplate) | 3397 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SequenceOfObjectIDTemplate) |
| 3395 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SkipTemplate) | 3398 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_SkipTemplate) |
| 3396 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_UniversalStringTemplate) | 3399 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_UniversalStringTemplate) |
| 3397 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PrintableStringTemplate) | 3400 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PrintableStringTemplate) |
| 3398 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_T61StringTemplate) | 3401 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_T61StringTemplate) |
| 3399 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToGeneralizedTimeTemplate) | 3402 SEC_ASN1_CHOOSER_IMPLEMENT(SEC_PointerToGeneralizedTimeTemplate) |
| 3400 | 3403 |
| OLD | NEW |