• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #include <stdio.h>
11 #include "internal/cryptlib.h"
12 #include <openssl/asn1.h>
13 #include <openssl/asn1t.h>
14 
ASN1_TYPE_set_octetstring(ASN1_TYPE * a,unsigned char * data,int len)15 int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len)
16 {
17     ASN1_STRING *os;
18 
19     if ((os = ASN1_OCTET_STRING_new()) == NULL)
20         return 0;
21     if (!ASN1_OCTET_STRING_set(os, data, len)) {
22         ASN1_OCTET_STRING_free(os);
23         return 0;
24     }
25     ASN1_TYPE_set(a, V_ASN1_OCTET_STRING, os);
26     return 1;
27 }
28 
29 /* int max_len:  for returned value    */
ASN1_TYPE_get_octetstring(const ASN1_TYPE * a,unsigned char * data,int max_len)30 int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len)
31 {
32     int ret, num;
33     const unsigned char *p;
34 
35     if ((a->type != V_ASN1_OCTET_STRING) || (a->value.octet_string == NULL)) {
36         ASN1err(ASN1_F_ASN1_TYPE_GET_OCTETSTRING, ASN1_R_DATA_IS_WRONG);
37         return -1;
38     }
39     p = ASN1_STRING_get0_data(a->value.octet_string);
40     ret = ASN1_STRING_length(a->value.octet_string);
41     if (ret < max_len)
42         num = ret;
43     else
44         num = max_len;
45     memcpy(data, p, num);
46     return ret;
47 }
48 
49 typedef struct {
50     int32_t num;
51     ASN1_OCTET_STRING *oct;
52 } asn1_int_oct;
53 
54 ASN1_SEQUENCE(asn1_int_oct) = {
55         ASN1_EMBED(asn1_int_oct, num, INT32),
56         ASN1_SIMPLE(asn1_int_oct, oct, ASN1_OCTET_STRING)
57 } static_ASN1_SEQUENCE_END(asn1_int_oct)
58 
59 DECLARE_ASN1_ITEM(asn1_int_oct)
60 
61 int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data,
62                                   int len)
63 {
64     asn1_int_oct atmp;
65     ASN1_OCTET_STRING oct;
66 
67     atmp.num = num;
68     atmp.oct = &oct;
69     oct.data = data;
70     oct.type = V_ASN1_OCTET_STRING;
71     oct.length = len;
72     oct.flags = 0;
73 
74     if (ASN1_TYPE_pack_sequence(ASN1_ITEM_rptr(asn1_int_oct), &atmp, &a))
75         return 1;
76     return 0;
77 }
78 
79 /*
80  * we return the actual length...
81  */
82 /* int max_len:  for returned value    */
ASN1_TYPE_get_int_octetstring(const ASN1_TYPE * a,long * num,unsigned char * data,int max_len)83 int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num,
84                                   unsigned char *data, int max_len)
85 {
86     asn1_int_oct *atmp = NULL;
87     int ret = -1, n;
88 
89     if ((a->type != V_ASN1_SEQUENCE) || (a->value.sequence == NULL)) {
90         goto err;
91     }
92 
93     atmp = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(asn1_int_oct), a);
94 
95     if (atmp == NULL)
96         goto err;
97 
98     if (num != NULL)
99         *num = atmp->num;
100 
101     ret = ASN1_STRING_length(atmp->oct);
102     if (max_len > ret)
103         n = ret;
104     else
105         n = max_len;
106 
107     if (data != NULL)
108         memcpy(data, ASN1_STRING_get0_data(atmp->oct), n);
109     if (ret == -1) {
110  err:
111         ASN1err(ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING, ASN1_R_DATA_IS_WRONG);
112     }
113     M_ASN1_free_of(atmp, asn1_int_oct);
114     return ret;
115 }
116