This commit was manufactured by cvs2svn to create branch 'BRANCH_engine'.
This commit is contained in:
commit
eb31944f81
364
crypto/dso/dso_vms.c
Normal file
364
crypto/dso/dso_vms.c
Normal file
@ -0,0 +1,364 @@
|
||||
/* dso_vms.c */
|
||||
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#ifdef VMS
|
||||
#include <lib$routines.h>
|
||||
#include <libfisdef.h>
|
||||
#include <stsdef.h>
|
||||
#include <descrip.h>
|
||||
#include <starlet.h>
|
||||
#endif
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
#ifndef VMS
|
||||
DSO_METHOD *DSO_METHOD_vms(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
#pragma message disable DOLLARID
|
||||
|
||||
static int vms_load(DSO *dso, const char *filename);
|
||||
static int vms_unload(DSO *dso);
|
||||
static void *vms_bind_var(DSO *dso, const char *symname);
|
||||
static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname);
|
||||
#if 0
|
||||
static int vms_unbind_var(DSO *dso, char *symname, void *symptr);
|
||||
static int vms_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
|
||||
static int vms_init(DSO *dso);
|
||||
static int vms_finish(DSO *dso);
|
||||
#endif
|
||||
static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg);
|
||||
|
||||
static DSO_METHOD dso_meth_vms = {
|
||||
"OpenSSL 'VMS' shared library method",
|
||||
vms_load,
|
||||
NULL, /* unload */
|
||||
vms_bind_var,
|
||||
vms_bind_func,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind_var */
|
||||
NULL, /* unbind_func */
|
||||
#endif
|
||||
vms_ctrl,
|
||||
NULL, /* init */
|
||||
NULL /* finish */
|
||||
};
|
||||
|
||||
/* On VMS, the only "handle" is the file name. LIB$FIND_IMAGE_SYMBOL depends
|
||||
* on the reference to the file name being the same for all calls regarding
|
||||
* one shared image, so we'll just store it in an instance of the following
|
||||
* structure and put a pointer to that instance in the meth_data stack.
|
||||
*/
|
||||
typedef struct dso_internal_st
|
||||
{
|
||||
/* This should contain the name only, no directory,
|
||||
* no extension, nothing but a name. */
|
||||
struct dsc$descriptor_s filename_dsc;
|
||||
char filename[FILENAME_MAX+1];
|
||||
/* This contains whatever is not in filename, if needed.
|
||||
* Normally not defined. */
|
||||
struct dsc$descriptor_s imagename_dsc;
|
||||
char imagename[FILENAME_MAX+1];
|
||||
} DSO_VMS_INTERNAL;
|
||||
|
||||
|
||||
DSO_METHOD *DSO_METHOD_vms(void)
|
||||
{
|
||||
return(&dso_meth_vms);
|
||||
}
|
||||
|
||||
static int vms_load(DSO *dso, const char *filename)
|
||||
{
|
||||
DSO_VMS_INTERNAL *p;
|
||||
const char *sp1, *sp2; /* Search result */
|
||||
|
||||
/* A file specification may look like this:
|
||||
*
|
||||
* node::dev:[dir-spec]name.type;ver
|
||||
*
|
||||
* or (for compatibility with TOPS-20):
|
||||
*
|
||||
* node::dev:<dir-spec>name.type;ver
|
||||
*
|
||||
* and the dir-spec uses '.' as separator. Also, a dir-spec
|
||||
* may consist of several parts, with mixed use of [] and <>:
|
||||
*
|
||||
* [dir1.]<dir2>
|
||||
*
|
||||
* We need to split the file specification into the name and
|
||||
* the rest (both before and after the name itself).
|
||||
*/
|
||||
/* Start with trying to find the end of a dir-spec, and save the
|
||||
position of the byte after in sp1 */
|
||||
sp1 = strrchr(filename, ']');
|
||||
sp2 = strrchr(filename, '>');
|
||||
if (sp1 == NULL) sp1 = sp2;
|
||||
if (sp2 != NULL && sp2 > sp1) sp1 = sp2;
|
||||
if (sp1 == NULL) sp1 = strrchr(filename, ':');
|
||||
if (sp1 == NULL)
|
||||
sp1 = filename;
|
||||
else
|
||||
sp1++; /* The byte after the found character */
|
||||
/* Now, let's see if there's a type, and save the position in sp2 */
|
||||
sp2 = strchr(sp1, '.');
|
||||
/* If we found it, that's where we'll cut. Otherwise, look for a
|
||||
version number and save the position in sp2 */
|
||||
if (sp2 == NULL) sp2 = strchr(sp1, ';');
|
||||
/* If there was still nothing to find, set sp2 to point at the end of
|
||||
the string */
|
||||
if (sp2 == NULL) sp2 = sp1 + strlen(sp1);
|
||||
|
||||
/* Check that we won't get buffer overflows */
|
||||
if (sp2 - sp1 > FILENAME_MAX
|
||||
|| (sp1 - filename) + strlen(sp2) > FILENAME_MAX)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_LOAD,DSO_R_FILENAME_TOO_BIG);
|
||||
return(0);
|
||||
}
|
||||
|
||||
p = (DSO_VMS_INTERNAL *)OPENSSL_malloc(sizeof(DSO_VMS_INTERNAL));
|
||||
if(p == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_LOAD,ERR_R_MALLOC_FAILURE);
|
||||
return(0);
|
||||
}
|
||||
|
||||
strncpy(p->filename, sp1, sp2-sp1);
|
||||
p->filename[sp2-sp1] = '\0';
|
||||
|
||||
strncpy(p->imagename, filename, sp1-filename);
|
||||
p->imagename[sp1-filename] = '\0';
|
||||
strcat(p->imagename, sp2);
|
||||
|
||||
p->filename_dsc.dsc$w_length = strlen(p->filename);
|
||||
p->filename_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
|
||||
p->filename_dsc.dsc$b_class = DSC$K_CLASS_S;
|
||||
p->filename_dsc.dsc$a_pointer = p->filename;
|
||||
p->imagename_dsc.dsc$w_length = strlen(p->imagename);
|
||||
p->imagename_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
|
||||
p->imagename_dsc.dsc$b_class = DSC$K_CLASS_S;
|
||||
p->imagename_dsc.dsc$a_pointer = p->imagename;
|
||||
|
||||
if(!sk_push(dso->meth_data, (char *)p))
|
||||
{
|
||||
DSOerr(DSO_F_VMS_LOAD,DSO_R_STACK_ERROR);
|
||||
OPENSSL_free(p);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* Note that this doesn't actually unload the shared image, as there is no
|
||||
* such thing in VMS. Next time it get loaded again, a new copy will
|
||||
* actually be loaded.
|
||||
*/
|
||||
static int vms_unload(DSO *dso)
|
||||
{
|
||||
DSO_VMS_INTERNAL *p;
|
||||
if(dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
return(1);
|
||||
p = (DSO_VMS_INTERNAL *)sk_pop(dso->meth_data);
|
||||
if(p == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_UNLOAD,DSO_R_NULL_HANDLE);
|
||||
return(0);
|
||||
}
|
||||
/* Cleanup */
|
||||
OPENSSL_free(p);
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* We must do this in a separate function because of the way the exception
|
||||
handler works (it makes this function return */
|
||||
static int do_find_symbol(DSO_VMS_INTERNAL *ptr,
|
||||
struct dsc$descriptor_s *symname_dsc, void **sym,
|
||||
unsigned long flags)
|
||||
{
|
||||
/* Make sure that signals are caught and returned instead of
|
||||
aborting the program. The exception handler gets unestablished
|
||||
automatically on return from this function. */
|
||||
lib$establish(lib$sig_to_ret);
|
||||
|
||||
if(ptr->imagename_dsc.dsc$w_length)
|
||||
return lib$find_image_symbol(&ptr->filename_dsc,
|
||||
symname_dsc, sym,
|
||||
&ptr->imagename_dsc, flags);
|
||||
else
|
||||
return lib$find_image_symbol(&ptr->filename_dsc,
|
||||
symname_dsc, sym,
|
||||
0, flags);
|
||||
}
|
||||
|
||||
static void *vms_bind_sym(DSO *dso, const char *symname)
|
||||
{
|
||||
DSO_VMS_INTERNAL *ptr;
|
||||
void *sym = 0;
|
||||
int status;
|
||||
int flags = LIB$M_FIS_MIXEDCASE;
|
||||
struct dsc$descriptor_s symname_dsc;
|
||||
|
||||
symname_dsc.dsc$w_length = strlen(symname);
|
||||
symname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
|
||||
symname_dsc.dsc$b_class = DSC$K_CLASS_S;
|
||||
symname_dsc.dsc$a_pointer = (char *)symname; /* The cast is needed */
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_VMS_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (DSO_VMS_INTERNAL *)sk_value(dso->meth_data,
|
||||
sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
if(dso->flags & DSO_FLAG_UPCASE_SYMBOL) flags = 0;
|
||||
|
||||
status = do_find_symbol(ptr, &symname_dsc, &sym, flags);
|
||||
|
||||
if(!$VMS_STATUS_SUCCESS(status))
|
||||
{
|
||||
unsigned short length;
|
||||
char errstring[257];
|
||||
struct dsc$descriptor_s errstring_dsc;
|
||||
|
||||
errstring_dsc.dsc$w_length = sizeof(errstring);
|
||||
errstring_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
|
||||
errstring_dsc.dsc$b_class = DSC$K_CLASS_S;
|
||||
errstring_dsc.dsc$a_pointer = errstring;
|
||||
|
||||
status = sys$getmsg(status, &length, &errstring_dsc, 1, 0);
|
||||
|
||||
if (!$VMS_STATUS_SUCCESS(status))
|
||||
lib$signal(status); /* This is really bad. Abort! */
|
||||
else
|
||||
{
|
||||
errstring[length] = '\0';
|
||||
|
||||
DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_SYM_FAILURE);
|
||||
if (ptr->imagename_dsc.dsc$w_length)
|
||||
ERR_add_error_data(9,
|
||||
"Symbol ", symname,
|
||||
" in ", ptr->filename,
|
||||
" (", ptr->imagename, ")",
|
||||
": ", errstring);
|
||||
else
|
||||
ERR_add_error_data(6,
|
||||
"Symbol ", symname,
|
||||
" in ", ptr->filename,
|
||||
": ", errstring);
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
return(sym);
|
||||
}
|
||||
|
||||
static void *vms_bind_var(DSO *dso, const char *symname)
|
||||
{
|
||||
return vms_bind_sym(dso, symname);
|
||||
}
|
||||
|
||||
static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname)
|
||||
{
|
||||
return (DSO_FUNC_TYPE)vms_bind_sym(dso, symname);
|
||||
}
|
||||
|
||||
static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg)
|
||||
{
|
||||
if(dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_VMS_CTRL,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(-1);
|
||||
}
|
||||
switch(cmd)
|
||||
{
|
||||
case DSO_CTRL_GET_FLAGS:
|
||||
return dso->flags;
|
||||
case DSO_CTRL_SET_FLAGS:
|
||||
dso->flags = (int)larg;
|
||||
return(0);
|
||||
case DSO_CTRL_OR_FLAGS:
|
||||
dso->flags |= (int)larg;
|
||||
return(0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
DSOerr(DSO_F_VMS_CTRL,DSO_R_UNKNOWN_COMMAND);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#endif /* VMS */
|
38
doc/crypto/BIO_ctrl_get_read_request.pod
Normal file
38
doc/crypto/BIO_ctrl_get_read_request.pod
Normal file
@ -0,0 +1,38 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_ctrl_get_read_request - Find out how much bytes are were requested from the BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
size_t BIO_ctrl_get_read_request(BIO *bio);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_ctrl_get_read_request() returns the number of bytes that were last
|
||||
requested from B<bio> by a BIO_read() operation. This is useful e.g. for
|
||||
BIO pairs, so that the application knows how much bytes to supply to B<bio>.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
When B<bio> is NULL, the OpenSSL library calls assert().
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item E<gt>=0
|
||||
|
||||
The number of bytes requested.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<bio(3)|bio(3)>, L<BIO_s_mem(3)|BIO_s_mem(3)>,
|
||||
L<BIO_new_bio_pair(3)|BIO_new_bio_pair(3)>
|
36
doc/crypto/BIO_ctrl_pending.pod
Normal file
36
doc/crypto/BIO_ctrl_pending.pod
Normal file
@ -0,0 +1,36 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_ctrl_pending - Find out how much bytes are buffered in a BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
size_t BIO_ctrl_pending(BIO *bio);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_ctrl_pending() returns the number of bytes buffered in a BIO.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
When B<bio> is NULL, the OpenSSL library calls assert().
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item E<gt>=0
|
||||
|
||||
The number of bytes pending the BIO.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<bio(3)|bio(3)>, L<BIO_s_mem(3)|BIO_s_mem(3)>,
|
||||
L<BIO_new_bio_pair(3)|BIO_new_bio_pair(3)>
|
102
doc/crypto/BIO_new_bio_pair.pod
Normal file
102
doc/crypto/BIO_new_bio_pair.pod
Normal file
@ -0,0 +1,102 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_new_bio_pair - create a new BIO pair
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, BIO **bio2, size_t writebuf2);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_new_bio_pair() creates a buffering BIO pair. It has two endpoints between
|
||||
data can be buffered. Its typical use is to connect one endpoint as underlying
|
||||
input/output BIO to an SSL and access the other one controlled by the program
|
||||
instead of accessing the network connection directly.
|
||||
|
||||
The two new BIOs B<bio1> and B<bio2> are symmetric with respect to their
|
||||
functionality. The size of their buffers is determined by B<writebuf1> and
|
||||
B<writebuf2>. If the size give is 0, the default size is used.
|
||||
|
||||
BIO_new_bio_pair() does not check whether B<bio1> or B<bio2> do point to
|
||||
some other BIO, the values are overwritten, BIO_free() is not called.
|
||||
|
||||
The two BIOs, even though forming a BIO pair and must be BIO_free()'ed
|
||||
seperately. This can be of importance, as some SSL-functions like SSL_set_bio()
|
||||
or SSL_free() call BIO_free() implicitely, so that the peer-BIO is left
|
||||
untouched and must also be BIO_free()'ed.
|
||||
|
||||
=head1 EXAMPLE
|
||||
|
||||
The BIO pair can be used to have full control over the network access of an
|
||||
application. The application can call select() on the socket as required
|
||||
without having to go through the SSL-interface.
|
||||
|
||||
BIO *internal_bio, *network_bio;
|
||||
...
|
||||
BIO_new_bio_pair(internal_bio, 0, network_bio, 0);
|
||||
SSL_set_bio(ssl, internal_bio);
|
||||
SSL_operations();
|
||||
...
|
||||
|
||||
application | TLS-engine
|
||||
| |
|
||||
+----------> SSL_operations()
|
||||
| /\ ||
|
||||
| || \/
|
||||
| BIO-pair (internal_bio)
|
||||
+----------< BIO-pair (network_bio)
|
||||
| |
|
||||
socket |
|
||||
|
||||
...
|
||||
SSL_free(ssl); /* implicitely frees internal_bio */
|
||||
BIO_free(network_bio);
|
||||
...
|
||||
|
||||
As the BIO pair will only buffer the data and never directly access the
|
||||
connection, it behaves non-blocking and will return as soon as the write
|
||||
buffer is full or the read buffer is drained. Then the application has to
|
||||
flush the write buffer and/or fill the read buffer.
|
||||
|
||||
Use the BIO_ctrl_pending(), to find out whether data is buffered in the BIO
|
||||
and must be transfered to the network. Use BIO_ctrl_get_read_request() to
|
||||
find out, how many bytes must be written into the buffer before the
|
||||
SSL_operation() can successfully be continued.
|
||||
|
||||
=head1 IMPORTANT
|
||||
|
||||
As the data is buffered, SSL_operation() may return with a ERROR_SSL_WANT_READ
|
||||
condition, but there is still data in the write buffer. An application must
|
||||
not rely on the error value of SSL_operation() but must assure that the
|
||||
write buffer is always flushed first. Otherwise a deadlock may occur as
|
||||
the peer might be waiting for the data before being able to continue.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 1
|
||||
|
||||
The BIO pair was created successfully. The new BIOs are available in
|
||||
B<bio1> and B<bio2>.
|
||||
|
||||
=item 0
|
||||
|
||||
The operation failed. The NULL pointer is stored into the locations for
|
||||
B<bio1> and B<bio2>. Check the error stack for more information.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_set_bio(3)|SSL_set_bio(3)>, L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>,
|
||||
L<BIO_ctrl_pending(3)|BIO_ctrl_pending(3)>,
|
||||
L<BIO_ctrl_get_read_request(3)|BIO_ctrl_get_read_request(3)>
|
||||
|
||||
=cut
|
182
doc/crypto/BIO_s_accept.pod
Normal file
182
doc/crypto/BIO_s_accept.pod
Normal file
@ -0,0 +1,182 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_s_accept, BIO_set_nbio, BIO_set_accept_port, BIO_get_accept_port,
|
||||
BIO_set_nbio_accept, BIO_set_accept_bios, BIO_set_bind_mode,
|
||||
BIO_get_bind_mode, BIO_do_accept - accept BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
BIO_METHOD * BIO_s_accept(void);
|
||||
|
||||
#define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name)
|
||||
#define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0)
|
||||
|
||||
BIO *BIO_new_accept(char *host_port);
|
||||
|
||||
#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL)
|
||||
#define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio)
|
||||
|
||||
#define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL)
|
||||
#define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL)
|
||||
|
||||
#define BIO_BIND_NORMAL 0
|
||||
#define BIO_BIND_REUSEADDR_IF_UNUSED 1
|
||||
#define BIO_BIND_REUSEADDR 2
|
||||
|
||||
#define BIO_do_accept(b) BIO_do_handshake(b)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_s_accept() returns the accept BIO method. This is a wrapper
|
||||
round the platform's TCP/IP socket accept routines.
|
||||
|
||||
Using accept BIOs TCP/IP connections can be accepted and data
|
||||
transferred using only BIO routines. In this way any platform
|
||||
specific operations are hidden by the BIO abstraction.
|
||||
|
||||
Read and write operations on an accept BIO will perform I/O
|
||||
on the underlying connection. If no connection is established
|
||||
and the port (see below) is set up properly then the BIO
|
||||
waits for an incoming connection.
|
||||
|
||||
Accept BIOs support BIO_puts() but not BIO_gets().
|
||||
|
||||
If the close flag is set on an accept BIO then any active
|
||||
connection on that chain is shutdown and the socket closed when
|
||||
the BIO is freed.
|
||||
|
||||
Calling BIO_reset() on a accept BIO will close any active
|
||||
connection and reset the BIO into a state where it awaits another
|
||||
incoming connection.
|
||||
|
||||
BIO_get_fd() and BIO_set_fd() can be called to retrieve or set
|
||||
the accept socket. See L<BIO_s_fd(3)|BIO_s_fd(3)>
|
||||
|
||||
BIO_set_accept_port() uses the string B<name> to set the accept
|
||||
port. The port is represented as a string of the form "host:port",
|
||||
where "host" is the interface to use and "port" is the port.
|
||||
Either or both values can be "*" which is interpreted as meaning
|
||||
any interface or port respectively. "port" has the same syntax
|
||||
as the port specified in BIO_set_conn_port() for connect BIOs,
|
||||
that is it can be a numerical port string or a string to lookup
|
||||
using getservbyname() and a string table.
|
||||
|
||||
BIO_new_accept() combines BIO_new() and BIO_set_accept_port() into
|
||||
a single call: that is it creates a new accept BIO with port
|
||||
B<host_port>.
|
||||
|
||||
BIO_set_nbio_accept() sets the accept socket to blocking mode
|
||||
(the default) if B<n> is 0 or non blocking mode if B<n> is 1.
|
||||
|
||||
BIO_set_accept_bios() can be used to set a chain of BIOs which
|
||||
will be duplicated and prepended to the chain when an incoming
|
||||
connection is received. This is useful if, for example, a
|
||||
buffering BIO is required for each connection.
|
||||
|
||||
BIO_set_bind_mode() and BIO_get_bind_mode() set and retrieve
|
||||
the current bind mode. If BIO_BIND_NORMAL (the default) is set
|
||||
then another socket cannot be bound to the same port. If
|
||||
BIO_BIND_REUSEADDR is set then other sockets can bind to the
|
||||
same port. If BIO_BIND_REUSEADDR_IF_UNUSED is set then and
|
||||
attempt is first made to use BIO_BIN_NORMAL, if this fails
|
||||
and the port is not in use then a second attempt is made
|
||||
using BIO_BIND_REUSEADDR.
|
||||
|
||||
BIO_do_accept() serves two functions. When it is first
|
||||
called, after the accept BIO has been setup, it will attempt
|
||||
to create the accept socket and bind an address to it. Second
|
||||
and subsequent calls to BIO_do_accept() will await an incoming
|
||||
connection.
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
When an accept BIO is at the end of a chain it will await an
|
||||
incoming connection before processing I/O calls. When an accept
|
||||
BIO is not at then end of a chain it passes I/O calls to the next
|
||||
BIO in the chain.
|
||||
|
||||
When a connection is established a new socket BIO is created for
|
||||
the conection and appended to the chain. That is the chain is now
|
||||
accept->socket. This effectively means that attempting I/O on
|
||||
an initial accept socket will await an incoming connection then
|
||||
perform I/O on it.
|
||||
|
||||
If any additional BIOs have been set using BIO_set_accept_bios()
|
||||
then they are placed between the socket and the accept BIO,
|
||||
that is the chain will be accept->otherbios->socket.
|
||||
|
||||
If a server wishes to process multiple connections (as is normally
|
||||
the case) then the accept BIO must be made available for further
|
||||
incoming connections. This can be done by waiting for a connection and
|
||||
then calling:
|
||||
|
||||
connection = BIO_pop(accept);
|
||||
|
||||
After this call B<connection> will contain a BIO for the recently
|
||||
established connection and B<accept> will now be a single BIO
|
||||
again which can be used to await further incoming connections.
|
||||
If no further connections will be accepted the B<accept> can
|
||||
be freed using BIO_free().
|
||||
|
||||
If only a single connection will be processed it is possible to
|
||||
perform I/O using the accept BIO itself. This is often undesirable
|
||||
however because the accept BIO will still accept additional incoming
|
||||
connections. This can be resolved by using BIO_pop() (see above)
|
||||
and freeing up the accept BIO after the initial connection.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
TBA
|
||||
|
||||
=head1 EXAMPLE
|
||||
|
||||
This example accepts two connections on port 4444, sends messages
|
||||
down each and finally closes both down.
|
||||
|
||||
BIO *abio, *cbio, *cbio2;
|
||||
ERR_load_crypto_strings();
|
||||
abio = BIO_new_accept("4444");
|
||||
|
||||
/* First call to BIO_accept() sets up accept BIO */
|
||||
if(BIO_do_accept(abio) <= 0) {
|
||||
fprintf(stderr, "Error setting up accept\n");
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* Wait for incoming connection */
|
||||
if(BIO_do_accept(abio) <= 0) {
|
||||
fprintf(stderr, "Error accepting connection\n");
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(0);
|
||||
}
|
||||
fprintf(stderr, "Connection 1 established\n");
|
||||
/* Retrieve BIO for connection */
|
||||
cbio = BIO_pop(abio);
|
||||
BIO_puts(cbio, "Connection 1: Sending out Data on initial connection\n");
|
||||
fprintf(stderr, "Sent out data on connection 1\n");
|
||||
/* Wait for another connection */
|
||||
if(BIO_do_accept(abio) <= 0) {
|
||||
fprintf(stderr, "Error accepting connection\n");
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(0);
|
||||
}
|
||||
fprintf(stderr, "Connection 2 established\n");
|
||||
/* Close accept BIO to refuse further connections */
|
||||
cbio2 = BIO_pop(abio);
|
||||
BIO_free(abio);
|
||||
BIO_puts(cbio2, "Connection 2: Sending out Data on second\n");
|
||||
fprintf(stderr, "Sent out data on connection 2\n");
|
||||
|
||||
BIO_puts(cbio, "Connection 1: Second connection established\n");
|
||||
/* Close the two established connections */
|
||||
BIO_free(cbio);
|
||||
BIO_free(cbio2);
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
TBA
|
118
doc/crypto/BIO_s_bio.pod
Normal file
118
doc/crypto/BIO_s_bio.pod
Normal file
@ -0,0 +1,118 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_s_bio, BIO_make_bio_pair, BIO_destroy_bio_pair, BIO_set_write_buf_size,
|
||||
BIO_get_write_buf_size, BIO_new_bio_pair, BIO_get_write_guarantee,
|
||||
BIO_ctrl_get_write_guarantee, BIO_get_read_request, BIO_ctrl_get_read_request,
|
||||
BIO_ctrl_reset_read_request - BIO pair BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
BIO_METHOD *BIO_s_bio(void);
|
||||
|
||||
#define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2)
|
||||
#define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL)
|
||||
|
||||
#define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL)
|
||||
#define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL)
|
||||
|
||||
int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, BIO **bio2, size_t writebuf2);
|
||||
|
||||
#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL)
|
||||
size_t BIO_ctrl_get_write_guarantee(BIO *b);
|
||||
|
||||
#define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL)
|
||||
size_t BIO_ctrl_get_read_request(BIO *b);
|
||||
|
||||
int BIO_ctrl_reset_read_request(BIO *b);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_s_bio() returns the method for a BIO pair. A BIO pair is a pair of source/sink
|
||||
BIOs where data written to either half of the pair is buffered and can be read from
|
||||
the other half. Both halves must usually by handled by the same application thread
|
||||
since no locking is done on the internal data structures.
|
||||
|
||||
Since BIO chains typically end in a source/sink BIO it is possible to make this
|
||||
one half of a BIO pair and have all the data processed by the chain under application
|
||||
control.
|
||||
|
||||
One typical use of BIO pairs is to place TLS/SSL I/O under application control, this
|
||||
can be used when the application wishes to use a non standard transport for
|
||||
TLS/SSL or the normal socket routines are inappropriate.
|
||||
|
||||
Calls to BIO_read() will read data from the buffer or request a retry if no
|
||||
data is available.
|
||||
|
||||
Calls to BIO_write() will place data in the buffer or request a retry if the
|
||||
buffer is full.
|
||||
|
||||
The standard calls BIO_ctrl_pending() and BIO_ctrl_wpending() can be used to
|
||||
determine the amount of pending data in the read or write buffer.
|
||||
|
||||
BIO_reset() clears any data in the write buffer.
|
||||
|
||||
BIO_make_bio_pair() joins two separate BIOs into a connected pair.
|
||||
|
||||
BIO_destroy_pair() destroys the association between two connected BIOs. Freeing
|
||||
up any half of the pair will automatically destroy the association.
|
||||
|
||||
BIO_set_write_buf_size() sets the write buffer size of BIO B<b> to B<size>.
|
||||
If the size is not initialised a default value is used. This is currently
|
||||
17K, sufficient for a maximum size TLS record.
|
||||
|
||||
BIO_get_write_buf_size() returns the size of the write buffer.
|
||||
|
||||
BIO_new_bio_pair() combines the calls to BIO_new(), BIO_make_bio_pair() and
|
||||
BIO_set_write_buf_size() to create a connected pair of BIOs B<bio1>, B<bio2>
|
||||
with write buffer sizes B<writebuf1> and B<writebuf2>. If either size is
|
||||
zero then the default size is used.
|
||||
|
||||
BIO_get_write_guarantee() and BIO_ctrl_get_write_guarentee() return the maximum
|
||||
length of data that can be currently written to the BIO. Writes larger than this
|
||||
value will return a value from BIO_write() less than the amount requested or if the
|
||||
buffer is full request a retry. BIO_ctrl_get_write_guarantee() is a function
|
||||
whereas BIO_get_write_guarantee() is a macro.
|
||||
|
||||
BIO_get_read_request() and BIO_ctrl_get_read_request() return the amount of data
|
||||
requested (or the buffer size if it is less) if the last read failed due to an
|
||||
empty buffer. This can be used to determine how much data should be written to the
|
||||
other half of the pair so the next read will succeed: this is most useful in TLS/SSL
|
||||
applications where the amount of data read is usually meaningful rather than just
|
||||
a buffer size. After a successful read this call will return zero.
|
||||
|
||||
BIO_ctrl_reset_read_request() can also be used to reset the value returned by
|
||||
BIO_get_read_request() to zero.
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
Both halves of a BIO pair should be freed. That is even if one half is implicity
|
||||
freed due to a BIO_free_all() or SSL_free() call the other half needs to be freed.
|
||||
|
||||
When used in bidirectional applications (such as TLS/SSL) care should be taken to
|
||||
flush any data in the write buffer. This can be done by calling BIO_pending()
|
||||
on the other half of the pair and, if any data is pending, reading it and sending
|
||||
it to the underlying transport. This must be done before any normal processing
|
||||
(such as calling select() ) due to a request and BIO_should_read() being true.
|
||||
|
||||
To see why this is important consider a case where a request is sent using
|
||||
BIO_write() and a response read with BIO_read(), this can occur during an
|
||||
TLS/SSL handshake for example. BIO_write() will succeed and place data in the write
|
||||
buffer. BIO_read() will initially fail and BIO_should_read() will be true. If
|
||||
the application then waits for data to be available on the underlying transport
|
||||
before flusing the write buffer it will never succeed because the request was
|
||||
never sent!
|
||||
|
||||
=head1 EXAMPLE
|
||||
|
||||
TBA
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_set_bio(3)|SSL_set_bio(3)>, L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>,
|
||||
L<BIO_should_retry(3)|BIO_should_retry(3)>, L<BIO_read(3)|BIO_read(3)>
|
||||
|
||||
=cut
|
182
doc/crypto/BIO_s_connect.pod
Normal file
182
doc/crypto/BIO_s_connect.pod
Normal file
@ -0,0 +1,182 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_s_connect, BIO_set_conn_hostname, BIO_set_conn_port,
|
||||
BIO_set_conn_ip, BIO_set_conn_int_port, BIO_get_conn_hostname,
|
||||
BIO_get_conn_port, BIO_get_conn_ip, BIO_get_conn_int_port,
|
||||
BIO_set_nbio, BIO_do_connect - connect BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
BIO_METHOD * BIO_s_connect(void);
|
||||
|
||||
#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
|
||||
#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
|
||||
#define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip)
|
||||
#define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port)
|
||||
#define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)
|
||||
#define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)
|
||||
#define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2)
|
||||
#define BIO_get_conn_int_port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port)
|
||||
|
||||
#define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)
|
||||
|
||||
#define BIO_do_connect(b) BIO_do_handshake(b)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_s_connect() returns the connect BIO method. This is a wrapper
|
||||
round the platform's TCP/IP socket connection routines.
|
||||
|
||||
Using connect BIOs TCP/IP connections can be made and data
|
||||
transferred using only BIO routines. In this way any platform
|
||||
specific operations are hidden by the BIO abstraction.
|
||||
|
||||
Read and write operations on a connect BIO will perform I/O
|
||||
on the underlying connection. If no connection is established
|
||||
and the port and hostname (see below) is set up properly then
|
||||
a connection is established first.
|
||||
|
||||
Connect BIOs support BIO_puts() but not BIO_gets().
|
||||
|
||||
If the close flag is set on a connect BIO then any active
|
||||
connection is shutdown and the socket closed when the BIO
|
||||
is freed.
|
||||
|
||||
Calling BIO_reset() on a connect BIO will close any active
|
||||
connection and reset the BIO into a state where it can connect
|
||||
to the same host again.
|
||||
|
||||
BIO_get_fd() places the underlying socket in B<c> if it is not NULL,
|
||||
it also returns the socket . If B<c> is not NULL it should be of
|
||||
type (int *).
|
||||
|
||||
BIO_set_conn_hostname() uses the string B<name> to set the hostname
|
||||
The hostname can be an IP address. The hostname can also include the
|
||||
port in the form hostname:port . It is also acceptable to use the
|
||||
form "hostname/any/other/path" or "hostname:port/any/other/path".
|
||||
|
||||
BIO_set_conn_port() sets the port to B<port>. B<port> can be the
|
||||
numerical form or a string such as "http". A string will be looked
|
||||
up first using getservbyname() on the host platform but if that
|
||||
fails a standard table of port names will be used. Currently the
|
||||
list is http, telnet, socks, https, ssl, ftp, gopher and wais.
|
||||
|
||||
BIO_set_conn_ip() sets the IP address to B<ip> using binary form,
|
||||
that is four bytes specifying the IP address in big endian form.
|
||||
|
||||
BIO_set_conn_int_port() sets the port using B<port>. B<port> should
|
||||
be of type (int *).
|
||||
|
||||
BIO_get_conn_hostname() returns the hostname of the connect BIO or
|
||||
NULL if the BIO is initialised but no hostname is set.
|
||||
This return value is an internal pointer which should not be modified.
|
||||
|
||||
BIO_get_conn_port() returns the port as a string.
|
||||
|
||||
BIO_get_conn_ip() returns the IP address in binary form.
|
||||
|
||||
BIO_get_conn_int_port() returns the port as an int.
|
||||
|
||||
BIO_set_nbio() sets the non blocking I/O flag to B<n>. If B<n> is
|
||||
zero then blocking I/O is set. If B<n> is 1 then non blocking I/O
|
||||
is set. Blocking I/O is the default. The call to BIO_set_nbio()
|
||||
should be made before the connection is established because
|
||||
non blocking I/O is set during the connect process.
|
||||
|
||||
BIO_do_connect() attempts to connect the supplied BIO. It returns 1
|
||||
if the connection was established successfully. A zero or negative
|
||||
value is returned if the connection could not be established, the
|
||||
call BIO_should_retry() should be used for non blocking connect BIOs
|
||||
to determine if the call should be retried.
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
If blocking I/O is set then a non positive return value from any
|
||||
I/O call is caused by an error condition, although a zero return
|
||||
will normally mean that the connection was closed.
|
||||
|
||||
If the port name is supplied as part of the host name then this will
|
||||
override any value set with BIO_set_conn_port(). This may be undesirable
|
||||
if the application does not wish to allow connection to arbitrary
|
||||
ports. This can be avoided by checking for the presence of the ':'
|
||||
character in the passed hostname and either indicating an error or
|
||||
truncating the string at that point.
|
||||
|
||||
The values returned by BIO_get_conn_hostname(), BIO_get_conn_port(),
|
||||
BIO_get_conn_ip() and BIO_get_conn_int_port() are updated when a
|
||||
connection attempt is made. Before any connection attempt the values
|
||||
returned are those set by the application itself.
|
||||
|
||||
Applications do not have to call BIO_do_connect() but may wish to do
|
||||
so to separate the connection process from other I/O processing.
|
||||
|
||||
If non blocking I/O is set then retries will be requested as appropriate.
|
||||
|
||||
It addition to BIO_should_read() and BIO_should_write() it is also
|
||||
possible for BIO_should_io_special() to be true during the initial
|
||||
connection process with the reason BIO_RR_CONNECT. If this is returned
|
||||
then this is an indication that a connection attempt would block,
|
||||
the application should then take appropiate action to wait until
|
||||
the underlying socket has connected and retry the call.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
BIO_s_connect() returns the connect BIO method.
|
||||
|
||||
BIO_get_fd() returns the socket or -1 if the BIO has not
|
||||
been initialised.
|
||||
|
||||
BIO_set_conn_hostname(), BIO_set_conn_port(), BIO_set_conn_ip() and
|
||||
BIO_set_conn_int_port() always return 1.
|
||||
|
||||
BIO_get_conn_hostname() returns the connected hostname or NULL is
|
||||
none was set.
|
||||
|
||||
BIO_get_conn_port() returns a string representing the connected
|
||||
port or NULL if not set.
|
||||
|
||||
BIO_get_conn_ip() returns a pointer to the connected IP address in
|
||||
binary form or all zeros if not set.
|
||||
|
||||
BIO_get_conn_int_port() returns the connected port or 0 if none was
|
||||
set.
|
||||
|
||||
BIO_set_nbio() always returns 1.
|
||||
|
||||
BIO_do_connect() returns 1 if the connection was successfully
|
||||
established and 0 or -1 if the connection failed.
|
||||
|
||||
=head1 EXAMPLE
|
||||
|
||||
This is example connects to a webserver on the local host and attempts
|
||||
to retrieve a page and copy the result to standard output.
|
||||
|
||||
|
||||
BIO *cbio, *out;
|
||||
int len;
|
||||
char tmpbuf[1024];
|
||||
ERR_load_crypto_strings();
|
||||
cbio = BIO_new_connect("localhost:http");
|
||||
out = BIO_new_fp(stdout, BIO_NOCLOSE);
|
||||
if(BIO_do_connect(cbio) <= 0) {
|
||||
fprintf(stderr, "Error connecting to server\n");
|
||||
ERR_print_errors_fp(stderr);
|
||||
/* whatever ... */
|
||||
}
|
||||
BIO_puts(cbio, "GET / HTTP/1.0\n\n");
|
||||
for(;;) {
|
||||
len = BIO_read(cbio, tmpbuf, 1024);
|
||||
if(len <= 0) break;
|
||||
BIO_write(out, tmpbuf, len);
|
||||
}
|
||||
BIO_free(cbio);
|
||||
BIO_free(out);
|
||||
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
TBA
|
61
doc/crypto/BIO_s_socket.pod
Normal file
61
doc/crypto/BIO_s_socket.pod
Normal file
@ -0,0 +1,61 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_s_socket, BIO_new_socket - socket BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
BIO_METHOD * BIO_s_socket(void);
|
||||
|
||||
#define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd)
|
||||
#define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c)
|
||||
|
||||
BIO *BIO_new_socket(int sock, int close_flag);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_s_socket() returns the socket BIO method. This is a wrapper
|
||||
round the platform's socket routines.
|
||||
|
||||
BIO_read() and BIO_write() read or write the underlying socket.
|
||||
BIO_puts() is supported but BIO_gets() is not.
|
||||
|
||||
If the close flag is set then the socket is shut down and closed
|
||||
when the BIO is freed.
|
||||
|
||||
BIO_set_fd() sets the socket of BIO B<b> to B<fd> and the close
|
||||
flag to B<c>.
|
||||
|
||||
BIO_get_fd() places the socket in B<c> if it is not NULL, it also
|
||||
returns the socket . If B<c> is not NULL it should be of type (int *).
|
||||
|
||||
BIO_new_socket() returns a socket BIO using B<sock> and B<close_flag>.
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
Socket BIOs also support any relevant functionality of file descriptor
|
||||
BIOs.
|
||||
|
||||
The reason for having separate file descriptor and socket BIOs is that on some
|
||||
platforms sockets are not file descriptors and use distinct I/O routines,
|
||||
Windows is one such platform. Any code mixing the two will not work on
|
||||
all platforms.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
BIO_s_socket() returns the socket BIO method.
|
||||
|
||||
BIO_set_fd() always returns 1.
|
||||
|
||||
BIO_get_fd() returns the socket or -1 if the BIO has not been
|
||||
initialised.
|
||||
|
||||
BIO_new_socket() returns the newly allocated BIO or NULL is an error
|
||||
occurred.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
TBA
|
30
doc/crypto/BIO_seek.pod
Normal file
30
doc/crypto/BIO_seek.pod
Normal file
@ -0,0 +1,30 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
BIO_seek, BIO_tell - file BIO operations
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
#define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL)
|
||||
#define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BIO_seek() sets the file position pointer to B<ofs> bytes from start of file.
|
||||
|
||||
BIO_tell() returns the current file position.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
BIO_seek() returns the same value as the underlying fseek() function:
|
||||
0 for success or -1 for failure.
|
||||
|
||||
BIO_tell() returns the current file position.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
TBA
|
||||
|
25
doc/ssl/SSL_SESSION_free.pod
Normal file
25
doc/ssl/SSL_SESSION_free.pod
Normal file
@ -0,0 +1,25 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_SESSION_free - Free up an allocated SSL_SESSION structure
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
void *SSL_SESSION_free(SSL_SESSION *session);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_SESSION_free() decrements the reference count of B<session> and removes
|
||||
the SSL_SESSION structure pointed to by B<session> and frees up the allocated
|
||||
memory, if the the reference count has reached 0.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
SSL_SESSION_free() does not provide diagnostic information.
|
||||
|
||||
L<ssl(3)|ssl(3)>, L<SSL_get_session(3)|SSL_get_session(3)>
|
||||
|
||||
=cut
|
69
doc/ssl/SSL_accept.pod
Normal file
69
doc/ssl/SSL_accept.pod
Normal file
@ -0,0 +1,69 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_accept - Wait for a TLS client to initiate a TLS handshake
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_accept(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_accept() waits for a TLS client to initiate the TLS handshake.
|
||||
The communication channel must already have been set and assigned to the
|
||||
B<ssl> by setting an underlying B<BIO>. The behaviour of SSL_accept() depends
|
||||
on the underlying BIO.
|
||||
|
||||
If the underlying BIO is B<blocking>, SSL_accept() will only return, once the
|
||||
handshake has been finished or an error occured, except for SGC (Server
|
||||
Gated Cryptography). For SGC SSL_accept() may return with -1 but
|
||||
SSL_get_error() will yield SSL_ERROR_WANT_READ/WRITE and SSL_accept()
|
||||
should be called again.
|
||||
|
||||
If the underlying BIO is B<non-blocking>, SSL_accept() will also return,
|
||||
when the underlying BIO could not satisfy the needs of SSL_accept()
|
||||
to continue the handshake. In this case a call to SSL_get_error() with the
|
||||
return value of SSL_accept() will yield SSL_ERROR_WANT_READ or
|
||||
SSL_ERROR_WANT_WRITE. The calling process then must repeat the call after
|
||||
taking appropriate action to satisfy the needs of SSL_accept().
|
||||
The action depends on the underlying BIO. When using a non-blocking socket,
|
||||
nothing is to be done, but select() can be used to check for the required
|
||||
condition. When using a buffering BIO, like a BIO pair, data must be written
|
||||
into or retrieved out of the BIO before being able to continue.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 1
|
||||
|
||||
The TLS handshake was successfully completed, a TLS connection has been
|
||||
established.
|
||||
|
||||
=item 0
|
||||
|
||||
The TLS handshake was not successfull but was shut down controlled and
|
||||
by the specifications of the TLS protocol. Call SSL_get_error() with the
|
||||
return value B<ret> to find out the reason.
|
||||
|
||||
=item -1
|
||||
|
||||
The TLS handshake was not successfull, because a fatal error occured either
|
||||
at the protocol level or a connection failure occured. The shutdown was
|
||||
not clean. It can also occure of action is need to continue the operation
|
||||
for non-blocking BIOs. Call SSL_get_error() with the return value B<ret>
|
||||
to find out the reason.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_connect(3)|SSL_connect(3)>,
|
||||
L<SSL_shutdown(3)|SSL_shutdown(3)>, L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
39
doc/ssl/SSL_clear.pod
Normal file
39
doc/ssl/SSL_clear.pod
Normal file
@ -0,0 +1,39 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_clear - Reset SSL to allow another connection
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int *SSL_clear(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Reset the B<ssl> to allow another connection. All settings (method, ciphers,
|
||||
BIOs) are kept. A completely negotiated SSL_SESSION is not freed but left
|
||||
untouched for the underlying SSL_CTX.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 0
|
||||
|
||||
The SSL_clear() operation could not be performed. Check the error stack to
|
||||
find out the reason.
|
||||
|
||||
=item 1
|
||||
|
||||
The SSL_clear() operation was successfull.
|
||||
|
||||
=back
|
||||
|
||||
L<SSL_new(3)|SSL_new(3)>, L<SSL_free(3)|SSL_free(3)>,
|
||||
L<ssl(3)|ssl(3)>
|
||||
|
||||
=cut
|
66
doc/ssl/SSL_connect.pod
Normal file
66
doc/ssl/SSL_connect.pod
Normal file
@ -0,0 +1,66 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_connect - Initiate the TLS handshake with an TLS server
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_connect(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_connect() initiates the TLS handshake with a server. The communication
|
||||
channel must already have been set and assigned to the B<ssl> by setting an
|
||||
underlying B<BIO>. The behaviour of SSL_connect() depends on the underlying
|
||||
BIO.
|
||||
|
||||
If the underlying BIO is B<blocking>, SSL_connect() will only return, once the
|
||||
handshake has been finished or an error occured.
|
||||
|
||||
If the underlying BIO is B<non-blocking>, SSL_connect() will also return,
|
||||
when the underlying BIO could not satisfy the needs of SSL_connect()
|
||||
to continue the handshake. In this case a call to SSL_get_error() with the
|
||||
return value of SSL_connect() will yield SSL_ERROR_WANT_READ or
|
||||
SSL_ERROR_WANT_WRITE. The calling process then must repeat the call after
|
||||
taking appropriate action to satisfy the needs of SSL_connect().
|
||||
The action depends on the underlying BIO. When using a non-blocking socket,
|
||||
nothing is to be done, but select() can be used to check for the required
|
||||
condition. When using a buffering BIO, like a BIO pair, data must be written
|
||||
into or retrieved out of the BIO before being able to continue.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 1
|
||||
|
||||
The TLS handshake was successfully completed, a TLS connection has been
|
||||
established.
|
||||
|
||||
=item 0
|
||||
|
||||
The TLS handshake was not successfull but was shut down controlled and
|
||||
by the specifications of the TLS protocol. Call SSL_get_error() with the
|
||||
return value B<ret> to find out the reason.
|
||||
|
||||
=item -1
|
||||
|
||||
The TLS handshake was not successfull, because a fatal error occured either
|
||||
at the protocol level or a connection failure occured. The shutdown was
|
||||
not clean. It can also occure of action is need to continue the operation
|
||||
for non-blocking BIOs. Call SSL_get_error() with the return value B<ret>
|
||||
to find out the reason.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_accept(3)|SSL_accept(3)>,
|
||||
L<SSL_shutdown(3)|SSL_shutdown(3)>, L<ssl(3)|ssl(3)> , L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
33
doc/ssl/SSL_free.pod
Normal file
33
doc/ssl/SSL_free.pod
Normal file
@ -0,0 +1,33 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_free - Free up an allocated SSL structure
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
void *SSL_free(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_free() decrements the reference count of B<ssl> and removes the SSL
|
||||
structure pointed to by B<ssl> and frees up the allocated memory, if the
|
||||
the reference count has reached 0.
|
||||
|
||||
It also calls the free()ing procedures for indirectly affected items, if
|
||||
applicable: the buffering BIO, the read and write BIOs,
|
||||
cipher lists especially created for this B<ssl>, the SSL_SESSION.
|
||||
Do not explicitly free these indirectly freed up items before or after
|
||||
calling SSL_free(), as trying to free things twice may lead to program
|
||||
failure.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
SSL_free() does not provide diagnostic information.
|
||||
|
||||
L<SSL_new(3)|SSL_new(3)>, L<SSL_clear(3)|SSL_clear(3)>,
|
||||
L<ssl(3)|ssl(3)>
|
||||
|
||||
=cut
|
44
doc/ssl/SSL_get_fd.pod
Normal file
44
doc/ssl/SSL_get_fd.pod
Normal file
@ -0,0 +1,44 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_get_fd - Get file descriptor linked to an SSL
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_get_fd(SSL *ssl);
|
||||
int SSL_get_rfd(SSL *ssl);
|
||||
int SSL_get_wfd(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_get_fd() returns the file descriptor which is linked to B<ssl>.
|
||||
SSL_get_rfd() and SSL_get_wfd() return the file descriptors for the
|
||||
read or the write channel, which can be different. If the read and the
|
||||
write channel are different, SSL_get_fd() will return the file descriptor
|
||||
of the read channel.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item -1
|
||||
|
||||
The operation failed, because the underlying BIO is not of the correct type
|
||||
(suitable for file descriptors).
|
||||
|
||||
=item E<gt>=0
|
||||
|
||||
The file descriptor linked to B<ssl>.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_set_fd(3)|SSL_set_fd(3)>, L<ssl(3)|ssl(3)> , L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
40
doc/ssl/SSL_get_rbio.pod
Normal file
40
doc/ssl/SSL_get_rbio.pod
Normal file
@ -0,0 +1,40 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_get_rbio - Get BIO linked to an SSL
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
BIO *SSL_get_rbio(SSL *ssl);
|
||||
BIO *SSL_get_wbio(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_get_rbio() and SSL_get_wbio() return pointers to the BIOs for the
|
||||
read or the write channel, which can be different. The reference count
|
||||
of the BIO is not incremented.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item NULL
|
||||
|
||||
No BIO was connected to the SSL
|
||||
|
||||
=item Any other pointer
|
||||
|
||||
The BIO linked to B<ssl>.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_set_bio(3)|SSL_set_bio(3)>, L<ssl(3)|ssl(3)> , L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
48
doc/ssl/SSL_get_session.pod
Normal file
48
doc/ssl/SSL_get_session.pod
Normal file
@ -0,0 +1,48 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_get_session - Retrieve SSL session data
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
SSL_SESSION *SSL_get_session(SSL *ssl);
|
||||
SSL_SESSION *SSL_get0_session(SSL *ssl);
|
||||
SSL_SESSION *SSL_get1_session(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_get_session() returns a pointer to the SSL session actually used in
|
||||
B<ssl>. The reference count of the SSL session is not incremented, so
|
||||
that the pointer can become invalid when the B<ssl> is freed and
|
||||
SSL_SESSION_free() is implicitly called.
|
||||
|
||||
SSL_get0_session() is the same as SSL_get_session().
|
||||
|
||||
SSL_get1_session() is the same as SSL_get_session(), but the reference
|
||||
count of the SSL session is incremented by one.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item NULL
|
||||
|
||||
There is no session available in B<ssl>.
|
||||
|
||||
=item Pointer to an SSL
|
||||
|
||||
The return value points to the data of an SSL session.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<ssl(3)|ssl(3)>, L<SSL_free(3)|SSL_free(3)>,
|
||||
L<SSL_SESSION_free(3)|SSL_SESSION_free(3)>
|
||||
|
||||
=cut
|
42
doc/ssl/SSL_new.pod
Normal file
42
doc/ssl/SSL_new.pod
Normal file
@ -0,0 +1,42 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_new - Create a new SSL structure for a connection
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
SSL *SSL_new(SSL_CTX *ctx);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_new() creates a new B<SSL> structure which is needed to hold the data
|
||||
for a SSL connection. The new SSL inherits the settings of the underlying
|
||||
context B<ctx>: connection method (SSLv2/v3/TLSv1), options, verification
|
||||
settings, timeout settings.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item NULL
|
||||
|
||||
The creation of a new SSL failed. Check the error stack to find out the
|
||||
reason.
|
||||
|
||||
=item Pointer to an SSL
|
||||
|
||||
The return value points to an allocated SSL structure.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_free(3)|SSL_free(3)>, L<SSL_clear(3)|SSL_clear(3)>,
|
||||
L<ssl(3)|ssl(3)>
|
||||
|
||||
=cut
|
67
doc/ssl/SSL_read.pod
Normal file
67
doc/ssl/SSL_read.pod
Normal file
@ -0,0 +1,67 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_read - Read bytes from a TLS connection.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_read(SSL *ssl, char *buf, int num);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_read() tries to read B<num> bytes from the specified B<ssl> into the
|
||||
buffer B<buf>. If necessary, SSL_read() will negotiate a TLS session, if
|
||||
not already explicitely performed by SSL_connect() or SSL_accept(). If the
|
||||
peer requests a re-negotiation, it will be performed transparently during
|
||||
the SSL_read() operation. The behaviour of SSL_read() depends on the
|
||||
underlying BIO.
|
||||
|
||||
If the underlying BIO is B<blocking>, SSL_read() will only return, once the
|
||||
read operation has been finished or an error occured.
|
||||
|
||||
If the underlying BIO is B<non-blocking>, SSL_read() will also return,
|
||||
when the underlying BIO could not satisfy the needs of SSL_read()
|
||||
to continue the operation. In this case a call to SSL_get_error() with the
|
||||
return value of SSL_read() will yield SSL_ERROR_WANT_READ or
|
||||
SSL_ERROR_WANT_WRITE. As at any time a re-negotiation is possible, a
|
||||
call to SSL_read() can also cause write operations! The calling process
|
||||
then must repeat the call after taking appropriate action to satisfy the
|
||||
needs of SSL_read(). The action depends on the underlying BIO. When using a
|
||||
non-blocking socket, nothing is to be done, but select() can be used to check
|
||||
for the required condition. When using a buffering BIO, like a BIO pair, data
|
||||
must be written into or retrieved out of the BIO before being able to continue.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item E<gt>0
|
||||
|
||||
The read operation was successfull, the return value is the number of
|
||||
bytes actually read from the TLS connection.
|
||||
|
||||
=item 0
|
||||
|
||||
The read operation was not successfull, probably because no data was
|
||||
available. Call SSL_get_error() with the return value B<ret> to find out,
|
||||
whether an error occured.
|
||||
|
||||
=item -1
|
||||
|
||||
The read operation was not successfull, because either an error occured
|
||||
or action must be taken by the calling process. Call SSL_get_error() with the
|
||||
return value B<ret> to find out the reason.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_write(3)|SSL_write(3)>,
|
||||
L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
34
doc/ssl/SSL_set_bio.pod
Normal file
34
doc/ssl/SSL_set_bio.pod
Normal file
@ -0,0 +1,34 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_set_bio - Connect the SSL with a BIO
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
void SSL_set_bio(SSL *ssl, BIO *rbio, BIO *wbio);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_set_bio() connects the BIOs B<rbio> and B<wbio> for the read and write
|
||||
operations of the TLS (encrypted) side of B<ssl>.
|
||||
|
||||
The SSL engine inherits the behaviour of B<rbio> and B<wbio>, respectively.
|
||||
If a BIO is non-blocking, the B<ssl> will also have non-blocking behaviour.
|
||||
|
||||
If there was already a BIO connected to B<ssl>, BIO_free() will be called
|
||||
(for both the reading and writing side, if different).
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
SSL_set_bio() cannot fail.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_rbio(3)|SSL_get_rbio(3)>,
|
||||
L<SSL_connect(3)|SSL_connect(3)>, L<SSL_accept(3)|SSL_accept(3)>,
|
||||
L<SSL_shutdown(3)|SSL_shutdown(3)>, L<ssl(3)|ssl(3)> , L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
54
doc/ssl/SSL_set_fd.pod
Normal file
54
doc/ssl/SSL_set_fd.pod
Normal file
@ -0,0 +1,54 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_set_fd - Connect the SSL with a file descriptor
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_set_fd(SSL *ssl, int fd);
|
||||
int SSL_set_rfd(SSL *ssl, int fd);
|
||||
int SSL_set_wfd(SSL *ssl, int fd);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_set_fd() sets the file descriptor B<fd> as the input/output facility
|
||||
for the TLS (encrypted) side of SSL engine. B<fd> will typically be the
|
||||
socket file descriptor of a network connection.
|
||||
|
||||
When performing the operation, a B<socket BIO> is automatically created to
|
||||
interface between the B<ssl> and B<fd>. The BIO and hence the SSL engine
|
||||
inherit the behaviour of B<fd>. If B<fd> is non-blocking, the B<ssl> will
|
||||
also have non-blocking behaviour.
|
||||
|
||||
If there was already a BIO connected to B<ssl>, BIO_free() will be called
|
||||
(for both the reading and writing side, if different).
|
||||
|
||||
SSL_set_rfd() and SSL_set_wfd() perform the respective action but only
|
||||
for the read channel or the write channel, which can be set independantly.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 0
|
||||
|
||||
The operation failed. Check the error stack to find out why.
|
||||
|
||||
=item 1
|
||||
|
||||
The operation succeeded.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_fd(3)|SSL_get_fd(3)>, L<SSL_set_bio(3)|SSL_set_bio(3)>,
|
||||
L<SSL_connect(3)|SSL_connect(3)>, L<SSL_accept(3)|SSL_accept(3)>,
|
||||
L<SSL_shutdown(3)|SSL_shutdown(3)>, L<ssl(3)|ssl(3)> , L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
45
doc/ssl/SSL_set_session.pod
Normal file
45
doc/ssl/SSL_set_session.pod
Normal file
@ -0,0 +1,45 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_set_session - Set an SSL session to be used during SSL connect
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int *SSL_set_session(SSL *ssl, SSL_SESSION *session);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_set_session() sets B<session> to be used, when the SSL connection
|
||||
is to be established. SSL_set_session() is only useful for SSL clients.
|
||||
When the session is set, the reference count of B<session> is incremented
|
||||
by 1. If the session is not reused, the reference count is decremented
|
||||
again during SSL_connect().
|
||||
|
||||
If there is already a session set inside B<ssl> (because it was set with
|
||||
SSL_set_session() before or because the same B<ssl> was already used for
|
||||
a connection) SSL_SESSION_free() will be called for that session.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 0
|
||||
|
||||
The operation failed, check the error stack to find out the reason.
|
||||
|
||||
=item 1
|
||||
|
||||
The operation succeeded.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<ssl(3)|ssl(3)>, L<SSL_SESSION_free(3)|SSL_SESSION_free(3)>
|
||||
|
||||
=cut
|
62
doc/ssl/SSL_shutdown.pod
Normal file
62
doc/ssl/SSL_shutdown.pod
Normal file
@ -0,0 +1,62 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_shutdown - Shut down a TLS connection
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_shutdown(SSL *ssl);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_shutdown() shuts down an active TLS connection. It sends the shutdown
|
||||
alert to the peer. The behaviour of SSL_shutdown() depends on the underlying
|
||||
BIO.
|
||||
|
||||
If the underlying BIO is B<blocking>, SSL_shutdown() will only return, once the
|
||||
handshake has been finished or an error occured.
|
||||
|
||||
If the underlying BIO is B<non-blocking>, SSL_shutdown() will also return,
|
||||
when the underlying BIO could not satisfy the needs of SSL_shutdown()
|
||||
to continue the handshake. In this case a call to SSL_get_error() with the
|
||||
return value of SSL_shutdown() will yield SSL_ERROR_WANT_READ or
|
||||
SSL_ERROR_WANT_WRITE. The calling process then must repeat the call after
|
||||
taking appropriate action to satisfy the needs of SSL_shutdown().
|
||||
The action depends on the underlying BIO. When using a non-blocking socket,
|
||||
nothing is to be done, but select() can be used to check for the required
|
||||
condition. When using a buffering BIO, like a BIO pair, data must be written
|
||||
into or retrieved out of the BIO before being able to continue.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item 1
|
||||
|
||||
The shutdown was successfully completed.
|
||||
|
||||
=item 0
|
||||
|
||||
The shutdown was not successfull. Call SSL_get_error() with the return
|
||||
value B<ret> to find out the reason.
|
||||
|
||||
=item -1
|
||||
|
||||
The shutdown was not successfull, because a fatal error occured either
|
||||
at the protocol level or a connection failure occured. It can also occure of
|
||||
action is need to continue the operation for non-blocking BIOs.
|
||||
Call SSL_get_error() with the return value B<ret> to find out the reason.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_connect(3)|SSL_connect(3)>,
|
||||
L<SSL_accept(3)|SSL_accept(3)>, L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
66
doc/ssl/SSL_write.pod
Normal file
66
doc/ssl/SSL_write.pod
Normal file
@ -0,0 +1,66 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SSL_read - Write bytes to a TLS connection.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
|
||||
int SSL_write(SSL *ssl, char *buf, int num);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SSL_write() writes B<num> bytes from the buffer B<buf> into the specified
|
||||
B<ssl>. If necessary, SSL_write() will negotiate a TLS session, if
|
||||
not already explicitely performed by SSL_connect() or SSL_accept(). If the
|
||||
peer requests a re-negotiation, it will be performed transparently during
|
||||
the SSL_write() operation. The behaviour of SSL_write() depends on the
|
||||
underlying BIO.
|
||||
|
||||
If the underlying BIO is B<blocking>, SSL_write() will only return, once the
|
||||
write operation has been finished or an error occured.
|
||||
|
||||
If the underlying BIO is B<non-blocking>, SSL_write() will also return,
|
||||
when the underlying BIO could not satisfy the needs of SSL_write()
|
||||
to continue the operation. In this case a call to SSL_get_error() with the
|
||||
return value of SSL_write() will yield SSL_ERROR_WANT_READ or
|
||||
SSL_ERROR_WANT_WRITE. As at any time a re-negotiation is possible, a
|
||||
call to SSL_write() can also cause write operations! The calling process
|
||||
then must repeat the call after taking appropriate action to satisfy the
|
||||
needs of SSL_write(). The action depends on the underlying BIO. When using a
|
||||
non-blocking socket, nothing is to be done, but select() can be used to check
|
||||
for the required condition. When using a buffering BIO, like a BIO pair, data
|
||||
must be written into or retrieved out of the BIO before being able to continue.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
The following return values can occur:
|
||||
|
||||
=over 4
|
||||
|
||||
=item E<gt>0
|
||||
|
||||
The write operation was successfull, the return value is the number of
|
||||
bytes actually written to the TLS connection.
|
||||
|
||||
=item 0
|
||||
|
||||
The write operation was not successfull. Call SSL_get_error() with the return
|
||||
value B<ret> to find out, whether an error occured.
|
||||
|
||||
=item -1
|
||||
|
||||
The read operation was not successfull, because either an error occured
|
||||
or action must be taken by the calling process. Call SSL_get_error() with the
|
||||
return value B<ret> to find out the reason.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<SSL_get_error(3)|SSL_get_error(3)>, L<SSL_read(3)|SSL_read(3)>,
|
||||
L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
|
||||
|
||||
=cut
|
210
openssl.spec
Normal file
210
openssl.spec
Normal file
@ -0,0 +1,210 @@
|
||||
%define libmaj 0
|
||||
%define libmin 9
|
||||
%define librel 6
|
||||
#%define librev
|
||||
Release: 1
|
||||
|
||||
%define openssldir /var/ssl
|
||||
|
||||
Summary: Secure Sockets Layer and cryptography libraries and tools
|
||||
Name: openssl
|
||||
Version: %{libmaj}.%{libmin}.%{librel}
|
||||
#Version: %{libmaj}.%{libmin}.%{librel}%{librev}
|
||||
Source0: ftp://ftp.openssl.org/source/%{name}-%{version}.tar.gz
|
||||
Copyright: Freely distributable
|
||||
Group: System Environment/Libraries
|
||||
Provides: SSL
|
||||
URL: http://www.openssl.org/
|
||||
Packager: Damien Miller <djm@mindrot.org>
|
||||
BuildRoot: /var/tmp/%{name}-%{version}-root
|
||||
|
||||
%description
|
||||
The OpenSSL Project is a collaborative effort to develop a robust,
|
||||
commercial-grade, fully featured, and Open Source toolkit implementing the
|
||||
Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1)
|
||||
protocols with full-strength cryptography world-wide. The project is
|
||||
managed by a worldwide community of volunteers that use the Internet to
|
||||
communicate, plan, and develop the OpenSSL tookit and its related
|
||||
documentation.
|
||||
|
||||
OpenSSL is based on the excellent SSLeay library developed from Eric A.
|
||||
Young and Tim J. Hudson. The OpenSSL toolkit is licensed under an
|
||||
Apache-style licence, which basically means that you are free to get and
|
||||
use it for commercial and non-commercial purposes.
|
||||
|
||||
This package contains the base OpenSSL cryptography and SSL/TLS
|
||||
libraries and tools.
|
||||
|
||||
%package devel
|
||||
Summary: Secure Sockets Layer and cryptography static libraries and headers
|
||||
Group: Development/Libraries
|
||||
Requires: openssl
|
||||
%description devel
|
||||
The OpenSSL Project is a collaborative effort to develop a robust,
|
||||
commercial-grade, fully featured, and Open Source toolkit implementing the
|
||||
Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1)
|
||||
protocols with full-strength cryptography world-wide. The project is
|
||||
managed by a worldwide community of volunteers that use the Internet to
|
||||
communicate, plan, and develop the OpenSSL tookit and its related
|
||||
documentation.
|
||||
|
||||
OpenSSL is based on the excellent SSLeay library developed from Eric A.
|
||||
Young and Tim J. Hudson. The OpenSSL toolkit is licensed under an
|
||||
Apache-style licence, which basically means that you are free to get and
|
||||
use it for commercial and non-commercial purposes.
|
||||
|
||||
This package contains the the OpenSSL cryptography and SSL/TLS
|
||||
static libraries and header files required when developing applications.
|
||||
|
||||
%package doc
|
||||
Summary: OpenSSL miscellaneous files
|
||||
Group: Documentation
|
||||
Requires: openssl
|
||||
%description doc
|
||||
The OpenSSL Project is a collaborative effort to develop a robust,
|
||||
commercial-grade, fully featured, and Open Source toolkit implementing the
|
||||
Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1)
|
||||
protocols with full-strength cryptography world-wide. The project is
|
||||
managed by a worldwide community of volunteers that use the Internet to
|
||||
communicate, plan, and develop the OpenSSL tookit and its related
|
||||
documentation.
|
||||
|
||||
OpenSSL is based on the excellent SSLeay library developed from Eric A.
|
||||
Young and Tim J. Hudson. The OpenSSL toolkit is licensed under an
|
||||
Apache-style licence, which basically means that you are free to get and
|
||||
use it for commercial and non-commercial purposes.
|
||||
|
||||
This package contains the the OpenSSL cryptography and SSL/TLS extra
|
||||
documentation and POD files from which the man pages were produced.
|
||||
|
||||
%prep
|
||||
|
||||
%setup -q
|
||||
|
||||
%build
|
||||
|
||||
%define CONFIG_FLAGS -DSSL_ALLOW_ADH --prefix=/usr
|
||||
|
||||
perl util/perlpath.pl /usr/bin/perl
|
||||
|
||||
%ifarch i386 i486 i586 i686
|
||||
./Configure %{CONFIG_FLAGS} --openssldir=%{openssldir} linux-elf shared
|
||||
%endif
|
||||
%ifarch ppc
|
||||
./Configure %{CONFIG_FLAGS} --openssldir=%{openssldir} linux-ppc shared
|
||||
%endif
|
||||
%ifarch alpha
|
||||
./Configure %{CONFIG_FLAGS} --openssldir=%{openssldir} linux-alpha shared
|
||||
%endif
|
||||
LD_LIBRARY_PATH=`pwd` make
|
||||
LD_LIBRARY_PATH=`pwd` make rehash
|
||||
LD_LIBRARY_PATH=`pwd` make test
|
||||
|
||||
%install
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
make install MANDIR=/usr/man INSTALL_PREFIX="$RPM_BUILD_ROOT"
|
||||
|
||||
# Rename manpages
|
||||
for x in $RPM_BUILD_ROOT/usr/man/man*/*
|
||||
do mv ${x} ${x}ssl
|
||||
done
|
||||
|
||||
# Install RSAref stuff
|
||||
install -m644 rsaref/rsaref.h $RPM_BUILD_ROOT/usr/include/openssl
|
||||
install -m644 libRSAglue.a $RPM_BUILD_ROOT/usr/lib
|
||||
|
||||
# Make backwards-compatibility symlink to ssleay
|
||||
ln -s /usr/bin/openssl $RPM_BUILD_ROOT/usr/bin/ssleay
|
||||
|
||||
# Install shared libs
|
||||
install -m644 libcrypto.a $RPM_BUILD_ROOT/usr/lib
|
||||
install -m755 libcrypto.so.%{libmaj}.%{libmin}.%{librel} $RPM_BUILD_ROOT/usr/lib
|
||||
install -m644 libssl.a $RPM_BUILD_ROOT/usr/lib
|
||||
install -m755 libssl.so.%{libmaj}.%{libmin}.%{librel} $RPM_BUILD_ROOT/usr/lib
|
||||
(
|
||||
cd $RPM_BUILD_ROOT/usr/lib
|
||||
ln -s libcrypto.so.%{libmaj}.%{libmin}.%{librel} libcrypto.so.%{libmaj}
|
||||
ln -s libcrypto.so.%{libmaj}.%{libmin}.%{librel} libcrypto.so
|
||||
ln -s libssl.so.%{libmaj}.%{libmin}.%{librel} libssl.so.%{libmaj}
|
||||
ln -s libssl.so.%{libmaj}.%{libmin}.%{librel} libssl.so
|
||||
)
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
%defattr(0644,root,root,0755)
|
||||
%doc CHANGES CHANGES.SSLeay LICENSE NEWS README
|
||||
|
||||
%attr(0755,root,root) /usr/bin/*
|
||||
%attr(0755,root,root) /usr/lib/*.so*
|
||||
%attr(0755,root,root) %{openssldir}/misc/*
|
||||
%attr(0644,root,root) /usr/man/man[157]/*
|
||||
|
||||
%config %attr(0644,root,root) %{openssldir}/openssl.cnf
|
||||
%dir %attr(0755,root,root) %{openssldir}/certs
|
||||
%dir %attr(0755,root,root) %{openssldir}/lib
|
||||
%dir %attr(0755,root,root) %{openssldir}/misc
|
||||
%dir %attr(0750,root,root) %{openssldir}/private
|
||||
|
||||
%files devel
|
||||
%doc CHANGES CHANGES.SSLeay LICENSE NEWS README
|
||||
|
||||
%defattr(0644,root,root,0755)
|
||||
%attr(0644,root,root) /usr/lib/*.a
|
||||
%attr(0644,root,root) /usr/include/openssl/*
|
||||
%attr(0644,root,root) /usr/man/man[3]/*
|
||||
|
||||
%files doc
|
||||
%doc CHANGES CHANGES.SSLeay LICENSE NEWS README
|
||||
%doc doc
|
||||
|
||||
%post
|
||||
ldconfig
|
||||
|
||||
%postun
|
||||
ldconfig
|
||||
|
||||
%changelog
|
||||
* Thu Sep 14 2000 Richard Levitte <richard@levitte.org>
|
||||
- Changed to adapt to the new (supported) way of making shared libraries
|
||||
- Installs all static libraries, not just libRSAglue.a
|
||||
- Extra documents now end up in a separate document package
|
||||
* Sun Feb 27 2000 Damien Miller <djm@mindrot.org>
|
||||
- Merged patches to spec
|
||||
- Updated to 0.9.5beta2 (now with manpages)
|
||||
* Sat Feb 5 2000 Michal Jaegermann <michal@harddata.com>
|
||||
- added 'linux-alpha' to configuration
|
||||
- fixed nasty absolute links
|
||||
* Tue Jan 25 2000 Bennett Todd <bet@rahul.net>
|
||||
- Added -DSSL_ALLOW_ADH, bumped Release to 4
|
||||
* Thu Oct 14 1999 Damien Miller <djm@mindrot.org>
|
||||
- Set default permissions
|
||||
- Removed documentation from devel sub-package
|
||||
* Thu Sep 30 1999 Damien Miller <djm@mindrot.org>
|
||||
- Added "make test" stage
|
||||
- GPG signed
|
||||
* Tue Sep 10 1999 Damien Miller <damien@ibs.com.au>
|
||||
- Updated to version 0.9.4
|
||||
* Tue May 25 1999 Damien Miller <damien@ibs.com.au>
|
||||
- Updated to version 0.9.3
|
||||
- Added attributes for all files
|
||||
- Paramatised openssl directory
|
||||
* Sat Mar 20 1999 Carlo M. Arenas Belon <carenas@jmconsultores.com.pe>
|
||||
- Added "official" bnrec patch and taking other out
|
||||
- making a link from ssleay to openssl binary
|
||||
- putting all changelog together on SPEC file
|
||||
* Fri Mar 5 1999 Henri Gomez <gomez@slib.fr>
|
||||
- Added bnrec patch
|
||||
* Tue Dec 29 1998 Jonathan Ruano <kobalt@james.encomix.es>
|
||||
- minimum spec and patches changes for openssl
|
||||
- modified for openssl sources
|
||||
* Sat Aug 8 1998 Khimenko Victor <khim@sch57.msk.ru>
|
||||
- shared library creating process honours $RPM_OPT_FLAGS
|
||||
- shared libarry supports threads (as well as static library)
|
||||
* Wed Jul 22 1998 Khimenko Victor <khim@sch57.msk.ru>
|
||||
- building of shared library completely reworked
|
||||
* Tue Jul 21 1998 Khimenko Victor <khim@sch57.msk.ru>
|
||||
- RPM is BuildRoot'ed
|
||||
* Tue Feb 10 1998 Khimenko Victor <khim@sch57.msk.ru>
|
||||
- all stuff is moved out of /usr/local
|
Loading…
x
Reference in New Issue
Block a user