]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - secure/lib/libcrypto/man/man3/SSL_CTX_set_generate_session_id.3
Merge OpenSSL 1.1.1i.
[FreeBSD/FreeBSD.git] / secure / lib / libcrypto / man / man3 / SSL_CTX_set_generate_session_id.3
1 .\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.41)
2 .\"
3 .\" Standard preamble:
4 .\" ========================================================================
5 .de Sp \" Vertical space (when we can't use .PP)
6 .if t .sp .5v
7 .if n .sp
8 ..
9 .de Vb \" Begin verbatim text
10 .ft CW
11 .nf
12 .ne \\$1
13 ..
14 .de Ve \" End verbatim text
15 .ft R
16 .fi
17 ..
18 .\" Set up some character translations and predefined strings.  \*(-- will
19 .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
20 .\" double quote, and \*(R" will give a right double quote.  \*(C+ will
21 .\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
22 .\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
23 .\" nothing in troff, for use with C<>.
24 .tr \(*W-
25 .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
26 .ie n \{\
27 .    ds -- \(*W-
28 .    ds PI pi
29 .    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
30 .    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
31 .    ds L" ""
32 .    ds R" ""
33 .    ds C` ""
34 .    ds C' ""
35 'br\}
36 .el\{\
37 .    ds -- \|\(em\|
38 .    ds PI \(*p
39 .    ds L" ``
40 .    ds R" ''
41 .    ds C`
42 .    ds C'
43 'br\}
44 .\"
45 .\" Escape single quotes in literal strings from groff's Unicode transform.
46 .ie \n(.g .ds Aq \(aq
47 .el       .ds Aq '
48 .\"
49 .\" If the F register is >0, we'll generate index entries on stderr for
50 .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
51 .\" entries marked with X<> in POD.  Of course, you'll have to process the
52 .\" output yourself in some meaningful fashion.
53 .\"
54 .\" Avoid warning from groff about undefined register 'F'.
55 .de IX
56 ..
57 .nr rF 0
58 .if \n(.g .if rF .nr rF 1
59 .if (\n(rF:(\n(.g==0)) \{\
60 .    if \nF \{\
61 .        de IX
62 .        tm Index:\\$1\t\\n%\t"\\$2"
63 ..
64 .        if !\nF==2 \{\
65 .            nr % 0
66 .            nr F 2
67 .        \}
68 .    \}
69 .\}
70 .rr rF
71 .\"
72 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
73 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
74 .    \" fudge factors for nroff and troff
75 .if n \{\
76 .    ds #H 0
77 .    ds #V .8m
78 .    ds #F .3m
79 .    ds #[ \f1
80 .    ds #] \fP
81 .\}
82 .if t \{\
83 .    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
84 .    ds #V .6m
85 .    ds #F 0
86 .    ds #[ \&
87 .    ds #] \&
88 .\}
89 .    \" simple accents for nroff and troff
90 .if n \{\
91 .    ds ' \&
92 .    ds ` \&
93 .    ds ^ \&
94 .    ds , \&
95 .    ds ~ ~
96 .    ds /
97 .\}
98 .if t \{\
99 .    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
100 .    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
101 .    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
102 .    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
103 .    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
104 .    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
105 .\}
106 .    \" troff and (daisy-wheel) nroff accents
107 .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
108 .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
109 .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
110 .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
111 .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
112 .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
113 .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
114 .ds ae a\h'-(\w'a'u*4/10)'e
115 .ds Ae A\h'-(\w'A'u*4/10)'E
116 .    \" corrections for vroff
117 .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
118 .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
119 .    \" for low resolution devices (crt and lpr)
120 .if \n(.H>23 .if \n(.V>19 \
121 \{\
122 .    ds : e
123 .    ds 8 ss
124 .    ds o a
125 .    ds d- d\h'-1'\(ga
126 .    ds D- D\h'-1'\(hy
127 .    ds th \o'bp'
128 .    ds Th \o'LP'
129 .    ds ae ae
130 .    ds Ae AE
131 .\}
132 .rm #[ #] #H #V #F C
133 .\" ========================================================================
134 .\"
135 .IX Title "SSL_CTX_SET_GENERATE_SESSION_ID 3"
136 .TH SSL_CTX_SET_GENERATE_SESSION_ID 3 "2020-12-08" "1.1.1i" "OpenSSL"
137 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
138 .\" way too many mistakes in technical documents.
139 .if n .ad l
140 .nh
141 .SH "NAME"
142 SSL_CTX_set_generate_session_id, SSL_set_generate_session_id, SSL_has_matching_session_id, GEN_SESSION_CB \&\- manipulate generation of SSL session IDs (server only)
143 .SH "SYNOPSIS"
144 .IX Header "SYNOPSIS"
145 .Vb 1
146 \& #include <openssl/ssl.h>
147 \&
148 \& typedef int (*GEN_SESSION_CB)(SSL *ssl, unsigned char *id,
149 \&                               unsigned int *id_len);
150 \&
151 \& int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb);
152 \& int SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB, cb);
153 \& int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
154 \&                                 unsigned int id_len);
155 .Ve
156 .SH "DESCRIPTION"
157 .IX Header "DESCRIPTION"
158 \&\fBSSL_CTX_set_generate_session_id()\fR sets the callback function for generating
159 new session ids for \s-1SSL/TLS\s0 sessions for \fBctx\fR to be \fBcb\fR.
160 .PP
161 \&\fBSSL_set_generate_session_id()\fR sets the callback function for generating
162 new session ids for \s-1SSL/TLS\s0 sessions for \fBssl\fR to be \fBcb\fR.
163 .PP
164 \&\fBSSL_has_matching_session_id()\fR checks, whether a session with id \fBid\fR
165 (of length \fBid_len\fR) is already contained in the internal session cache
166 of the parent context of \fBssl\fR.
167 .SH "NOTES"
168 .IX Header "NOTES"
169 When a new session is established between client and server, the server
170 generates a session id. The session id is an arbitrary sequence of bytes.
171 The length of the session id is between 1 and 32 bytes.  The session id is not
172 security critical but must be unique for the server. Additionally, the session id is
173 transmitted in the clear when reusing the session so it must not contain
174 sensitive information.
175 .PP
176 Without a callback being set, an OpenSSL server will generate a unique
177 session id from pseudo random numbers of the maximum possible length.
178 Using the callback function, the session id can be changed to contain
179 additional information like e.g. a host id in order to improve load balancing
180 or external caching techniques.
181 .PP
182 The callback function receives a pointer to the memory location to put
183 \&\fBid\fR into and a pointer to the maximum allowed length \fBid_len\fR. The
184 buffer at location \fBid\fR is only guaranteed to have the size \fBid_len\fR.
185 The callback is only allowed to generate a shorter id and reduce \fBid_len\fR;
186 the callback \fBmust never\fR increase \fBid_len\fR or write to the location
187 \&\fBid\fR exceeding the given limit.
188 .PP
189 The location \fBid\fR is filled with 0x00 before the callback is called, so the
190 callback may only fill part of the possible length and leave \fBid_len\fR
191 untouched while maintaining reproducibility.
192 .PP
193 Since the sessions must be distinguished, session ids must be unique.
194 Without the callback a random number is used, so that the probability
195 of generating the same session id is extremely small (2^256 for SSLv3/TLSv1).
196 In order to assure the uniqueness of the generated session id, the callback must call
197 \&\fBSSL_has_matching_session_id()\fR and generate another id if a conflict occurs.
198 If an id conflict is not resolved, the handshake will fail.
199 If the application codes e.g. a unique host id, a unique process number, and
200 a unique sequence number into the session id, uniqueness could easily be
201 achieved without randomness added (it should however be taken care that
202 no confidential information is leaked this way). If the application can not
203 guarantee uniqueness, it is recommended to use the maximum \fBid_len\fR and
204 fill in the bytes not used to code special information with random data
205 to avoid collisions.
206 .PP
207 \&\fBSSL_has_matching_session_id()\fR will only query the internal session cache,
208 not the external one. Since the session id is generated before the
209 handshake is completed, it is not immediately added to the cache. If
210 another thread is using the same internal session cache, a race condition
211 can occur in that another thread generates the same session id.
212 Collisions can also occur when using an external session cache, since
213 the external cache is not tested with \fBSSL_has_matching_session_id()\fR
214 and the same race condition applies.
215 .PP
216 The callback must return 0 if it cannot generate a session id for whatever
217 reason and return 1 on success.
218 .SH "RETURN VALUES"
219 .IX Header "RETURN VALUES"
220 \&\fBSSL_CTX_set_generate_session_id()\fR and \fBSSL_set_generate_session_id()\fR
221 always return 1.
222 .PP
223 \&\fBSSL_has_matching_session_id()\fR returns 1 if another session with the
224 same id is already in the cache.
225 .SH "EXAMPLES"
226 .IX Header "EXAMPLES"
227 The callback function listed will generate a session id with the
228 server id given, and will fill the rest with pseudo random bytes:
229 .PP
230 .Vb 1
231 \& const char session_id_prefix = "www\-18";
232 \&
233 \& #define MAX_SESSION_ID_ATTEMPTS 10
234 \& static int generate_session_id(SSL *ssl, unsigned char *id,
235 \&                                unsigned int *id_len)
236 \& {
237 \&     unsigned int count = 0;
238 \&
239 \&     do {
240 \&         RAND_pseudo_bytes(id, *id_len);
241 \&         /*
242 \&          * Prefix the session_id with the required prefix. NB: If our
243 \&          * prefix is too long, clip it \- but there will be worse effects
244 \&          * anyway, e.g. the server could only possibly create 1 session
245 \&          * ID (i.e. the prefix!) so all future session negotiations will
246 \&          * fail due to conflicts.
247 \&          */
248 \&         memcpy(id, session_id_prefix, strlen(session_id_prefix) < *id_len ?
249 \&                                       strlen(session_id_prefix) : *id_len);
250 \&     } while (SSL_has_matching_session_id(ssl, id, *id_len)
251 \&               && ++count < MAX_SESSION_ID_ATTEMPTS);
252 \&     if (count >= MAX_SESSION_ID_ATTEMPTS)
253 \&         return 0;
254 \&     return 1;
255 \& }
256 .Ve
257 .SH "SEE ALSO"
258 .IX Header "SEE ALSO"
259 \&\fBssl\fR\|(7), \fBSSL_get_version\fR\|(3)
260 .SH "COPYRIGHT"
261 .IX Header "COPYRIGHT"
262 Copyright 2001\-2020 The OpenSSL Project Authors. All Rights Reserved.
263 .PP
264 Licensed under the OpenSSL license (the \*(L"License\*(R").  You may not use
265 this file except in compliance with the License.  You can obtain a copy
266 in the file \s-1LICENSE\s0 in the source distribution or at
267 <https://www.openssl.org/source/license.html>.