Merge pull request #239 from libtom/pr/asn1-small-fixes
ASN.1 changes extracted from ECC stuff
This commit is contained in:
		
						commit
						ebc9d2943b
					
				| @ -563,6 +563,8 @@ int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, | |||||||
| 
 | 
 | ||||||
| #ifdef LTC_SOURCE | #ifdef LTC_SOURCE | ||||||
| /* internal helper functions */ | /* internal helper functions */ | ||||||
|  | int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | ||||||
|  |                            unsigned long *outlen, unsigned long *payloadlen); | ||||||
| /* SUBJECT PUBLIC KEY INFO */ | /* SUBJECT PUBLIC KEY INFO */ | ||||||
| int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen, | int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen, | ||||||
|         unsigned int algorithm, void* public_key, unsigned long public_key_len, |         unsigned int algorithm, void* public_key, unsigned long public_key_len, | ||||||
|  | |||||||
| @ -98,6 +98,7 @@ int der_decode_sequence_ex(const unsigned char *in, unsigned long  inlen, | |||||||
|            case LTC_ASN1_BOOLEAN: |            case LTC_ASN1_BOOLEAN: | ||||||
|                z = inlen; |                z = inlen; | ||||||
|                if ((err = der_decode_boolean(in + x, z, ((int *)data))) != CRYPT_OK) { |                if ((err = der_decode_boolean(in + x, z, ((int *)data))) != CRYPT_OK) { | ||||||
|  |                    if (!ordered) { continue; } | ||||||
|                    goto LBL_ERR; |                    goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                if ((err = der_length_boolean(&z)) != CRYPT_OK) { |                if ((err = der_length_boolean(&z)) != CRYPT_OK) { | ||||||
|  | |||||||
| @ -38,135 +38,8 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|    LTC_ARGCHK(outlen  != NULL); |    LTC_ARGCHK(outlen  != NULL); | ||||||
| 
 | 
 | ||||||
|    /* get size of output that will be required */ |    /* get size of output that will be required */ | ||||||
|    y = 0; |    y = 0; z = 0; | ||||||
|    for (i = 0; i < inlen; i++) { |    if ((err = der_length_sequence_ex(list, inlen, &y, &z)) != CRYPT_OK) return CRYPT_INVALID_ARG; | ||||||
|        type = list[i].type; |  | ||||||
|        size = list[i].size; |  | ||||||
|        data = list[i].data; |  | ||||||
| 
 |  | ||||||
|        if (type == LTC_ASN1_EOL) { |  | ||||||
|           break; |  | ||||||
|        } |  | ||||||
| 
 |  | ||||||
|        switch (type) { |  | ||||||
|             case LTC_ASN1_BOOLEAN: |  | ||||||
|                if ((err = der_length_boolean(&x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_INTEGER: |  | ||||||
|                if ((err = der_length_integer(data, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_SHORT_INTEGER: |  | ||||||
|                if ((err = der_length_short_integer(*((unsigned long*)data), &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_BIT_STRING: |  | ||||||
|            case LTC_ASN1_RAW_BIT_STRING: |  | ||||||
|                if ((err = der_length_bit_string(size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_OCTET_STRING: |  | ||||||
|                if ((err = der_length_octet_string(size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_NULL: |  | ||||||
|                y += 2; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_OBJECT_IDENTIFIER: |  | ||||||
|                if ((err = der_length_object_identifier(data, size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_IA5_STRING: |  | ||||||
|                if ((err = der_length_ia5_string(data, size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_PRINTABLE_STRING: |  | ||||||
|                if ((err = der_length_printable_string(data, size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_UTF8_STRING: |  | ||||||
|                if ((err = der_length_utf8_string(data, size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_UTCTIME: |  | ||||||
|                if ((err = der_length_utctime(data, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_GENERALIZEDTIME: |  | ||||||
|                if ((err = der_length_generalizedtime(data, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_SET: |  | ||||||
|            case LTC_ASN1_SETOF: |  | ||||||
|            case LTC_ASN1_SEQUENCE: |  | ||||||
|                if ((err = der_length_sequence(data, size, &x)) != CRYPT_OK) { |  | ||||||
|                   goto LBL_ERR; |  | ||||||
|                } |  | ||||||
|                y += x; |  | ||||||
|                break; |  | ||||||
| 
 |  | ||||||
|            case LTC_ASN1_CHOICE: |  | ||||||
|            case LTC_ASN1_CONSTRUCTED: |  | ||||||
|            case LTC_ASN1_CONTEXT_SPECIFIC: |  | ||||||
|            case LTC_ASN1_EOL: |  | ||||||
|            case LTC_ASN1_TELETEX_STRING: |  | ||||||
|                err = CRYPT_INVALID_ARG; |  | ||||||
|                goto LBL_ERR; |  | ||||||
|        } |  | ||||||
|    } |  | ||||||
| 
 |  | ||||||
|    /* calc header size */ |  | ||||||
|    z = y; |  | ||||||
|    if (y < 128) { |  | ||||||
|       y += 2; |  | ||||||
|    } else if (y < 256) { |  | ||||||
|       /* 0x30 0x81 LL */ |  | ||||||
|       y += 3; |  | ||||||
|    } else if (y < 65536UL) { |  | ||||||
|       /* 0x30 0x82 LL LL */ |  | ||||||
|       y += 4; |  | ||||||
|    } else if (y < 16777216UL) { |  | ||||||
|       /* 0x30 0x83 LL LL LL */ |  | ||||||
|       y += 5; |  | ||||||
|    } else { |  | ||||||
|       err = CRYPT_INVALID_ARG; |  | ||||||
|       goto LBL_ERR; |  | ||||||
|    } |  | ||||||
| 
 | 
 | ||||||
|    /* too big ? */ |    /* too big ? */ | ||||||
|    if (*outlen < y) { |    if (*outlen < y) { | ||||||
| @ -212,8 +85,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_boolean(*((int *)data), out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_boolean(*((int *)data), out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_INTEGER: |            case LTC_ASN1_INTEGER: | ||||||
| @ -221,8 +92,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_integer(data, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_integer(data, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_SHORT_INTEGER: |            case LTC_ASN1_SHORT_INTEGER: | ||||||
| @ -230,8 +99,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_short_integer(*((unsigned long*)data), out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_short_integer(*((unsigned long*)data), out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_BIT_STRING: |            case LTC_ASN1_BIT_STRING: | ||||||
| @ -239,8 +106,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_bit_string(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_bit_string(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_RAW_BIT_STRING: |            case LTC_ASN1_RAW_BIT_STRING: | ||||||
| @ -248,8 +113,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_raw_bit_string(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_raw_bit_string(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_OCTET_STRING: |            case LTC_ASN1_OCTET_STRING: | ||||||
| @ -257,14 +120,12 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_octet_string(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_octet_string(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_NULL: |            case LTC_ASN1_NULL: | ||||||
|                out[x++] = 0x05; |                out[x] = 0x05; | ||||||
|                out[x++] = 0x00; |                out[x+1] = 0x00; | ||||||
|                *outlen -= 2; |                z = 2; | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_OBJECT_IDENTIFIER: |            case LTC_ASN1_OBJECT_IDENTIFIER: | ||||||
| @ -272,8 +133,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_object_identifier(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_object_identifier(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_IA5_STRING: |            case LTC_ASN1_IA5_STRING: | ||||||
| @ -281,8 +140,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_ia5_string(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_ia5_string(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_PRINTABLE_STRING: |            case LTC_ASN1_PRINTABLE_STRING: | ||||||
| @ -290,8 +147,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_printable_string(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_printable_string(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_UTF8_STRING: |            case LTC_ASN1_UTF8_STRING: | ||||||
| @ -299,8 +154,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_utf8_string(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_utf8_string(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_UTCTIME: |            case LTC_ASN1_UTCTIME: | ||||||
| @ -308,8 +161,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_utctime(data, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_utctime(data, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_GENERALIZEDTIME: |            case LTC_ASN1_GENERALIZEDTIME: | ||||||
| @ -317,8 +168,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_generalizedtime(data, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_generalizedtime(data, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_SET: |            case LTC_ASN1_SET: | ||||||
| @ -326,8 +175,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_set(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_set(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_SETOF: |            case LTC_ASN1_SETOF: | ||||||
| @ -335,8 +182,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_setof(data, size, out + x, &z)) != CRYPT_OK) { |                if ((err = der_encode_setof(data, size, out + x, &z)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_SEQUENCE: |            case LTC_ASN1_SEQUENCE: | ||||||
| @ -344,8 +189,6 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                if ((err = der_encode_sequence_ex(data, size, out + x, &z, type)) != CRYPT_OK) { |                if ((err = der_encode_sequence_ex(data, size, out + x, &z, type)) != CRYPT_OK) { | ||||||
|                   goto LBL_ERR; |                   goto LBL_ERR; | ||||||
|                } |                } | ||||||
|                x       += z; |  | ||||||
|                *outlen -= z; |  | ||||||
|                break; |                break; | ||||||
| 
 | 
 | ||||||
|            case LTC_ASN1_CHOICE: |            case LTC_ASN1_CHOICE: | ||||||
| @ -356,6 +199,9 @@ int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |||||||
|                err = CRYPT_INVALID_ARG; |                err = CRYPT_INVALID_ARG; | ||||||
|                goto LBL_ERR; |                goto LBL_ERR; | ||||||
|        } |        } | ||||||
|  | 
 | ||||||
|  |        x       += z; | ||||||
|  |        *outlen -= z; | ||||||
|    } |    } | ||||||
|    *outlen = x; |    *outlen = x; | ||||||
|    err = CRYPT_OK; |    err = CRYPT_OK; | ||||||
|  | |||||||
| @ -24,10 +24,16 @@ | |||||||
| */ | */ | ||||||
| int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, | int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, | ||||||
|                         unsigned long *outlen) |                         unsigned long *outlen) | ||||||
|  | { | ||||||
|  |    return der_length_sequence_ex(list, inlen, outlen, NULL); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | ||||||
|  |                            unsigned long *outlen, unsigned long *payloadlen) | ||||||
| { | { | ||||||
|    int           err; |    int           err; | ||||||
|    ltc_asn1_type type; |    ltc_asn1_type type; | ||||||
|    unsigned long size, x, y, i; |    unsigned long size, x, y, i, z; | ||||||
|    void          *data; |    void          *data; | ||||||
| 
 | 
 | ||||||
|    LTC_ARGCHK(list    != NULL); |    LTC_ARGCHK(list    != NULL); | ||||||
| @ -154,6 +160,7 @@ int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, | |||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    /* calc header size */ |    /* calc header size */ | ||||||
|  |    z = y; | ||||||
|    if (y < 128) { |    if (y < 128) { | ||||||
|       y += 2; |       y += 2; | ||||||
|    } else if (y < 256) { |    } else if (y < 256) { | ||||||
| @ -171,6 +178,7 @@ int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, | |||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    /* store size */ |    /* store size */ | ||||||
|  |    if (payloadlen) *payloadlen = z; | ||||||
|    *outlen = y; |    *outlen = y; | ||||||
|    err     = CRYPT_OK; |    err     = CRYPT_OK; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user