Coverage Report

Created: 2022-08-24 06:31

/src/libressl/crypto/asn1/x_bignum.c
Line
Count
Source (jump to first uncovered line)
1
/* $OpenBSD: x_bignum.c,v 1.12 2022/07/30 13:42:25 jsing Exp $ */
2
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3
 * project 2000.
4
 */
5
/* ====================================================================
6
 * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 *
12
 * 1. Redistributions of source code must retain the above copyright
13
 *    notice, this list of conditions and the following disclaimer.
14
 *
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in
17
 *    the documentation and/or other materials provided with the
18
 *    distribution.
19
 *
20
 * 3. All advertising materials mentioning features or use of this
21
 *    software must display the following acknowledgment:
22
 *    "This product includes software developed by the OpenSSL Project
23
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24
 *
25
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
 *    endorse or promote products derived from this software without
27
 *    prior written permission. For written permission, please contact
28
 *    licensing@OpenSSL.org.
29
 *
30
 * 5. Products derived from this software may not be called "OpenSSL"
31
 *    nor may "OpenSSL" appear in their names without prior written
32
 *    permission of the OpenSSL Project.
33
 *
34
 * 6. Redistributions of any form whatsoever must retain the following
35
 *    acknowledgment:
36
 *    "This product includes software developed by the OpenSSL Project
37
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38
 *
39
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
 * OF THE POSSIBILITY OF SUCH DAMAGE.
51
 * ====================================================================
52
 *
53
 * This product includes cryptographic software written by Eric Young
54
 * (eay@cryptsoft.com).  This product includes software written by Tim
55
 * Hudson (tjh@cryptsoft.com).
56
 *
57
 */
58
59
#include <stdio.h>
60
61
#include <openssl/asn1t.h>
62
#include <openssl/bn.h>
63
64
#include "asn1_locl.h"
65
#include "bytestring.h"
66
67
/*
68
 * Custom primitive type for that reads an ASN.1 INTEGER into a BIGNUM.
69
 */
70
71
static int bn_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
72
static void bn_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
73
static void bn_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
74
75
static int bn_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype,
76
    const ASN1_ITEM *it);
77
static int bn_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
78
    int utype, char *free_cont, const ASN1_ITEM *it);
79
static int bn_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it,
80
    int indent, const ASN1_PCTX *pctx);
81
82
static ASN1_PRIMITIVE_FUNCS bignum_pf = {
83
  .app_data = NULL,
84
  .flags = 0,
85
  .prim_new = bn_new,
86
  .prim_free = bn_free,
87
  .prim_clear = bn_clear,
88
  .prim_c2i = bn_c2i,
89
  .prim_i2c = bn_i2c,
90
  .prim_print = bn_print,
91
};
92
93
const ASN1_ITEM BIGNUM_it = {
94
        .itype = ASN1_ITYPE_PRIMITIVE,
95
        .utype = V_ASN1_INTEGER,
96
        .templates = NULL,
97
        .tcount = 0,
98
        .funcs = &bignum_pf,
99
        .size = 0,
100
        .sname = "BIGNUM",
101
};
102
103
const ASN1_ITEM CBIGNUM_it = {
104
        .itype = ASN1_ITYPE_PRIMITIVE,
105
        .utype = V_ASN1_INTEGER,
106
        .templates = NULL,
107
        .tcount = 0,
108
        .funcs = &bignum_pf,
109
        .size = 0,
110
        .sname = "BIGNUM",
111
};
112
113
static int
114
bn_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
115
25.7k
{
116
25.7k
  if ((*pval = (ASN1_VALUE *)BN_new()) == NULL)
117
0
    return 0;
118
119
25.7k
  return 1;
120
25.7k
}
121
122
static void
123
bn_clear(ASN1_VALUE **pval, const ASN1_ITEM *it)
124
168k
{
125
168k
  BN_free((BIGNUM *)*pval);
126
168k
  *pval = NULL;
127
168k
}
128
129
static void
130
bn_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
131
127k
{
132
127k
  if (*pval == NULL)
133
93.5k
    return;
134
135
33.5k
  bn_clear(pval, it);
136
33.5k
}
137
138
static int
139
bn_i2c(ASN1_VALUE **pval, unsigned char *content, int *putype, const ASN1_ITEM *it)
140
45.9k
{
141
45.9k
  ASN1_INTEGER *aint = NULL;
142
45.9k
  unsigned char **pp = NULL;
143
45.9k
  const BIGNUM *bn;
144
45.9k
  int ret;
145
146
45.9k
  if (*pval == NULL)
147
0
    return -1;
148
149
45.9k
  bn = (const BIGNUM *)*pval;
150
151
45.9k
  if ((aint = BN_to_ASN1_INTEGER(bn, NULL)) == NULL)
152
0
    return -1;
153
154
45.9k
  if (content != NULL)
155
12.1k
    pp = &content;
156
157
45.9k
  ret = i2c_ASN1_INTEGER(aint, pp);
158
159
45.9k
  ASN1_INTEGER_free(aint);
160
161
45.9k
  return ret;
162
45.9k
}
163
164
static int
165
bn_c2i(ASN1_VALUE **pval, const unsigned char *content, int len, int utype,
166
    char *free_content, const ASN1_ITEM *it)
167
134k
{
168
134k
  ASN1_INTEGER *aint = NULL;
169
134k
  BIGNUM *bn;
170
134k
  CBS cbs;
171
134k
  int ret = 0;
172
173
134k
  bn_clear(pval, it);
174
175
134k
  if (len < 0)
176
0
    goto err;
177
134k
  CBS_init(&cbs, content, len);
178
134k
  if (!c2i_ASN1_INTEGER_cbs(&aint, &cbs))
179
9.75k
    goto err;
180
181
124k
  if ((bn = ASN1_INTEGER_to_BN(aint, NULL)) == NULL)
182
0
    goto err;
183
124k
  *pval = (ASN1_VALUE *)bn;
184
185
124k
  ret = 1;
186
187
134k
 err:
188
134k
  ASN1_INTEGER_free(aint);
189
190
134k
  return ret;
191
124k
}
192
193
static int
194
bn_print(BIO *out, ASN1_VALUE **pval, const ASN1_ITEM *it, int indent,
195
    const ASN1_PCTX *pctx)
196
2.61k
{
197
2.61k
  const BIGNUM *bn = (BIGNUM *)*pval;
198
199
2.61k
  if (!BN_print(out, bn))
200
0
    return 0;
201
2.61k
  if (BIO_printf(out, "\n") <= 0)
202
0
    return 0;
203
204
2.61k
  return 1;
205
2.61k
}