grpc
third_party
boringssl-with-bazel
src
crypto
cipher_extra
derive_key.c
Go to the documentation of this file.
1
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2
* All rights reserved.
3
*
4
* This package is an SSL implementation written
5
* by Eric Young (eay@cryptsoft.com).
6
* The implementation was written so as to conform with Netscapes SSL.
7
*
8
* This library is free for commercial and non-commercial use as long as
9
* the following conditions are aheared to. The following conditions
10
* apply to all code found in this distribution, be it the RC4, RSA,
11
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
12
* included with this distribution is covered by the same copyright terms
13
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
14
*
15
* Copyright remains Eric Young's, and as such any Copyright notices in
16
* the code are not to be removed.
17
* If this package is used in a product, Eric Young should be given attribution
18
* as the author of the parts of the library used.
19
* This can be in the form of a textual message at program startup or
20
* in documentation (online or textual) provided with the package.
21
*
22
* Redistribution and use in source and binary forms, with or without
23
* modification, are permitted provided that the following conditions
24
* are met:
25
* 1. Redistributions of source code must retain the copyright
26
* notice, this list of conditions and the following disclaimer.
27
* 2. Redistributions in binary form must reproduce the above copyright
28
* notice, this list of conditions and the following disclaimer in the
29
* documentation and/or other materials provided with the distribution.
30
* 3. All advertising materials mentioning features or use of this software
31
* must display the following acknowledgement:
32
* "This product includes cryptographic software written by
33
* Eric Young (eay@cryptsoft.com)"
34
* The word 'cryptographic' can be left out if the rouines from the library
35
* being used are not cryptographic related :-).
36
* 4. If you include any Windows specific code (or a derivative thereof) from
37
* the apps directory (application code) you must include an acknowledgement:
38
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39
*
40
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50
* SUCH DAMAGE.
51
*
52
* The licence and distribution terms for any publically available version or
53
* derivative of this code cannot be changed. i.e. this code cannot simply be
54
* copied and put under another distribution licence
55
* [including the GNU Public Licence.] */
56
57
#include <
openssl/cipher.h
>
58
59
#include <assert.h>
60
61
#include <
openssl/digest.h
>
62
#include <
openssl/mem.h
>
63
64
65
#define PKCS5_SALT_LEN 8
66
67
int
EVP_BytesToKey
(
const
EVP_CIPHER
*
type
,
const
EVP_MD
*
md
,
68
const
uint8_t
*salt,
const
uint8_t
*
data
,
size_t
data_len,
69
unsigned
count
,
uint8_t
*
key
,
uint8_t
*iv) {
70
EVP_MD_CTX
c
;
71
uint8_t
md_buf[
EVP_MAX_MD_SIZE
];
72
unsigned
niv, nkey, addmd = 0;
73
unsigned
mds = 0,
i
;
74
int
rv = 0;
75
76
nkey =
type
->key_len;
77
niv =
type
->iv_len;
78
79
assert(nkey <=
EVP_MAX_KEY_LENGTH
);
80
assert(niv <=
EVP_MAX_IV_LENGTH
);
81
82
if
(
data
== NULL) {
83
return
nkey;
84
}
85
86
EVP_MD_CTX_init
(&
c
);
87
for
(;;) {
88
if
(!
EVP_DigestInit_ex
(&
c
,
md
, NULL)) {
89
goto
err
;
90
}
91
if
(addmd++) {
92
if
(!
EVP_DigestUpdate
(&
c
, md_buf, mds)) {
93
goto
err
;
94
}
95
}
96
if
(!
EVP_DigestUpdate
(&
c
,
data
, data_len)) {
97
goto
err
;
98
}
99
if
(salt != NULL) {
100
if
(!
EVP_DigestUpdate
(&
c
, salt,
PKCS5_SALT_LEN
)) {
101
goto
err
;
102
}
103
}
104
if
(!
EVP_DigestFinal_ex
(&
c
, md_buf, &mds)) {
105
goto
err
;
106
}
107
108
for
(
i
= 1;
i
<
count
;
i
++) {
109
if
(!
EVP_DigestInit_ex
(&
c
,
md
, NULL) ||
110
!
EVP_DigestUpdate
(&
c
, md_buf, mds) ||
111
!
EVP_DigestFinal_ex
(&
c
, md_buf, &mds)) {
112
goto
err
;
113
}
114
}
115
116
i
= 0;
117
if
(nkey) {
118
for
(;;) {
119
if
(nkey == 0 ||
i
== mds) {
120
break
;
121
}
122
if
(
key
!= NULL) {
123
*(
key
++) = md_buf[
i
];
124
}
125
nkey--;
126
i
++;
127
}
128
}
129
130
if
(niv &&
i
!= mds) {
131
for
(;;) {
132
if
(niv == 0 ||
i
== mds) {
133
break
;
134
}
135
if
(iv != NULL) {
136
*(iv++) = md_buf[
i
];
137
}
138
niv--;
139
i
++;
140
}
141
}
142
if
(nkey == 0 && niv == 0) {
143
break
;
144
}
145
}
146
rv =
type
->key_len;
147
148
err
:
149
EVP_MD_CTX_cleanup
(&
c
);
150
OPENSSL_cleanse
(md_buf,
EVP_MAX_MD_SIZE
);
151
return
rv;
152
}
PKCS5_SALT_LEN
#define PKCS5_SALT_LEN
Definition:
derive_key.c:65
OPENSSL_cleanse
#define OPENSSL_cleanse
Definition:
boringssl_prefix_symbols.h:1864
env_md_st
Definition:
third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h:67
EVP_MAX_KEY_LENGTH
#define EVP_MAX_KEY_LENGTH
Definition:
cipher.h:532
error_ref_leak.err
err
Definition:
error_ref_leak.py:35
EVP_DigestUpdate
#define EVP_DigestUpdate
Definition:
boringssl_prefix_symbols.h:1516
EVP_DigestInit_ex
#define EVP_DigestInit_ex
Definition:
boringssl_prefix_symbols.h:1511
uint8_t
unsigned char uint8_t
Definition:
stdint-msvc2008.h:78
env_md_ctx_st
Definition:
digest.h:306
c
void c(T a)
Definition:
miscompile_with_no_unique_address_test.cc:40
evp_cipher_st
Definition:
cipher.h:585
cipher.h
EVP_MD_CTX_init
#define EVP_MD_CTX_init
Definition:
boringssl_prefix_symbols.h:1567
data
char data[kBufferLength]
Definition:
abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
benchmark.md
md
Definition:
benchmark.py:86
digest.h
key
const char * key
Definition:
hpack_parser_table.cc:164
EVP_DigestFinal_ex
#define EVP_DigestFinal_ex
Definition:
boringssl_prefix_symbols.h:1509
count
int * count
Definition:
bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
EVP_BytesToKey
int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, const uint8_t *salt, const uint8_t *data, size_t data_len, unsigned count, uint8_t *key, uint8_t *iv)
Definition:
derive_key.c:67
EVP_MAX_MD_SIZE
#define EVP_MAX_MD_SIZE
Definition:
digest.h:156
EVP_MAX_IV_LENGTH
#define EVP_MAX_IV_LENGTH
Definition:
cipher.h:533
mem.h
asyncio_get_stats.type
type
Definition:
asyncio_get_stats.py:37
EVP_MD_CTX_cleanup
#define EVP_MD_CTX_cleanup
Definition:
boringssl_prefix_symbols.h:1561
i
uint64_t i
Definition:
abseil-cpp/absl/container/btree_benchmark.cc:230
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:09