xref: /freebsd/crypto/openssl/crypto/asn1/evp_asn1.c (revision e71b7053)
1e71b7053SJung-uk Kim /*
2e71b7053SJung-uk Kim  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
374664626SKris Kennaway  *
4e71b7053SJung-uk Kim  * Licensed under the OpenSSL license (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
874664626SKris Kennaway  */
974664626SKris Kennaway 
1074664626SKris Kennaway #include <stdio.h>
11e71b7053SJung-uk Kim #include "internal/cryptlib.h"
1274664626SKris Kennaway #include <openssl/asn1.h>
13e71b7053SJung-uk Kim #include <openssl/asn1t.h>
1474664626SKris Kennaway 
1574664626SKris Kennaway int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len)
1674664626SKris Kennaway {
1774664626SKris Kennaway     ASN1_STRING *os;
1874664626SKris Kennaway 
19e71b7053SJung-uk Kim     if ((os = ASN1_OCTET_STRING_new()) == NULL)
20e71b7053SJung-uk Kim         return 0;
21e71b7053SJung-uk Kim     if (!ASN1_OCTET_STRING_set(os, data, len)) {
22e71b7053SJung-uk Kim         ASN1_OCTET_STRING_free(os);
23a93cbc2bSJung-uk Kim         return 0;
24a93cbc2bSJung-uk Kim     }
2574664626SKris Kennaway     ASN1_TYPE_set(a, V_ASN1_OCTET_STRING, os);
26e71b7053SJung-uk Kim     return 1;
2774664626SKris Kennaway }
2874664626SKris Kennaway 
2974664626SKris Kennaway /* int max_len:  for returned value    */
30e71b7053SJung-uk Kim int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len)
3174664626SKris Kennaway {
3274664626SKris Kennaway     int ret, num;
33e71b7053SJung-uk Kim     const unsigned char *p;
3474664626SKris Kennaway 
356f9291ceSJung-uk Kim     if ((a->type != V_ASN1_OCTET_STRING) || (a->value.octet_string == NULL)) {
3674664626SKris Kennaway         ASN1err(ASN1_F_ASN1_TYPE_GET_OCTETSTRING, ASN1_R_DATA_IS_WRONG);
37e71b7053SJung-uk Kim         return -1;
3874664626SKris Kennaway     }
39e71b7053SJung-uk Kim     p = ASN1_STRING_get0_data(a->value.octet_string);
40e71b7053SJung-uk Kim     ret = ASN1_STRING_length(a->value.octet_string);
4174664626SKris Kennaway     if (ret < max_len)
4274664626SKris Kennaway         num = ret;
4374664626SKris Kennaway     else
4474664626SKris Kennaway         num = max_len;
4574664626SKris Kennaway     memcpy(data, p, num);
46e71b7053SJung-uk Kim     return ret;
4774664626SKris Kennaway }
4874664626SKris Kennaway 
49e71b7053SJung-uk Kim typedef struct {
50e71b7053SJung-uk Kim     int32_t num;
51e71b7053SJung-uk Kim     ASN1_OCTET_STRING *oct;
52e71b7053SJung-uk Kim } asn1_int_oct;
53e71b7053SJung-uk Kim 
54e71b7053SJung-uk Kim ASN1_SEQUENCE(asn1_int_oct) = {
55e71b7053SJung-uk Kim         ASN1_EMBED(asn1_int_oct, num, INT32),
56e71b7053SJung-uk Kim         ASN1_SIMPLE(asn1_int_oct, oct, ASN1_OCTET_STRING)
57e71b7053SJung-uk Kim } static_ASN1_SEQUENCE_END(asn1_int_oct)
58e71b7053SJung-uk Kim 
59e71b7053SJung-uk Kim DECLARE_ASN1_ITEM(asn1_int_oct)
60e71b7053SJung-uk Kim 
6174664626SKris Kennaway int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data,
6274664626SKris Kennaway                                   int len)
6374664626SKris Kennaway {
64e71b7053SJung-uk Kim     asn1_int_oct atmp;
65e71b7053SJung-uk Kim     ASN1_OCTET_STRING oct;
6674664626SKris Kennaway 
67e71b7053SJung-uk Kim     atmp.num = num;
68e71b7053SJung-uk Kim     atmp.oct = &oct;
69e71b7053SJung-uk Kim     oct.data = data;
70e71b7053SJung-uk Kim     oct.type = V_ASN1_OCTET_STRING;
71e71b7053SJung-uk Kim     oct.length = len;
72e71b7053SJung-uk Kim     oct.flags = 0;
7374664626SKris Kennaway 
74e71b7053SJung-uk Kim     if (ASN1_TYPE_pack_sequence(ASN1_ITEM_rptr(asn1_int_oct), &atmp, &a))
75e71b7053SJung-uk Kim         return 1;
76e71b7053SJung-uk Kim     return 0;
7774664626SKris Kennaway }
7874664626SKris Kennaway 
796f9291ceSJung-uk Kim /*
80e71b7053SJung-uk Kim  * we return the actual length...
816f9291ceSJung-uk Kim  */
8274664626SKris Kennaway /* int max_len:  for returned value    */
83e71b7053SJung-uk Kim int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num,
846f9291ceSJung-uk Kim                                   unsigned char *data, int max_len)
8574664626SKris Kennaway {
86e71b7053SJung-uk Kim     asn1_int_oct *atmp = NULL;
8774664626SKris Kennaway     int ret = -1, n;
8874664626SKris Kennaway 
896f9291ceSJung-uk Kim     if ((a->type != V_ASN1_SEQUENCE) || (a->value.sequence == NULL)) {
9074664626SKris Kennaway         goto err;
9174664626SKris Kennaway     }
9274664626SKris Kennaway 
93e71b7053SJung-uk Kim     atmp = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(asn1_int_oct), a);
9474664626SKris Kennaway 
95e71b7053SJung-uk Kim     if (atmp == NULL)
966f9291ceSJung-uk Kim         goto err;
9774664626SKris Kennaway 
9874664626SKris Kennaway     if (num != NULL)
99e71b7053SJung-uk Kim         *num = atmp->num;
10074664626SKris Kennaway 
101e71b7053SJung-uk Kim     ret = ASN1_STRING_length(atmp->oct);
10274664626SKris Kennaway     if (max_len > ret)
10374664626SKris Kennaway         n = ret;
10474664626SKris Kennaway     else
10574664626SKris Kennaway         n = max_len;
10674664626SKris Kennaway 
10774664626SKris Kennaway     if (data != NULL)
108e71b7053SJung-uk Kim         memcpy(data, ASN1_STRING_get0_data(atmp->oct), n);
109e71b7053SJung-uk Kim     if (ret == -1) {
11074664626SKris Kennaway  err:
11174664626SKris Kennaway         ASN1err(ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING, ASN1_R_DATA_IS_WRONG);
11274664626SKris Kennaway     }
113e71b7053SJung-uk Kim     M_ASN1_free_of(atmp, asn1_int_oct);
114e71b7053SJung-uk Kim     return ret;
11574664626SKris Kennaway }
116