Coverage Report

Created: 2024-05-20 06:38

/src/boringssl/crypto/dh_extra/dh_asn1.c
Line
Count
Source (jump to first uncovered line)
1
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
2
 * project 2000.
3
 */
4
/* ====================================================================
5
 * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 *
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 *
14
 * 2. Redistributions in binary form must reproduce the above copyright
15
 *    notice, this list of conditions and the following disclaimer in
16
 *    the documentation and/or other materials provided with the
17
 *    distribution.
18
 *
19
 * 3. All advertising materials mentioning features or use of this
20
 *    software must display the following acknowledgment:
21
 *    "This product includes software developed by the OpenSSL Project
22
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23
 *
24
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25
 *    endorse or promote products derived from this software without
26
 *    prior written permission. For written permission, please contact
27
 *    licensing@OpenSSL.org.
28
 *
29
 * 5. Products derived from this software may not be called "OpenSSL"
30
 *    nor may "OpenSSL" appear in their names without prior written
31
 *    permission of the OpenSSL Project.
32
 *
33
 * 6. Redistributions of any form whatsoever must retain the following
34
 *    acknowledgment:
35
 *    "This product includes software developed by the OpenSSL Project
36
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37
 *
38
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
42
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49
 * OF THE POSSIBILITY OF SUCH DAMAGE.
50
 * ====================================================================
51
 *
52
 * This product includes cryptographic software written by Eric Young
53
 * (eay@cryptsoft.com).  This product includes software written by Tim
54
 * Hudson (tjh@cryptsoft.com). */
55
56
#include <openssl/dh.h>
57
58
#include <assert.h>
59
#include <limits.h>
60
61
#include <openssl/bn.h>
62
#include <openssl/bytestring.h>
63
#include <openssl/err.h>
64
65
#include "../bytestring/internal.h"
66
#include "../fipsmodule/dh/internal.h"
67
68
69
0
static int parse_integer(CBS *cbs, BIGNUM **out) {
70
0
  assert(*out == NULL);
71
0
  *out = BN_new();
72
0
  if (*out == NULL) {
73
0
    return 0;
74
0
  }
75
0
  return BN_parse_asn1_unsigned(cbs, *out);
76
0
}
77
78
0
static int marshal_integer(CBB *cbb, BIGNUM *bn) {
79
0
  if (bn == NULL) {
80
    // A DH object may be missing some components.
81
0
    OPENSSL_PUT_ERROR(DH, ERR_R_PASSED_NULL_PARAMETER);
82
0
    return 0;
83
0
  }
84
0
  return BN_marshal_asn1(cbb, bn);
85
0
}
86
87
0
DH *DH_parse_parameters(CBS *cbs) {
88
0
  DH *ret = DH_new();
89
0
  if (ret == NULL) {
90
0
    return NULL;
91
0
  }
92
93
0
  CBS child;
94
0
  if (!CBS_get_asn1(cbs, &child, CBS_ASN1_SEQUENCE) ||
95
0
      !parse_integer(&child, &ret->p) ||
96
0
      !parse_integer(&child, &ret->g)) {
97
0
    goto err;
98
0
  }
99
100
0
  uint64_t priv_length;
101
0
  if (CBS_len(&child) != 0) {
102
0
    if (!CBS_get_asn1_uint64(&child, &priv_length) ||
103
0
        priv_length > UINT_MAX) {
104
0
      goto err;
105
0
    }
106
0
    ret->priv_length = (unsigned)priv_length;
107
0
  }
108
109
0
  if (CBS_len(&child) != 0) {
110
0
    goto err;
111
0
  }
112
113
0
  if (!dh_check_params_fast(ret)) {
114
0
    goto err;
115
0
  }
116
117
0
  return ret;
118
119
0
err:
120
0
  OPENSSL_PUT_ERROR(DH, DH_R_DECODE_ERROR);
121
0
  DH_free(ret);
122
0
  return NULL;
123
0
}
124
125
0
int DH_marshal_parameters(CBB *cbb, const DH *dh) {
126
0
  CBB child;
127
0
  if (!CBB_add_asn1(cbb, &child, CBS_ASN1_SEQUENCE) ||
128
0
      !marshal_integer(&child, dh->p) ||
129
0
      !marshal_integer(&child, dh->g) ||
130
0
      (dh->priv_length != 0 &&
131
0
       !CBB_add_asn1_uint64(&child, dh->priv_length)) ||
132
0
      !CBB_flush(cbb)) {
133
0
    OPENSSL_PUT_ERROR(DH, DH_R_ENCODE_ERROR);
134
0
    return 0;
135
0
  }
136
0
  return 1;
137
0
}
138
139
0
DH *d2i_DHparams(DH **out, const uint8_t **inp, long len) {
140
0
  if (len < 0) {
141
0
    return NULL;
142
0
  }
143
0
  CBS cbs;
144
0
  CBS_init(&cbs, *inp, (size_t)len);
145
0
  DH *ret = DH_parse_parameters(&cbs);
146
0
  if (ret == NULL) {
147
0
    return NULL;
148
0
  }
149
0
  if (out != NULL) {
150
0
    DH_free(*out);
151
0
    *out = ret;
152
0
  }
153
0
  *inp = CBS_data(&cbs);
154
0
  return ret;
155
0
}
156
157
0
int i2d_DHparams(const DH *in, uint8_t **outp) {
158
0
  CBB cbb;
159
0
  if (!CBB_init(&cbb, 0) ||
160
0
      !DH_marshal_parameters(&cbb, in)) {
161
0
    CBB_cleanup(&cbb);
162
0
    return -1;
163
0
  }
164
0
  return CBB_finish_i2d(&cbb, outp);
165
0
}