aboutsummaryrefslogtreecommitdiff
path: root/src/daemon/https/minitasn1/decoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/https/minitasn1/decoding.c')
-rw-r--r--src/daemon/https/minitasn1/decoding.c156
1 files changed, 90 insertions, 66 deletions
diff --git a/src/daemon/https/minitasn1/decoding.c b/src/daemon/https/minitasn1/decoding.c
index fcee0797..fe0eaef7 100644
--- a/src/daemon/https/minitasn1/decoding.c
+++ b/src/daemon/https/minitasn1/decoding.c
@@ -35,12 +35,14 @@
35 35
36 36
37static void 37static void
38MHD__asn1_error_description_tag_error (node_asn * node, char *ErrorDescription) 38MHD__asn1_error_description_tag_error (node_asn * node,
39 char *ErrorDescription)
39{ 40{
40 41
41 Estrcpy (ErrorDescription, ":: tag error near element '"); 42 Estrcpy (ErrorDescription, ":: tag error near element '");
42 MHD__asn1_hierarchical_name (node, ErrorDescription + strlen (ErrorDescription), 43 MHD__asn1_hierarchical_name (node,
43 MAX_ERROR_DESCRIPTION_SIZE - 40); 44 ErrorDescription + strlen (ErrorDescription),
45 MAX_ERROR_DESCRIPTION_SIZE - 40);
44 Estrcat (ErrorDescription, "'"); 46 Estrcat (ErrorDescription, "'");
45 47
46} 48}
@@ -117,7 +119,7 @@ MHD__asn1_get_length_der (const unsigned char *der, int der_len, int *len)
117 **/ 119 **/
118int 120int
119MHD__asn1_get_tag_der (const unsigned char *der, int der_len, 121MHD__asn1_get_tag_der (const unsigned char *der, int der_len,
120 unsigned char *cls, int *len, unsigned long *tag) 122 unsigned char *cls, int *len, unsigned long *tag)
121{ 123{
122 int punt, ris; 124 int punt, ris;
123 125
@@ -178,8 +180,8 @@ MHD__asn1_get_tag_der (const unsigned char *der, int der_len,
178 **/ 180 **/
179int 181int
180MHD__asn1_get_octet_der (const unsigned char *der, int der_len, 182MHD__asn1_get_octet_der (const unsigned char *der, int der_len,
181 int *ret_len, unsigned char *str, int str_size, 183 int *ret_len, unsigned char *str, int str_size,
182 int *str_len) 184 int *str_len)
183{ 185{
184 int len_len; 186 int len_len;
185 187
@@ -209,7 +211,7 @@ MHD__asn1_get_octet_der (const unsigned char *der, int der_len,
209 */ 211 */
210static int 212static int
211MHD__asn1_get_time_der (const unsigned char *der, int der_len, int *ret_len, 213MHD__asn1_get_time_der (const unsigned char *der, int der_len, int *ret_len,
212 char *str, int str_size) 214 char *str, int str_size)
213{ 215{
214 int len_len, str_len; 216 int len_len, str_len;
215 217
@@ -228,8 +230,8 @@ MHD__asn1_get_time_der (const unsigned char *der, int der_len, int *ret_len,
228 230
229 231
230static void 232static void
231MHD__asn1_get_objectid_der (const unsigned char *der, int der_len, int *ret_len, 233MHD__asn1_get_objectid_der (const unsigned char *der, int der_len,
232 char *str, int str_size) 234 int *ret_len, char *str, int str_size)
233{ 235{
234 int len_len, len, k; 236 int len_len, len, k;
235 char temp[20]; 237 char temp[20];
@@ -286,8 +288,8 @@ MHD__asn1_get_objectid_der (const unsigned char *der, int der_len, int *ret_len,
286 **/ 288 **/
287int 289int
288MHD__asn1_get_bit_der (const unsigned char *der, int der_len, 290MHD__asn1_get_bit_der (const unsigned char *der, int der_len,
289 int *ret_len, unsigned char *str, int str_size, 291 int *ret_len, unsigned char *str, int str_size,
290 int *bit_len) 292 int *bit_len)
291{ 293{
292 int len_len, len_byte; 294 int len_len, len_byte;
293 295
@@ -314,8 +316,8 @@ MHD__asn1_get_bit_der (const unsigned char *der, int der_len,
314 316
315 317
316static int 318static int
317MHD__asn1_extract_tag_der (node_asn * node, const unsigned char *der, int der_len, 319MHD__asn1_extract_tag_der (node_asn * node, const unsigned char *der,
318 int *ret_len) 320 int der_len, int *ret_len)
319{ 321{
320 node_asn *p; 322 node_asn *p;
321 int counter, len2, len3, is_tag_implicit; 323 int counter, len2, len3, is_tag_implicit;
@@ -353,8 +355,8 @@ MHD__asn1_extract_tag_der (node_asn * node, const unsigned char *der, int der_le
353 return ASN1_DER_ERROR; 355 return ASN1_DER_ERROR;
354 counter += len2; 356 counter += len2;
355 len3 = 357 len3 =
356 MHD__asn1_get_length_der (der + counter, der_len - counter, 358 MHD__asn1_get_length_der (der + counter,
357 &len2); 359 der_len - counter, &len2);
358 if (len3 < 0) 360 if (len3 < 0)
359 return ASN1_DER_ERROR; 361 return ASN1_DER_ERROR;
360 counter += len2; 362 counter += len2;
@@ -567,7 +569,8 @@ MHD__asn1_delete_not_used (node_asn * node)
567 569
568 570
569static MHD__asn1_retCode 571static MHD__asn1_retCode
570MHD__asn1_get_octet_string (const unsigned char *der, node_asn * node, int *len) 572MHD__asn1_get_octet_string (const unsigned char *der, node_asn * node,
573 int *len)
571{ 574{
572 int len2, len3, counter, counter2, counter_end, tot_len, indefinite; 575 int len2, len3, counter, counter2, counter_end, tot_len, indefinite;
573 unsigned char *temp, *temp2; 576 unsigned char *temp, *temp2;
@@ -606,7 +609,8 @@ MHD__asn1_get_octet_string (const unsigned char *der, node_asn * node, int *len)
606 609
607 counter++; 610 counter++;
608 611
609 len2 = MHD__asn1_get_length_der (der + counter, *len - counter, &len3); 612 len2 =
613 MHD__asn1_get_length_der (der + counter, *len - counter, &len3);
610 if (len2 <= 0) 614 if (len2 <= 0)
611 return ASN1_DER_ERROR; 615 return ASN1_DER_ERROR;
612 616
@@ -629,10 +633,10 @@ MHD__asn1_get_octet_string (const unsigned char *der, node_asn * node, int *len)
629 temp2 = temp + len2; 633 temp2 = temp + len2;
630 len2 = MHD__asn1_get_length_der (der, *len, &len3); 634 len2 = MHD__asn1_get_length_der (der, *len, &len3);
631 if (len2 < -1) 635 if (len2 < -1)
632 { 636 {
633 MHD__asn1_afree (temp); 637 MHD__asn1_afree (temp);
634 return ASN1_DER_ERROR; 638 return ASN1_DER_ERROR;
635 } 639 }
636 counter2 = len3 + 1; 640 counter2 = len3 + 1;
637 641
638 if (indefinite == -1) 642 if (indefinite == -1)
@@ -643,12 +647,13 @@ MHD__asn1_get_octet_string (const unsigned char *der, node_asn * node, int *len)
643 while (counter2 < counter_end) 647 while (counter2 < counter_end)
644 { 648 {
645 len2 = 649 len2 =
646 MHD__asn1_get_length_der (der + counter2, *len - counter, &len3); 650 MHD__asn1_get_length_der (der + counter2, *len - counter,
651 &len3);
647 if (len2 < -1) 652 if (len2 < -1)
648 { 653 {
649 MHD__asn1_afree (temp); 654 MHD__asn1_afree (temp);
650 return ASN1_DER_ERROR; 655 return ASN1_DER_ERROR;
651 } 656 }
652 657
653 /* FIXME: to be checked. Is this ok? Has the 658 /* FIXME: to be checked. Is this ok? Has the
654 * size been checked before? 659 * size been checked before?
@@ -757,7 +762,7 @@ MHD__asn1_get_indefinite_length_string (const unsigned char *der, int *len)
757 762
758MHD__asn1_retCode 763MHD__asn1_retCode
759MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len, 764MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
760 char *errorDescription) 765 char *errorDescription)
761{ 766{
762 node_asn *node, *p, *p2, *p3; 767 node_asn *node, *p, *p2, *p3;
763 char temp[128]; 768 char temp[128];
@@ -789,7 +794,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
789 if (p->type & CONST_SET) 794 if (p->type & CONST_SET)
790 { 795 {
791 p2 = MHD__asn1_find_up (p); 796 p2 = MHD__asn1_find_up (p);
792 len2 = strtol ((const char*) p2->value, NULL, 10); 797 len2 = strtol ((const char *) p2->value, NULL, 10);
793 if (len2 == -1) 798 if (len2 == -1)
794 { 799 {
795 if (!der[counter] && !der[counter + 1]) 800 if (!der[counter] && !der[counter + 1])
@@ -819,7 +824,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
819 if (type_field (p2->type) != TYPE_CHOICE) 824 if (type_field (p2->type) != TYPE_CHOICE)
820 ris = 825 ris =
821 MHD__asn1_extract_tag_der (p2, der + counter, 826 MHD__asn1_extract_tag_der (p2, der + counter,
822 len - counter, &len2); 827 len - counter, &len2);
823 else 828 else
824 { 829 {
825 p3 = p2->down; 830 p3 = p2->down;
@@ -827,7 +832,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
827 { 832 {
828 ris = 833 ris =
829 MHD__asn1_extract_tag_der (p3, der + counter, 834 MHD__asn1_extract_tag_der (p3, der + counter,
830 len - counter, &len2); 835 len - counter,
836 &len2);
831 if (ris == ASN1_SUCCESS) 837 if (ris == ASN1_SUCCESS)
832 break; 838 break;
833 p3 = p3->right; 839 p3 = p3->right;
@@ -852,7 +858,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
852 if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT)) 858 if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
853 { 859 {
854 p2 = MHD__asn1_find_up (p); 860 p2 = MHD__asn1_find_up (p);
855 len2 = strtol ((const char*) p2->value, NULL, 10); 861 len2 = strtol ((const char *) p2->value, NULL, 10);
856 if (counter == len2) 862 if (counter == len2)
857 { 863 {
858 if (p->right) 864 if (p->right)
@@ -878,7 +884,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
878 if (counter < len) 884 if (counter < len)
879 ris = 885 ris =
880 MHD__asn1_extract_tag_der (p->down, der + counter, 886 MHD__asn1_extract_tag_der (p->down, der + counter,
881 len - counter, &len2); 887 len - counter, &len2);
882 else 888 else
883 ris = ASN1_DER_ERROR; 889 ris = ASN1_DER_ERROR;
884 if (ris == ASN1_SUCCESS) 890 if (ris == ASN1_SUCCESS)
@@ -917,14 +923,15 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
917 if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT)) 923 if ((p->type & CONST_OPTION) || (p->type & CONST_DEFAULT))
918 { 924 {
919 p2 = MHD__asn1_find_up (p); 925 p2 = MHD__asn1_find_up (p);
920 len2 = strtol ((const char*) p2->value, NULL, 10); 926 len2 = strtol ((const char *) p2->value, NULL, 10);
921 if ((len2 != -1) && (counter > len2)) 927 if ((len2 != -1) && (counter > len2))
922 ris = ASN1_TAG_ERROR; 928 ris = ASN1_TAG_ERROR;
923 } 929 }
924 930
925 if (ris == ASN1_SUCCESS) 931 if (ris == ASN1_SUCCESS)
926 ris = 932 ris =
927 MHD__asn1_extract_tag_der (p, der + counter, len - counter, &len2); 933 MHD__asn1_extract_tag_der (p, der + counter, len - counter,
934 &len2);
928 if (ris != ASN1_SUCCESS) 935 if (ris != ASN1_SUCCESS)
929 { 936 {
930 if (p->type & CONST_OPTION) 937 if (p->type & CONST_OPTION)
@@ -940,7 +947,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
940 else 947 else
941 { 948 {
942 if (errorDescription != NULL) 949 if (errorDescription != NULL)
943 MHD__asn1_error_description_tag_error (p, errorDescription); 950 MHD__asn1_error_description_tag_error (p,
951 errorDescription);
944 952
945 MHD__asn1_delete_structure (element); 953 MHD__asn1_delete_structure (element);
946 return ASN1_TAG_ERROR; 954 return ASN1_TAG_ERROR;
@@ -978,7 +986,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
978 case TYPE_INTEGER: 986 case TYPE_INTEGER:
979 case TYPE_ENUMERATED: 987 case TYPE_ENUMERATED:
980 len2 = 988 len2 =
981 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 989 MHD__asn1_get_length_der (der + counter, len - counter,
990 &len3);
982 if (len2 < 0) 991 if (len2 < 0)
983 return ASN1_DER_ERROR; 992 return ASN1_DER_ERROR;
984 if (len2 + len3 > len - counter) 993 if (len2 + len3 > len - counter)
@@ -989,7 +998,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
989 break; 998 break;
990 case TYPE_OBJECT_ID: 999 case TYPE_OBJECT_ID:
991 MHD__asn1_get_objectid_der (der + counter, len - counter, &len2, 1000 MHD__asn1_get_objectid_der (der + counter, len - counter, &len2,
992 temp, sizeof (temp)); 1001 temp, sizeof (temp));
993 tlen = strlen (temp); 1002 tlen = strlen (temp);
994 if (tlen > 0) 1003 if (tlen > 0)
995 MHD__asn1_set_value (p, temp, tlen + 1); 1004 MHD__asn1_set_value (p, temp, tlen + 1);
@@ -998,8 +1007,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
998 break; 1007 break;
999 case TYPE_TIME: 1008 case TYPE_TIME:
1000 result = 1009 result =
1001 MHD__asn1_get_time_der (der + counter, len - counter, &len2, temp, 1010 MHD__asn1_get_time_der (der + counter, len - counter, &len2,
1002 sizeof (temp) - 1); 1011 temp, sizeof (temp) - 1);
1003 if (result != ASN1_SUCCESS) 1012 if (result != ASN1_SUCCESS)
1004 { 1013 {
1005 MHD__asn1_delete_structure (element); 1014 MHD__asn1_delete_structure (element);
@@ -1021,7 +1030,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1021 break; 1030 break;
1022 case TYPE_GENERALSTRING: 1031 case TYPE_GENERALSTRING:
1023 len2 = 1032 len2 =
1024 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1033 MHD__asn1_get_length_der (der + counter, len - counter,
1034 &len3);
1025 if (len2 < 0) 1035 if (len2 < 0)
1026 return ASN1_DER_ERROR; 1036 return ASN1_DER_ERROR;
1027 if (len3 + len2 > len - counter) 1037 if (len3 + len2 > len - counter)
@@ -1032,7 +1042,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1032 break; 1042 break;
1033 case TYPE_BIT_STRING: 1043 case TYPE_BIT_STRING:
1034 len2 = 1044 len2 =
1035 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1045 MHD__asn1_get_length_der (der + counter, len - counter,
1046 &len3);
1036 if (len2 < 0) 1047 if (len2 < 0)
1037 return ASN1_DER_ERROR; 1048 return ASN1_DER_ERROR;
1038 if (len3 + len2 > len - counter) 1049 if (len3 + len2 > len - counter)
@@ -1045,7 +1056,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1045 case TYPE_SET: 1056 case TYPE_SET:
1046 if (move == UP) 1057 if (move == UP)
1047 { 1058 {
1048 len2 = strtol ( (const char*) p->value, NULL, 10); 1059 len2 = strtol ((const char *) p->value, NULL, 10);
1049 MHD__asn1_set_value (p, NULL, 0); 1060 MHD__asn1_set_value (p, NULL, 0);
1050 if (len2 == -1) 1061 if (len2 == -1)
1051 { /* indefinite length method */ 1062 { /* indefinite length method */
@@ -1074,7 +1085,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1074 else 1085 else
1075 { /* move==DOWN || move==RIGHT */ 1086 { /* move==DOWN || move==RIGHT */
1076 len3 = 1087 len3 =
1077 MHD__asn1_get_length_der (der + counter, len - counter, &len2); 1088 MHD__asn1_get_length_der (der + counter, len - counter,
1089 &len2);
1078 if (len3 < -1) 1090 if (len3 < -1)
1079 return ASN1_DER_ERROR; 1091 return ASN1_DER_ERROR;
1080 counter += len2; 1092 counter += len2;
@@ -1113,7 +1125,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1113 case TYPE_SET_OF: 1125 case TYPE_SET_OF:
1114 if (move == UP) 1126 if (move == UP)
1115 { 1127 {
1116 len2 = strtol ( (const char*) p->value, NULL, 10); 1128 len2 = strtol ((const char *) p->value, NULL, 10);
1117 if (len2 == -1) 1129 if (len2 == -1)
1118 { /* indefinite length method */ 1130 { /* indefinite length method */
1119 if ((counter + 2) > len) 1131 if ((counter + 2) > len)
@@ -1152,7 +1164,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1152 else 1164 else
1153 { /* move==DOWN || move==RIGHT */ 1165 { /* move==DOWN || move==RIGHT */
1154 len3 = 1166 len3 =
1155 MHD__asn1_get_length_der (der + counter, len - counter, &len2); 1167 MHD__asn1_get_length_der (der + counter, len - counter,
1168 &len2);
1156 if (len3 < -1) 1169 if (len3 < -1)
1157 return ASN1_DER_ERROR; 1170 return ASN1_DER_ERROR;
1158 counter += len2; 1171 counter += len2;
@@ -1190,7 +1203,7 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1190 return ASN1_DER_ERROR; 1203 return ASN1_DER_ERROR;
1191 len4 = 1204 len4 =
1192 MHD__asn1_get_length_der (der + counter + len2, 1205 MHD__asn1_get_length_der (der + counter + len2,
1193 len - counter - len2, &len3); 1206 len - counter - len2, &len3);
1194 if (len4 < -1) 1207 if (len4 < -1)
1195 return ASN1_DER_ERROR; 1208 return ASN1_DER_ERROR;
1196 if (len4 > len - counter + len2 + len3) 1209 if (len4 > len - counter + len2 + len3)
@@ -1199,14 +1212,16 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1199 { 1212 {
1200 len2 += len4; 1213 len2 += len4;
1201 MHD__asn1_length_der (len2 + len3, NULL, &len4); 1214 MHD__asn1_length_der (len2 + len3, NULL, &len4);
1202 temp2 = (unsigned char *) MHD__asn1_alloca (len2 + len3 + len4); 1215 temp2 =
1216 (unsigned char *) MHD__asn1_alloca (len2 + len3 + len4);
1203 if (temp2 == NULL) 1217 if (temp2 == NULL)
1204 { 1218 {
1205 MHD__asn1_delete_structure (element); 1219 MHD__asn1_delete_structure (element);
1206 return ASN1_MEM_ALLOC_ERROR; 1220 return ASN1_MEM_ALLOC_ERROR;
1207 } 1221 }
1208 1222
1209 MHD__asn1_octet_der (der + counter, len2 + len3, temp2, &len4); 1223 MHD__asn1_octet_der (der + counter, len2 + len3, temp2,
1224 &len4);
1210 MHD__asn1_set_value (p, temp2, len4); 1225 MHD__asn1_set_value (p, temp2, len4);
1211 MHD__asn1_afree (temp2); 1226 MHD__asn1_afree (temp2);
1212 counter += len2 + len3; 1227 counter += len2 + len3;
@@ -1221,7 +1236,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1221 1236
1222 len2 = len - counter; 1237 len2 = len - counter;
1223 ris = 1238 ris =
1224 MHD__asn1_get_indefinite_length_string (der + counter, &len2); 1239 MHD__asn1_get_indefinite_length_string (der + counter,
1240 &len2);
1225 if (ris != ASN1_SUCCESS) 1241 if (ris != ASN1_SUCCESS)
1226 { 1242 {
1227 MHD__asn1_delete_structure (element); 1243 MHD__asn1_delete_structure (element);
@@ -1328,7 +1344,8 @@ MHD__asn1_der_decoding (ASN1_TYPE * element, const void *ider, int len,
1328 **/ 1344 **/
1329MHD__asn1_retCode 1345MHD__asn1_retCode
1330MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len, 1346MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1331 const char *name_element, int *start, int *end) 1347 const char *name_element, int *start,
1348 int *end)
1332{ 1349{
1333 node_asn *node, *node_to_find, *p, *p2, *p3; 1350 node_asn *node, *node_to_find, *p, *p2, *p3;
1334 int counter, len2, len3, len4, move, ris; 1351 int counter, len2, len3, len4, move, ris;
@@ -1369,7 +1386,7 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1369 if (p->type & CONST_SET) 1386 if (p->type & CONST_SET)
1370 { 1387 {
1371 p2 = MHD__asn1_find_up (p); 1388 p2 = MHD__asn1_find_up (p);
1372 len2 = strtol ( (const char* ) p2->value, NULL, 10); 1389 len2 = strtol ((const char *) p2->value, NULL, 10);
1373 if (len2 == -1) 1390 if (len2 == -1)
1374 { 1391 {
1375 if (!der[counter] && !der[counter + 1]) 1392 if (!der[counter] && !der[counter + 1])
@@ -1396,13 +1413,13 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1396 if (type_field (p2->type) != TYPE_CHOICE) 1413 if (type_field (p2->type) != TYPE_CHOICE)
1397 ris = 1414 ris =
1398 MHD__asn1_extract_tag_der (p2, der + counter, 1415 MHD__asn1_extract_tag_der (p2, der + counter,
1399 len - counter, &len2); 1416 len - counter, &len2);
1400 else 1417 else
1401 { 1418 {
1402 p3 = p2->down; 1419 p3 = p2->down;
1403 ris = 1420 ris =
1404 MHD__asn1_extract_tag_der (p3, der + counter, 1421 MHD__asn1_extract_tag_der (p3, der + counter,
1405 len - counter, &len2); 1422 len - counter, &len2);
1406 } 1423 }
1407 if (ris == ASN1_SUCCESS) 1424 if (ris == ASN1_SUCCESS)
1408 { 1425 {
@@ -1425,14 +1442,15 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1425 p = p->down; 1442 p = p->down;
1426 ris = 1443 ris =
1427 MHD__asn1_extract_tag_der (p, der + counter, len - counter, 1444 MHD__asn1_extract_tag_der (p, der + counter, len - counter,
1428 &len2); 1445 &len2);
1429 if (p == node_to_find) 1446 if (p == node_to_find)
1430 *start = counter; 1447 *start = counter;
1431 } 1448 }
1432 1449
1433 if (ris == ASN1_SUCCESS) 1450 if (ris == ASN1_SUCCESS)
1434 ris = 1451 ris =
1435 MHD__asn1_extract_tag_der (p, der + counter, len - counter, &len2); 1452 MHD__asn1_extract_tag_der (p, der + counter, len - counter,
1453 &len2);
1436 if (ris != ASN1_SUCCESS) 1454 if (ris != ASN1_SUCCESS)
1437 { 1455 {
1438 if (p->type & CONST_OPTION) 1456 if (p->type & CONST_OPTION)
@@ -1472,7 +1490,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1472 case TYPE_INTEGER: 1490 case TYPE_INTEGER:
1473 case TYPE_ENUMERATED: 1491 case TYPE_ENUMERATED:
1474 len2 = 1492 len2 =
1475 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1493 MHD__asn1_get_length_der (der + counter, len - counter,
1494 &len3);
1476 if (len2 < 0) 1495 if (len2 < 0)
1477 return ASN1_DER_ERROR; 1496 return ASN1_DER_ERROR;
1478 counter += len3 + len2; 1497 counter += len3 + len2;
@@ -1480,7 +1499,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1480 break; 1499 break;
1481 case TYPE_OBJECT_ID: 1500 case TYPE_OBJECT_ID:
1482 len2 = 1501 len2 =
1483 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1502 MHD__asn1_get_length_der (der + counter, len - counter,
1503 &len3);
1484 if (len2 < 0) 1504 if (len2 < 0)
1485 return ASN1_DER_ERROR; 1505 return ASN1_DER_ERROR;
1486 counter += len2 + len3; 1506 counter += len2 + len3;
@@ -1488,7 +1508,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1488 break; 1508 break;
1489 case TYPE_TIME: 1509 case TYPE_TIME:
1490 len2 = 1510 len2 =
1491 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1511 MHD__asn1_get_length_der (der + counter, len - counter,
1512 &len3);
1492 if (len2 < 0) 1513 if (len2 < 0)
1493 return ASN1_DER_ERROR; 1514 return ASN1_DER_ERROR;
1494 counter += len2 + len3; 1515 counter += len2 + len3;
@@ -1504,7 +1525,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1504 break; 1525 break;
1505 case TYPE_GENERALSTRING: 1526 case TYPE_GENERALSTRING:
1506 len2 = 1527 len2 =
1507 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1528 MHD__asn1_get_length_der (der + counter, len - counter,
1529 &len3);
1508 if (len2 < 0) 1530 if (len2 < 0)
1509 return ASN1_DER_ERROR; 1531 return ASN1_DER_ERROR;
1510 counter += len3 + len2; 1532 counter += len3 + len2;
@@ -1512,7 +1534,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1512 break; 1534 break;
1513 case TYPE_BIT_STRING: 1535 case TYPE_BIT_STRING:
1514 len2 = 1536 len2 =
1515 MHD__asn1_get_length_der (der + counter, len - counter, &len3); 1537 MHD__asn1_get_length_der (der + counter, len - counter,
1538 &len3);
1516 if (len2 < 0) 1539 if (len2 < 0)
1517 return ASN1_DER_ERROR; 1540 return ASN1_DER_ERROR;
1518 counter += len3 + len2; 1541 counter += len3 + len2;
@@ -1523,7 +1546,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1523 if (move != UP) 1546 if (move != UP)
1524 { 1547 {
1525 len3 = 1548 len3 =
1526 MHD__asn1_get_length_der (der + counter, len - counter, &len2); 1549 MHD__asn1_get_length_der (der + counter, len - counter,
1550 &len2);
1527 if (len3 < -1) 1551 if (len3 < -1)
1528 return ASN1_DER_ERROR; 1552 return ASN1_DER_ERROR;
1529 counter += len2; 1553 counter += len2;
@@ -1544,7 +1568,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1544 if (move != UP) 1568 if (move != UP)
1545 { 1569 {
1546 len3 = 1570 len3 =
1547 MHD__asn1_get_length_der (der + counter, len - counter, &len2); 1571 MHD__asn1_get_length_der (der + counter, len - counter,
1572 &len2);
1548 if (len3 < -1) 1573 if (len3 < -1)
1549 return ASN1_DER_ERROR; 1574 return ASN1_DER_ERROR;
1550 counter += len2; 1575 counter += len2;
@@ -1576,7 +1601,7 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1576 1601
1577 len4 = 1602 len4 =
1578 MHD__asn1_get_length_der (der + counter + len2, 1603 MHD__asn1_get_length_der (der + counter + len2,
1579 len - counter - len2, &len3); 1604 len - counter - len2, &len3);
1580 if (len4 < -1) 1605 if (len4 < -1)
1581 return ASN1_DER_ERROR; 1606 return ASN1_DER_ERROR;
1582 1607
@@ -1594,7 +1619,8 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1594 1619
1595 len2 = len - counter; 1620 len2 = len - counter;
1596 ris = 1621 ris =
1597 MHD__asn1_get_indefinite_length_string (der + counter, &len2); 1622 MHD__asn1_get_indefinite_length_string (der + counter,
1623 &len2);
1598 if (ris != ASN1_SUCCESS) 1624 if (ris != ASN1_SUCCESS)
1599 return ris; 1625 return ris;
1600 counter += len2; 1626 counter += len2;
@@ -1646,5 +1672,3 @@ MHD__asn1_der_decoding_startEnd (ASN1_TYPE element, const void *ider, int len,
1646 1672
1647 return ASN1_ELEMENT_NOT_FOUND; 1673 return ASN1_ELEMENT_NOT_FOUND;
1648} 1674}
1649
1650