Use rdmd so the bot can be used as a script
This commit is contained in:
parent
9bc0ac40f7
commit
1d1d4d5a87
|
@ -0,0 +1,17 @@
|
|||
module deimos.openssl._d_util;
|
||||
|
||||
public import core.stdc.config;
|
||||
version (OPENSSL_NO_FP_API) {} else { public import core.stdc.stdio; }
|
||||
|
||||
package:
|
||||
|
||||
// Very boiled down version because we cannot use std.traits without causing
|
||||
// DMD to create a ModuleInfo reference for _d_util, which would require users
|
||||
// to include the Deimos files in the build.
|
||||
template ExternC(T) if (is(typeof(*(T.init)) P == function)) {
|
||||
static if (is(typeof(*(T.init)) R == return)) {
|
||||
static if (is(typeof(*(T.init)) P == function)) {
|
||||
alias extern(C) R function(P) ExternC;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,140 @@
|
|||
/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2002 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
|
||||
* openssl-core@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.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.aes;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_AES) {
|
||||
static assert(false, "AES is disabled.");
|
||||
}
|
||||
|
||||
import core.stdc.config;
|
||||
|
||||
enum AES_ENCRYPT = 1;
|
||||
enum AES_DECRYPT = 0;
|
||||
|
||||
/* Because array size can't be a const in C, the following two are macros.
|
||||
Both sizes are in bytes. */
|
||||
enum AES_MAXNR = 14;
|
||||
enum AES_BLOCK_SIZE = 16;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* This should be a hidden type, but EVP requires that the size be known */
|
||||
struct aes_key_st {
|
||||
version (AES_LONG) {
|
||||
c_ulong[4* (AES_MAXNR + 1)] rd_key;
|
||||
} else {
|
||||
uint[4* (AES_MAXNR + 1)] rd_key;
|
||||
}
|
||||
int rounds;
|
||||
};
|
||||
alias aes_key_st AES_KEY;
|
||||
|
||||
const(char)* AES_options();
|
||||
|
||||
int AES_set_encrypt_key(const(ubyte)* userKey, const int bits,
|
||||
AES_KEY* key);
|
||||
int AES_set_decrypt_key(const(ubyte)* userKey, const int bits,
|
||||
AES_KEY* key);
|
||||
|
||||
int private_AES_set_encrypt_key(const(ubyte)* userKey, const int bits,
|
||||
AES_KEY *key);
|
||||
int private_AES_set_decrypt_key(const(ubyte)* userKey, const int bits,
|
||||
AES_KEY *key);
|
||||
|
||||
void AES_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(AES_KEY)* key);
|
||||
void AES_decrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(AES_KEY)* key);
|
||||
|
||||
void AES_ecb_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(AES_KEY)* key, const int enc);
|
||||
void AES_cbc_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte* ivec, const int enc);
|
||||
void AES_cfb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte* ivec, int* num, const int enc);
|
||||
void AES_cfb1_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte* ivec, int* num, const int enc);
|
||||
void AES_cfb8_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte* ivec, int* num, const int enc);
|
||||
void AES_ofb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte* ivec, int* num);
|
||||
void AES_ctr128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte[AES_BLOCK_SIZE] ivec,
|
||||
ubyte[AES_BLOCK_SIZE] ecount_buf,
|
||||
uint* num);
|
||||
/* NB: the IV is _two_ blocks long */
|
||||
void AES_ige_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
ubyte* ivec, const int enc);
|
||||
/* NB: the IV is _four_ blocks long */
|
||||
void AES_bi_ige_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(AES_KEY)* key,
|
||||
const(AES_KEY)* key2, const(ubyte)* ivec,
|
||||
const int enc);
|
||||
|
||||
int AES_wrap_key(AES_KEY* key, const(ubyte)* iv,
|
||||
ubyte* out_,
|
||||
const(ubyte)* in_, uint inlen);
|
||||
int AES_unwrap_key(AES_KEY* key, const(ubyte)* iv,
|
||||
ubyte* out_,
|
||||
const(ubyte)* in_, uint inlen);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,577 @@
|
|||
/* crypto/asn1/asn1_mac.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.asn1_mac;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.err; // Needed for ERR_LIB_ASN1.
|
||||
|
||||
public import deimos.openssl.asn1;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
// #ifndef ASN1_MAC_ERR_LIB
|
||||
alias ERR_LIB_ASN1 ASN1_MAC_ERR_LIB;
|
||||
// #endif
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
#define ASN1_MAC_H_err(f,r,line) \
|
||||
ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line))
|
||||
|
||||
#define M_ASN1_D2I_vars(a,type,func) \
|
||||
ASN1_const_CTX c; \
|
||||
type ret=NULL; \
|
||||
\
|
||||
c.pp=(const(ubyte)**)pp; \
|
||||
c.q= *(const(ubyte)**)pp; \
|
||||
c.error=ERR_R_NESTED_ASN1_ERROR; \
|
||||
if ((a == NULL) || ((*a) == NULL)) \
|
||||
{ if ((ret=(type)func()) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } } \
|
||||
else ret=(*a);
|
||||
|
||||
#define M_ASN1_D2I_Init() \
|
||||
c.p= *(const(ubyte)**)pp; \
|
||||
c.max=(length == 0)?0:(c.p+length);
|
||||
|
||||
#define M_ASN1_D2I_Finish_2(a) \
|
||||
if (!asn1_const_Finish(&c)) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
*(const(ubyte)**)pp=c.p; \
|
||||
if (a != NULL) (*a)=ret; \
|
||||
return(ret);
|
||||
|
||||
#define M_ASN1_D2I_Finish(a,func,e) \
|
||||
M_ASN1_D2I_Finish_2(a); \
|
||||
err:\
|
||||
ASN1_MAC_H_err((e),c.error,c.line); \
|
||||
asn1_add_error(*(const(ubyte)**)pp,(int)(c.q- *pp)); \
|
||||
if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
|
||||
return(NULL)
|
||||
|
||||
#define M_ASN1_D2I_start_sequence() \
|
||||
if (!asn1_GetSequence(&c,&length)) \
|
||||
{ c.line=__LINE__; goto err; }
|
||||
/* Begin reading ASN1 without a surrounding sequence */
|
||||
#define M_ASN1_D2I_begin() \
|
||||
c.slen = length;
|
||||
|
||||
/* End reading ASN1 with no check on length */
|
||||
#define M_ASN1_D2I_Finish_nolen(a, func, e) \
|
||||
*pp=c.p; \
|
||||
if (a != NULL) (*a)=ret; \
|
||||
return(ret); \
|
||||
err:\
|
||||
ASN1_MAC_H_err((e),c.error,c.line); \
|
||||
asn1_add_error(*pp,(int)(c.q- *pp)); \
|
||||
if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
|
||||
return(NULL)
|
||||
|
||||
#define M_ASN1_D2I_end_sequence() \
|
||||
(((c.inf&1) == 0)?(c.slen <= 0): \
|
||||
(c.eos=ASN1_const_check_infinite_end(&c.p,c.slen)))
|
||||
|
||||
/* Don't use this with d2i_ASN1_BOOLEAN() */
|
||||
#define M_ASN1_D2I_get(b, func) \
|
||||
c.q=c.p; \
|
||||
if (func(&(b),&c.p,c.slen) == NULL) \
|
||||
{c.line=__LINE__; goto err; } \
|
||||
c.slen-=(c.p-c.q);
|
||||
|
||||
/* Don't use this with d2i_ASN1_BOOLEAN() */
|
||||
#define M_ASN1_D2I_get_x(type,b,func) \
|
||||
c.q=c.p; \
|
||||
if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \
|
||||
{c.line=__LINE__; goto err; } \
|
||||
c.slen-=(c.p-c.q);
|
||||
|
||||
/* use this instead () */
|
||||
#define M_ASN1_D2I_get_int(b,func) \
|
||||
c.q=c.p; \
|
||||
if (func(&(b),&c.p,c.slen) < 0) \
|
||||
{c.line=__LINE__; goto err; } \
|
||||
c.slen-=(c.p-c.q);
|
||||
|
||||
#define M_ASN1_D2I_get_opt(b,func,type) \
|
||||
if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \
|
||||
== (V_ASN1_UNIVERSAL|(type)))) \
|
||||
{ \
|
||||
M_ASN1_D2I_get(b,func); \
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_int_opt(b,func,type) \
|
||||
if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \
|
||||
== (V_ASN1_UNIVERSAL|(type)))) \
|
||||
{ \
|
||||
M_ASN1_D2I_get_int(b,func); \
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_imp(b,func, type) \
|
||||
M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \
|
||||
c.q=c.p; \
|
||||
if (func(&(b),&c.p,c.slen) == NULL) \
|
||||
{c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \
|
||||
c.slen-=(c.p-c.q);\
|
||||
M_ASN1_next_prev=_tmp;
|
||||
|
||||
#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \
|
||||
if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \
|
||||
(V_ASN1_CONTEXT_SPECIFIC|(tag)))) \
|
||||
{ \
|
||||
ubyte _tmp = M_ASN1_next; \
|
||||
M_ASN1_D2I_get_imp(b,func, type);\
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_set(r,func,free_func) \
|
||||
M_ASN1_D2I_get_imp_set(r,func,free_func, \
|
||||
V_ASN1_SET,V_ASN1_UNIVERSAL);
|
||||
|
||||
#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
|
||||
M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
|
||||
V_ASN1_SET,V_ASN1_UNIVERSAL);
|
||||
|
||||
#define M_ASN1_D2I_get_set_opt(r,func,free_func) \
|
||||
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
|
||||
V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
|
||||
{ M_ASN1_D2I_get_set(r,func,free_func); }
|
||||
|
||||
#define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \
|
||||
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
|
||||
V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
|
||||
{ M_ASN1_D2I_get_set_type(type,r,func,free_func); }
|
||||
|
||||
#define M_ASN1_I2D_len_SET_opt(a,f) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
M_ASN1_I2D_len_SET(a,f);
|
||||
|
||||
#define M_ASN1_I2D_put_SET_opt(a,f) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
M_ASN1_I2D_put_SET(a,f);
|
||||
|
||||
#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
M_ASN1_I2D_put_SEQUENCE(a,f);
|
||||
|
||||
#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
M_ASN1_I2D_put_SEQUENCE_type(type,a,f);
|
||||
|
||||
#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
|
||||
if ((c.slen != 0) && \
|
||||
(M_ASN1_next == \
|
||||
(V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
|
||||
{ \
|
||||
M_ASN1_D2I_get_imp_set(b,func,free_func,\
|
||||
tag,V_ASN1_CONTEXT_SPECIFIC); \
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \
|
||||
if ((c.slen != 0) && \
|
||||
(M_ASN1_next == \
|
||||
(V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
|
||||
{ \
|
||||
M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\
|
||||
tag,V_ASN1_CONTEXT_SPECIFIC); \
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_seq(r,func,free_func) \
|
||||
M_ASN1_D2I_get_imp_set(r,func,free_func,\
|
||||
V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
|
||||
|
||||
#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
|
||||
M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
|
||||
V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
|
||||
|
||||
#define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
|
||||
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
|
||||
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
|
||||
{ M_ASN1_D2I_get_seq(r,func,free_func); }
|
||||
|
||||
#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
|
||||
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
|
||||
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
|
||||
{ M_ASN1_D2I_get_seq_type(type,r,func,free_func); }
|
||||
|
||||
#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
|
||||
M_ASN1_D2I_get_imp_set(r,func,free_func,\
|
||||
x,V_ASN1_CONTEXT_SPECIFIC);
|
||||
|
||||
#define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \
|
||||
M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
|
||||
x,V_ASN1_CONTEXT_SPECIFIC);
|
||||
|
||||
#define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
|
||||
c.q=c.p; \
|
||||
if (d2i_ASN1_SET(&(r),&c.p,c.slen,(ExternC!(char* function()) )func,\
|
||||
(ExternC!(void function()) )free_func,a,b) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
c.slen-=(c.p-c.q);
|
||||
|
||||
#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
|
||||
c.q=c.p; \
|
||||
if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
|
||||
free_func,a,b) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
c.slen-=(c.p-c.q);
|
||||
|
||||
#define M_ASN1_D2I_get_set_strings(r,func,a,b) \
|
||||
c.q=c.p; \
|
||||
if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
c.slen-=(c.p-c.q);
|
||||
|
||||
#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
|
||||
if ((c.slen != 0L) && (M_ASN1_next == \
|
||||
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
|
||||
{ \
|
||||
int Tinf,Ttag,Tclass; \
|
||||
c_long Tlen; \
|
||||
\
|
||||
c.q=c.p; \
|
||||
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
|
||||
if (Tinf & 0x80) \
|
||||
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
|
||||
c.line=__LINE__; goto err; } \
|
||||
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
|
||||
Tlen = c.slen - (c.p - c.q) - 2; \
|
||||
if (func(&(r),&c.p,Tlen) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
|
||||
Tlen = c.slen - (c.p - c.q); \
|
||||
if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \
|
||||
{ c.error=ERR_R_MISSING_ASN1_EOS; \
|
||||
c.line=__LINE__; goto err; } \
|
||||
}\
|
||||
c.slen-=(c.p-c.q); \
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
|
||||
if ((c.slen != 0) && (M_ASN1_next == \
|
||||
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
|
||||
{ \
|
||||
int Tinf,Ttag,Tclass; \
|
||||
c_long Tlen; \
|
||||
\
|
||||
c.q=c.p; \
|
||||
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
|
||||
if (Tinf & 0x80) \
|
||||
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
|
||||
c.line=__LINE__; goto err; } \
|
||||
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
|
||||
Tlen = c.slen - (c.p - c.q) - 2; \
|
||||
if (d2i_ASN1_SET(&(r),&c.p,Tlen,(ExternC!(char* function()) )func, \
|
||||
(ExternC!(void function()) )free_func, \
|
||||
b,V_ASN1_UNIVERSAL) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
|
||||
Tlen = c.slen - (c.p - c.q); \
|
||||
if(!ASN1_check_infinite_end(&c.p, Tlen)) \
|
||||
{ c.error=ERR_R_MISSING_ASN1_EOS; \
|
||||
c.line=__LINE__; goto err; } \
|
||||
}\
|
||||
c.slen-=(c.p-c.q); \
|
||||
}
|
||||
|
||||
#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
|
||||
if ((c.slen != 0) && (M_ASN1_next == \
|
||||
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
|
||||
{ \
|
||||
int Tinf,Ttag,Tclass; \
|
||||
c_long Tlen; \
|
||||
\
|
||||
c.q=c.p; \
|
||||
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
|
||||
if (Tinf & 0x80) \
|
||||
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
|
||||
c.line=__LINE__; goto err; } \
|
||||
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
|
||||
Tlen = c.slen - (c.p - c.q) - 2; \
|
||||
if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
|
||||
free_func,b,V_ASN1_UNIVERSAL) == NULL) \
|
||||
{ c.line=__LINE__; goto err; } \
|
||||
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
|
||||
Tlen = c.slen - (c.p - c.q); \
|
||||
if(!ASN1_check_infinite_end(&c.p, Tlen)) \
|
||||
{ c.error=ERR_R_MISSING_ASN1_EOS; \
|
||||
c.line=__LINE__; goto err; } \
|
||||
}\
|
||||
c.slen-=(c.p-c.q); \
|
||||
}
|
||||
|
||||
/* New macros */
|
||||
#define M_ASN1_New_Malloc(ret,type) \
|
||||
if ((ret=(type*)OPENSSL_malloc(sizeof(type))) == NULL) \
|
||||
{ c.line=__LINE__; goto err2; }
|
||||
|
||||
#define M_ASN1_New(arg,func) \
|
||||
if (((arg)=func()) == NULL) return(NULL)
|
||||
|
||||
#define M_ASN1_New_Error(a) \
|
||||
/* err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \
|
||||
return(NULL);*/ \
|
||||
err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
|
||||
return(NULL)
|
||||
|
||||
|
||||
/* BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately,
|
||||
some macros that use ASN1_const_CTX still insist on writing in the input
|
||||
stream. ARGH! ARGH! ARGH! Let's get rid of this macro package.
|
||||
Please? -- Richard Levitte */
|
||||
#define M_ASN1_next (*((ubyte*)(c.p)))
|
||||
#define M_ASN1_next_prev (*((ubyte*)(c.q)))
|
||||
|
||||
/*************************************************/
|
||||
|
||||
#define M_ASN1_I2D_vars(a) int r=0,ret=0; \
|
||||
ubyte* p; \
|
||||
if (a == NULL) return(0)
|
||||
|
||||
/* Length Macros */
|
||||
#define M_ASN1_I2D_len(a,f) ret+=f(a,NULL)
|
||||
#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f)
|
||||
|
||||
#define M_ASN1_I2D_len_SET(a,f) \
|
||||
ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
|
||||
|
||||
#define M_ASN1_I2D_len_SET_type(type,a,f) \
|
||||
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
|
||||
V_ASN1_UNIVERSAL,IS_SET);
|
||||
|
||||
#define M_ASN1_I2D_len_SEQUENCE(a,f) \
|
||||
ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
|
||||
IS_SEQUENCE);
|
||||
|
||||
#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
|
||||
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
|
||||
V_ASN1_UNIVERSAL,IS_SEQUENCE)
|
||||
|
||||
#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
M_ASN1_I2D_len_SEQUENCE(a,f);
|
||||
|
||||
#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
M_ASN1_I2D_len_SEQUENCE_type(type,a,f);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SET(a,f,x) \
|
||||
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \
|
||||
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
|
||||
V_ASN1_CONTEXT_SPECIFIC,IS_SET);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SET);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
|
||||
V_ASN1_CONTEXT_SPECIFIC,IS_SET);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \
|
||||
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SEQUENCE);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SEQUENCE);
|
||||
|
||||
#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
|
||||
V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SEQUENCE);
|
||||
|
||||
#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \
|
||||
if (a != NULL)\
|
||||
{ \
|
||||
v=f(a,NULL); \
|
||||
ret+=ASN1_object_size(1,v,mtag); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \
|
||||
if ((a != NULL) && (sk_num(a) != 0))\
|
||||
{ \
|
||||
v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
|
||||
ret+=ASN1_object_size(1,v,mtag); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
|
||||
if ((a != NULL) && (sk_num(a) != 0))\
|
||||
{ \
|
||||
v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \
|
||||
IS_SEQUENCE); \
|
||||
ret+=ASN1_object_size(1,v,mtag); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0))\
|
||||
{ \
|
||||
v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
|
||||
V_ASN1_UNIVERSAL, \
|
||||
IS_SEQUENCE); \
|
||||
ret+=ASN1_object_size(1,v,mtag); \
|
||||
}
|
||||
|
||||
/* Put Macros */
|
||||
#define M_ASN1_I2D_put(a,f) f(a,&p)
|
||||
|
||||
#define M_ASN1_I2D_put_IMP_opt(a,f,t) \
|
||||
if (a != NULL) \
|
||||
{ \
|
||||
ubyte* q=p; \
|
||||
f(a,&p); \
|
||||
*q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
|
||||
V_ASN1_UNIVERSAL,IS_SET)
|
||||
#define M_ASN1_I2D_put_SET_type(type,a,f) \
|
||||
i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
|
||||
#define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
|
||||
V_ASN1_CONTEXT_SPECIFIC,IS_SET)
|
||||
#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
|
||||
i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)
|
||||
#define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
|
||||
V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)
|
||||
|
||||
#define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
|
||||
V_ASN1_UNIVERSAL,IS_SEQUENCE)
|
||||
|
||||
#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
|
||||
i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
|
||||
IS_SEQUENCE)
|
||||
|
||||
#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
M_ASN1_I2D_put_SEQUENCE(a,f);
|
||||
|
||||
#define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
{ i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SET); }
|
||||
|
||||
#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
{ i2d_ASN1_SET_OF_##type(a,&p,f,x, \
|
||||
V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SET); }
|
||||
|
||||
#define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
{ i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SEQUENCE); }
|
||||
|
||||
#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
{ i2d_ASN1_SET_OF_##type(a,&p,f,x, \
|
||||
V_ASN1_CONTEXT_SPECIFIC, \
|
||||
IS_SEQUENCE); }
|
||||
|
||||
#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \
|
||||
if (a != NULL) \
|
||||
{ \
|
||||
ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \
|
||||
f(a,&p); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
{ \
|
||||
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
|
||||
i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
|
||||
if ((a != NULL) && (sk_num(a) != 0)) \
|
||||
{ \
|
||||
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
|
||||
i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
|
||||
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
|
||||
{ \
|
||||
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
|
||||
i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
|
||||
IS_SEQUENCE); \
|
||||
}
|
||||
|
||||
#define M_ASN1_I2D_seq_total() \
|
||||
r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
|
||||
if (pp == NULL) return(r); \
|
||||
p= *pp; \
|
||||
ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
|
||||
|
||||
#define M_ASN1_I2D_INF_seq_start(tag,ctx) \
|
||||
*(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \
|
||||
*(p++)=0x80
|
||||
|
||||
#define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00
|
||||
|
||||
#define M_ASN1_I2D_finish() *pp=p; \
|
||||
return(r);
|
||||
+/
|
||||
|
||||
int asn1_GetSequence(ASN1_const_CTX* c, c_long* length);
|
||||
void asn1_add_error(const(ubyte)* address,int offset);
|
|
@ -0,0 +1,961 @@
|
|||
/* asn1t.h */
|
||||
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000-2005 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).
|
||||
*
|
||||
*/
|
||||
module deimos.openssl.asn1t;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.ossl_typ; // Needed for ASN1_BOOLEAN, etc.
|
||||
|
||||
import core.stdc.config;
|
||||
public import deimos.openssl.e_os2;
|
||||
public import deimos.openssl.asn1;
|
||||
|
||||
|
||||
/* ASN1 template defines, structures and functions */
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
|
||||
|
||||
/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
|
||||
#define ASN1_ADB_ptr(iptr) ((const(ASN1_ADB)*)(iptr))
|
||||
|
||||
|
||||
/* Macros for start and end of ASN1_ITEM definition */
|
||||
|
||||
#define ASN1_ITEM_start(itname) \
|
||||
OPENSSL_GLOBAL const ASN1_ITEM itname##_it = {
|
||||
|
||||
#define ASN1_ITEM_end(itname) \
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
|
||||
#define ASN1_ADB_ptr(iptr) ((const(ASN1_ADB)*)(iptr()))
|
||||
|
||||
|
||||
/* Macros for start and end of ASN1_ITEM definition */
|
||||
|
||||
#define ASN1_ITEM_start(itname) \
|
||||
const(ASN1_ITEM)* itname##_it() \
|
||||
{ \
|
||||
static const ASN1_ITEM local_it = {
|
||||
|
||||
#define ASN1_ITEM_end(itname) \
|
||||
}; \
|
||||
return &local_it; \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Macros to aid ASN1 template writing */
|
||||
|
||||
#define ASN1_ITEM_TEMPLATE(tname) \
|
||||
static const ASN1_TEMPLATE tname##_item_tt
|
||||
|
||||
#define ASN1_ITEM_TEMPLATE_END(tname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_PRIMITIVE,\
|
||||
-1,\
|
||||
&tname##_item_tt,\
|
||||
0,\
|
||||
NULL,\
|
||||
0,\
|
||||
#tname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
|
||||
/* This is a ASN1 type which just embeds a template */
|
||||
|
||||
/* This pair helps declare a SEQUENCE. We can do:
|
||||
*
|
||||
* ASN1_SEQUENCE(stname) = {
|
||||
* ... SEQUENCE components ...
|
||||
* } ASN1_SEQUENCE_END(stname)
|
||||
*
|
||||
* This will produce an ASN1_ITEM called stname_it
|
||||
* for a structure called stname.
|
||||
*
|
||||
* If you want the same structure but a different
|
||||
* name then use:
|
||||
*
|
||||
* ASN1_SEQUENCE(itname) = {
|
||||
* ... SEQUENCE components ...
|
||||
* } ASN1_SEQUENCE_END_name(stname, itname)
|
||||
*
|
||||
* This will create an item called itname_it using
|
||||
* a structure called stname.
|
||||
*/
|
||||
|
||||
#define ASN1_SEQUENCE(tname) \
|
||||
static const ASN1_TEMPLATE[] tname##_seq_tt
|
||||
|
||||
#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)
|
||||
|
||||
#define ASN1_SEQUENCE_END_name(stname, tname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_SEQUENCE,\
|
||||
V_ASN1_SEQUENCE,\
|
||||
tname##_seq_tt,\
|
||||
sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
|
||||
NULL,\
|
||||
sizeof(stname),\
|
||||
#stname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
#define ASN1_NDEF_SEQUENCE(tname) \
|
||||
ASN1_SEQUENCE(tname)
|
||||
|
||||
#define ASN1_NDEF_SEQUENCE_cb(tname, cb) \
|
||||
ASN1_SEQUENCE_cb(tname, cb)
|
||||
|
||||
#define ASN1_SEQUENCE_cb(tname, cb) \
|
||||
static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
|
||||
ASN1_SEQUENCE(tname)
|
||||
|
||||
#define ASN1_BROKEN_SEQUENCE(tname) \
|
||||
static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \
|
||||
ASN1_SEQUENCE(tname)
|
||||
|
||||
#define ASN1_SEQUENCE_ref(tname, cb, lck) \
|
||||
static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \
|
||||
ASN1_SEQUENCE(tname)
|
||||
|
||||
#define ASN1_SEQUENCE_enc(tname, enc, cb) \
|
||||
static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \
|
||||
ASN1_SEQUENCE(tname)
|
||||
|
||||
#define ASN1_NDEF_SEQUENCE_END(tname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_NDEF_SEQUENCE,\
|
||||
V_ASN1_SEQUENCE,\
|
||||
tname##_seq_tt,\
|
||||
sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
|
||||
NULL,\
|
||||
sizeof(tname),\
|
||||
#tname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
#define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname)
|
||||
|
||||
#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
|
||||
|
||||
#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)
|
||||
|
||||
#define ASN1_SEQUENCE_END_ref(stname, tname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_SEQUENCE,\
|
||||
V_ASN1_SEQUENCE,\
|
||||
tname##_seq_tt,\
|
||||
sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
|
||||
&tname##_aux,\
|
||||
sizeof(stname),\
|
||||
#stname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
#define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_NDEF_SEQUENCE,\
|
||||
V_ASN1_SEQUENCE,\
|
||||
tname##_seq_tt,\
|
||||
sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
|
||||
&tname##_aux,\
|
||||
sizeof(stname),\
|
||||
#stname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
|
||||
/* This pair helps declare a CHOICE type. We can do:
|
||||
*
|
||||
* ASN1_CHOICE(chname) = {
|
||||
* ... CHOICE options ...
|
||||
* ASN1_CHOICE_END(chname)
|
||||
*
|
||||
* This will produce an ASN1_ITEM called chname_it
|
||||
* for a structure called chname. The structure
|
||||
* definition must look like this:
|
||||
* typedef struct {
|
||||
* int type;
|
||||
* union {
|
||||
* ASN1_SOMETHING* opt1;
|
||||
* ASN1_SOMEOTHER* opt2;
|
||||
* } value;
|
||||
* } chname;
|
||||
*
|
||||
* the name of the selector must be 'type'.
|
||||
* to use an alternative selector name use the
|
||||
* ASN1_CHOICE_END_selector() version.
|
||||
*/
|
||||
|
||||
#define ASN1_CHOICE(tname) \
|
||||
static const ASN1_TEMPLATE[] tname##_ch_tt
|
||||
|
||||
#define ASN1_CHOICE_cb(tname, cb) \
|
||||
static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
|
||||
ASN1_CHOICE(tname)
|
||||
|
||||
#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname)
|
||||
|
||||
#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type)
|
||||
|
||||
#define ASN1_CHOICE_END_selector(stname, tname, selname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_CHOICE,\
|
||||
offsetof(stname,selname) ,\
|
||||
tname##_ch_tt,\
|
||||
sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
|
||||
NULL,\
|
||||
sizeof(stname),\
|
||||
#stname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
#define ASN1_CHOICE_END_cb(stname, tname, selname) \
|
||||
;\
|
||||
ASN1_ITEM_start(tname) \
|
||||
ASN1_ITYPE_CHOICE,\
|
||||
offsetof(stname,selname) ,\
|
||||
tname##_ch_tt,\
|
||||
sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
|
||||
&tname##_aux,\
|
||||
sizeof(stname),\
|
||||
#stname \
|
||||
ASN1_ITEM_end(tname)
|
||||
|
||||
/* This helps with the template wrapper form of ASN1_ITEM */
|
||||
|
||||
#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \
|
||||
(flags), (tag), 0,\
|
||||
#name, ASN1_ITEM_ref(type) }
|
||||
|
||||
/* These help with SEQUENCE or CHOICE components */
|
||||
|
||||
/* used to declare other types */
|
||||
|
||||
#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \
|
||||
(flags), (tag), offsetof(stname, field),\
|
||||
#field, ASN1_ITEM_ref(type) }
|
||||
|
||||
/* used when the structure is combined with the parent */
|
||||
|
||||
#define ASN1_EX_COMBINE(flags, tag, type) { \
|
||||
(flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }
|
||||
|
||||
/* implicit and explicit helper macros */
|
||||
|
||||
#define ASN1_IMP_EX(stname, field, type, tag, ex) \
|
||||
ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type)
|
||||
|
||||
#define ASN1_EXP_EX(stname, field, type, tag, ex) \
|
||||
ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type)
|
||||
|
||||
/* Any defined by macros: the field used is in the table itself */
|
||||
|
||||
#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
|
||||
#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const(ASN1_ITEM)*)&(tblname##_adb) }
|
||||
#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const(ASN1_ITEM)*)&(tblname##_adb) }
|
||||
#else
|
||||
#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb }
|
||||
#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb }
|
||||
#endif
|
||||
/* Plain simple type */
|
||||
#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)
|
||||
|
||||
/* OPTIONAL simple type */
|
||||
#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
|
||||
|
||||
/* IMPLICIT tagged simple type */
|
||||
#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
|
||||
|
||||
/* IMPLICIT tagged OPTIONAL simple type */
|
||||
#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
|
||||
|
||||
/* Same as above but EXPLICIT */
|
||||
|
||||
#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
|
||||
#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
|
||||
|
||||
/* SEQUENCE OF type */
|
||||
#define ASN1_SEQUENCE_OF(stname, field, type) \
|
||||
ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type)
|
||||
|
||||
/* OPTIONAL SEQUENCE OF */
|
||||
#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \
|
||||
ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
|
||||
|
||||
/* Same as above but for SET OF */
|
||||
|
||||
#define ASN1_SET_OF(stname, field, type) \
|
||||
ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type)
|
||||
|
||||
#define ASN1_SET_OF_OPT(stname, field, type) \
|
||||
ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)
|
||||
|
||||
/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */
|
||||
|
||||
#define ASN1_IMP_SET_OF(stname, field, type, tag) \
|
||||
ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
|
||||
|
||||
#define ASN1_EXP_SET_OF(stname, field, type, tag) \
|
||||
ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)
|
||||
|
||||
#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \
|
||||
ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
|
||||
|
||||
#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \
|
||||
ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)
|
||||
|
||||
#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \
|
||||
ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
|
||||
|
||||
#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \
|
||||
ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
|
||||
|
||||
#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \
|
||||
ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)
|
||||
|
||||
#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \
|
||||
ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)
|
||||
|
||||
/* EXPLICIT using indefinite length constructed form */
|
||||
#define ASN1_NDEF_EXP(stname, field, type, tag) \
|
||||
ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF)
|
||||
|
||||
/* EXPLICIT OPTIONAL using indefinite length constructed form */
|
||||
#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \
|
||||
ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF)
|
||||
|
||||
/* Macros for the ASN1_ADB structure */
|
||||
|
||||
#define ASN1_ADB(name) \
|
||||
static const ASN1_ADB_TABLE[] name##_adbtbl
|
||||
|
||||
#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
|
||||
|
||||
#define ASN1_ADB_END(name, flags, field, app_table, def, none) \
|
||||
;\
|
||||
static const ASN1_ADB name##_adb = {\
|
||||
flags,\
|
||||
offsetof(name, field),\
|
||||
app_table,\
|
||||
name##_adbtbl,\
|
||||
sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
|
||||
def,\
|
||||
none\
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define ASN1_ADB_END(name, flags, field, app_table, def, none) \
|
||||
;\
|
||||
static const(ASN1_ITEM)* name##_adb() \
|
||||
{ \
|
||||
static const ASN1_ADB internal_adb = \
|
||||
{\
|
||||
flags,\
|
||||
offsetof(name, field),\
|
||||
app_table,\
|
||||
name##_adbtbl,\
|
||||
sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
|
||||
def,\
|
||||
none\
|
||||
}; \
|
||||
return (const(ASN1_ITEM)*) &internal_adb; \
|
||||
} \
|
||||
void dummy_function()
|
||||
|
||||
#endif
|
||||
|
||||
#define ADB_ENTRY(val, template) {val, template}
|
||||
|
||||
#define ASN1_ADB_TEMPLATE(name) \
|
||||
static const ASN1_TEMPLATE name##_tt
|
||||
+/
|
||||
/* This is the ASN1 template structure that defines
|
||||
* a wrapper round the actual type. It determines the
|
||||
* actual position of the field in the value structure,
|
||||
* various flags such as OPTIONAL and the field name.
|
||||
*/
|
||||
|
||||
struct ASN1_TEMPLATE_st {
|
||||
c_ulong flags; /* Various flags */
|
||||
c_long tag; /* tag, not used if no tagging */
|
||||
c_ulong offset; /* Offset of this field in structure */
|
||||
version (NO_ASN1_FIELD_NAMES) {} else {
|
||||
const(char)* field_name; /* Field name */
|
||||
}
|
||||
ASN1_ITEM_EXP* item; /* Relevant ASN1_ITEM or ASN1_ADB */
|
||||
};
|
||||
|
||||
/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */
|
||||
|
||||
auto ASN1_TEMPLATE_item()(ASN1_TEMPLATE_st* t) { return (t.item_ptr); }
|
||||
auto ASN1_TEMPLATE_adb()(ASN1_TEMPLATE_st* t) { return (t.item_ptr); }
|
||||
|
||||
alias ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
|
||||
alias ASN1_ADB_st ASN1_ADB;
|
||||
|
||||
struct ASN1_ADB_st {
|
||||
c_ulong flags; /* Various flags */
|
||||
c_ulong offset; /* Offset of selector field */
|
||||
STACK_OF!(ASN1_ADB_TABLE) **app_items; /* Application defined items */
|
||||
const(ASN1_ADB_TABLE)* tbl; /* Table of possible types */
|
||||
c_long tblcount; /* Number of entries in tbl */
|
||||
const(ASN1_TEMPLATE)* default_tt; /* Type to use if no match */
|
||||
const(ASN1_TEMPLATE)* null_tt; /* Type to use if selector is NULL */
|
||||
};
|
||||
|
||||
struct ASN1_ADB_TABLE_st {
|
||||
c_long value; /* NID for an object or value for an int */
|
||||
const ASN1_TEMPLATE tt; /* item for this value */
|
||||
};
|
||||
|
||||
/* template flags */
|
||||
|
||||
/* Field is optional */
|
||||
enum ASN1_TFLG_OPTIONAL = (0x1);
|
||||
|
||||
/* Field is a SET OF */
|
||||
enum ASN1_TFLG_SET_OF = (0x1 << 1);
|
||||
|
||||
/* Field is a SEQUENCE OF */
|
||||
enum ASN1_TFLG_SEQUENCE_OF = (0x2 << 1);
|
||||
|
||||
/* Special case: this refers to a SET OF that
|
||||
* will be sorted into DER order when encoded* and*
|
||||
* the corresponding STACK will be modified to match
|
||||
* the new order.
|
||||
*/
|
||||
enum ASN1_TFLG_SET_ORDER = (0x3 << 1);
|
||||
|
||||
/* Mask for SET OF or SEQUENCE OF */
|
||||
enum ASN1_TFLG_SK_MASK = (0x3 << 1);
|
||||
|
||||
/* These flags mean the tag should be taken from the
|
||||
* tag field. If EXPLICIT then the underlying type
|
||||
* is used for the inner tag.
|
||||
*/
|
||||
|
||||
/* IMPLICIT tagging */
|
||||
enum ASN1_TFLG_IMPTAG = (0x1 << 3);
|
||||
|
||||
|
||||
/* EXPLICIT tagging, inner tag from underlying type */
|
||||
enum ASN1_TFLG_EXPTAG = (0x2 << 3);
|
||||
|
||||
enum ASN1_TFLG_TAG_MASK = (0x3 << 3);
|
||||
|
||||
/* context specific IMPLICIT */
|
||||
enum ASN1_TFLG_IMPLICIT = ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT;
|
||||
|
||||
/* context specific EXPLICIT */
|
||||
enum ASN1_TFLG_EXPLICIT = ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT;
|
||||
|
||||
/* If tagging is in force these determine the
|
||||
* type of tag to use. Otherwise the tag is
|
||||
* determined by the underlying type. These
|
||||
* values reflect the actual octet format.
|
||||
*/
|
||||
|
||||
/* Universal tag */
|
||||
enum ASN1_TFLG_UNIVERSAL = (0x0<<6);
|
||||
/* Application tag */
|
||||
enum ASN1_TFLG_APPLICATION = (0x1<<6);
|
||||
/* Context specific tag */
|
||||
enum ASN1_TFLG_CONTEXT = (0x2<<6);
|
||||
/* Private tag */
|
||||
enum ASN1_TFLG_PRIVATE = (0x3<<6);
|
||||
|
||||
enum ASN1_TFLG_TAG_CLASS = (0x3<<6);
|
||||
|
||||
/* These are for ANY DEFINED BY type. In this case
|
||||
* the 'item' field points to an ASN1_ADB structure
|
||||
* which contains a table of values to decode the
|
||||
* relevant type
|
||||
*/
|
||||
|
||||
enum ASN1_TFLG_ADB_MASK = (0x3<<8);
|
||||
|
||||
enum ASN1_TFLG_ADB_OID = (0x1<<8);
|
||||
|
||||
enum ASN1_TFLG_ADB_INT = (0x1<<9);
|
||||
|
||||
/* This flag means a parent structure is passed
|
||||
* instead of the field: this is useful is a
|
||||
* SEQUENCE is being combined with a CHOICE for
|
||||
* example. Since this means the structure and
|
||||
* item name will differ we need to use the
|
||||
* ASN1_CHOICE_END_name() macro for example.
|
||||
*/
|
||||
|
||||
enum ASN1_TFLG_COMBINE = (0x1<<10);
|
||||
|
||||
/* This flag when present in a SEQUENCE OF, SET OF
|
||||
* or EXPLICIT causes indefinite length constructed
|
||||
* encoding to be used if required.
|
||||
*/
|
||||
|
||||
enum ASN1_TFLG_NDEF = (0x1<<11);
|
||||
|
||||
/* This is the actual ASN1 item itself */
|
||||
|
||||
struct ASN1_ITEM_st {
|
||||
char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */
|
||||
c_long utype; /* underlying type */
|
||||
const(ASN1_TEMPLATE)* templates; /* If SEQUENCE or CHOICE this contains the contents */
|
||||
c_long tcount; /* Number of templates if SEQUENCE or CHOICE */
|
||||
const(void)* funcs; /* functions that handle this type */
|
||||
c_long size; /* Structure size (usually)*/
|
||||
version (NO_ASN1_FIELD_NAMES) {} else {
|
||||
const(char)* sname; /* Structure name */
|
||||
}
|
||||
};
|
||||
|
||||
/* These are values for the itype field and
|
||||
* determine how the type is interpreted.
|
||||
*
|
||||
* For PRIMITIVE types the underlying type
|
||||
* determines the behaviour if items is NULL.
|
||||
*
|
||||
* Otherwise templates must contain a single
|
||||
* template and the type is treated in the
|
||||
* same way as the type specified in the template.
|
||||
*
|
||||
* For SEQUENCE types the templates field points
|
||||
* to the members, the size field is the
|
||||
* structure size.
|
||||
*
|
||||
* For CHOICE types the templates field points
|
||||
* to each possible member (typically a union)
|
||||
* and the 'size' field is the offset of the
|
||||
* selector.
|
||||
*
|
||||
* The 'funcs' field is used for application
|
||||
* specific functions.
|
||||
*
|
||||
* For COMPAT types the funcs field gives a
|
||||
* set of functions that handle this type, this
|
||||
* supports the old d2i, i2d convention.
|
||||
*
|
||||
* The EXTERN type uses a new style d2i/i2d.
|
||||
* The new style should be used where possible
|
||||
* because it avoids things like the d2i IMPLICIT
|
||||
* hack.
|
||||
*
|
||||
* MSTRING is a multiple string type, it is used
|
||||
* for a CHOICE of character strings where the
|
||||
* actual strings all occupy an ASN1_STRING
|
||||
* structure. In this case the 'utype' field
|
||||
* has a special meaning, it is used as a mask
|
||||
* of acceptable types using the B_ASN1 constants.
|
||||
*
|
||||
* NDEF_SEQUENCE is the same as SEQUENCE except
|
||||
* that it will use indefinite length constructed
|
||||
* encoding if requested.
|
||||
*
|
||||
*/
|
||||
|
||||
enum ASN1_ITYPE_PRIMITIVE = 0x0;
|
||||
|
||||
enum ASN1_ITYPE_SEQUENCE = 0x1;
|
||||
|
||||
enum ASN1_ITYPE_CHOICE = 0x2;
|
||||
|
||||
enum ASN1_ITYPE_COMPAT = 0x3;
|
||||
|
||||
enum ASN1_ITYPE_EXTERN = 0x4;
|
||||
|
||||
enum ASN1_ITYPE_MSTRING = 0x5;
|
||||
|
||||
enum ASN1_ITYPE_NDEF_SEQUENCE = 0x6;
|
||||
|
||||
/* Cache for ASN1 tag and length, so we
|
||||
* don't keep re-reading it for things
|
||||
* like CHOICE
|
||||
*/
|
||||
|
||||
struct ASN1_TLC_st{
|
||||
char valid; /* Values below are valid */
|
||||
int ret; /* return value */
|
||||
c_long plen; /* length */
|
||||
int ptag; /* class value */
|
||||
int pclass; /* class value */
|
||||
int hdrlen; /* header length */
|
||||
};
|
||||
|
||||
/* Typedefs for ASN1 function pointers */
|
||||
|
||||
alias typeof(*(ExternC!(ASN1_VALUE* function())).init) ASN1_new_func;
|
||||
alias typeof(*(ExternC!(void function(ASN1_VALUE* a))).init) ASN1_free_func;
|
||||
alias typeof(*(ExternC!(ASN1_VALUE* function(ASN1_VALUE** a, const(ubyte)** in_, c_long length))).init) ASN1_d2i_func;
|
||||
alias typeof(*(ExternC!(int function(ASN1_VALUE* a, ubyte** in_))).init) ASN1_i2d_func;
|
||||
|
||||
alias typeof(*(ExternC!(int function(ASN1_VALUE** pval, const(ubyte)** in_, c_long len, const(ASN1_ITEM)* it,
|
||||
int tag, int aclass, char opt, ASN1_TLC* ctx))).init) ASN1_ex_d2i;
|
||||
|
||||
alias typeof(*(ExternC!(int function(ASN1_VALUE** pval, ubyte** out_, const(ASN1_ITEM)* it, int tag, int aclass))).init) ASN1_ex_i2d;
|
||||
alias typeof(*(ExternC!(int function(ASN1_VALUE** pval, const(ASN1_ITEM)* it))).init) ASN1_ex_new_func;
|
||||
alias typeof(*(ExternC!(void function(ASN1_VALUE** pval, const(ASN1_ITEM)* it))).init) ASN1_ex_free_func;
|
||||
|
||||
alias typeof(*(ExternC!(int function(BIO* out_, ASN1_VALUE** pval,
|
||||
int indent, const(char)* fname,
|
||||
const(ASN1_PCTX)* pctx))).init) ASN1_ex_print_func;
|
||||
|
||||
alias typeof(*(ExternC!(int function(ASN1_VALUE** pval, ubyte* cont, int* putype, const(ASN1_ITEM)* it))).init) ASN1_primitive_i2c;
|
||||
alias typeof(*(ExternC!(int function(ASN1_VALUE** pval, const(ubyte)* cont, int len, int utype, char* free_cont, const(ASN1_ITEM)* it))).init) ASN1_primitive_c2i;
|
||||
alias typeof(*(ExternC!(int function(BIO* out_, ASN1_VALUE** pval, const(ASN1_ITEM)* it, int indent, const(ASN1_PCTX)* pctx))).init) ASN1_primitive_print;
|
||||
|
||||
struct ASN1_COMPAT_FUNCS_st {
|
||||
ASN1_new_func* asn1_new;
|
||||
ASN1_free_func* asn1_free;
|
||||
ASN1_d2i_func* asn1_d2i;
|
||||
ASN1_i2d_func* asn1_i2d;
|
||||
}
|
||||
alias ASN1_COMPAT_FUNCS_st ASN1_COMPAT_FUNCS;
|
||||
|
||||
struct ASN1_EXTERN_FUNCS_st {
|
||||
void* app_data;
|
||||
ASN1_ex_new_func* asn1_ex_new;
|
||||
ASN1_ex_free_func* asn1_ex_free;
|
||||
ASN1_ex_free_func* asn1_ex_clear;
|
||||
ASN1_ex_d2i* asn1_ex_d2i;
|
||||
ASN1_ex_i2d* asn1_ex_i2d;
|
||||
ASN1_ex_print_func* asn1_ex_print;
|
||||
}
|
||||
alias ASN1_EXTERN_FUNCS_st ASN1_EXTERN_FUNCS;
|
||||
|
||||
struct ASN1_PRIMITIVE_FUNCS_st {
|
||||
void* app_data;
|
||||
c_ulong flags;
|
||||
ASN1_ex_new_func* prim_new;
|
||||
ASN1_ex_free_func* prim_free;
|
||||
ASN1_ex_free_func* prim_clear;
|
||||
ASN1_primitive_c2i* prim_c2i;
|
||||
ASN1_primitive_i2c* prim_i2c;
|
||||
ASN1_primitive_print* prim_print;
|
||||
}
|
||||
alias ASN1_PRIMITIVE_FUNCS_st ASN1_PRIMITIVE_FUNCS;
|
||||
|
||||
/* This is the ASN1_AUX structure: it handles various
|
||||
* miscellaneous requirements. For example the use of
|
||||
* reference counts and an informational callback.
|
||||
*
|
||||
* The "informational callback" is called at various
|
||||
* points during the ASN1 encoding and decoding. It can
|
||||
* be used to provide minor customisation of the structures
|
||||
* used. This is most useful where the supplied routines
|
||||
** almost* do the right thing but need some extra help
|
||||
* at a few points. If the callback returns zero then
|
||||
* it is assumed a fatal error has occurred and the
|
||||
* main operation should be abandoned.
|
||||
*
|
||||
* If major changes in the default behaviour are required
|
||||
* then an external type is more appropriate.
|
||||
*/
|
||||
|
||||
alias typeof(*(ExternC!(int function(int operation, ASN1_VALUE** in_, const(ASN1_ITEM)* it,
|
||||
void* exarg))).init) ASN1_aux_cb;
|
||||
|
||||
struct ASN1_AUX_st {
|
||||
void* app_data;
|
||||
int flags;
|
||||
int ref_offset; /* Offset of reference value */
|
||||
int ref_lock; /* Lock type to use */
|
||||
ASN1_aux_cb* asn1_cb;
|
||||
int enc_offset; /* Offset of ASN1_ENCODING structure */
|
||||
}
|
||||
alias ASN1_AUX_st ASN1_AUX;
|
||||
|
||||
/* For print related callbacks exarg points to this structure */
|
||||
struct ASN1_PRINT_ARG_st {
|
||||
BIO* out_;
|
||||
int indent;
|
||||
const(ASN1_PCTX)* pctx;
|
||||
}
|
||||
alias ASN1_PRINT_ARG_st ASN1_PRINT_ARG;
|
||||
|
||||
/* For streaming related callbacks exarg points to this structure */
|
||||
struct ASN1_STREAM_ARG_st {
|
||||
/* BIO to stream through */
|
||||
BIO* out_;
|
||||
/* BIO with filters appended */
|
||||
BIO* ndef_bio;
|
||||
/* Streaming I/O boundary */
|
||||
ubyte** boundary;
|
||||
}
|
||||
alias ASN1_STREAM_ARG_st ASN1_STREAM_ARG;
|
||||
|
||||
/* Flags in ASN1_AUX */
|
||||
|
||||
/* Use a reference count */
|
||||
enum ASN1_AFLG_REFCOUNT = 1;
|
||||
/* Save the encoding of structure (useful for signatures) */
|
||||
enum ASN1_AFLG_ENCODING = 2;
|
||||
/* The Sequence length is invalid */
|
||||
enum ASN1_AFLG_BROKEN = 4;
|
||||
|
||||
/* operation values for asn1_cb */
|
||||
|
||||
enum ASN1_OP_NEW_PRE = 0;
|
||||
enum ASN1_OP_NEW_POST = 1;
|
||||
enum ASN1_OP_FREE_PRE = 2;
|
||||
enum ASN1_OP_FREE_POST = 3;
|
||||
enum ASN1_OP_D2I_PRE = 4;
|
||||
enum ASN1_OP_D2I_POST = 5;
|
||||
enum ASN1_OP_I2D_PRE = 6;
|
||||
enum ASN1_OP_I2D_POST = 7;
|
||||
enum ASN1_OP_PRINT_PRE = 8;
|
||||
enum ASN1_OP_PRINT_POST = 9;
|
||||
enum ASN1_OP_STREAM_PRE = 10;
|
||||
enum ASN1_OP_STREAM_POST = 11;
|
||||
enum ASN1_OP_DETACHED_PRE = 12;
|
||||
enum ASN1_OP_DETACHED_POST = 13;
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
/* Macro to implement a primitive type */
|
||||
#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0)
|
||||
#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \
|
||||
ASN1_ITEM_start(itname) \
|
||||
ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \
|
||||
ASN1_ITEM_end(itname)
|
||||
|
||||
/* Macro to implement a multi string type */
|
||||
#define IMPLEMENT_ASN1_MSTRING(itname, mask) \
|
||||
ASN1_ITEM_start(itname) \
|
||||
ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \
|
||||
ASN1_ITEM_end(itname)
|
||||
|
||||
/* Macro to implement an ASN1_ITEM in terms of old style funcs */
|
||||
|
||||
#define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE)
|
||||
|
||||
#define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \
|
||||
static const ASN1_COMPAT_FUNCS sname##_ff = { \
|
||||
(ASN1_new_func*)sname##_new, \
|
||||
(ASN1_free_func*)sname##_free, \
|
||||
(ASN1_d2i_func*)d2i_##sname, \
|
||||
(ASN1_i2d_func*)i2d_##sname, \
|
||||
}; \
|
||||
ASN1_ITEM_start(sname) \
|
||||
ASN1_ITYPE_COMPAT, \
|
||||
tag, \
|
||||
NULL, \
|
||||
0, \
|
||||
&sname##_ff, \
|
||||
0, \
|
||||
#sname \
|
||||
ASN1_ITEM_end(sname)
|
||||
|
||||
#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \
|
||||
ASN1_ITEM_start(sname) \
|
||||
ASN1_ITYPE_EXTERN, \
|
||||
tag, \
|
||||
NULL, \
|
||||
0, \
|
||||
&fptrs, \
|
||||
0, \
|
||||
#sname \
|
||||
ASN1_ITEM_end(sname)
|
||||
|
||||
/* Macro to implement standard functions in terms of ASN1_ITEM structures */
|
||||
|
||||
#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname)
|
||||
|
||||
#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname)
|
||||
|
||||
#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \
|
||||
IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname)
|
||||
|
||||
#define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \
|
||||
IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname)
|
||||
|
||||
#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \
|
||||
IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname)
|
||||
|
||||
#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \
|
||||
pre stname* fname##_new() \
|
||||
{ \
|
||||
return (stname*)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
|
||||
} \
|
||||
pre void fname##_free(stname* a) \
|
||||
{ \
|
||||
ASN1_item_free((ASN1_VALUE*)a, ASN1_ITEM_rptr(itname)); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \
|
||||
stname* fname##_new() \
|
||||
{ \
|
||||
return (stname*)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
|
||||
} \
|
||||
void fname##_free(stname* a) \
|
||||
{ \
|
||||
ASN1_item_free((ASN1_VALUE*)a, ASN1_ITEM_rptr(itname)); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \
|
||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
|
||||
IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
|
||||
|
||||
#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
|
||||
stname* d2i_##fname(stname** a, const(ubyte)** in_, c_long len) \
|
||||
{ \
|
||||
return (stname*)ASN1_item_d2i((ASN1_VALUE**)a, in_, len, ASN1_ITEM_rptr(itname));\
|
||||
} \
|
||||
int i2d_##fname(stname* a, ubyte** out_) \
|
||||
{ \
|
||||
return ASN1_item_i2d((ASN1_VALUE*)a, out_, ASN1_ITEM_rptr(itname));\
|
||||
}
|
||||
|
||||
#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \
|
||||
int i2d_##stname##_NDEF(stname* a, ubyte** out_) \
|
||||
{ \
|
||||
return ASN1_item_ndef_i2d((ASN1_VALUE*)a, out_, ASN1_ITEM_rptr(stname));\
|
||||
}
|
||||
|
||||
/* This includes evil casts to remove const: they will go away when full
|
||||
* ASN1 constification is done.
|
||||
*/
|
||||
#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
|
||||
stname* d2i_##fname(stname** a, const(ubyte)** in_, c_long len) \
|
||||
{ \
|
||||
return (stname*)ASN1_item_d2i((ASN1_VALUE**)a, in_, len, ASN1_ITEM_rptr(itname));\
|
||||
} \
|
||||
int i2d_##fname(const(stname)* a, ubyte** out_) \
|
||||
{ \
|
||||
return ASN1_item_i2d((ASN1_VALUE*)a, out_, ASN1_ITEM_rptr(itname));\
|
||||
}
|
||||
|
||||
#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
|
||||
stname* stname##_dup(stname* x) \
|
||||
{ \
|
||||
return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \
|
||||
IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname)
|
||||
|
||||
#define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \
|
||||
int fname##_print_ctx(BIO* out_, stname* x, int indent, \
|
||||
const(ASN1_PCTX)* pctx) \
|
||||
{ \
|
||||
return ASN1_item_print(out, (ASN1_VALUE*)x, indent, \
|
||||
ASN1_ITEM_rptr(itname), pctx); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)
|
||||
|
||||
#define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \
|
||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
|
||||
IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)
|
||||
+/
|
||||
|
||||
/* external definitions for primitive types */
|
||||
|
||||
mixin(DECLARE_ASN1_ITEM!"ASN1_BOOLEAN");
|
||||
mixin(DECLARE_ASN1_ITEM!"ASN1_TBOOLEAN");
|
||||
mixin(DECLARE_ASN1_ITEM!"ASN1_FBOOLEAN");
|
||||
mixin(DECLARE_ASN1_ITEM!"ASN1_SEQUENCE");
|
||||
mixin(DECLARE_ASN1_ITEM!"CBIGNUM");
|
||||
mixin(DECLARE_ASN1_ITEM!"BIGNUM");
|
||||
mixin(DECLARE_ASN1_ITEM!"LONG");
|
||||
mixin(DECLARE_ASN1_ITEM!"ZLONG");
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(ASN1_VALUE);+/
|
||||
|
||||
/* Functions used internally by the ASN1 code */
|
||||
|
||||
int ASN1_item_ex_new(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
void ASN1_item_ex_free(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
int ASN1_template_new(ASN1_VALUE** pval, const(ASN1_TEMPLATE)* tt);
|
||||
int ASN1_primitive_new(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
|
||||
void ASN1_template_free(ASN1_VALUE** pval, const(ASN1_TEMPLATE)* tt);
|
||||
int ASN1_template_d2i(ASN1_VALUE** pval, const(ubyte)** in_, c_long len, const(ASN1_TEMPLATE)* tt);
|
||||
int ASN1_item_ex_d2i(ASN1_VALUE** pval, const(ubyte)** in_, c_long len, const(ASN1_ITEM)* it,
|
||||
int tag, int aclass, char opt, ASN1_TLC* ctx);
|
||||
|
||||
int ASN1_item_ex_i2d(ASN1_VALUE** pval, ubyte** out_, const(ASN1_ITEM)* it, int tag, int aclass);
|
||||
int ASN1_template_i2d(ASN1_VALUE** pval, ubyte** out_, const(ASN1_TEMPLATE)* tt);
|
||||
void ASN1_primitive_free(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
|
||||
int asn1_ex_i2c(ASN1_VALUE** pval, ubyte* cont, int* putype, const(ASN1_ITEM)* it);
|
||||
int asn1_ex_c2i(ASN1_VALUE** pval, const(ubyte)* cont, int len, int utype, char* free_cont, const(ASN1_ITEM)* it);
|
||||
|
||||
int asn1_get_choice_selector(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
int asn1_set_choice_selector(ASN1_VALUE** pval, int value, const(ASN1_ITEM)* it);
|
||||
|
||||
ASN1_VALUE** asn1_get_field_ptr(ASN1_VALUE** pval, const(ASN1_TEMPLATE)* tt);
|
||||
|
||||
const(ASN1_TEMPLATE)* asn1_do_adb(ASN1_VALUE** pval, const(ASN1_TEMPLATE)* tt, int nullerr);
|
||||
|
||||
int asn1_do_lock(ASN1_VALUE** pval, int op, const(ASN1_ITEM)* it);
|
||||
|
||||
void asn1_enc_init(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
void asn1_enc_free(ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
int asn1_enc_restore(int* len, ubyte** out_, ASN1_VALUE** pval, const(ASN1_ITEM)* it);
|
||||
int asn1_enc_save(ASN1_VALUE** pval, const(ubyte)* in_, int inlen, const(ASN1_ITEM)* it);
|
|
@ -0,0 +1,838 @@
|
|||
/* crypto/bio/bio.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.bio;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import core.stdc.stdarg;
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
import core.stdc.stdio;
|
||||
}
|
||||
|
||||
// TODO: review imports
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
version(OPENSSL_SYS_VMS)
|
||||
import inttypes;
|
||||
else
|
||||
import core.stdc.stdint;
|
||||
}
|
||||
|
||||
version (Posix) {
|
||||
import core.sys.posix.netdb;
|
||||
} else version (Windows) {
|
||||
static if (__VERSION__ >= 2070)
|
||||
import core.sys.windows.winsock2;
|
||||
else
|
||||
import std.c.windows.winsock;
|
||||
} else version (Win64) {
|
||||
import core.sys.windows.winsock2;
|
||||
}
|
||||
|
||||
public import deimos.openssl.crypto;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* These are the 'types' of BIOs */
|
||||
enum BIO_TYPE_NONE = 0;
|
||||
enum BIO_TYPE_MEM = (1|0x0400);
|
||||
enum BIO_TYPE_FILE = (2|0x0400);
|
||||
|
||||
enum BIO_TYPE_FD = (4|0x0400|0x0100);
|
||||
enum BIO_TYPE_SOCKET = (5|0x0400|0x0100);
|
||||
enum BIO_TYPE_NULL = (6|0x0400);
|
||||
enum BIO_TYPE_SSL = (7|0x0200);
|
||||
enum BIO_TYPE_MD = (8|0x0200); /* passive filter */
|
||||
enum BIO_TYPE_BUFFER = (9|0x0200); /* filter */
|
||||
enum BIO_TYPE_CIPHER = (10|0x0200); /* filter */
|
||||
enum BIO_TYPE_BASE64 = (11|0x0200); /* filter */
|
||||
enum BIO_TYPE_CONNECT = (12|0x0400|0x0100); /* socket - connect */
|
||||
enum BIO_TYPE_ACCEPT = (13|0x0400|0x0100); /* socket for accept */
|
||||
enum BIO_TYPE_PROXY_CLIENT = (14|0x0200); /* client proxy BIO */
|
||||
enum BIO_TYPE_PROXY_SERVER = (15|0x0200); /* server proxy BIO */
|
||||
enum BIO_TYPE_NBIO_TEST = (16|0x0200); /* server proxy BIO */
|
||||
enum BIO_TYPE_NULL_FILTER = (17|0x0200);
|
||||
enum BIO_TYPE_BER = (18|0x0200); /* BER -> bin filter */
|
||||
enum BIO_TYPE_BIO = (19|0x0400); /* (half a) BIO pair */
|
||||
enum BIO_TYPE_LINEBUFFER = (20|0x0200); /* filter */
|
||||
enum BIO_TYPE_DGRAM = (21|0x0400|0x0100);
|
||||
version (OPENSSL_NO_SCTP) {} else {
|
||||
enum BIO_TYPE_DGRAM_SCTP = (24|0x0400|0x0100);
|
||||
}
|
||||
enum BIO_TYPE_ASN1 = (22|0x0200); /* filter */
|
||||
enum BIO_TYPE_COMP = (23|0x0200); /* filter */
|
||||
|
||||
enum BIO_TYPE_DESCRIPTOR = 0x0100; /* socket, fd, connect or accept */
|
||||
enum BIO_TYPE_FILTER = 0x0200;
|
||||
enum BIO_TYPE_SOURCE_SINK = 0x0400;
|
||||
|
||||
/* BIO_FILENAME_READ|BIO_CLOSE to open or close on free.
|
||||
* BIO_set_fp(in,stdin,BIO_NOCLOSE); */
|
||||
enum BIO_NOCLOSE = 0x00;
|
||||
enum BIO_CLOSE = 0x01;
|
||||
|
||||
/* These are used in the following macros and are passed to
|
||||
* BIO_ctrl() */
|
||||
enum BIO_CTRL_RESET = 1; /* opt - rewind/zero etc */
|
||||
enum BIO_CTRL_EOF = 2; /* opt - are we at the eof */
|
||||
enum BIO_CTRL_INFO = 3; /* opt - extra tit-bits */
|
||||
enum BIO_CTRL_SET = 4; /* man - set the 'IO' type */
|
||||
enum BIO_CTRL_GET = 5; /* man - get the 'IO' type */
|
||||
enum BIO_CTRL_PUSH = 6; /* opt - internal, used to signify change */
|
||||
enum BIO_CTRL_POP = 7; /* opt - internal, used to signify change */
|
||||
enum BIO_CTRL_GET_CLOSE = 8; /* man - set the 'close' on free */
|
||||
enum BIO_CTRL_SET_CLOSE = 9; /* man - set the 'close' on free */
|
||||
enum BIO_CTRL_PENDING = 10; /* opt - is their more data buffered */
|
||||
enum BIO_CTRL_FLUSH = 11; /* opt - 'flush' buffered output */
|
||||
enum BIO_CTRL_DUP = 12; /* man - extra stuff for 'duped' BIO */
|
||||
enum BIO_CTRL_WPENDING = 13; /* opt - number of bytes still to write */
|
||||
/* callback is int cb(BIO* bio,state,ret); */
|
||||
enum BIO_CTRL_SET_CALLBACK = 14; /* opt - set callback function */
|
||||
enum BIO_CTRL_GET_CALLBACK = 15; /* opt - set callback function */
|
||||
|
||||
enum BIO_CTRL_SET_FILENAME = 30; /* BIO_s_file special */
|
||||
|
||||
/* dgram BIO stuff */
|
||||
enum BIO_CTRL_DGRAM_CONNECT = 31; /* BIO dgram special */
|
||||
enum BIO_CTRL_DGRAM_SET_CONNECTED = 32; /* allow for an externally
|
||||
* connected socket to be
|
||||
* passed in */
|
||||
enum BIO_CTRL_DGRAM_SET_RECV_TIMEOUT = 33; /* setsockopt, essentially */
|
||||
enum BIO_CTRL_DGRAM_GET_RECV_TIMEOUT = 34; /* getsockopt, essentially */
|
||||
enum BIO_CTRL_DGRAM_SET_SEND_TIMEOUT = 35; /* setsockopt, essentially */
|
||||
enum BIO_CTRL_DGRAM_GET_SEND_TIMEOUT = 36; /* getsockopt, essentially */
|
||||
|
||||
enum BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP = 37; /* flag whether the last */
|
||||
enum BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP = 38; /* I/O operation tiemd out */
|
||||
|
||||
/* #ifdef IP_MTU_DISCOVER */
|
||||
enum BIO_CTRL_DGRAM_MTU_DISCOVER = 39; /* set DF bit on egress packets */
|
||||
/* #endif */
|
||||
|
||||
enum BIO_CTRL_DGRAM_QUERY_MTU = 40; /* as kernel for current MTU */
|
||||
enum BIO_CTRL_DGRAM_GET_FALLBACK_MTU = 47;
|
||||
enum BIO_CTRL_DGRAM_GET_MTU = 41; /* get cached value for MTU */
|
||||
enum BIO_CTRL_DGRAM_SET_MTU = 42; /* set cached value for
|
||||
* MTU. want to use this
|
||||
* if asking the kernel
|
||||
* fails */
|
||||
|
||||
enum BIO_CTRL_DGRAM_MTU_EXCEEDED = 43; /* check whether the MTU
|
||||
* was exceed in the
|
||||
* previous write
|
||||
* operation */
|
||||
|
||||
enum BIO_CTRL_DGRAM_GET_PEER = 46;
|
||||
enum BIO_CTRL_DGRAM_SET_PEER = 44; /* Destination for the data */
|
||||
|
||||
enum BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT = 45; /* Next DTLS handshake timeout to
|
||||
* adjust socket timeouts */
|
||||
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
/* SCTP stuff */
|
||||
enum BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE = 50;
|
||||
enum BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY = 51;
|
||||
enum BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY = 52;
|
||||
enum BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD = 53;
|
||||
enum BIO_CTRL_DGRAM_SCTP_GET_SNDINFO = 60;
|
||||
enum BIO_CTRL_DGRAM_SCTP_SET_SNDINFO = 61;
|
||||
enum BIO_CTRL_DGRAM_SCTP_GET_RCVINFO = 62;
|
||||
enum BIO_CTRL_DGRAM_SCTP_SET_RCVINFO = 63;
|
||||
enum BIO_CTRL_DGRAM_SCTP_GET_PRINFO = 64;
|
||||
enum BIO_CTRL_DGRAM_SCTP_SET_PRINFO = 65;
|
||||
enum BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN = 70;
|
||||
}
|
||||
|
||||
/* modifiers */
|
||||
enum BIO_FP_READ = 0x02;
|
||||
enum BIO_FP_WRITE = 0x04;
|
||||
enum BIO_FP_APPEND = 0x08;
|
||||
enum BIO_FP_TEXT = 0x10;
|
||||
|
||||
enum BIO_FLAGS_READ = 0x01;
|
||||
enum BIO_FLAGS_WRITE = 0x02;
|
||||
enum BIO_FLAGS_IO_SPECIAL = 0x04;
|
||||
enum BIO_FLAGS_RWS = (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL);
|
||||
enum BIO_FLAGS_SHOULD_RETRY = 0x08;
|
||||
/* "UPLINK" flag denotes file descriptors provided by application.
|
||||
It defaults to 0, as most platforms don't require UPLINK interface. */
|
||||
enum BIO_FLAGS_UPLINK = 0;
|
||||
|
||||
/* Used in BIO_gethostbyname() */
|
||||
enum BIO_GHBN_CTRL_HITS = 1;
|
||||
enum BIO_GHBN_CTRL_MISSES = 2;
|
||||
enum BIO_GHBN_CTRL_CACHE_SIZE = 3;
|
||||
enum BIO_GHBN_CTRL_GET_ENTRY = 4;
|
||||
enum BIO_GHBN_CTRL_FLUSH = 5;
|
||||
|
||||
/* Mostly used in the SSL BIO */
|
||||
/* Not used anymore
|
||||
* enum BIO_FLAGS_PROTOCOL_DELAYED_READ = 0x10;
|
||||
* enum BIO_FLAGS_PROTOCOL_DELAYED_WRITE = 0x20;
|
||||
* enum BIO_FLAGS_PROTOCOL_STARTUP = 0x40;
|
||||
*/
|
||||
|
||||
enum BIO_FLAGS_BASE64_NO_NL = 0x100;
|
||||
|
||||
/* This is used with memory BIOs: it means we shouldn't free up or change the
|
||||
* data in any way.
|
||||
*/
|
||||
enum BIO_FLAGS_MEM_RDONLY = 0x200;
|
||||
|
||||
alias bio_st BIO;
|
||||
|
||||
void BIO_set_flags(BIO* b, int flags);
|
||||
int BIO_test_flags(const(BIO)* b, int flags);
|
||||
void BIO_clear_flags(BIO* b, int flags);
|
||||
|
||||
auto BIO_get_flags()(const(BIO)* b) { return BIO_test_flags(b, ~(0x0)); }
|
||||
auto BIO_set_retry_special()(BIO* b) {
|
||||
return BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY));
|
||||
}
|
||||
auto BIO_set_retry_read()(BIO* b) {
|
||||
return BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY));
|
||||
}
|
||||
auto BIO_set_retry_write()(BIO* b) {
|
||||
return BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY));
|
||||
}
|
||||
|
||||
/* These are normally used internally in BIOs */
|
||||
auto BIO_clear_retry_flags()(BIO* b) {
|
||||
return BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY));
|
||||
}
|
||||
auto BIO_get_retry_flags()(const(BIO)* b) {
|
||||
return BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY));
|
||||
}
|
||||
|
||||
/* These should be used by the application to tell why we should retry */
|
||||
auto BIO_should_read()(const(BIO)* a) { return BIO_test_flags(a, BIO_FLAGS_READ); }
|
||||
auto BIO_should_write()(const(BIO)* a) { return BIO_test_flags(a, BIO_FLAGS_WRITE); }
|
||||
auto BIO_should_io_special()(const(BIO)* a) { return BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL); }
|
||||
auto BIO_retry_type()(const(BIO)* a) { return BIO_test_flags(a, BIO_FLAGS_RWS); }
|
||||
auto BIO_should_retry()(const(BIO)* a) { return BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY); }
|
||||
|
||||
/* The next three are used in conjunction with the
|
||||
* BIO_should_io_special() condition. After this returns true,
|
||||
* BIO* BIO_get_retry_BIO(BIO* bio, int* reason); will walk the BIO
|
||||
* stack and return the 'reason' for the special and the offending BIO.
|
||||
* Given a BIO, BIO_get_retry_reason(bio) will return the code. */
|
||||
/* Returned from the SSL bio when the certificate retrieval code had an error */
|
||||
enum BIO_RR_SSL_X509_LOOKUP = 0x01;
|
||||
/* Returned from the connect BIO when a connect would have blocked */
|
||||
enum BIO_RR_CONNECT = 0x02;
|
||||
/* Returned from the accept BIO when an accept would have blocked */
|
||||
enum BIO_RR_ACCEPT = 0x03;
|
||||
|
||||
/* These are passed by the BIO callback */
|
||||
enum BIO_CB_FREE = 0x01;
|
||||
enum BIO_CB_READ = 0x02;
|
||||
enum BIO_CB_WRITE = 0x03;
|
||||
enum BIO_CB_PUTS = 0x04;
|
||||
enum BIO_CB_GETS = 0x05;
|
||||
enum BIO_CB_CTRL = 0x06;
|
||||
|
||||
/* The callback is called before and after the underling operation,
|
||||
* The BIO_CB_RETURN flag indicates if it is after the call */
|
||||
enum BIO_CB_RETURN = 0x80;
|
||||
auto BIO_CB_return()(int a) { return a|BIO_CB_RETURN; }
|
||||
auto BIO_cb_pre()(int a) { return !((a)&BIO_CB_RETURN); }
|
||||
auto BIO_cb_post()(int a) { return a&BIO_CB_RETURN; }
|
||||
|
||||
ExternC!(c_long function(bio_st*,int,const(char)*,int, c_long,long)) BIO_get_callback(const(BIO)* b);
|
||||
void BIO_set_callback(BIO* b,
|
||||
ExternC!(c_long function(bio_st*,int,const(char)*,int, c_long,long)) callback);
|
||||
char* BIO_get_callback_arg(const(BIO)* b);
|
||||
void BIO_set_callback_arg(BIO* b, char* arg);
|
||||
|
||||
const(char)* BIO_method_name(const(BIO)* b);
|
||||
int BIO_method_type(const(BIO)* b);
|
||||
|
||||
alias typeof(*(ExternC!(void function(bio_st*, int, const(char)*, int, c_long, c_long))).init) bio_info_cb;
|
||||
|
||||
struct bio_method_st {
|
||||
int type;
|
||||
const(char)* name;
|
||||
ExternC!(int function(BIO*, const(char)*, int)) bwrite;
|
||||
ExternC!(int function(BIO*, char*, int)) bread;
|
||||
ExternC!(int function(BIO*, const(char)*)) bputs;
|
||||
ExternC!(int function(BIO*, char*, int)) bgets;
|
||||
ExternC!(c_long function(BIO*, int, c_long, void*)) ctrl;
|
||||
ExternC!(int function(BIO*)) create;
|
||||
ExternC!(int function(BIO*)) destroy;
|
||||
ExternC!(c_long function(BIO*, int, bio_info_cb*)) callback_ctrl;
|
||||
}
|
||||
alias bio_method_st BIO_METHOD;
|
||||
|
||||
struct bio_st
|
||||
{
|
||||
BIO_METHOD* method;
|
||||
/* bio, mode, argp, argi, argl, ret */
|
||||
ExternC!(c_long function(bio_st*,int,const(char)*,int, c_long,long)) callback;
|
||||
char* cb_arg; /* first argument for the callback */
|
||||
|
||||
int init_;
|
||||
int shutdown;
|
||||
int flags; /* extra storage */
|
||||
int retry_reason;
|
||||
int num;
|
||||
void* ptr;
|
||||
bio_st* next_bio; /* used by filter BIOs */
|
||||
bio_st* prev_bio; /* used by filter BIOs */
|
||||
int references;
|
||||
c_ulong num_read;
|
||||
c_ulong num_write;
|
||||
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
};
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(BIO);+/
|
||||
|
||||
struct bio_f_buffer_ctx_struct {
|
||||
|
||||
/* Buffers are setup like this:
|
||||
*
|
||||
* <---------------------- size ----------------------->
|
||||
* +---------------------------------------------------+
|
||||
* | consumed | remaining | free space |
|
||||
* +---------------------------------------------------+
|
||||
* <-- off --><------- len ------->
|
||||
*/
|
||||
|
||||
/* BIO* bio; */ /* this is now in the BIO struct */
|
||||
int ibuf_size; /* how big is the input buffer */
|
||||
int obuf_size; /* how big is the output buffer */
|
||||
|
||||
char* ibuf; /* the char array */
|
||||
int ibuf_len; /* how many bytes are in it */
|
||||
int ibuf_off; /* write/read offset */
|
||||
|
||||
char* obuf; /* the char array */
|
||||
int obuf_len; /* how many bytes are in it */
|
||||
int obuf_off; /* write/read offset */
|
||||
}
|
||||
alias bio_f_buffer_ctx_struct BIO_F_BUFFER_CTX;
|
||||
|
||||
/* Prefix and suffix callback in ASN1 BIO */
|
||||
alias typeof(*(ExternC!(int function(BIO* b, ubyte** pbuf, int* plen, void* parg))).init) asn1_ps_func;
|
||||
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
/* SCTP parameter structs */
|
||||
struct bio_dgram_sctp_sndinfo
|
||||
{
|
||||
uint16_t snd_sid;
|
||||
uint16_t snd_flags;
|
||||
uint32_t snd_ppid;
|
||||
uint32_t snd_context;
|
||||
};
|
||||
|
||||
struct bio_dgram_sctp_rcvinfo
|
||||
{
|
||||
uint16_t rcv_sid;
|
||||
uint16_t rcv_ssn;
|
||||
uint16_t rcv_flags;
|
||||
uint32_t rcv_ppid;
|
||||
uint32_t rcv_tsn;
|
||||
uint32_t rcv_cumtsn;
|
||||
uint32_t rcv_context;
|
||||
};
|
||||
|
||||
struct bio_dgram_sctp_prinfo
|
||||
{
|
||||
uint16_t pr_policy;
|
||||
uint32_t pr_value;
|
||||
};
|
||||
}
|
||||
|
||||
/* connect BIO stuff */
|
||||
enum BIO_CONN_S_BEFORE = 1;
|
||||
enum BIO_CONN_S_GET_IP = 2;
|
||||
enum BIO_CONN_S_GET_PORT = 3;
|
||||
enum BIO_CONN_S_CREATE_SOCKET = 4;
|
||||
enum BIO_CONN_S_CONNECT = 5;
|
||||
enum BIO_CONN_S_OK = 6;
|
||||
enum BIO_CONN_S_BLOCKED_CONNECT = 7;
|
||||
enum BIO_CONN_S_NBIO = 8;
|
||||
/*alias BIO_ctrl BIO_CONN_get_param_hostname; */
|
||||
|
||||
enum BIO_C_SET_CONNECT = 100;
|
||||
enum BIO_C_DO_STATE_MACHINE = 101;
|
||||
enum BIO_C_SET_NBIO = 102;
|
||||
enum BIO_C_SET_PROXY_PARAM = 103;
|
||||
enum BIO_C_SET_FD = 104;
|
||||
enum BIO_C_GET_FD = 105;
|
||||
enum BIO_C_SET_FILE_PTR = 106;
|
||||
enum BIO_C_GET_FILE_PTR = 107;
|
||||
enum BIO_C_SET_FILENAME = 108;
|
||||
enum BIO_C_SET_SSL = 109;
|
||||
enum BIO_C_GET_SSL = 110;
|
||||
enum BIO_C_SET_MD = 111;
|
||||
enum BIO_C_GET_MD = 112;
|
||||
enum BIO_C_GET_CIPHER_STATUS = 113;
|
||||
enum BIO_C_SET_BUF_MEM = 114;
|
||||
enum BIO_C_GET_BUF_MEM_PTR = 115;
|
||||
enum BIO_C_GET_BUFF_NUM_LINES = 116;
|
||||
enum BIO_C_SET_BUFF_SIZE = 117;
|
||||
enum BIO_C_SET_ACCEPT = 118;
|
||||
enum BIO_C_SSL_MODE = 119;
|
||||
enum BIO_C_GET_MD_CTX = 120;
|
||||
enum BIO_C_GET_PROXY_PARAM = 121;
|
||||
enum BIO_C_SET_BUFF_READ_DATA = 122; /* data to read first */
|
||||
enum BIO_C_GET_CONNECT = 123;
|
||||
enum BIO_C_GET_ACCEPT = 124;
|
||||
enum BIO_C_SET_SSL_RENEGOTIATE_BYTES = 125;
|
||||
enum BIO_C_GET_SSL_NUM_RENEGOTIATES = 126;
|
||||
enum BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT = 127;
|
||||
enum BIO_C_FILE_SEEK = 128;
|
||||
enum BIO_C_GET_CIPHER_CTX = 129;
|
||||
enum BIO_C_SET_BUF_MEM_EOF_RETURN = 130;/*return end of input value*/
|
||||
enum BIO_C_SET_BIND_MODE = 131;
|
||||
enum BIO_C_GET_BIND_MODE = 132;
|
||||
enum BIO_C_FILE_TELL = 133;
|
||||
enum BIO_C_GET_SOCKS = 134;
|
||||
enum BIO_C_SET_SOCKS = 135;
|
||||
|
||||
enum BIO_C_SET_WRITE_BUF_SIZE = 136;/* for BIO_s_bio */
|
||||
enum BIO_C_GET_WRITE_BUF_SIZE = 137;
|
||||
enum BIO_C_MAKE_BIO_PAIR = 138;
|
||||
enum BIO_C_DESTROY_BIO_PAIR = 139;
|
||||
enum BIO_C_GET_WRITE_GUARANTEE = 140;
|
||||
enum BIO_C_GET_READ_REQUEST = 141;
|
||||
enum BIO_C_SHUTDOWN_WR = 142;
|
||||
enum BIO_C_NREAD0 = 143;
|
||||
enum BIO_C_NREAD = 144;
|
||||
enum BIO_C_NWRITE0 = 145;
|
||||
enum BIO_C_NWRITE = 146;
|
||||
enum BIO_C_RESET_READ_REQUEST = 147;
|
||||
enum BIO_C_SET_MD_CTX = 148;
|
||||
|
||||
enum BIO_C_SET_PREFIX = 149;
|
||||
enum BIO_C_GET_PREFIX = 150;
|
||||
enum BIO_C_SET_SUFFIX = 151;
|
||||
enum BIO_C_GET_SUFFIX = 152;
|
||||
|
||||
enum BIO_C_SET_EX_ARG = 153;
|
||||
enum BIO_C_GET_EX_ARG = 154;
|
||||
|
||||
auto BIO_set_app_data()(BIO* s, void* arg) { return BIO_set_ex_data(s,0,arg); }
|
||||
auto BIO_get_app_data()(BIO* s) { return BIO_get_ex_data(s,0); }
|
||||
|
||||
/* BIO_s_connect() and BIO_s_socks4a_connect() */
|
||||
auto BIO_set_conn_hostname()(BIO* b, char* name) { return BIO_ctrl(b,BIO_C_SET_CONNECT,0,name); }
|
||||
auto BIO_set_conn_port()(BIO* b,char* port) { return BIO_ctrl(b,BIO_C_SET_CONNECT,1,port); }
|
||||
auto BIO_set_conn_ip()(BIO* b,char* ip) { return BIO_ctrl(b,BIO_C_SET_CONNECT,2,ip); }
|
||||
auto BIO_set_conn_int_port()(BIO* b,char* port) { return BIO_ctrl(b,BIO_C_SET_CONNECT,3,port); }
|
||||
auto BIO_get_conn_hostname()(BIO* b) { return { return BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0); }; }
|
||||
auto BIO_get_conn_port()(BIO* b) { return { return BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1); }; }
|
||||
auto BIO_get_conn_ip()(BIO* b) { return { return BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2); }; }
|
||||
auto BIO_get_conn_int_port()(BIO* b) { return { return BIO_int_ctrl(b,BIO_C_GET_CONNECT,3,0); }; }
|
||||
|
||||
|
||||
auto BIO_set_nbio()(BIO* b,n) { return BIO_ctrl(b,BIO_C_SET_NBIO,(n),null); }
|
||||
|
||||
/* BIO_s_accept_socket() */
|
||||
auto BIO_set_accept_port()(BIO* b,char* name) { return BIO_ctrl(b,BIO_C_SET_ACCEPT,0,name); }
|
||||
auto BIO_get_accept_port()(BIO* b) { return BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0); }
|
||||
/* auto BIO_set_nbio()(BIO* b,n) { return BIO_ctrl(b,BIO_C_SET_NBIO,(n),null); } */
|
||||
auto BIO_set_nbio_accept()(BIO* b,int n) { return BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a".ptr:null); }
|
||||
auto BIO_set_accept_bios()(BIO* b,char* bio) { return BIO_ctrl(b,BIO_C_SET_ACCEPT,2,bio); }
|
||||
|
||||
enum BIO_BIND_NORMAL = 0;
|
||||
enum BIO_BIND_REUSEADDR_IF_UNUSED = 1;
|
||||
enum BIO_BIND_REUSEADDR = 2;
|
||||
auto BIO_set_bind_mode()(BIO* b,c_long mode) { return BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,null); }
|
||||
auto BIO_get_bind_mode()(BIO* b, c_long dummy) { return BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,null); }
|
||||
|
||||
alias BIO_do_handshake BIO_do_connect;
|
||||
alias BIO_do_handshake BIO_do_accept;
|
||||
auto BIO_do_handshake()(BIO* b) { return BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,null); }
|
||||
|
||||
/* BIO_s_proxy_client() */
|
||||
auto BIO_set_url()(BIO* b,char* url) { return BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,url); }
|
||||
auto BIO_set_proxies()(BIO* b,char* p) { return BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,p); }
|
||||
/* BIO_set_nbio()(BIO* b,n) */
|
||||
auto BIO_set_filter_bio()(BIO* b,char* s) { return BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,s); }
|
||||
/* BIO* BIO_get_filter_bio(BIO* bio); */
|
||||
auto BIO_set_proxy_cb()(BIO* b,ExternC!(void* function()) cb) { return BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,cb); }
|
||||
auto BIO_set_proxy_header()(BIO* b,char* sk) { return BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,sk); }
|
||||
auto BIO_set_no_connect_return()(BIO* b,bool t) { return BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,t); }
|
||||
|
||||
auto BIO_get_proxy_header()(BIO* b,char* skp) { return BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,skp); }
|
||||
auto BIO_get_proxies()(BIO* b,char* pxy_p) { return BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(pxy_p)); }
|
||||
auto BIO_get_url()(BIO* b,char*url) { return BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(url)); }
|
||||
auto BIO_get_no_connect_return()(BIO* b) { return BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,null); }
|
||||
|
||||
auto BIO_set_fd()(BIO* b,int fd, c_long c) { return BIO_int_ctrl(b,BIO_C_SET_FD,c,fd); }
|
||||
auto BIO_get_fd()(BIO* b,c_long c) { return BIO_ctrl(b,BIO_C_GET_FD,0,cast(void*)c); }
|
||||
|
||||
auto BIO_set_fp()(BIO* b,FILE* fp,c_long c) { return BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,fp); }
|
||||
auto BIO_get_fp()(BIO* b,FILE** fpp) { return BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,fpp); }
|
||||
|
||||
auto BIO_seek()(BIO* b,ofs) { return cast(int) BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,null); }
|
||||
auto BIO_tell()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_C_FILE_TELL,0,null); }
|
||||
|
||||
/* name is cast to lose const, but might be better to route through a function
|
||||
so we can do it safely */
|
||||
//#ifdef CONST_STRICT
|
||||
///* If you are wondering why this isn't defined, its because CONST_STRICT is
|
||||
// * purely a compile-time kludge to allow const to be checked.
|
||||
// */
|
||||
//int BIO_read_filename(BIO* b,const(char)* name);
|
||||
//#else
|
||||
auto BIO_read_filename()(BIO* b,const(char)* name) { return BIO_ctrl(b,BIO_C_SET_FILENAME,BIO_CLOSE|BIO_FP_READ,name); }
|
||||
//#endif
|
||||
auto BIO_write_filename()(BIO* b,const(char)* name) { return BIO_ctrl(b,BIO_C_SET_FILENAME,BIO_CLOSE|BIO_FP_WRITE,name); }
|
||||
auto BIO_append_filename()(BIO* b,const(char)* name) { return BIO_ctrl(b,BIO_C_SET_FILENAME,BIO_CLOSE|BIO_FP_APPEND,name); }
|
||||
auto BIO_rw_filename()(BIO* b,const(char)* name) { return BIO_ctrl(b,BIO_C_SET_FILENAME,BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name); }
|
||||
|
||||
/* WARNING WARNING, this ups the reference count on the read bio of the
|
||||
* SSL structure. This is because the ssl read BIO is now pointed to by
|
||||
* the next_bio field in the bio. So when you free the BIO, make sure
|
||||
* you are doing a BIO_free_all() to catch the underlying BIO. */
|
||||
auto BIO_set_ssl()(BIO* b,SSL* ssl,c_long c) { return BIO_ctrl(b,BIO_C_SET_SSL,c,ssl); }
|
||||
auto BIO_get_ssl()(BIO* b,SSL** sslp) { return BIO_ctrl(b,BIO_C_GET_SSL,0,sslp); }
|
||||
auto BIO_set_ssl_mode()(BIO* b,c_long client) { return BIO_ctrl(b,BIO_C_SSL_MODE,client,null); }
|
||||
auto BIO_set_ssl_renegotiate_bytes()(BIO* b,c_long num) {
|
||||
return BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,null);
|
||||
};
|
||||
auto BIO_get_num_renegotiates()(BIO* b) {
|
||||
return BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,null);
|
||||
};
|
||||
auto BIO_set_ssl_renegotiate_timeout()(BIO* b,c_long seconds) {
|
||||
return BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,null);
|
||||
};
|
||||
|
||||
/* defined in evp.h */
|
||||
/* auto BIO_set_md()(BIO* b,md) { return BIO_ctrl(b,BIO_C_SET_MD,1,(char*)md); } */
|
||||
|
||||
auto BIO_get_mem_data()(BIO* b,BUF_MEM** pp) { return BIO_ctrl(b,BIO_CTRL_INFO,0,pp); }
|
||||
auto BIO_set_mem_buf()(BIO* b,BUF_MEM* bm,c_long c) { return BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,bm); }
|
||||
auto BIO_get_mem_ptr()(BIO* b,BUF_MEM** pp) { return BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,pp); }
|
||||
auto BIO_set_mem_eof_return()(BIO* b,c_long v) { return BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,null); }
|
||||
|
||||
/* For the BIO_f_buffer() type */
|
||||
auto BIO_get_buffer_num_lines()(BIO* b) { return BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,null); }
|
||||
auto BIO_set_buffer_size()(BIO* b,size) { return BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,null); }
|
||||
auto BIO_set_read_buffer_size()(BIO* b,size) { return BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0); }
|
||||
auto BIO_set_write_buffer_size()(BIO* b,size) { return BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1); }
|
||||
auto BIO_set_buffer_read_data()(BIO* b,buf,num) { return BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf); }
|
||||
|
||||
/* Don't use the next one unless you know what you are doing :-) */
|
||||
auto BIO_dup_state()(BIO* b,void* ret) { return BIO_ctrl(b,BIO_CTRL_DUP,0,ret); }
|
||||
|
||||
auto BIO_reset()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_CTRL_RESET,0,null); }
|
||||
auto BIO_eof()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_CTRL_EOF,0,null); }
|
||||
auto BIO_set_close()(BIO* b,int c) { return cast(int) BIO_ctrl(b,BIO_CTRL_SET_CLOSE,c,null); }
|
||||
auto BIO_get_close()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,null); }
|
||||
auto BIO_pending()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_CTRL_PENDING,0,null); }
|
||||
auto BIO_wpending()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_CTRL_WPENDING,0,null); }
|
||||
/* ...pending macros have inappropriate return type */
|
||||
size_t BIO_ctrl_pending(BIO* b);
|
||||
size_t BIO_ctrl_wpending(BIO* b);
|
||||
auto BIO_flush()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_CTRL_FLUSH,0,null); }
|
||||
auto BIO_get_info_callback()(BIO* b,bio_info_cb** cbp) { return cast(int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,cbp); }
|
||||
auto BIO_set_info_callback()(BIO* b,bio_info_cb* cb) { return cast(int) BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb); }
|
||||
|
||||
/* For the BIO_f_buffer() type */
|
||||
auto BIO_buffer_get_num_lines()(BIO* b) { return BIO_ctrl(b,BIO_CTRL_GET,0,null); }
|
||||
|
||||
/* For BIO_s_bio() */
|
||||
auto BIO_set_write_buf_size()(BIO* b,size) { return cast(int) BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,null); }
|
||||
auto BIO_get_write_buf_size()(BIO* b,size) { return cast(size_t) BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,null); }
|
||||
auto BIO_make_bio_pair()(BIO* b1,b2) { return cast(int) BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2); }
|
||||
auto BIO_destroy_bio_pair()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,null); }
|
||||
auto BIO_shutdown_wr()(BIO* b) { return cast(int) BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, null); }
|
||||
/* macros with inappropriate type -- but ...pending macros use int too: */
|
||||
auto BIO_get_write_guarantee()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,null); }
|
||||
auto BIO_get_read_request()(BIO* b) { return cast(int) BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,null); }
|
||||
size_t BIO_ctrl_get_write_guarantee(BIO* b);
|
||||
size_t BIO_ctrl_get_read_request(BIO* b);
|
||||
int BIO_ctrl_reset_read_request(BIO* b);
|
||||
|
||||
/* ctrl macros for dgram */
|
||||
auto BIO_ctrl_dgram_connect()(BIO* b,void* peer) { return cast(int) BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, peer); }
|
||||
auto BIO_ctrl_set_connected()(BIO* b, c_long state, peer) { return cast(int) BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, peer); }
|
||||
auto BIO_dgram_recv_timedout()(BIO* b) { return cast(int) BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, null); }
|
||||
auto BIO_dgram_send_timedout()(BIO* b) { return cast(int) BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, null); }
|
||||
auto BIO_dgram_get_peer()(BIO* b,void* peer) { return cast(int) BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, peer); }
|
||||
auto BIO_dgram_set_peer()(BIO* b,void* peer) { return cast(int) BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, peer); }
|
||||
|
||||
/* These two aren't currently implemented */
|
||||
/* int BIO_get_ex_num(BIO* bio); */
|
||||
/* void BIO_set_ex_free_func(BIO* bio,int idx,ExternC!(void function()) cb); */
|
||||
int BIO_set_ex_data(BIO* bio,int idx,void* data);
|
||||
void* BIO_get_ex_data(BIO* bio,int idx);
|
||||
int BIO_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
c_ulong BIO_number_read(BIO* bio);
|
||||
c_ulong BIO_number_written(BIO* bio);
|
||||
|
||||
/* For BIO_f_asn1() */
|
||||
int BIO_asn1_set_prefix(BIO* b, asn1_ps_func* prefix,
|
||||
asn1_ps_func* prefix_free);
|
||||
int BIO_asn1_get_prefix(BIO* b, asn1_ps_func** pprefix,
|
||||
asn1_ps_func** pprefix_free);
|
||||
int BIO_asn1_set_suffix(BIO* b, asn1_ps_func* suffix,
|
||||
asn1_ps_func* suffix_free);
|
||||
int BIO_asn1_get_suffix(BIO* b, asn1_ps_func** psuffix,
|
||||
asn1_ps_func** psuffix_free);
|
||||
|
||||
version (OPENSSL_NO_FP_API) {} else {
|
||||
BIO_METHOD* BIO_s_file();
|
||||
BIO* BIO_new_file(const(char)* filename, const(char)* mode);
|
||||
BIO* BIO_new_fp(FILE* stream, int close_flag);
|
||||
alias BIO_s_file BIO_s_file_internal;
|
||||
}
|
||||
BIO* BIO_new(BIO_METHOD* type);
|
||||
int BIO_set(BIO* a,BIO_METHOD* type);
|
||||
int BIO_free(BIO* a);
|
||||
void BIO_vfree(BIO* a);
|
||||
int BIO_read(BIO* b, void* data, int len);
|
||||
int BIO_gets(BIO* bp,char* buf, int size);
|
||||
int BIO_write(BIO* b, const(void)* data, int len);
|
||||
int BIO_puts(BIO* bp,const(char)* buf);
|
||||
int BIO_indent(BIO* b,int indent,int max);
|
||||
c_long BIO_ctrl(BIO* bp,int cmd,c_long larg,void* parg);
|
||||
c_long BIO_callback_ctrl(BIO* b, int cmd, ExternC!(void function(bio_st*, int, const(char)*, int, c_long, c_long)) fp);
|
||||
char* BIO_ptr_ctrl(BIO* bp,int cmd,c_long larg);
|
||||
c_long BIO_int_ctrl(BIO* bp,int cmd,c_long larg,int iarg);
|
||||
BIO* BIO_push(BIO* b,BIO* append);
|
||||
BIO* BIO_pop(BIO* b);
|
||||
void BIO_free_all(BIO* a);
|
||||
BIO* BIO_find_type(BIO* b,int bio_type);
|
||||
BIO* BIO_next(BIO* b);
|
||||
BIO* BIO_get_retry_BIO(BIO* bio, int* reason);
|
||||
int BIO_get_retry_reason(BIO* bio);
|
||||
BIO* BIO_dup_chain(BIO* in_);
|
||||
|
||||
int BIO_nread0(BIO* bio, char** buf);
|
||||
int BIO_nread(BIO* bio, char** buf, int num);
|
||||
int BIO_nwrite0(BIO* bio, char** buf);
|
||||
int BIO_nwrite(BIO* bio, char** buf, int num);
|
||||
|
||||
c_long BIO_debug_callback(BIO* bio,int cmd,const(char)* argp,int argi,
|
||||
c_long argl,c_long ret);
|
||||
|
||||
BIO_METHOD* BIO_s_mem();
|
||||
BIO* BIO_new_mem_buf(void* buf, int len);
|
||||
BIO_METHOD* BIO_s_socket();
|
||||
BIO_METHOD* BIO_s_connect();
|
||||
BIO_METHOD* BIO_s_accept();
|
||||
BIO_METHOD* BIO_s_fd();
|
||||
// #ifndef OPENSSL_SYS_OS2
|
||||
BIO_METHOD* BIO_s_log();
|
||||
// #endif
|
||||
BIO_METHOD* BIO_s_bio();
|
||||
BIO_METHOD* BIO_s_null();
|
||||
BIO_METHOD* BIO_f_null();
|
||||
BIO_METHOD* BIO_f_buffer();
|
||||
//#ifdef OPENSSL_SYS_VMS
|
||||
//BIO_METHOD* BIO_f_linebuffer();
|
||||
//#endif
|
||||
BIO_METHOD* BIO_f_nbio_test();
|
||||
version (OPENSSL_NO_DGRAM) {} else {
|
||||
BIO_METHOD* BIO_s_datagram();
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
BIO_METHOD *BIO_s_datagram_sctp();
|
||||
}
|
||||
}
|
||||
|
||||
/* BIO_METHOD* BIO_f_ber(); */
|
||||
|
||||
int BIO_sock_should_retry(int i);
|
||||
int BIO_sock_non_fatal_error(int error);
|
||||
int BIO_dgram_non_fatal_error(int error);
|
||||
|
||||
int BIO_fd_should_retry(int i);
|
||||
int BIO_fd_non_fatal_error(int error);
|
||||
int BIO_dump_cb(ExternC!(int function(const(void)* data, size_t len, void* u)) cb,
|
||||
void* u, const(char)* s, int len);
|
||||
int BIO_dump_indent_cb(ExternC!(int function(const(void)* data, size_t len, void* u)) cb,
|
||||
void* u, const(char)* s, int len, int indent);
|
||||
int BIO_dump(BIO* b,const(char)* bytes,int len);
|
||||
int BIO_dump_indent(BIO* b,const(char)* bytes,int len,int indent);
|
||||
version (OPENSSL_NO_FP_API) {} else {
|
||||
int BIO_dump_fp(FILE* fp, const(char)* s, int len);
|
||||
int BIO_dump_indent_fp(FILE* fp, const(char)* s, int len, int indent);
|
||||
}
|
||||
hostent* BIO_gethostbyname(const(char)* name);
|
||||
/* We might want a thread-safe interface too:
|
||||
* hostent* BIO_gethostbyname_r(const(char)* name,
|
||||
* hostent* result, void* buffer, size_t buflen);
|
||||
* or something similar (caller allocates a struct hostent,
|
||||
* pointed to by "result", and additional buffer space for the various
|
||||
* substructures; if the buffer does not suffice, NULL is returned
|
||||
* and an appropriate error code is set).
|
||||
*/
|
||||
int BIO_sock_error(int sock);
|
||||
int BIO_socket_ioctl(int fd, c_long type, void* arg);
|
||||
int BIO_socket_nbio(int fd,int mode);
|
||||
int BIO_get_port(const(char)* str, ushort* port_ptr);
|
||||
int BIO_get_host_ip(const(char)* str, ubyte* ip);
|
||||
int BIO_get_accept_socket(char* host_port,int mode);
|
||||
int BIO_accept(int sock,char** ip_port);
|
||||
int BIO_sock_init();
|
||||
void BIO_sock_cleanup();
|
||||
int BIO_set_tcp_ndelay(int sock,int turn_on);
|
||||
|
||||
BIO* BIO_new_socket(int sock, int close_flag);
|
||||
BIO* BIO_new_dgram(int fd, int close_flag);
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
BIO *BIO_new_dgram_sctp(int fd, int close_flag);
|
||||
int BIO_dgram_is_sctp(BIO *bio);
|
||||
int BIO_dgram_sctp_notification_cb(BIO *b,
|
||||
ExternC!(void function(BIO *bio, void *context, void *buf)) handle_notifications,
|
||||
void *context);
|
||||
int BIO_dgram_sctp_wait_for_dry(BIO *b);
|
||||
int BIO_dgram_sctp_msg_waiting(BIO *b);
|
||||
}
|
||||
BIO* BIO_new_fd(int fd, int close_flag);
|
||||
BIO* BIO_new_connect(char* host_port);
|
||||
BIO* BIO_new_accept(char* host_port);
|
||||
|
||||
int BIO_new_bio_pair(BIO** bio1, size_t writebuf1,
|
||||
BIO** bio2, size_t writebuf2);
|
||||
/* If successful, returns 1 and in* bio1, *bio2 two BIO pair endpoints.
|
||||
* Otherwise returns 0 and sets* bio1 and* bio2 to NULL.
|
||||
* Size 0 uses default value.
|
||||
*/
|
||||
|
||||
void BIO_copy_next_retry(BIO* b);
|
||||
|
||||
/*long BIO_ghbn_ctrl(int cmd,int iarg,char* parg);*/
|
||||
|
||||
int BIO_printf(BIO* bio, const(char)* format, ...);
|
||||
int BIO_vprintf(BIO* bio, const(char)* format, va_list args);
|
||||
int BIO_snprintf(char* buf, size_t n, const(char)* format, ...);
|
||||
int BIO_vsnprintf(char* buf, size_t n, const(char)* format, va_list args);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_BIO_strings();
|
||||
|
||||
/* Error codes for the BIO functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum BIO_F_ACPT_STATE = 100;
|
||||
enum BIO_F_BIO_ACCEPT = 101;
|
||||
enum BIO_F_BIO_BER_GET_HEADER = 102;
|
||||
enum BIO_F_BIO_CALLBACK_CTRL = 131;
|
||||
enum BIO_F_BIO_CTRL = 103;
|
||||
enum BIO_F_BIO_GETHOSTBYNAME = 120;
|
||||
enum BIO_F_BIO_GETS = 104;
|
||||
enum BIO_F_BIO_GET_ACCEPT_SOCKET = 105;
|
||||
enum BIO_F_BIO_GET_HOST_IP = 106;
|
||||
enum BIO_F_BIO_GET_PORT = 107;
|
||||
enum BIO_F_BIO_MAKE_PAIR = 121;
|
||||
enum BIO_F_BIO_NEW = 108;
|
||||
enum BIO_F_BIO_NEW_FILE = 109;
|
||||
enum BIO_F_BIO_NEW_MEM_BUF = 126;
|
||||
enum BIO_F_BIO_NREAD = 123;
|
||||
enum BIO_F_BIO_NREAD0 = 124;
|
||||
enum BIO_F_BIO_NWRITE = 125;
|
||||
enum BIO_F_BIO_NWRITE0 = 122;
|
||||
enum BIO_F_BIO_PUTS = 110;
|
||||
enum BIO_F_BIO_READ = 111;
|
||||
enum BIO_F_BIO_SOCK_INIT = 112;
|
||||
enum BIO_F_BIO_WRITE = 113;
|
||||
enum BIO_F_BUFFER_CTRL = 114;
|
||||
enum BIO_F_CONN_CTRL = 127;
|
||||
enum BIO_F_CONN_STATE = 115;
|
||||
enum BIO_F_DGRAM_SCTP_READ = 132;
|
||||
enum BIO_F_FILE_CTRL = 116;
|
||||
enum BIO_F_FILE_READ = 130;
|
||||
enum BIO_F_LINEBUFFER_CTRL = 129;
|
||||
enum BIO_F_MEM_READ = 128;
|
||||
enum BIO_F_MEM_WRITE = 117;
|
||||
enum BIO_F_SSL_NEW = 118;
|
||||
enum BIO_F_WSASTARTUP = 119;
|
||||
|
||||
/* Reason codes. */
|
||||
enum BIO_R_ACCEPT_ERROR = 100;
|
||||
enum BIO_R_BAD_FOPEN_MODE = 101;
|
||||
enum BIO_R_BAD_HOSTNAME_LOOKUP = 102;
|
||||
enum BIO_R_BROKEN_PIPE = 124;
|
||||
enum BIO_R_CONNECT_ERROR = 103;
|
||||
enum BIO_R_EOF_ON_MEMORY_BIO = 127;
|
||||
enum BIO_R_ERROR_SETTING_NBIO = 104;
|
||||
enum BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET = 105;
|
||||
enum BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET = 106;
|
||||
enum BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET = 107;
|
||||
enum BIO_R_INVALID_ARGUMENT = 125;
|
||||
enum BIO_R_INVALID_IP_ADDRESS = 108;
|
||||
enum BIO_R_IN_USE = 123;
|
||||
enum BIO_R_KEEPALIVE = 109;
|
||||
enum BIO_R_NBIO_CONNECT_ERROR = 110;
|
||||
enum BIO_R_NO_ACCEPT_PORT_SPECIFIED = 111;
|
||||
enum BIO_R_NO_HOSTNAME_SPECIFIED = 112;
|
||||
enum BIO_R_NO_PORT_DEFINED = 113;
|
||||
enum BIO_R_NO_PORT_SPECIFIED = 114;
|
||||
enum BIO_R_NO_SUCH_FILE = 128;
|
||||
enum BIO_R_NULL_PARAMETER = 115;
|
||||
enum BIO_R_TAG_MISMATCH = 116;
|
||||
enum BIO_R_UNABLE_TO_BIND_SOCKET = 117;
|
||||
enum BIO_R_UNABLE_TO_CREATE_SOCKET = 118;
|
||||
enum BIO_R_UNABLE_TO_LISTEN_SOCKET = 119;
|
||||
enum BIO_R_UNINITIALIZED = 120;
|
||||
enum BIO_R_UNSUPPORTED_METHOD = 121;
|
||||
enum BIO_R_WRITE_TO_READ_ONLY_BIO = 126;
|
||||
enum BIO_R_WSASTARTUP = 122;
|
|
@ -0,0 +1,124 @@
|
|||
/* crypto/bf/blowfish.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.blowfish;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_NO_BF) {
|
||||
static assert(false, "BF is disabled.");
|
||||
}
|
||||
|
||||
enum BF_ENCRYPT = 1;
|
||||
enum BF_DECRYPT = 0;
|
||||
|
||||
/*
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
* ! BF_LONG has to be at least 32 bits wide. If it's wider, then !
|
||||
* ! BF_LONG_LOG2 has to be defined along. !
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
*/
|
||||
|
||||
// #if defined(__LP32__)
|
||||
// alias c_ulong BF_LONG;
|
||||
// #elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
|
||||
// alias c_ulong BF_LONG;
|
||||
// enum BF_LONG_LOG2 = 3;
|
||||
// /*
|
||||
// * _CRAY note. I could declare short, but I have no idea what impact
|
||||
// * does it have on performance on none-T3E machines. I could declare
|
||||
// * int, but at least on C90 sizeof(int) can be chosen at compile time.
|
||||
// * So I've chosen long...
|
||||
// * <appro@fy.chalmers.se>
|
||||
// */
|
||||
// #else
|
||||
// alias uint BF_LONG;
|
||||
// #endif
|
||||
alias uint BF_LONG;
|
||||
|
||||
enum BF_ROUNDS = 16;
|
||||
enum BF_BLOCK = 8;
|
||||
|
||||
struct bf_key_st {
|
||||
BF_LONG[BF_ROUNDS+2] P;
|
||||
BF_LONG[4*256] S;
|
||||
}
|
||||
alias bf_key_st BF_KEY;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
void private_BF_set_key(BF_KEY *key, int len, const(ubyte)* data);
|
||||
}
|
||||
void BF_set_key(BF_KEY* key, int len, const(ubyte)* data);
|
||||
|
||||
void BF_encrypt(BF_LONG* data,const(BF_KEY)* key);
|
||||
void BF_decrypt(BF_LONG* data,const(BF_KEY)* key);
|
||||
|
||||
void BF_ecb_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(BF_KEY)* key, int enc);
|
||||
void BF_cbc_encrypt(const(ubyte)* in_, ubyte* out_, c_long length,
|
||||
const(BF_KEY)* schedule, ubyte* ivec, int enc);
|
||||
void BF_cfb64_encrypt(const(ubyte)* in_, ubyte* out_, c_long length,
|
||||
const(BF_KEY)* schedule, ubyte* ivec, int* num, int enc);
|
||||
void BF_ofb64_encrypt(const(ubyte)* in_, ubyte* out_, c_long length,
|
||||
const(BF_KEY)* schedule, ubyte* ivec, int* num);
|
||||
const(char)* BF_options();
|
|
@ -0,0 +1,908 @@
|
|||
/* crypto/bn/bn.h */
|
||||
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2006 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
*
|
||||
* Portions of the attached software ("Contribution") are developed by
|
||||
* SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
|
||||
*
|
||||
* The Contribution is licensed pursuant to the Eric Young open source
|
||||
* license provided above.
|
||||
*
|
||||
* The binary polynomial arithmetic software is originally written by
|
||||
* Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.bn;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
import core.stdc.stdio; /* FILE */
|
||||
}
|
||||
public import deimos.openssl.ossl_typ;
|
||||
public import deimos.openssl.crypto;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/+ Not ported, internal only.
|
||||
/* These preprocessor symbols control various aspects of the bignum headers and
|
||||
* library code. They're not defined by any "normal" configuration, as they are
|
||||
* intended for development and testing purposes. NB: defining all three can be
|
||||
* useful for debugging application code as well as openssl itself.
|
||||
*
|
||||
* BN_DEBUG - turn on various debugging alterations to the bignum code
|
||||
* BN_DEBUG_RAND - uses random poisoning of unused words to trip up
|
||||
* mismanagement of bignum internals. You must also define BN_DEBUG.
|
||||
*/
|
||||
/* #define BN_DEBUG */
|
||||
/* #define BN_DEBUG_RAND */
|
||||
|
||||
// #ifndef OPENSSL_SMALL_FOOTPRINT
|
||||
// #define BN_MUL_COMBA
|
||||
// #define BN_SQR_COMBA
|
||||
// #define BN_RECURSION
|
||||
// #endif
|
||||
|
||||
/* This next option uses the C libraries (2 word)/(1 word) function.
|
||||
* If it is not defined, I use my C version (which is slower).
|
||||
* The reason for this flag is that when the particular C compiler
|
||||
* library routine is used, and the library is linked with a different
|
||||
* compiler, the library is missing. This mostly happens when the
|
||||
* library is built with gcc and then linked using normal cc. This would
|
||||
* be a common occurrence because gcc normally produces code that is
|
||||
* 2 times faster than system compilers for the big number stuff.
|
||||
* For machines with only one compiler (or shared libraries), this should
|
||||
* be on. Again this in only really a problem on machines
|
||||
* using "long long's", are 32bit, and are not using my assembler code. */
|
||||
#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \
|
||||
defined(OPENSSL_SYS_WIN32) || defined(linux)
|
||||
# ifndef BN_DIV2W
|
||||
# define BN_DIV2W
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* assuming c_long is 64bit - this is the DEC Alpha
|
||||
* c_ulong c_long is only 64 bits :-(, don't define
|
||||
* BN_LLONG for the DEC Alpha */
|
||||
#ifdef SIXTY_FOUR_BIT_LONG
|
||||
alias c_ulong BN_ULLONG; c_long
|
||||
alias c_ulong BN_ULONG;
|
||||
alias c_long BN_LONG;
|
||||
enum BN_BITS = 128;
|
||||
enum BN_BYTES = 8;
|
||||
enum BN_BITS2 = 64;
|
||||
enum BN_BITS4 = 32;
|
||||
#define BN_MASK (0xffffffffffffffffffffffffffffffffLL)
|
||||
#define BN_MASK2 (0xffffffffffffffffL)
|
||||
#define BN_MASK2l (0xffffffffL)
|
||||
#define BN_MASK2h (0xffffffff00000000L)
|
||||
#define BN_MASK2h1 (0xffffffff80000000L)
|
||||
#define BN_TBIT (0x8000000000000000L)
|
||||
enum BN_DEC_CONV = (10000000000000000000UL);
|
||||
enum BN_DEC_FMT1 = "%lu";
|
||||
enum BN_DEC_FMT2 = "%019lu";
|
||||
enum BN_DEC_NUM = 19;
|
||||
enum BN_HEX_FMT1 = "%lX";
|
||||
enum BN_HEX_FMT2 = "%016lX";
|
||||
#endif
|
||||
|
||||
/* This is where the c_long long data type is 64 bits, but c_long is 32.
|
||||
* For machines where there are 64bit registers, this is the mode to use.
|
||||
* IRIX, on R4000 and above should use this mode, along with the relevant
|
||||
* assembler code :-). Do NOT define BN_LLONG.
|
||||
*/
|
||||
#ifdef SIXTY_FOUR_BIT
|
||||
#undef BN_LLONG
|
||||
#undef BN_ULLONG
|
||||
alias c_ulong BN_ULONG; c_long
|
||||
alias c_long BN_LONG; long
|
||||
enum BN_BITS = 128;
|
||||
enum BN_BYTES = 8;
|
||||
enum BN_BITS2 = 64;
|
||||
enum BN_BITS4 = 32;
|
||||
#define BN_MASK2 (0xffffffffffffffffLL)
|
||||
#define BN_MASK2l (0xffffffffL)
|
||||
#define BN_MASK2h (0xffffffff00000000LL)
|
||||
#define BN_MASK2h1 (0xffffffff80000000LL)
|
||||
#define BN_TBIT (0x8000000000000000LL)
|
||||
enum BN_DEC_CONV = (10000000000000000000ULL);
|
||||
enum BN_DEC_FMT1 = "%llu";
|
||||
enum BN_DEC_FMT2 = "%019llu";
|
||||
enum BN_DEC_NUM = 19;
|
||||
enum BN_HEX_FMT1 = "%llX";
|
||||
enum BN_HEX_FMT2 = "%016llX";
|
||||
#endif
|
||||
|
||||
#ifdef THIRTY_TWO_BIT+/
|
||||
// #ifdef BN_LLONG
|
||||
// # if defined(_WIN32) && !defined(__GNUC__)
|
||||
// # define BN_ULLONG unsigned __int64
|
||||
// # define BN_MASK (0xffffffffffffffffI64)
|
||||
// # else
|
||||
// # define BN_ULLONG c_ulong c_long
|
||||
// # define BN_MASK (0xffffffffffffffffLL)
|
||||
// # endif
|
||||
// #endif
|
||||
// FIXME: Is this correct?
|
||||
alias ulong BN_ULLONG;
|
||||
alias uint BN_ULONG;
|
||||
alias int BN_LONG;
|
||||
enum BN_BITS = 64;
|
||||
enum BN_BYTES = 4;
|
||||
enum BN_BITS2 = 32;
|
||||
enum BN_BITS4 = 16;
|
||||
enum BN_MASK2 = 0xffffffff;
|
||||
enum BN_MASK2l = 0xffff;
|
||||
enum BN_MASK2h1 = 0xffff8000;
|
||||
enum BN_MASK2h = 0xffff0000;
|
||||
enum BN_TBIT = 0x80000000;
|
||||
enum BN_DEC_CONV = 1000000000;
|
||||
enum BN_DEC_FMT1 = "%u";
|
||||
enum BN_DEC_FMT2 = "%09u";
|
||||
enum BN_DEC_NUM = 9;
|
||||
enum BN_HEX_FMT1 = "%X";
|
||||
enum BN_HEX_FMT2 = "%08X";
|
||||
/+#endif
|
||||
|
||||
/* 2011-02-22 SMS.
|
||||
* In various places, a size_t variable or a type cast to size_t was
|
||||
* used to perform integer-only operations on pointers. This failed on
|
||||
* VMS with 64-bit pointers (CC /POINTER_SIZE = 64) because size_t is
|
||||
* still only 32 bits. What's needed in these cases is an integer type
|
||||
* with the same size as a pointer, which size_t is not certain to be.
|
||||
* The only fix here is VMS-specific.
|
||||
*/
|
||||
#if defined(OPENSSL_SYS_VMS)
|
||||
# if __INITIAL_POINTER_SIZE == 64
|
||||
# define PTR_SIZE_INT c_long long
|
||||
# else /* __INITIAL_POINTER_SIZE == 64 */
|
||||
# define PTR_SIZE_INT int
|
||||
# endif /* __INITIAL_POINTER_SIZE == 64 [else] */
|
||||
#else /* defined(OPENSSL_SYS_VMS) */
|
||||
# define PTR_SIZE_INT size_t
|
||||
#endif /* defined(OPENSSL_SYS_VMS) [else] */
|
||||
+/
|
||||
enum BN_DEFAULT_BITS = 1280;
|
||||
|
||||
enum BN_FLG_MALLOCED = 0x01;
|
||||
enum BN_FLG_STATIC_DATA = 0x02;
|
||||
enum BN_FLG_CONSTTIME = 0x04; /* avoid leaking exponent information through timing,
|
||||
* BN_mod_exp_mont() will call BN_mod_exp_mont_consttime,
|
||||
* BN_div() will call BN_div_no_branch,
|
||||
* BN_mod_inverse() will call BN_mod_inverse_no_branch.
|
||||
*/
|
||||
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
alias BN_FLG_CONSTTIME BN_FLG_EXP_CONSTTIME; /* deprecated name for the flag */
|
||||
/* avoid leaking exponent information through timings
|
||||
* (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) */
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
enum BN_FLG_FREE = 0x8000; /* used for debuging */
|
||||
}
|
||||
void BN_set_flags()(BIGNUM* b, int n) { b.flags |= n; }
|
||||
int BN_get_flags()(const(BIGNUM)* b, int n) { return b.flags & n; }
|
||||
|
||||
/* get a clone of a BIGNUM with changed flags, for* temporary* use only
|
||||
* (the two BIGNUMs cannot not be used in parallel!) */
|
||||
void BN_with_flags()(BIGNUM* dest, BIGNUM* b, int n) {
|
||||
dest.d=b.d;
|
||||
dest.top=b.top;
|
||||
dest.dmax=b.dmax;
|
||||
dest.neg=b.neg;
|
||||
dest.flags=(dest.flags & BN_FLG_MALLOCED)
|
||||
| (b.flags & ~BN_FLG_MALLOCED)
|
||||
| BN_FLG_STATIC_DATA
|
||||
| n;
|
||||
}
|
||||
|
||||
/* Already declared in ossl_typ.h */
|
||||
version (none) {
|
||||
alias bignum_st BIGNUM;
|
||||
/* Used for temp variables (declaration hidden in bn_lcl.h) */
|
||||
alias bignum_ctx BN_CTX;
|
||||
alias bn_blinding_st BN_BLINDING;
|
||||
alias bn_mont_ctx_st BN_MONT_CTX;
|
||||
alias bn_recp_ctx_st BN_RECP_CTX;
|
||||
alias bn_gencb_st BN_GENCB;
|
||||
}
|
||||
|
||||
struct bignum_st
|
||||
{
|
||||
BN_ULONG* d; /* Pointer to an array of 'BN_BITS2' bit chunks. */
|
||||
int top; /* Index of last used d +1. */
|
||||
/* The next are internal book keeping for bn_expand. */
|
||||
int dmax; /* Size of the d array. */
|
||||
int neg; /* one if the number is negative */
|
||||
int flags;
|
||||
};
|
||||
|
||||
/* Used for montgomery multiplication */
|
||||
struct bn_mont_ctx_st
|
||||
{
|
||||
int ri; /* number of bits in R */
|
||||
BIGNUM RR; /* used to convert to montgomery form */
|
||||
BIGNUM N; /* The modulus */
|
||||
BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1
|
||||
* (Ni is only stored for bignum algorithm) */
|
||||
BN_ULONG[2] n0;/* least significant word(s) of Ni;
|
||||
(type changed with 0.9.9, was "BN_ULONG n0;" before) */
|
||||
int flags;
|
||||
};
|
||||
|
||||
/* Used for reciprocal division/mod functions
|
||||
* It cannot be shared between threads
|
||||
*/
|
||||
struct bn_recp_ctx_st
|
||||
{
|
||||
BIGNUM N; /* the divisor */
|
||||
BIGNUM Nr; /* the reciprocal */
|
||||
int num_bits;
|
||||
int shift;
|
||||
int flags;
|
||||
};
|
||||
|
||||
/* Used for slow "generation" functions. */
|
||||
struct bn_gencb_st
|
||||
{
|
||||
uint ver; /* To handle binary (in)compatibility */
|
||||
void* arg; /* callback-specific data */
|
||||
union cb_
|
||||
{
|
||||
/* if(ver==1) - handles old style callbacks */
|
||||
ExternC!(void function(int, int, void*)) cb_1;
|
||||
/* if(ver==2) - new callback style */
|
||||
ExternC!(int function(int, int, BN_GENCB*)) cb_2;
|
||||
}
|
||||
cb_ cb;
|
||||
};
|
||||
/* Wrapper function to make using BN_GENCB easier, */
|
||||
int BN_GENCB_call(BN_GENCB* cb, int a, int b);
|
||||
/* Macro to populate a BN_GENCB structure with an "old"-style callback */
|
||||
void BN_GENCB_set_old()(gencb, callback, cb_arg) {
|
||||
BN_GENCB* tmp_gencb = (gencb);
|
||||
tmp_gencb.ver = 1;
|
||||
tmp_gencb.arg = (cb_arg);
|
||||
tmp_gencb.cb.cb_1 = (callback);
|
||||
}
|
||||
/* Macro to populate a BN_GENCB structure with a "new"-style callback */
|
||||
void BN_GENCB_set()(gencb, callback, cb_arg) {
|
||||
BN_GENCB* tmp_gencb = (gencb);
|
||||
tmp_gencb.ver = 2;
|
||||
tmp_gencb.arg = (cb_arg);
|
||||
tmp_gencb.cb.cb_2 = (callback);
|
||||
}
|
||||
|
||||
enum BN_prime_checks = 0; /* default: select number of iterations
|
||||
based on the size of the number */
|
||||
|
||||
/* number of Miller-Rabin iterations for an error rate of less than 2^-80
|
||||
* for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook
|
||||
* of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996];
|
||||
* original paper: Damgaard, Landrock, Pomerance: Average case error estimates
|
||||
* for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */
|
||||
auto BN_prime_checks_for_size(T)(T b) {
|
||||
return ((b) >= 1300 ? 2 :
|
||||
(b) >= 850 ? 3 :
|
||||
(b) >= 650 ? 4 :
|
||||
(b) >= 550 ? 5 :
|
||||
(b) >= 450 ? 6 :
|
||||
(b) >= 400 ? 7 :
|
||||
(b) >= 350 ? 8 :
|
||||
(b) >= 300 ? 9 :
|
||||
(b) >= 250 ? 12 :
|
||||
(b) >= 200 ? 15 :
|
||||
(b) >= 150 ? 18 :
|
||||
/* b >= 100 */ 27);
|
||||
}
|
||||
|
||||
auto BN_num_bytes()(const(BIGNUM)* a) { return (BN_num_bits(a)+7)/8; }
|
||||
|
||||
/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */
|
||||
auto BN_abs_is_word()(const(BIGNUM)* a, BN_ULONG w) { return (((a.top == 1) && (a.d[0] == (w))) ||
|
||||
(((w) == 0) && (a.top == 0))); }
|
||||
auto BN_is_zero()(const(BIGNUM)* a) { return (a.top == 0); }
|
||||
auto BN_is_one()(const(BIGNUM)* a) { return (BN_abs_is_word((a),1) && !a.neg); }
|
||||
auto BN_is_word()(const(BIGNUM)* a, BN_ULONG w) { return (BN_abs_is_word((a),(w)) && (!(w) || !a.neg)); }
|
||||
auto BN_is_odd()(const(BIGNUM)* a) { return ((a.top > 0) && (a.d[0] & 1)); }
|
||||
|
||||
auto BN_one()(BIGNUM* a) { return BN_set_word((a),1); }
|
||||
auto BN_zero_ex()(BIGNUM* a) {
|
||||
a.top = 0;
|
||||
a.neg = 0;
|
||||
}
|
||||
version (OPENSSL_NO_DEPRECATED) {
|
||||
alias BN_zero_ex BN_zero;
|
||||
} else {
|
||||
auto BN_zero()(BIGNUM* a) { return BN_set_word(a,0); }
|
||||
}
|
||||
|
||||
const(BIGNUM)* BN_value_one();
|
||||
char* BN_options();
|
||||
BN_CTX* BN_CTX_new();
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
void BN_CTX_init(BN_CTX* c);
|
||||
}
|
||||
void BN_CTX_free(BN_CTX* c);
|
||||
void BN_CTX_start(BN_CTX* ctx);
|
||||
BIGNUM* BN_CTX_get(BN_CTX* ctx);
|
||||
void BN_CTX_end(BN_CTX* ctx);
|
||||
int BN_rand(BIGNUM* rnd, int bits, int top,int bottom);
|
||||
int BN_pseudo_rand(BIGNUM* rnd, int bits, int top,int bottom);
|
||||
int BN_rand_range(BIGNUM* rnd, const(BIGNUM)* range);
|
||||
int BN_pseudo_rand_range(BIGNUM* rnd, const(BIGNUM)* range);
|
||||
int BN_num_bits(const(BIGNUM)* a);
|
||||
int BN_num_bits_word(BN_ULONG);
|
||||
BIGNUM* BN_new();
|
||||
void BN_init(BIGNUM*);
|
||||
void BN_clear_free(BIGNUM* a);
|
||||
BIGNUM* BN_copy(BIGNUM* a, const(BIGNUM)* b);
|
||||
void BN_swap(BIGNUM* a, BIGNUM* b);
|
||||
BIGNUM* BN_bin2bn(const(ubyte)* s,int len,BIGNUM* ret);
|
||||
int BN_bn2bin(const(BIGNUM)* a, ubyte* to);
|
||||
BIGNUM* BN_mpi2bn(const(ubyte)* s,int len,BIGNUM* ret);
|
||||
int BN_bn2mpi(const(BIGNUM)* a, ubyte* to);
|
||||
int BN_sub(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b);
|
||||
int BN_usub(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b);
|
||||
int BN_uadd(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b);
|
||||
int BN_add(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b);
|
||||
int BN_mul(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, BN_CTX* ctx);
|
||||
int BN_sqr(BIGNUM* r, const(BIGNUM)* a,BN_CTX* ctx);
|
||||
/** BN_set_negative sets sign of a BIGNUM
|
||||
* \param b pointer to the BIGNUM object
|
||||
* \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise
|
||||
*/
|
||||
void BN_set_negative(BIGNUM* b, int n);
|
||||
/** BN_is_negative returns 1 if the BIGNUM is negative
|
||||
* \param a pointer to the BIGNUM object
|
||||
* \return 1 if a < 0 and 0 otherwise
|
||||
*/
|
||||
auto BN_is_negative()(const(BIGNUM)* a) { return a.neg != 0; }
|
||||
|
||||
int BN_div(BIGNUM* dv, BIGNUM* rem, const(BIGNUM)* m, const(BIGNUM)* d,
|
||||
BN_CTX* ctx);
|
||||
auto BN_mod()(BIGNUM* rem,const(BIGNUM)* m,const(BIGNUM)* d,BN_CTX* ctx) { return BN_div(null,(rem),(m),(d),(ctx)); }
|
||||
int BN_nnmod(BIGNUM* r, const(BIGNUM)* m, const(BIGNUM)* d, BN_CTX* ctx);
|
||||
int BN_mod_add(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_mod_add_quick(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m);
|
||||
int BN_mod_sub(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_mod_sub_quick(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m);
|
||||
int BN_mod_mul(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_mod_sqr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_mod_lshift1(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_mod_lshift1_quick(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* m);
|
||||
int BN_mod_lshift(BIGNUM* r, const(BIGNUM)* a, int n, const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_mod_lshift_quick(BIGNUM* r, const(BIGNUM)* a, int n, const(BIGNUM)* m);
|
||||
|
||||
BN_ULONG BN_mod_word(const(BIGNUM)* a, BN_ULONG w);
|
||||
BN_ULONG BN_div_word(BIGNUM* a, BN_ULONG w);
|
||||
int BN_mul_word(BIGNUM* a, BN_ULONG w);
|
||||
int BN_add_word(BIGNUM* a, BN_ULONG w);
|
||||
int BN_sub_word(BIGNUM* a, BN_ULONG w);
|
||||
int BN_set_word(BIGNUM* a, BN_ULONG w);
|
||||
BN_ULONG BN_get_word(const(BIGNUM)* a);
|
||||
|
||||
int BN_cmp(const(BIGNUM)* a, const(BIGNUM)* b);
|
||||
void BN_free(BIGNUM* a);
|
||||
int BN_is_bit_set(const(BIGNUM)* a, int n);
|
||||
int BN_lshift(BIGNUM* r, const(BIGNUM)* a, int n);
|
||||
int BN_lshift1(BIGNUM* r, const(BIGNUM)* a);
|
||||
int BN_exp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,BN_CTX* ctx);
|
||||
|
||||
int BN_mod_exp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m,BN_CTX* ctx);
|
||||
int BN_mod_exp_mont(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* m_ctx);
|
||||
int BN_mod_exp_mont_consttime(BIGNUM* rr, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* in_mont);
|
||||
int BN_mod_exp_mont_word(BIGNUM* r, BN_ULONG a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* m_ctx);
|
||||
int BN_mod_exp2_mont(BIGNUM* r, const(BIGNUM)* a1, const(BIGNUM)* p1,
|
||||
const(BIGNUM)* a2, const(BIGNUM)* p2,const(BIGNUM)* m,
|
||||
BN_CTX* ctx,BN_MONT_CTX* m_ctx);
|
||||
int BN_mod_exp_simple(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m,BN_CTX* ctx);
|
||||
|
||||
int BN_mask_bits(BIGNUM* a,int n);
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
int BN_print_fp(FILE* fp, const(BIGNUM)* a);
|
||||
}
|
||||
// #ifdef HEADER_BIO_H
|
||||
import deimos.openssl.bio;
|
||||
int BN_print(BIO* fp, const(BIGNUM)* a);
|
||||
// #else
|
||||
// int BN_print(void* fp, const(BIGNUM)* a);
|
||||
// #endif
|
||||
int BN_reciprocal(BIGNUM* r, const(BIGNUM)* m, int len, BN_CTX* ctx);
|
||||
int BN_rshift(BIGNUM* r, const(BIGNUM)* a, int n);
|
||||
int BN_rshift1(BIGNUM* r, const(BIGNUM)* a);
|
||||
void BN_clear(BIGNUM* a);
|
||||
BIGNUM* BN_dup(const(BIGNUM)* a);
|
||||
int BN_ucmp(const(BIGNUM)* a, const(BIGNUM)* b);
|
||||
int BN_set_bit(BIGNUM* a, int n);
|
||||
int BN_clear_bit(BIGNUM* a, int n);
|
||||
char* BN_bn2hex(const(BIGNUM)* a);
|
||||
char* BN_bn2dec(const(BIGNUM)* a);
|
||||
int BN_hex2bn(BIGNUM** a, const(char)* str);
|
||||
int BN_dec2bn(BIGNUM** a, const(char)* str);
|
||||
int BN_asc2bn(BIGNUM** a, const(char)* str);
|
||||
int BN_gcd(BIGNUM* r,const(BIGNUM)* a,const(BIGNUM)* b,BN_CTX* ctx);
|
||||
int BN_kronecker(const(BIGNUM)* a,const(BIGNUM)* b,BN_CTX* ctx); /* returns -2 for error */
|
||||
BIGNUM* BN_mod_inverse(BIGNUM* ret,
|
||||
const(BIGNUM)* a, const(BIGNUM)* n,BN_CTX* ctx);
|
||||
BIGNUM* BN_mod_sqrt(BIGNUM* ret,
|
||||
const(BIGNUM)* a, const(BIGNUM)* n,BN_CTX* ctx);
|
||||
|
||||
void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords);
|
||||
|
||||
/* Deprecated versions */
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
BIGNUM* BN_generate_prime(BIGNUM* ret,int bits,int safe,
|
||||
const(BIGNUM)* add, const(BIGNUM)* rem,
|
||||
ExternC!(void function(int,int,void*)) callback,void* cb_arg);
|
||||
int BN_is_prime(const(BIGNUM)* p,int nchecks,
|
||||
ExternC!(void function(int,int,void*)) callback,
|
||||
BN_CTX* ctx,void* cb_arg);
|
||||
int BN_is_prime_fasttest(const(BIGNUM)* p,int nchecks,
|
||||
ExternC!(void function(int,int,void*)) callback,BN_CTX* ctx,void* cb_arg,
|
||||
int do_trial_division);
|
||||
} /* !defined(OPENSSL_NO_DEPRECATED) */
|
||||
|
||||
/* Newer versions */
|
||||
int BN_generate_prime_ex(BIGNUM* ret,int bits,int safe, const(BIGNUM)* add,
|
||||
const(BIGNUM)* rem, BN_GENCB* cb);
|
||||
int BN_is_prime_ex(const(BIGNUM)* p,int nchecks, BN_CTX* ctx, BN_GENCB* cb);
|
||||
int BN_is_prime_fasttest_ex(const(BIGNUM)* p,int nchecks, BN_CTX* ctx,
|
||||
int do_trial_division, BN_GENCB* cb);
|
||||
|
||||
int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx);
|
||||
|
||||
int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
|
||||
const(BIGNUM)* Xp, const(BIGNUM)* Xp1, const(BIGNUM)* Xp2,
|
||||
const(BIGNUM)* e, BN_CTX *ctx, BN_GENCB *cb);
|
||||
int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
|
||||
BIGNUM *Xp1, BIGNUM *Xp2,
|
||||
const(BIGNUM)* Xp,
|
||||
const(BIGNUM)* e, BN_CTX *ctx,
|
||||
BN_GENCB *cb);
|
||||
|
||||
BN_MONT_CTX* BN_MONT_CTX_new();
|
||||
void BN_MONT_CTX_init(BN_MONT_CTX* ctx);
|
||||
int BN_mod_mul_montgomery(BIGNUM* r,const(BIGNUM)* a,const(BIGNUM)* b,
|
||||
BN_MONT_CTX* mont, BN_CTX* ctx);
|
||||
auto BN_to_montgomery()(BIGNUM* r,const(BIGNUM)* a,BN_MONT_CTX* mont,BN_CTX* ctx) {
|
||||
BN_mod_mul_montgomery((r),(a),&(mont.RR),(mont),(ctx));
|
||||
}
|
||||
int BN_from_montgomery(BIGNUM* r,const(BIGNUM)* a,
|
||||
BN_MONT_CTX* mont, BN_CTX* ctx);
|
||||
void BN_MONT_CTX_free(BN_MONT_CTX* mont);
|
||||
int BN_MONT_CTX_set(BN_MONT_CTX* mont,const(BIGNUM)* mod,BN_CTX* ctx);
|
||||
BN_MONT_CTX* BN_MONT_CTX_copy(BN_MONT_CTX* to,BN_MONT_CTX* from);
|
||||
BN_MONT_CTX* BN_MONT_CTX_set_locked(BN_MONT_CTX** pmont, int lock,
|
||||
const(BIGNUM)* mod, BN_CTX* ctx);
|
||||
|
||||
/* BN_BLINDING flags */
|
||||
enum BN_BLINDING_NO_UPDATE = 0x00000001;
|
||||
enum BN_BLINDING_NO_RECREATE = 0x00000002;
|
||||
|
||||
BN_BLINDING* BN_BLINDING_new(const(BIGNUM)* A, const(BIGNUM)* Ai, BIGNUM* mod);
|
||||
void BN_BLINDING_free(BN_BLINDING* b);
|
||||
int BN_BLINDING_update(BN_BLINDING* b,BN_CTX* ctx);
|
||||
int BN_BLINDING_convert(BIGNUM* n, BN_BLINDING* b, BN_CTX* ctx);
|
||||
int BN_BLINDING_invert(BIGNUM* n, BN_BLINDING* b, BN_CTX* ctx);
|
||||
int BN_BLINDING_convert_ex(BIGNUM* n, BIGNUM* r, BN_BLINDING* b, BN_CTX*);
|
||||
int BN_BLINDING_invert_ex(BIGNUM* n, const(BIGNUM)* r, BN_BLINDING* b, BN_CTX*);
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
c_ulong BN_BLINDING_get_thread_id(const(BN_BLINDING)*);
|
||||
void BN_BLINDING_set_thread_id(BN_BLINDING*, c_ulong);
|
||||
}
|
||||
CRYPTO_THREADID* BN_BLINDING_thread_id(BN_BLINDING*);
|
||||
c_ulong BN_BLINDING_get_flags(const(BN_BLINDING)*);
|
||||
void BN_BLINDING_set_flags(BN_BLINDING*, c_ulong);
|
||||
BN_BLINDING* BN_BLINDING_create_param(BN_BLINDING* b,
|
||||
const(BIGNUM)* e, BIGNUM* m, BN_CTX* ctx,
|
||||
ExternC!(int function(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* m_ctx)) bn_mod_exp,
|
||||
BN_MONT_CTX* m_ctx);
|
||||
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
void BN_set_params(int mul,int high,int low,int mont);
|
||||
int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */
|
||||
}
|
||||
|
||||
void BN_RECP_CTX_init(BN_RECP_CTX* recp);
|
||||
BN_RECP_CTX* BN_RECP_CTX_new();
|
||||
void BN_RECP_CTX_free(BN_RECP_CTX* recp);
|
||||
int BN_RECP_CTX_set(BN_RECP_CTX* recp,const(BIGNUM)* rdiv,BN_CTX* ctx);
|
||||
int BN_mod_mul_reciprocal(BIGNUM* r, const(BIGNUM)* x, const(BIGNUM)* y,
|
||||
BN_RECP_CTX* recp,BN_CTX* ctx);
|
||||
int BN_mod_exp_recp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx);
|
||||
int BN_div_recp(BIGNUM* dv, BIGNUM* rem, const(BIGNUM)* m,
|
||||
BN_RECP_CTX* recp, BN_CTX* ctx);
|
||||
|
||||
version(OPENSSL_NO_EC2M) {} else {
|
||||
|
||||
/* Functions for arithmetic over binary polynomials represented by BIGNUMs.
|
||||
*
|
||||
* The BIGNUM::neg property of BIGNUMs representing binary polynomials is
|
||||
* ignored.
|
||||
*
|
||||
* Note that input arguments are not const so that their bit arrays can
|
||||
* be expanded to the appropriate size if needed.
|
||||
*/
|
||||
|
||||
int BN_GF2m_add(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b); /*r = a + b*/
|
||||
alias BN_GF2m_add BN_GF2m_sub;
|
||||
int BN_GF2m_mod(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p); /*r=a mod p*/
|
||||
int BN_GF2m_mod_mul(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const(BIGNUM)* p, BN_CTX* ctx); /* r = (a* b) mod p */
|
||||
int BN_GF2m_mod_sqr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
BN_CTX* ctx); /* r = (a* a) mod p */
|
||||
int BN_GF2m_mod_inv(BIGNUM* r, const(BIGNUM)* b, const(BIGNUM)* p,
|
||||
BN_CTX* ctx); /* r = (1 / b) mod p */
|
||||
int BN_GF2m_mod_div(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const(BIGNUM)* p, BN_CTX* ctx); /* r = (a / b) mod p */
|
||||
int BN_GF2m_mod_exp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const(BIGNUM)* p, BN_CTX* ctx); /* r = (a ^ b) mod p */
|
||||
int BN_GF2m_mod_sqrt(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
BN_CTX* ctx); /* r = sqrt(a) mod p */
|
||||
int BN_GF2m_mod_solve_quad(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
BN_CTX* ctx); /* r^2 + r = a mod p */
|
||||
alias BN_ucmp BN_GF2m_cmp;
|
||||
/* Some functions allow for representation of the irreducible polynomials
|
||||
* as an uint[], say p. The irreducible f(t) is then of the form:
|
||||
* t^p[0] + t^p[1] + ... + t^p[k]
|
||||
* where m = p[0] > p[1] > ... > p[k] = 0.
|
||||
*/
|
||||
int BN_GF2m_mod_arr(BIGNUM* r, const(BIGNUM)* a, const int[] p);
|
||||
/* r = a mod p */
|
||||
int BN_GF2m_mod_mul_arr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const int[] p, BN_CTX* ctx); /* r = (a* b) mod p */
|
||||
int BN_GF2m_mod_sqr_arr(BIGNUM* r, const(BIGNUM)* a, const int[] p,
|
||||
BN_CTX* ctx); /* r = (a* a) mod p */
|
||||
int BN_GF2m_mod_inv_arr(BIGNUM* r, const(BIGNUM)* b, const int[] p,
|
||||
BN_CTX* ctx); /* r = (1 / b) mod p */
|
||||
int BN_GF2m_mod_div_arr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const int[] p, BN_CTX* ctx); /* r = (a / b) mod p */
|
||||
int BN_GF2m_mod_exp_arr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b,
|
||||
const int[] p, BN_CTX* ctx); /* r = (a ^ b) mod p */
|
||||
int BN_GF2m_mod_sqrt_arr(BIGNUM* r, const(BIGNUM)* a,
|
||||
const int[] p, BN_CTX* ctx); /* r = sqrt(a) mod p */
|
||||
int BN_GF2m_mod_solve_quad_arr(BIGNUM* r, const(BIGNUM)* a,
|
||||
const int[] p, BN_CTX* ctx); /* r^2 + r = a mod p */
|
||||
int BN_GF2m_poly2arr(const(BIGNUM)* a, int[] p, int max);
|
||||
int BN_GF2m_arr2poly(const int[] p, BIGNUM* a);
|
||||
|
||||
}
|
||||
|
||||
/* faster mod functions for the 'NIST primes'
|
||||
* 0 <= a < p^2 */
|
||||
int BN_nist_mod_192(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx);
|
||||
int BN_nist_mod_224(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx);
|
||||
int BN_nist_mod_256(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx);
|
||||
int BN_nist_mod_384(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx);
|
||||
int BN_nist_mod_521(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx);
|
||||
|
||||
const(BIGNUM)* BN_get0_nist_prime_192();
|
||||
const(BIGNUM)* BN_get0_nist_prime_224();
|
||||
const(BIGNUM)* BN_get0_nist_prime_256();
|
||||
const(BIGNUM)* BN_get0_nist_prime_384();
|
||||
const(BIGNUM)* BN_get0_nist_prime_521();
|
||||
|
||||
/* library internal functions */
|
||||
|
||||
auto bn_expand()(BIGNUM* a, int bits) { return ((((((bits+BN_BITS2-1))/BN_BITS2)) <= a.dmax)?
|
||||
(a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2)); }
|
||||
auto bn_wexpand()(BIGNUM* a, int words) { return (((words) <= a.dmax)?(a):bn_expand2((a),(words))); }
|
||||
BIGNUM* bn_expand2(BIGNUM* a, int words);
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
BIGNUM* bn_dup_expand(const(BIGNUM)* a, int words); /* unused */
|
||||
}
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
/* Bignum consistency macros
|
||||
* There is one "API" macro, bn_fix_top(), for stripping leading zeroes from
|
||||
* bignum data after direct manipulations on the data. There is also an
|
||||
* "internal" macro, bn_check_top(), for verifying that there are no leading
|
||||
* zeroes. Unfortunately, some auditing is required due to the fact that
|
||||
* bn_fix_top() has become an overabused duct-tape because bignum data is
|
||||
* occasionally passed around in an inconsistent state. So the following
|
||||
* changes have been made to sort this out_;
|
||||
* - bn_fix_top()s implementation has been moved to bn_correct_top()
|
||||
* - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and
|
||||
* bn_check_top() is as before.
|
||||
* - if BN_DEBUG* is* defined;
|
||||
* - bn_check_top() tries to pollute unused words even if the bignum 'top' is
|
||||
* consistent. (ed: only if BN_DEBUG_RAND is defined)
|
||||
* - bn_fix_top() maps to bn_check_top() rather than "fixing" anything.
|
||||
* The idea is to have debug builds flag up inconsistent bignums when they
|
||||
* occur. If that occurs in a bn_fix_top(), we examine the code in question; if
|
||||
* the use of bn_fix_top() was appropriate (ie. it follows directly after code
|
||||
* that manipulates the bignum) it is converted to bn_correct_top(), and if it
|
||||
* was not appropriate, we convert it permanently to bn_check_top() and track
|
||||
* down the cause of the bug. Eventually, no internal code should be using the
|
||||
* bn_fix_top() macro. External applications and libraries should try this with
|
||||
* their own code too, both in terms of building against the openssl headers
|
||||
* with BN_DEBUG defined* and* linking with a version of OpenSSL built with it
|
||||
* defined. This not only improves external code, it provides more test
|
||||
* coverage for openssl's own code.
|
||||
*/
|
||||
|
||||
#ifdef BN_DEBUG
|
||||
|
||||
/* We only need assert() when debugging */
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef BN_DEBUG_RAND
|
||||
/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */
|
||||
#ifndef RAND_pseudo_bytes
|
||||
int RAND_pseudo_bytes(ubyte* buf,int num);
|
||||
#define BN_DEBUG_TRIX
|
||||
#endif
|
||||
#define bn_pollute(a) \
|
||||
do { \
|
||||
const(BIGNUM)* _bnum1 = (a); \
|
||||
if(_bnum1->top < _bnum1->dmax) { \
|
||||
ubyte _tmp_char; \
|
||||
/* We cast away const without the compiler knowing, any \
|
||||
** genuinely* constant variables that aren't mutable \
|
||||
* wouldn't be constructed with top!=dmax. */ \
|
||||
BN_ULONG* _not_const; \
|
||||
memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \
|
||||
RAND_pseudo_bytes(&_tmp_char, 1); \
|
||||
memset((ubyte*)(_not_const + _bnum1->top), _tmp_char, \
|
||||
(_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \
|
||||
} \
|
||||
} while(0)
|
||||
#ifdef BN_DEBUG_TRIX
|
||||
#undef RAND_pseudo_bytes
|
||||
#endif
|
||||
#else
|
||||
#define bn_pollute(a)
|
||||
#endif
|
||||
#define bn_check_top(a) \
|
||||
do { \
|
||||
const(BIGNUM)* _bnum2 = (a); \
|
||||
if (_bnum2 != NULL) { \
|
||||
assert((_bnum2->top == 0) || \
|
||||
(_bnum2->d[_bnum2->top - 1] != 0)); \
|
||||
bn_pollute(_bnum2); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define bn_fix_top(a) bn_check_top(a)
|
||||
|
||||
#define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits+BN_BITS2-1))/BN_BITS2)
|
||||
#define bn_wcheck_size(bn, words) \
|
||||
do { \
|
||||
const BIGNUM *_bnum2 = (bn); \
|
||||
assert(words <= (_bnum2)->dmax && words >= (_bnum2)->top); \
|
||||
} while(0)
|
||||
|
||||
#else /* !BN_DEBUG */
|
||||
+/
|
||||
void bn_pollute()(BIGNUM* a) {}
|
||||
void bn_check_top()(BIGNUM* a) {}
|
||||
alias bn_correct_top bn_fix_top;
|
||||
void bn_check_size()(BIGNUM* bn, size_t bits) {}
|
||||
void bn_wcheck_size()(BIGNUM* bn, size_t words) {}
|
||||
|
||||
// #endif
|
||||
|
||||
auto bn_correct_top()(BIGNUM* a) {
|
||||
BN_ULONG* ftl;
|
||||
int tmp_top = a.top;
|
||||
if (tmp_top > 0)
|
||||
{
|
||||
for (ftl= &(a.d[tmp_top-1]); tmp_top > 0; tmp_top--)
|
||||
if (*(ftl--)) break;
|
||||
a.top = tmp_top;
|
||||
}
|
||||
bn_pollute(a);
|
||||
}
|
||||
|
||||
BN_ULONG bn_mul_add_words(BN_ULONG* rp, const(BN_ULONG)* ap, int num, BN_ULONG w);
|
||||
BN_ULONG bn_mul_words(BN_ULONG* rp, const(BN_ULONG)* ap, int num, BN_ULONG w);
|
||||
void bn_sqr_words(BN_ULONG* rp, const(BN_ULONG)* ap, int num);
|
||||
BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);
|
||||
BN_ULONG bn_add_words(BN_ULONG* rp, const(BN_ULONG)* ap, const(BN_ULONG)* bp,int num);
|
||||
BN_ULONG bn_sub_words(BN_ULONG* rp, const(BN_ULONG)* ap, const(BN_ULONG)* bp,int num);
|
||||
|
||||
/* Primes from RFC 2409 */
|
||||
BIGNUM* get_rfc2409_prime_768(BIGNUM* bn);
|
||||
BIGNUM* get_rfc2409_prime_1024(BIGNUM* bn);
|
||||
|
||||
/* Primes from RFC 3526 */
|
||||
BIGNUM* get_rfc3526_prime_1536(BIGNUM* bn);
|
||||
BIGNUM* get_rfc3526_prime_2048(BIGNUM* bn);
|
||||
BIGNUM* get_rfc3526_prime_3072(BIGNUM* bn);
|
||||
BIGNUM* get_rfc3526_prime_4096(BIGNUM* bn);
|
||||
BIGNUM* get_rfc3526_prime_6144(BIGNUM* bn);
|
||||
BIGNUM* get_rfc3526_prime_8192(BIGNUM* bn);
|
||||
|
||||
int BN_bntest_rand(BIGNUM* rnd, int bits, int top,int bottom);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_BN_strings();
|
||||
|
||||
/* Error codes for the BN functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum BN_F_BNRAND = 127;
|
||||
enum BN_F_BN_BLINDING_CONVERT_EX = 100;
|
||||
enum BN_F_BN_BLINDING_CREATE_PARAM = 128;
|
||||
enum BN_F_BN_BLINDING_INVERT_EX = 101;
|
||||
enum BN_F_BN_BLINDING_NEW = 102;
|
||||
enum BN_F_BN_BLINDING_UPDATE = 103;
|
||||
enum BN_F_BN_BN2DEC = 104;
|
||||
enum BN_F_BN_BN2HEX = 105;
|
||||
enum BN_F_BN_CTX_GET = 116;
|
||||
enum BN_F_BN_CTX_NEW = 106;
|
||||
enum BN_F_BN_CTX_START = 129;
|
||||
enum BN_F_BN_DIV = 107;
|
||||
enum BN_F_BN_DIV_NO_BRANCH = 138;
|
||||
enum BN_F_BN_DIV_RECP = 130;
|
||||
enum BN_F_BN_EXP = 123;
|
||||
enum BN_F_BN_EXPAND2 = 108;
|
||||
enum BN_F_BN_EXPAND_INTERNAL = 120;
|
||||
enum BN_F_BN_GF2M_MOD = 131;
|
||||
enum BN_F_BN_GF2M_MOD_EXP = 132;
|
||||
enum BN_F_BN_GF2M_MOD_MUL = 133;
|
||||
enum BN_F_BN_GF2M_MOD_SOLVE_QUAD = 134;
|
||||
enum BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR = 135;
|
||||
enum BN_F_BN_GF2M_MOD_SQR = 136;
|
||||
enum BN_F_BN_GF2M_MOD_SQRT = 137;
|
||||
enum BN_F_BN_MOD_EXP2_MONT = 118;
|
||||
enum BN_F_BN_MOD_EXP_MONT = 109;
|
||||
enum BN_F_BN_MOD_EXP_MONT_CONSTTIME = 124;
|
||||
enum BN_F_BN_MOD_EXP_MONT_WORD = 117;
|
||||
enum BN_F_BN_MOD_EXP_RECP = 125;
|
||||
enum BN_F_BN_MOD_EXP_SIMPLE = 126;
|
||||
enum BN_F_BN_MOD_INVERSE = 110;
|
||||
enum BN_F_BN_MOD_INVERSE_NO_BRANCH = 139;
|
||||
enum BN_F_BN_MOD_LSHIFT_QUICK = 119;
|
||||
enum BN_F_BN_MOD_MUL_RECIPROCAL = 111;
|
||||
enum BN_F_BN_MOD_SQRT = 121;
|
||||
enum BN_F_BN_MPI2BN = 112;
|
||||
enum BN_F_BN_NEW = 113;
|
||||
enum BN_F_BN_RAND = 114;
|
||||
enum BN_F_BN_RAND_RANGE = 122;
|
||||
enum BN_F_BN_USUB = 115;
|
||||
|
||||
/* Reason codes. */
|
||||
enum BN_R_ARG2_LT_ARG3 = 100;
|
||||
enum BN_R_BAD_RECIPROCAL = 101;
|
||||
enum BN_R_BIGNUM_TOO_LONG = 114;
|
||||
enum BN_R_CALLED_WITH_EVEN_MODULUS = 102;
|
||||
enum BN_R_DIV_BY_ZERO = 103;
|
||||
enum BN_R_ENCODING_ERROR = 104;
|
||||
enum BN_R_EXPAND_ON_STATIC_BIGNUM_DATA = 105;
|
||||
enum BN_R_INPUT_NOT_REDUCED = 110;
|
||||
enum BN_R_INVALID_LENGTH = 106;
|
||||
enum BN_R_INVALID_RANGE = 115;
|
||||
enum BN_R_NOT_A_SQUARE = 111;
|
||||
enum BN_R_NOT_INITIALIZED = 107;
|
||||
enum BN_R_NO_INVERSE = 108;
|
||||
enum BN_R_NO_SOLUTION = 116;
|
||||
enum BN_R_P_IS_NOT_PRIME = 112;
|
||||
enum BN_R_TOO_MANY_ITERATIONS = 113;
|
||||
enum BN_R_TOO_MANY_TEMPORARY_VARIABLES = 109;
|
|
@ -0,0 +1,114 @@
|
|||
/* crypto/buffer/buffer.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.buffer;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.ossl_typ;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
import core.stdc.config;
|
||||
|
||||
//#if !defined(NO_SYS_TYPES_H)
|
||||
//#include <sys/types.h>
|
||||
//#endif
|
||||
|
||||
/* Already declared in ossl_typ.h */
|
||||
/* typedef buf_mem_st BUF_MEM; */
|
||||
|
||||
struct buf_mem_st
|
||||
{
|
||||
size_t length; /* current number of bytes */
|
||||
char* data;
|
||||
size_t max; /* size of buffer */
|
||||
};
|
||||
|
||||
BUF_MEM* BUF_MEM_new();
|
||||
void BUF_MEM_free(BUF_MEM* a);
|
||||
int BUF_MEM_grow(BUF_MEM* str, size_t len);
|
||||
int BUF_MEM_grow_clean(BUF_MEM* str, size_t len);
|
||||
char* BUF_strdup(const(char)* str);
|
||||
char* BUF_strndup(const(char)* str, size_t siz);
|
||||
void* BUF_memdup(const(void)* data, size_t siz);
|
||||
void BUF_reverse(ubyte* out_, const(ubyte)* in_, size_t siz);
|
||||
|
||||
/* safe string functions */
|
||||
size_t BUF_strlcpy(char* dst,const(char)* src,size_t siz);
|
||||
size_t BUF_strlcat(char* dst,const(char)* src,size_t siz);
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_BUF_strings();
|
||||
|
||||
/* Error codes for the BUF functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum BUF_F_BUF_MEMDUP = 103;
|
||||
enum BUF_F_BUF_MEM_GROW = 100;
|
||||
enum BUF_F_BUF_MEM_GROW_CLEAN = 105;
|
||||
enum BUF_F_BUF_MEM_NEW = 101;
|
||||
enum BUF_F_BUF_STRDUP = 102;
|
||||
enum BUF_F_BUF_STRNDUP = 104;
|
||||
|
||||
/* Reason codes. */
|
|
@ -0,0 +1,125 @@
|
|||
/* crypto/camellia/camellia.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2006 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
|
||||
* openssl-core@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.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.camellia;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_CAMELLIA) {
|
||||
static assert(false, "CAMELLIA is disabled.");
|
||||
}
|
||||
|
||||
import core.stdc.config;
|
||||
|
||||
enum CAMELLIA_ENCRYPT = 1;
|
||||
enum CAMELLIA_DECRYPT = 0;
|
||||
|
||||
/* Because array size can't be a const in C, the following two are macros.
|
||||
Both sizes are in bytes. */
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* This should be a hidden type, but EVP requires that the size be known */
|
||||
|
||||
enum CAMELLIA_BLOCK_SIZE = 16;
|
||||
enum CAMELLIA_TABLE_BYTE_LEN = 272;
|
||||
enum CAMELLIA_TABLE_WORD_LEN = (CAMELLIA_TABLE_BYTE_LEN / 4);
|
||||
|
||||
alias uint[CAMELLIA_TABLE_WORD_LEN] KEY_TABLE_TYPE; /* to match with WORD */
|
||||
|
||||
struct camellia_key_st
|
||||
{
|
||||
union u_ {
|
||||
double d; /* ensures 64-bit align */
|
||||
KEY_TABLE_TYPE rd_key;
|
||||
}
|
||||
u_ u;
|
||||
int grand_rounds;
|
||||
};
|
||||
alias camellia_key_st CAMELLIA_KEY;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_Camellia_set_key(const(ubyte)* userKey, const int bits,
|
||||
CAMELLIA_KEY *key);
|
||||
}
|
||||
int Camellia_set_key(const(ubyte)* userKey, const int bits,
|
||||
CAMELLIA_KEY* key);
|
||||
|
||||
void Camellia_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(CAMELLIA_KEY)* key);
|
||||
void Camellia_decrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(CAMELLIA_KEY)* key);
|
||||
|
||||
void Camellia_ecb_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
const(CAMELLIA_KEY)* key, const int enc);
|
||||
void Camellia_cbc_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(CAMELLIA_KEY)* key,
|
||||
ubyte* ivec, const int enc);
|
||||
void Camellia_cfb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(CAMELLIA_KEY)* key,
|
||||
ubyte* ivec, int* num, const int enc);
|
||||
void Camellia_cfb1_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(CAMELLIA_KEY)* key,
|
||||
ubyte* ivec, int* num, const int enc);
|
||||
void Camellia_cfb8_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(CAMELLIA_KEY)* key,
|
||||
ubyte* ivec, int* num, const int enc);
|
||||
void Camellia_ofb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(CAMELLIA_KEY)* key,
|
||||
ubyte* ivec, int* num);
|
||||
void Camellia_ctr128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(CAMELLIA_KEY)* key,
|
||||
ubyte[CAMELLIA_BLOCK_SIZE] ivec,
|
||||
ubyte[CAMELLIA_BLOCK_SIZE] ecount_buf,
|
||||
uint* num);
|
|
@ -0,0 +1,101 @@
|
|||
/* crypto/cast/cast.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.cast_;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_CAST) {
|
||||
static assert(false, "CAST is disabled.");
|
||||
}
|
||||
|
||||
enum CAST_ENCRYPT = 1;
|
||||
enum CAST_DECRYPT = 0;
|
||||
|
||||
alias uint CAST_LONG;
|
||||
|
||||
enum CAST_BLOCK = 8;
|
||||
enum CAST_KEY_LENGTH = 16;
|
||||
|
||||
struct cast_key_st {
|
||||
CAST_LONG[32] data;
|
||||
int short_key; /* Use reduced rounds for short key */
|
||||
}
|
||||
alias cast_key_st CAST_KEY;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
void private_CAST_set_key(CAST_KEY *key, int len, const(ubyte)* data);
|
||||
}
|
||||
void CAST_set_key(CAST_KEY* key, int len, const(ubyte)* data);
|
||||
void CAST_ecb_encrypt(const(ubyte)* in_, ubyte* out_, const(CAST_KEY)* key,
|
||||
int enc);
|
||||
void CAST_encrypt(CAST_LONG* data, const(CAST_KEY)* key);
|
||||
void CAST_decrypt(CAST_LONG* data, const(CAST_KEY)* key);
|
||||
void CAST_cbc_encrypt(const(ubyte)* in_, ubyte* out_, c_long length,
|
||||
const(CAST_KEY)* ks, ubyte* iv, int enc);
|
||||
void CAST_cfb64_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, const(CAST_KEY)* schedule, ubyte* ivec,
|
||||
int* num, int enc);
|
||||
void CAST_ofb64_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, const(CAST_KEY)* schedule, ubyte* ivec,
|
||||
int* num);
|
|
@ -0,0 +1,78 @@
|
|||
/* crypto/cmac/cmac.h */
|
||||
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
||||
* project.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2010 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.
|
||||
* ====================================================================
|
||||
*/
|
||||
module deimos.openssl.cmac;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
public import deimos.openssl.evp;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Opaque */
|
||||
struct CMAC_CTX_st;
|
||||
alias CMAC_CTX_st CMAC_CTX;
|
||||
|
||||
CMAC_CTX* CMAC_CTX_new();
|
||||
void CMAC_CTX_cleanup(CMAC_CTX *ctx);
|
||||
void CMAC_CTX_free(CMAC_CTX *ctx);
|
||||
EVP_CIPHER_CTX* CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx);
|
||||
int CMAC_CTX_copy(CMAC_CTX* out_, const(CMAC_CTX)* in_);
|
||||
|
||||
int CMAC_Init(CMAC_CTX* ctx, const(void)* key, size_t keylen,
|
||||
const(EVP_CIPHER)* cipher, ENGINE* impl);
|
||||
int CMAC_Update(CMAC_CTX* ctx, const(ubyte)* data, size_t dlen);
|
||||
int CMAC_Final(CMAC_CTX* ctx, ubyte* out_, size_t* poutlen);
|
||||
int CMAC_resume(CMAC_CTX* ctx);
|
|
@ -0,0 +1,506 @@
|
|||
/* crypto/cms/cms.h */
|
||||
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
||||
* project.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2008 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.
|
||||
* ====================================================================
|
||||
*/
|
||||
|
||||
|
||||
module deimos.openssl.cms;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.asn1; // Needed for DECLARE_ASN1_*.
|
||||
import deimos.openssl.x509v3; // Needed for GENERAL_NAMES.
|
||||
|
||||
public import deimos.openssl.x509;
|
||||
|
||||
version (OPENSSL_NO_CMS) {
|
||||
static assert(false, "CMS is disabled.");
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
|
||||
struct CMS_ContentInfo_st;
|
||||
alias CMS_ContentInfo_st CMS_ContentInfo;
|
||||
struct CMS_SignerInfo_st;
|
||||
alias CMS_SignerInfo_st CMS_SignerInfo;
|
||||
// BUG/oversight in the original headers: _st suffix missing.
|
||||
struct CMS_CertificateChoices;
|
||||
struct CMS_RevocationInfoChoice_st;
|
||||
alias CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice;
|
||||
struct CMS_RecipientInfo_st;
|
||||
alias CMS_RecipientInfo_st CMS_RecipientInfo;
|
||||
struct CMS_ReceiptRequest_st;
|
||||
alias CMS_ReceiptRequest_st CMS_ReceiptRequest;
|
||||
struct CMS_Receipt_st;
|
||||
alias CMS_Receipt_st CMS_Receipt;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(CMS_SignerInfo);+/
|
||||
/+mixin DECLARE_STACK_OF!(GENERAL_NAMES);+/
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"CMS_ContentInfo");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"CMS_ReceiptRequest");
|
||||
mixin(DECLARE_ASN1_PRINT_FUNCTION!"CMS_ContentInfo");
|
||||
|
||||
enum CMS_SIGNERINFO_ISSUER_SERIAL = 0;
|
||||
enum CMS_SIGNERINFO_KEYIDENTIFIER = 1;
|
||||
|
||||
enum CMS_RECIPINFO_TRANS = 0;
|
||||
enum CMS_RECIPINFO_AGREE = 1;
|
||||
enum CMS_RECIPINFO_KEK = 2;
|
||||
enum CMS_RECIPINFO_PASS = 3;
|
||||
enum CMS_RECIPINFO_OTHER = 4;
|
||||
|
||||
/* S/MIME related flags */
|
||||
|
||||
enum CMS_TEXT = 0x1;
|
||||
enum CMS_NOCERTS = 0x2;
|
||||
enum CMS_NO_CONTENT_VERIFY = 0x4;
|
||||
enum CMS_NO_ATTR_VERIFY = 0x8;
|
||||
enum CMS_NOSIGS = (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY);
|
||||
enum CMS_NOINTERN = 0x10;
|
||||
enum CMS_NO_SIGNER_CERT_VERIFY = 0x20;
|
||||
enum CMS_NOVERIFY = 0x20;
|
||||
enum CMS_DETACHED = 0x40;
|
||||
enum CMS_BINARY = 0x80;
|
||||
enum CMS_NOATTR = 0x100;
|
||||
enum CMS_NOSMIMECAP = 0x200;
|
||||
enum CMS_NOOLDMIMETYPE = 0x400;
|
||||
enum CMS_CRLFEOL = 0x800;
|
||||
enum CMS_STREAM = 0x1000;
|
||||
enum CMS_NOCRL = 0x2000;
|
||||
enum CMS_PARTIAL = 0x4000;
|
||||
enum CMS_REUSE_DIGEST = 0x8000;
|
||||
enum CMS_USE_KEYID = 0x10000;
|
||||
enum CMS_DEBUG_DECRYPT = 0x20000;
|
||||
|
||||
const(ASN1_OBJECT)* CMS_get0_type(CMS_ContentInfo* cms);
|
||||
|
||||
BIO* CMS_dataInit(CMS_ContentInfo* cms, BIO* icont);
|
||||
int CMS_dataFinal(CMS_ContentInfo* cms, BIO* bio);
|
||||
|
||||
ASN1_OCTET_STRING** CMS_get0_content(CMS_ContentInfo* cms);
|
||||
int CMS_is_detached(CMS_ContentInfo* cms);
|
||||
int CMS_set_detached(CMS_ContentInfo* cms, int detached);
|
||||
|
||||
// #ifdef HEADER_PEM_H
|
||||
import deimos.openssl.pem;
|
||||
mixin(DECLARE_PEM_rw_const!("CMS", "CMS_ContentInfo")());
|
||||
// #endif
|
||||
|
||||
int CMS_stream(ubyte*** boundary, CMS_ContentInfo* cms);
|
||||
CMS_ContentInfo* d2i_CMS_bio(BIO* bp, CMS_ContentInfo** cms);
|
||||
int i2d_CMS_bio(BIO* bp, CMS_ContentInfo* cms);
|
||||
|
||||
BIO* BIO_new_CMS(BIO* out_, CMS_ContentInfo* cms);
|
||||
int i2d_CMS_bio_stream(BIO* out_, CMS_ContentInfo* cms, BIO* in_, int flags);
|
||||
int PEM_write_bio_CMS_stream(BIO* out_, CMS_ContentInfo* cms, BIO* in_, int flags);
|
||||
CMS_ContentInfo* SMIME_read_CMS(BIO* bio, BIO** bcont);
|
||||
int SMIME_write_CMS(BIO* bio, CMS_ContentInfo* cms, BIO* data, int flags);
|
||||
|
||||
int CMS_final(CMS_ContentInfo* cms, BIO* data, BIO* dcont, uint flags);
|
||||
|
||||
CMS_ContentInfo* CMS_sign(X509* signcert, EVP_PKEY* pkey, STACK_OF!(X509) *certs,
|
||||
BIO* data, uint flags);
|
||||
|
||||
CMS_ContentInfo* CMS_sign_receipt(CMS_SignerInfo* si,
|
||||
X509* signcert, EVP_PKEY* pkey,
|
||||
STACK_OF!(X509) *certs,
|
||||
uint flags);
|
||||
|
||||
int CMS_data(CMS_ContentInfo* cms, BIO* out_, uint flags);
|
||||
CMS_ContentInfo* CMS_data_create(BIO* in_, uint flags);
|
||||
|
||||
int CMS_digest_verify(CMS_ContentInfo* cms, BIO* dcont, BIO* out_,
|
||||
uint flags);
|
||||
CMS_ContentInfo* CMS_digest_create(BIO* in_, const(EVP_MD)* md,
|
||||
uint flags);
|
||||
|
||||
int CMS_EncryptedData_decrypt(CMS_ContentInfo* cms,
|
||||
const(ubyte)* key, size_t keylen,
|
||||
BIO* dcont, BIO* out_, uint flags);
|
||||
|
||||
CMS_ContentInfo* CMS_EncryptedData_encrypt(BIO* in_, const(EVP_CIPHER)* cipher,
|
||||
const(ubyte)* key, size_t keylen,
|
||||
uint flags);
|
||||
|
||||
int CMS_EncryptedData_set1_key(CMS_ContentInfo* cms, const(EVP_CIPHER)* ciph,
|
||||
const(ubyte)* key, size_t keylen);
|
||||
|
||||
int CMS_verify(CMS_ContentInfo* cms, STACK_OF!(X509) *certs,
|
||||
X509_STORE* store, BIO* dcont, BIO* out_, uint flags);
|
||||
|
||||
int CMS_verify_receipt(CMS_ContentInfo* rcms, CMS_ContentInfo* ocms,
|
||||
STACK_OF!(X509) *certs,
|
||||
X509_STORE* store, uint flags);
|
||||
|
||||
STACK_OF!(X509) *CMS_get0_signers(CMS_ContentInfo* cms);
|
||||
|
||||
CMS_ContentInfo* CMS_encrypt(STACK_OF!(X509) *certs, BIO* in_,
|
||||
const(EVP_CIPHER)* cipher, uint flags);
|
||||
|
||||
int CMS_decrypt(CMS_ContentInfo* cms, EVP_PKEY* pkey, X509* cert,
|
||||
BIO* dcont, BIO* out_,
|
||||
uint flags);
|
||||
|
||||
int CMS_decrypt_set1_pkey(CMS_ContentInfo* cms, EVP_PKEY* pk, X509* cert);
|
||||
int CMS_decrypt_set1_key(CMS_ContentInfo* cms,
|
||||
ubyte* key, size_t keylen,
|
||||
ubyte* id, size_t idlen);
|
||||
int CMS_decrypt_set1_password(CMS_ContentInfo *cms,
|
||||
ubyte *pass, ossl_ssize_t passlen);
|
||||
|
||||
STACK_OF!(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo* cms);
|
||||
int CMS_RecipientInfo_type(CMS_RecipientInfo* ri);
|
||||
CMS_ContentInfo* CMS_EnvelopedData_create(const(EVP_CIPHER)* cipher);
|
||||
CMS_RecipientInfo* CMS_add1_recipient_cert(CMS_ContentInfo* cms,
|
||||
X509* recip, uint flags);
|
||||
int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo* ri, EVP_PKEY* pkey);
|
||||
int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo* ri, X509* cert);
|
||||
int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo* ri,
|
||||
EVP_PKEY** pk, X509** recip,
|
||||
X509_ALGOR** palg);
|
||||
int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo* ri,
|
||||
ASN1_OCTET_STRING** keyid,
|
||||
X509_NAME** issuer, ASN1_INTEGER** sno);
|
||||
|
||||
CMS_RecipientInfo* CMS_add0_recipient_key(CMS_ContentInfo* cms, int nid,
|
||||
ubyte* key, size_t keylen,
|
||||
ubyte* id, size_t idlen,
|
||||
ASN1_GENERALIZEDTIME* date,
|
||||
ASN1_OBJECT* otherTypeId,
|
||||
ASN1_TYPE* otherType);
|
||||
|
||||
int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo* ri,
|
||||
X509_ALGOR** palg,
|
||||
ASN1_OCTET_STRING** pid,
|
||||
ASN1_GENERALIZEDTIME** pdate,
|
||||
ASN1_OBJECT** potherid,
|
||||
ASN1_TYPE** pothertype);
|
||||
|
||||
int CMS_RecipientInfo_set0_key(CMS_RecipientInfo* ri,
|
||||
ubyte* key, size_t keylen);
|
||||
|
||||
int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo* ri,
|
||||
const(ubyte)* id, size_t idlen);
|
||||
|
||||
int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri,
|
||||
ubyte* pass,
|
||||
ossl_ssize_t passlen);
|
||||
|
||||
CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms,
|
||||
int iter, int wrap_nid, int pbe_nid,
|
||||
ubyte* pass,
|
||||
ossl_ssize_t passlen,
|
||||
const(EVP_CIPHER)* kekciph);
|
||||
|
||||
int CMS_RecipientInfo_decrypt(CMS_ContentInfo* cms, CMS_RecipientInfo* ri);
|
||||
|
||||
int CMS_uncompress(CMS_ContentInfo* cms, BIO* dcont, BIO* out_,
|
||||
uint flags);
|
||||
CMS_ContentInfo* CMS_compress(BIO* in_, int comp_nid, uint flags);
|
||||
|
||||
int CMS_set1_eContentType(CMS_ContentInfo* cms, const(ASN1_OBJECT)* oid);
|
||||
const(ASN1_OBJECT)* CMS_get0_eContentType(CMS_ContentInfo* cms);
|
||||
|
||||
CMS_CertificateChoices* CMS_add0_CertificateChoices(CMS_ContentInfo* cms);
|
||||
int CMS_add0_cert(CMS_ContentInfo* cms, X509* cert);
|
||||
int CMS_add1_cert(CMS_ContentInfo* cms, X509* cert);
|
||||
STACK_OF!(X509) *CMS_get1_certs(CMS_ContentInfo* cms);
|
||||
|
||||
CMS_RevocationInfoChoice* CMS_add0_RevocationInfoChoice(CMS_ContentInfo* cms);
|
||||
int CMS_add0_crl(CMS_ContentInfo* cms, X509_CRL* crl);
|
||||
int CMS_add1_crl(CMS_ContentInfo* cms, X509_CRL* crl);
|
||||
STACK_OF!(X509_CRL) *CMS_get1_crls(CMS_ContentInfo* cms);
|
||||
|
||||
int CMS_SignedData_init(CMS_ContentInfo* cms);
|
||||
CMS_SignerInfo* CMS_add1_signer(CMS_ContentInfo* cms,
|
||||
X509* signer, EVP_PKEY* pk, const(EVP_MD)* md,
|
||||
uint flags);
|
||||
STACK_OF!(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo* cms);
|
||||
|
||||
void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo* si, X509* signer);
|
||||
int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo* si,
|
||||
ASN1_OCTET_STRING** keyid,
|
||||
X509_NAME** issuer, ASN1_INTEGER** sno);
|
||||
int CMS_SignerInfo_cert_cmp(CMS_SignerInfo* si, X509* cert);
|
||||
int CMS_set1_signers_certs(CMS_ContentInfo* cms, STACK_OF!(X509) *certs,
|
||||
uint flags);
|
||||
void CMS_SignerInfo_get0_algs(CMS_SignerInfo* si, EVP_PKEY** pk, X509** signer,
|
||||
X509_ALGOR** pdig, X509_ALGOR** psig);
|
||||
int CMS_SignerInfo_sign(CMS_SignerInfo* si);
|
||||
int CMS_SignerInfo_verify(CMS_SignerInfo* si);
|
||||
int CMS_SignerInfo_verify_content(CMS_SignerInfo* si, BIO* chain);
|
||||
|
||||
int CMS_add_smimecap(CMS_SignerInfo* si, STACK_OF!(X509_ALGOR) *algs);
|
||||
int CMS_add_simple_smimecap(STACK_OF!(X509_ALGOR) **algs,
|
||||
int algnid, int keysize);
|
||||
int CMS_add_standard_smimecap(STACK_OF!(X509_ALGOR) **smcap);
|
||||
|
||||
int CMS_signed_get_attr_count(const(CMS_SignerInfo)* si);
|
||||
int CMS_signed_get_attr_by_NID(const(CMS_SignerInfo)* si, int nid,
|
||||
int lastpos);
|
||||
int CMS_signed_get_attr_by_OBJ(const(CMS_SignerInfo)* si, ASN1_OBJECT* obj,
|
||||
int lastpos);
|
||||
X509_ATTRIBUTE* CMS_signed_get_attr(const(CMS_SignerInfo)* si, int loc);
|
||||
X509_ATTRIBUTE* CMS_signed_delete_attr(CMS_SignerInfo* si, int loc);
|
||||
int CMS_signed_add1_attr(CMS_SignerInfo* si, X509_ATTRIBUTE* attr);
|
||||
int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo* si,
|
||||
const(ASN1_OBJECT)* obj, int type,
|
||||
const(void)* bytes, int len);
|
||||
int CMS_signed_add1_attr_by_NID(CMS_SignerInfo* si,
|
||||
int nid, int type,
|
||||
const(void)* bytes, int len);
|
||||
int CMS_signed_add1_attr_by_txt(CMS_SignerInfo* si,
|
||||
const(char)* attrname, int type,
|
||||
const(void)* bytes, int len);
|
||||
void* CMS_signed_get0_data_by_OBJ(CMS_SignerInfo* si, ASN1_OBJECT* oid,
|
||||
int lastpos, int type);
|
||||
|
||||
int CMS_unsigned_get_attr_count(const(CMS_SignerInfo)* si);
|
||||
int CMS_unsigned_get_attr_by_NID(const(CMS_SignerInfo)* si, int nid,
|
||||
int lastpos);
|
||||
int CMS_unsigned_get_attr_by_OBJ(const(CMS_SignerInfo)* si, ASN1_OBJECT* obj,
|
||||
int lastpos);
|
||||
X509_ATTRIBUTE* CMS_unsigned_get_attr(const(CMS_SignerInfo)* si, int loc);
|
||||
X509_ATTRIBUTE* CMS_unsigned_delete_attr(CMS_SignerInfo* si, int loc);
|
||||
int CMS_unsigned_add1_attr(CMS_SignerInfo* si, X509_ATTRIBUTE* attr);
|
||||
int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo* si,
|
||||
const(ASN1_OBJECT)* obj, int type,
|
||||
const(void)* bytes, int len);
|
||||
int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo* si,
|
||||
int nid, int type,
|
||||
const(void)* bytes, int len);
|
||||
int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo* si,
|
||||
const(char)* attrname, int type,
|
||||
const(void)* bytes, int len);
|
||||
void* CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo* si, ASN1_OBJECT* oid,
|
||||
int lastpos, int type);
|
||||
|
||||
// #ifdef HEADER_X509V3_H
|
||||
|
||||
int CMS_get1_ReceiptRequest(CMS_SignerInfo* si, CMS_ReceiptRequest** prr);
|
||||
CMS_ReceiptRequest* CMS_ReceiptRequest_create0(ubyte* id, int idlen,
|
||||
int allorfirst,
|
||||
STACK_OF!(GENERAL_NAMES) *receiptList,
|
||||
STACK_OF!(GENERAL_NAMES) *receiptsTo);
|
||||
int CMS_add1_ReceiptRequest(CMS_SignerInfo* si, CMS_ReceiptRequest* rr);
|
||||
void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest* rr,
|
||||
ASN1_STRING** pcid,
|
||||
int* pallorfirst,
|
||||
STACK_OF!(GENERAL_NAMES) **plist,
|
||||
STACK_OF!(GENERAL_NAMES) **prto);
|
||||
|
||||
// #endif
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_CMS_strings();
|
||||
|
||||
/* Error codes for the CMS functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum CMS_F_CHECK_CONTENT = 99;
|
||||
enum CMS_F_CMS_ADD0_CERT = 164;
|
||||
enum CMS_F_CMS_ADD0_RECIPIENT_KEY = 100;
|
||||
enum CMS_F_CMS_ADD0_RECIPIENT_PASSWORD = 165;
|
||||
enum CMS_F_CMS_ADD1_RECEIPTREQUEST = 158;
|
||||
enum CMS_F_CMS_ADD1_RECIPIENT_CERT = 101;
|
||||
enum CMS_F_CMS_ADD1_SIGNER = 102;
|
||||
enum CMS_F_CMS_ADD1_SIGNINGTIME = 103;
|
||||
enum CMS_F_CMS_COMPRESS = 104;
|
||||
enum CMS_F_CMS_COMPRESSEDDATA_CREATE = 105;
|
||||
enum CMS_F_CMS_COMPRESSEDDATA_INIT_BIO = 106;
|
||||
enum CMS_F_CMS_COPY_CONTENT = 107;
|
||||
enum CMS_F_CMS_COPY_MESSAGEDIGEST = 108;
|
||||
enum CMS_F_CMS_DATA = 109;
|
||||
enum CMS_F_CMS_DATAFINAL = 110;
|
||||
enum CMS_F_CMS_DATAINIT = 111;
|
||||
enum CMS_F_CMS_DECRYPT = 112;
|
||||
enum CMS_F_CMS_DECRYPT_SET1_KEY = 113;
|
||||
enum CMS_F_CMS_DECRYPT_SET1_PASSWORD = 166;
|
||||
enum CMS_F_CMS_DECRYPT_SET1_PKEY = 114;
|
||||
enum CMS_F_CMS_DIGESTALGORITHM_FIND_CTX = 115;
|
||||
enum CMS_F_CMS_DIGESTALGORITHM_INIT_BIO = 116;
|
||||
enum CMS_F_CMS_DIGESTEDDATA_DO_FINAL = 117;
|
||||
enum CMS_F_CMS_DIGEST_VERIFY = 118;
|
||||
enum CMS_F_CMS_ENCODE_RECEIPT = 161;
|
||||
enum CMS_F_CMS_ENCRYPT = 119;
|
||||
enum CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO = 120;
|
||||
enum CMS_F_CMS_ENCRYPTEDDATA_DECRYPT = 121;
|
||||
enum CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT = 122;
|
||||
enum CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY = 123;
|
||||
enum CMS_F_CMS_ENVELOPEDDATA_CREATE = 124;
|
||||
enum CMS_F_CMS_ENVELOPEDDATA_INIT_BIO = 125;
|
||||
enum CMS_F_CMS_ENVELOPED_DATA_INIT = 126;
|
||||
enum CMS_F_CMS_FINAL = 127;
|
||||
enum CMS_F_CMS_GET0_CERTIFICATE_CHOICES = 128;
|
||||
enum CMS_F_CMS_GET0_CONTENT = 129;
|
||||
enum CMS_F_CMS_GET0_ECONTENT_TYPE = 130;
|
||||
enum CMS_F_CMS_GET0_ENVELOPED = 131;
|
||||
enum CMS_F_CMS_GET0_REVOCATION_CHOICES = 132;
|
||||
enum CMS_F_CMS_GET0_SIGNED = 133;
|
||||
enum CMS_F_CMS_MSGSIGDIGEST_ADD1 = 162;
|
||||
enum CMS_F_CMS_RECEIPTREQUEST_CREATE0 = 159;
|
||||
enum CMS_F_CMS_RECEIPT_VERIFY = 160;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_DECRYPT = 134;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT = 135;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT = 136;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID = 137;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP = 138;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP = 139;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT = 140;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT = 141;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS = 142;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID = 143;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT = 167;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_SET0_KEY = 144;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD = 168;
|
||||
enum CMS_F_CMS_RECIPIENTINFO_SET0_PKEY = 145;
|
||||
enum CMS_F_CMS_SET1_SIGNERIDENTIFIER = 146;
|
||||
enum CMS_F_CMS_SET_DETACHED = 147;
|
||||
enum CMS_F_CMS_SIGN = 148;
|
||||
enum CMS_F_CMS_SIGNED_DATA_INIT = 149;
|
||||
enum CMS_F_CMS_SIGNERINFO_CONTENT_SIGN = 150;
|
||||
enum CMS_F_CMS_SIGNERINFO_SIGN = 151;
|
||||
enum CMS_F_CMS_SIGNERINFO_VERIFY = 152;
|
||||
enum CMS_F_CMS_SIGNERINFO_VERIFY_CERT = 153;
|
||||
enum CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT = 154;
|
||||
enum CMS_F_CMS_SIGN_RECEIPT = 163;
|
||||
enum CMS_F_CMS_STREAM = 155;
|
||||
enum CMS_F_CMS_UNCOMPRESS = 156;
|
||||
enum CMS_F_CMS_VERIFY = 157;
|
||||
|
||||
/* Reason codes. */
|
||||
enum CMS_R_ADD_SIGNER_ERROR = 99;
|
||||
enum CMS_R_CERTIFICATE_ALREADY_PRESENT = 175;
|
||||
enum CMS_R_CERTIFICATE_HAS_NO_KEYID = 160;
|
||||
enum CMS_R_CERTIFICATE_VERIFY_ERROR = 100;
|
||||
enum CMS_R_CIPHER_INITIALISATION_ERROR = 101;
|
||||
enum CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR = 102;
|
||||
enum CMS_R_CMS_DATAFINAL_ERROR = 103;
|
||||
enum CMS_R_CMS_LIB = 104;
|
||||
enum CMS_R_CONTENTIDENTIFIER_MISMATCH = 170;
|
||||
enum CMS_R_CONTENT_NOT_FOUND = 105;
|
||||
enum CMS_R_CONTENT_TYPE_MISMATCH = 171;
|
||||
enum CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA = 106;
|
||||
enum CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA = 107;
|
||||
enum CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA = 108;
|
||||
enum CMS_R_CONTENT_VERIFY_ERROR = 109;
|
||||
enum CMS_R_CTRL_ERROR = 110;
|
||||
enum CMS_R_CTRL_FAILURE = 111;
|
||||
enum CMS_R_DECRYPT_ERROR = 112;
|
||||
enum CMS_R_DIGEST_ERROR = 161;
|
||||
enum CMS_R_ERROR_GETTING_PUBLIC_KEY = 113;
|
||||
enum CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE = 114;
|
||||
enum CMS_R_ERROR_SETTING_KEY = 115;
|
||||
enum CMS_R_ERROR_SETTING_RECIPIENTINFO = 116;
|
||||
enum CMS_R_INVALID_ENCRYPTED_KEY_LENGTH = 117;
|
||||
enum CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER = 176;
|
||||
enum CMS_R_INVALID_KEY_LENGTH = 118;
|
||||
enum CMS_R_MD_BIO_INIT_ERROR = 119;
|
||||
enum CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH = 120;
|
||||
enum CMS_R_MESSAGEDIGEST_WRONG_LENGTH = 121;
|
||||
enum CMS_R_MSGSIGDIGEST_ERROR = 172;
|
||||
enum CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE = 162;
|
||||
enum CMS_R_MSGSIGDIGEST_WRONG_LENGTH = 163;
|
||||
enum CMS_R_NEED_ONE_SIGNER = 164;
|
||||
enum CMS_R_NOT_A_SIGNED_RECEIPT = 165;
|
||||
enum CMS_R_NOT_ENCRYPTED_DATA = 122;
|
||||
enum CMS_R_NOT_KEK = 123;
|
||||
enum CMS_R_NOT_KEY_TRANSPORT = 124;
|
||||
enum CMS_R_NOT_PWRI = 177;
|
||||
enum CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE = 125;
|
||||
enum CMS_R_NO_CIPHER = 126;
|
||||
enum CMS_R_NO_CONTENT = 127;
|
||||
enum CMS_R_NO_CONTENT_TYPE = 173;
|
||||
enum CMS_R_NO_DEFAULT_DIGEST = 128;
|
||||
enum CMS_R_NO_DIGEST_SET = 129;
|
||||
enum CMS_R_NO_KEY = 130;
|
||||
enum CMS_R_NO_KEY_OR_CERT = 174;
|
||||
enum CMS_R_NO_MATCHING_DIGEST = 131;
|
||||
enum CMS_R_NO_MATCHING_RECIPIENT = 132;
|
||||
enum CMS_R_NO_MATCHING_SIGNATURE = 166;
|
||||
enum CMS_R_NO_MSGSIGDIGEST = 167;
|
||||
enum CMS_R_NO_PASSWORD = 178;
|
||||
enum CMS_R_NO_PRIVATE_KEY = 133;
|
||||
enum CMS_R_NO_PUBLIC_KEY = 134;
|
||||
enum CMS_R_NO_RECEIPT_REQUEST = 168;
|
||||
enum CMS_R_NO_SIGNERS = 135;
|
||||
enum CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE = 136;
|
||||
enum CMS_R_RECEIPT_DECODE_ERROR = 169;
|
||||
enum CMS_R_RECIPIENT_ERROR = 137;
|
||||
enum CMS_R_SIGNER_CERTIFICATE_NOT_FOUND = 138;
|
||||
enum CMS_R_SIGNFINAL_ERROR = 139;
|
||||
enum CMS_R_SMIME_TEXT_ERROR = 140;
|
||||
enum CMS_R_STORE_INIT_ERROR = 141;
|
||||
enum CMS_R_TYPE_NOT_COMPRESSED_DATA = 142;
|
||||
enum CMS_R_TYPE_NOT_DATA = 143;
|
||||
enum CMS_R_TYPE_NOT_DIGESTED_DATA = 144;
|
||||
enum CMS_R_TYPE_NOT_ENCRYPTED_DATA = 145;
|
||||
enum CMS_R_TYPE_NOT_ENVELOPED_DATA = 146;
|
||||
enum CMS_R_UNABLE_TO_FINALIZE_CONTEXT = 147;
|
||||
enum CMS_R_UNKNOWN_CIPHER = 148;
|
||||
enum CMS_R_UNKNOWN_DIGEST_ALGORIHM = 149;
|
||||
enum CMS_R_UNKNOWN_ID = 150;
|
||||
enum CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM = 151;
|
||||
enum CMS_R_UNSUPPORTED_CONTENT_TYPE = 152;
|
||||
enum CMS_R_UNSUPPORTED_KEK_ALGORITHM = 153;
|
||||
enum CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = 179;
|
||||
enum CMS_R_UNSUPPORTED_RECIPIENT_TYPE = 154;
|
||||
enum CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE = 155;
|
||||
enum CMS_R_UNSUPPORTED_TYPE = 156;
|
||||
enum CMS_R_UNWRAP_ERROR = 157;
|
||||
enum CMS_R_UNWRAP_FAILURE = 180;
|
||||
enum CMS_R_VERIFICATION_FAILURE = 158;
|
||||
enum CMS_R_WRAP_ERROR = 159;
|
|
@ -0,0 +1,75 @@
|
|||
|
||||
module deimos.openssl.comp;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.bio; // Needed for BIO_METHOD.
|
||||
|
||||
public import deimos.openssl.crypto;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
alias comp_ctx_st COMP_CTX;
|
||||
|
||||
struct comp_method_st {
|
||||
int type; /* NID for compression library */
|
||||
const(char)* name; /* A text string to identify the library */
|
||||
ExternC!(int function(COMP_CTX* ctx)) init_;
|
||||
ExternC!(void function(COMP_CTX* ctx)) finish;
|
||||
ExternC!(int function(COMP_CTX* ctx,
|
||||
ubyte* out_, uint olen,
|
||||
ubyte* in_, uint ilen)) compress;
|
||||
ExternC!(int function(COMP_CTX* ctx,
|
||||
ubyte* out_, uint olen,
|
||||
ubyte* in_, uint ilen)) expand;
|
||||
/* The following two do NOTHING, but are kept for backward compatibility */
|
||||
ExternC!(c_long function()) ctrl;
|
||||
ExternC!(c_long function()) callback_ctrl;
|
||||
}
|
||||
alias comp_method_st COMP_METHOD;
|
||||
|
||||
struct comp_ctx_st
|
||||
{
|
||||
COMP_METHOD* meth;
|
||||
c_ulong compress_in;
|
||||
c_ulong compress_out;
|
||||
c_ulong expand_in;
|
||||
c_ulong expand_out;
|
||||
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
};
|
||||
|
||||
|
||||
COMP_CTX* COMP_CTX_new(COMP_METHOD* meth);
|
||||
void COMP_CTX_free(COMP_CTX* ctx);
|
||||
int COMP_compress_block(COMP_CTX* ctx, ubyte* out_, int olen,
|
||||
ubyte* in_, int ilen);
|
||||
int COMP_expand_block(COMP_CTX* ctx, ubyte* out_, int olen,
|
||||
ubyte* in_, int ilen);
|
||||
COMP_METHOD* COMP_rle();
|
||||
COMP_METHOD* COMP_zlib();
|
||||
void COMP_zlib_cleanup();
|
||||
|
||||
// #ifdef ZLIB
|
||||
BIO_METHOD* BIO_f_zlib();
|
||||
// #endif
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_COMP_strings();
|
||||
|
||||
/* Error codes for the COMP functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum COMP_F_BIO_ZLIB_FLUSH = 99;
|
||||
enum COMP_F_BIO_ZLIB_NEW = 100;
|
||||
enum COMP_F_BIO_ZLIB_READ = 101;
|
||||
enum COMP_F_BIO_ZLIB_WRITE = 102;
|
||||
|
||||
/* Reason codes. */
|
||||
enum COMP_R_ZLIB_DEFLATE_ERROR = 99;
|
||||
enum COMP_R_ZLIB_INFLATE_ERROR = 100;
|
||||
enum COMP_R_ZLIB_NOT_SUPPORTED = 101;
|
|
@ -0,0 +1,258 @@
|
|||
/* crypto/conf/conf.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.conf;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.bio;
|
||||
public import deimos.openssl.lhash;
|
||||
public import deimos.openssl.stack;
|
||||
public import deimos.openssl.safestack;
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
public import deimos.openssl.ossl_typ;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct CONF_VALUE
|
||||
{
|
||||
char* section;
|
||||
char* name;
|
||||
char* value;
|
||||
}
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(CONF_VALUE);+/
|
||||
mixin DECLARE_LHASH_OF!(CONF_VALUE);
|
||||
|
||||
alias conf_method_st CONF_METHOD;
|
||||
|
||||
struct conf_method_st
|
||||
{
|
||||
const(char)* name;
|
||||
ExternC!(CONF* function(CONF_METHOD* meth)) create;
|
||||
ExternC!(int function(CONF* conf)) init_;
|
||||
ExternC!(int function(CONF* conf)) destroy;
|
||||
ExternC!(int function(CONF* conf)) destroy_data;
|
||||
ExternC!(int function(CONF* conf, BIO* bp, c_long* eline)) load_bio;
|
||||
ExternC!(int function(const(CONF)* conf, BIO* bp)) dump;
|
||||
ExternC!(int function(const(CONF)* conf, char c)) is_number;
|
||||
ExternC!(int function(const(CONF)* conf, char c)) to_int;
|
||||
ExternC!(int function(CONF* conf, const(char)* name, c_long* eline)) load;
|
||||
};
|
||||
|
||||
/* Module definitions */
|
||||
|
||||
struct conf_imodule_st;
|
||||
alias conf_imodule_st CONF_IMODULE;
|
||||
struct conf_module_st;
|
||||
alias conf_module_st CONF_MODULE;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(CONF_MODULE);+/
|
||||
/+mixin DECLARE_STACK_OF!(CONF_IMODULE);+/
|
||||
|
||||
/* DSO module function typedefs */
|
||||
alias typeof(*(ExternC!(int function(CONF_IMODULE* md, const(CONF)* cnf))).init) conf_init_func;
|
||||
alias typeof(*(ExternC!(void function(CONF_IMODULE* md))).init) conf_finish_func;
|
||||
|
||||
enum CONF_MFLAGS_IGNORE_ERRORS = 0x1;
|
||||
enum CONF_MFLAGS_IGNORE_RETURN_CODES = 0x2;
|
||||
enum CONF_MFLAGS_SILENT = 0x4;
|
||||
enum CONF_MFLAGS_NO_DSO = 0x8;
|
||||
enum CONF_MFLAGS_IGNORE_MISSING_FILE = 0x10;
|
||||
enum CONF_MFLAGS_DEFAULT_SECTION = 0x20;
|
||||
|
||||
int CONF_set_default_method(CONF_METHOD* meth);
|
||||
void CONF_set_nconf(CONF* conf,LHASH_OF!(CONF_VALUE) *hash);
|
||||
LHASH_OF!(CONF_VALUE) *CONF_load(LHASH_OF!(CONF_VALUE) *conf,const(char)* file,
|
||||
c_long* eline);
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
LHASH_OF!(CONF_VALUE) *CONF_load_fp(LHASH_OF!(CONF_VALUE) *conf, FILE* fp,
|
||||
c_long* eline);
|
||||
}
|
||||
LHASH_OF!(CONF_VALUE) *CONF_load_bio(LHASH_OF!(CONF_VALUE) *conf, BIO* bp,c_long* eline);
|
||||
STACK_OF!(CONF_VALUE) *CONF_get_section(LHASH_OF!(CONF_VALUE) *conf,
|
||||
const(char)* section);
|
||||
char* CONF_get_string(LHASH_OF!(CONF_VALUE) *conf,const(char)* group,
|
||||
const(char)* name);
|
||||
c_long CONF_get_number(LHASH_OF!(CONF_VALUE) *conf,const(char)* group,
|
||||
const(char)* name);
|
||||
void CONF_free(LHASH_OF!(CONF_VALUE) *conf);
|
||||
int CONF_dump_fp(LHASH_OF!(CONF_VALUE) *conf, FILE* out_);
|
||||
int CONF_dump_bio(LHASH_OF!(CONF_VALUE) *conf, BIO* out_);
|
||||
|
||||
void OPENSSL_config(const(char)* config_name);
|
||||
void OPENSSL_no_config();
|
||||
|
||||
/* New conf code. The semantics are different from the functions above.
|
||||
If that wasn't the case, the above functions would have been replaced */
|
||||
|
||||
struct conf_st
|
||||
{
|
||||
CONF_METHOD* meth;
|
||||
void* meth_data;
|
||||
LHASH_OF!(CONF_VALUE) *data;
|
||||
};
|
||||
|
||||
CONF* NCONF_new(CONF_METHOD* meth);
|
||||
CONF_METHOD* NCONF_default();
|
||||
CONF_METHOD* NCONF_WIN32();
|
||||
version (none) { /* Just to give you an idea of what I have in mind */
|
||||
CONF_METHOD* NCONF_XML();
|
||||
}
|
||||
void NCONF_free(CONF* conf);
|
||||
void NCONF_free_data(CONF* conf);
|
||||
|
||||
int NCONF_load(CONF* conf,const(char)* file,c_long* eline);
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
int NCONF_load_fp(CONF* conf, FILE* fp,c_long* eline);
|
||||
}
|
||||
int NCONF_load_bio(CONF* conf, BIO* bp,c_long* eline);
|
||||
STACK_OF!(CONF_VALUE) *NCONF_get_section(const(CONF)* conf,const(char)* section);
|
||||
char* NCONF_get_string(const(CONF)* conf,const(char)* group,const(char)* name);
|
||||
int NCONF_get_number_e(const(CONF)* conf,const(char)* group,const(char)* name,
|
||||
c_long* result);
|
||||
int NCONF_dump_fp(const(CONF)* conf, FILE* out_);
|
||||
int NCONF_dump_bio(const(CONF)* conf, BIO* out_);
|
||||
|
||||
version (none) { /* The following function has no error checking,
|
||||
and should therefore be avoided */
|
||||
c_long NCONF_get_number(CONF* conf,char* group,char* name);
|
||||
} else {
|
||||
alias NCONF_get_number_e NCONF_get_number;
|
||||
}
|
||||
|
||||
/* Module functions */
|
||||
|
||||
int CONF_modules_load(const(CONF)* cnf, const(char)* appname,
|
||||
c_ulong flags);
|
||||
int CONF_modules_load_file(const(char)* filename, const(char)* appname,
|
||||
c_ulong flags);
|
||||
void CONF_modules_unload(int all);
|
||||
void CONF_modules_finish();
|
||||
void CONF_modules_free();
|
||||
int CONF_module_add(const(char)* name, conf_init_func* ifunc,
|
||||
conf_finish_func* ffunc);
|
||||
|
||||
const(char)* CONF_imodule_get_name(const(CONF_IMODULE)* md);
|
||||
const(char)* CONF_imodule_get_value(const(CONF_IMODULE)* md);
|
||||
void* CONF_imodule_get_usr_data(const(CONF_IMODULE)* md);
|
||||
void CONF_imodule_set_usr_data(CONF_IMODULE* md, void* usr_data);
|
||||
CONF_MODULE* CONF_imodule_get_module(const(CONF_IMODULE)* md);
|
||||
c_ulong CONF_imodule_get_flags(const(CONF_IMODULE)* md);
|
||||
void CONF_imodule_set_flags(CONF_IMODULE* md, c_ulong flags);
|
||||
void* CONF_module_get_usr_data(CONF_MODULE* pmod);
|
||||
void CONF_module_set_usr_data(CONF_MODULE* pmod, void* usr_data);
|
||||
|
||||
char* CONF_get1_default_config_file();
|
||||
|
||||
int CONF_parse_list(const(char)* list, int sep, int nospc,
|
||||
ExternC!(int function(const(char)* elem, int len, void* usr)) list_cb, void* arg);
|
||||
|
||||
void OPENSSL_load_builtin_modules();
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_CONF_strings();
|
||||
|
||||
/* Error codes for the CONF functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum CONF_F_CONF_DUMP_FP = 104;
|
||||
enum CONF_F_CONF_LOAD = 100;
|
||||
enum CONF_F_CONF_LOAD_BIO = 102;
|
||||
enum CONF_F_CONF_LOAD_FP = 103;
|
||||
enum CONF_F_CONF_MODULES_LOAD = 116;
|
||||
enum CONF_F_CONF_PARSE_LIST = 119;
|
||||
enum CONF_F_DEF_LOAD = 120;
|
||||
enum CONF_F_DEF_LOAD_BIO = 121;
|
||||
enum CONF_F_MODULE_INIT = 115;
|
||||
enum CONF_F_MODULE_LOAD_DSO = 117;
|
||||
enum CONF_F_MODULE_RUN = 118;
|
||||
enum CONF_F_NCONF_DUMP_BIO = 105;
|
||||
enum CONF_F_NCONF_DUMP_FP = 106;
|
||||
enum CONF_F_NCONF_GET_NUMBER = 107;
|
||||
enum CONF_F_NCONF_GET_NUMBER_E = 112;
|
||||
enum CONF_F_NCONF_GET_SECTION = 108;
|
||||
enum CONF_F_NCONF_GET_STRING = 109;
|
||||
enum CONF_F_NCONF_LOAD = 113;
|
||||
enum CONF_F_NCONF_LOAD_BIO = 110;
|
||||
enum CONF_F_NCONF_LOAD_FP = 114;
|
||||
enum CONF_F_NCONF_NEW = 111;
|
||||
enum CONF_F_STR_COPY = 101;
|
||||
|
||||
/* Reason codes. */
|
||||
enum CONF_R_ERROR_LOADING_DSO = 110;
|
||||
enum CONF_R_LIST_CANNOT_BE_NULL = 115;
|
||||
enum CONF_R_MISSING_CLOSE_SQUARE_BRACKET = 100;
|
||||
enum CONF_R_MISSING_EQUAL_SIGN = 101;
|
||||
enum CONF_R_MISSING_FINISH_FUNCTION = 111;
|
||||
enum CONF_R_MISSING_INIT_FUNCTION = 112;
|
||||
enum CONF_R_MODULE_INITIALIZATION_ERROR = 109;
|
||||
enum CONF_R_NO_CLOSE_BRACE = 102;
|
||||
enum CONF_R_NO_CONF = 105;
|
||||
enum CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE = 106;
|
||||
enum CONF_R_NO_SECTION = 107;
|
||||
enum CONF_R_NO_SUCH_FILE = 114;
|
||||
enum CONF_R_NO_VALUE = 108;
|
||||
enum CONF_R_UNABLE_TO_CREATE_NEW_SECTION = 103;
|
||||
enum CONF_R_UNKNOWN_MODULE_NAME = 113;
|
||||
enum CONF_R_VARIABLE_HAS_NO_VALUE = 104;
|
|
@ -0,0 +1,83 @@
|
|||
/* conf_api.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.conf_api;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.lhash;
|
||||
public import deimos.openssl.conf;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Up until OpenSSL 0.9.5a, this was new_section */
|
||||
CONF_VALUE* _CONF_new_section(CONF* conf, const(char)* section);
|
||||
/* Up until OpenSSL 0.9.5a, this was get_section */
|
||||
CONF_VALUE* _CONF_get_section(const(CONF)* conf, const(char)* section);
|
||||
/* Up until OpenSSL 0.9.5a, this was CONF_get_section */
|
||||
STACK_OF!(CONF_VALUE) *_CONF_get_section_values(const(CONF)* conf,
|
||||
const(char)* section);
|
||||
|
||||
int _CONF_add_string(CONF* conf, CONF_VALUE* section, CONF_VALUE* value);
|
||||
char* _CONF_get_string(const(CONF)* conf, const(char)* section,
|
||||
const(char)* name);
|
||||
c_long _CONF_get_number(const(CONF)* conf, const(char)* section, const(char)* name);
|
||||
|
||||
int _CONF_new_data(CONF* conf);
|
||||
void _CONF_free_data(CONF* conf);
|
|
@ -0,0 +1,605 @@
|
|||
/* crypto/crypto.h */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2006 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
* ECDH support in OpenSSL originally developed by
|
||||
* SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
|
||||
*/
|
||||
|
||||
module deimos.openssl.crypto;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import core.stdc.stdlib;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
import core.stdc.stdio;
|
||||
}
|
||||
|
||||
public import deimos.openssl.stack;
|
||||
public import deimos.openssl.safestack;
|
||||
public import deimos.openssl.opensslv;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
|
||||
version (CHARSET_EBCDIC) {
|
||||
public import deimos.openssl.ebcdic;
|
||||
}
|
||||
|
||||
/* Resolve problems on some operating systems with symbol names that clash
|
||||
one way or another */
|
||||
public import deimos.openssl.symhacks;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Backward compatibility to SSLeay */
|
||||
/* This is more to be used to check the correct DLL is being used
|
||||
* in the MS world. */
|
||||
alias OPENSSL_VERSION_NUMBER SSLEAY_VERSION_NUMBER;
|
||||
enum SSLEAY_VERSION = 0;
|
||||
/* enum SSLEAY_OPTIONS = 1; no longer supported */
|
||||
enum SSLEAY_CFLAGS = 2;
|
||||
enum SSLEAY_BUILT_ON = 3;
|
||||
enum SSLEAY_PLATFORM = 4;
|
||||
enum SSLEAY_DIR = 5;
|
||||
|
||||
/* Already declared in ossl_typ.h */
|
||||
/+#if 0
|
||||
alias crypto_ex_data_st CRYPTO_EX_DATA;
|
||||
/* Called when a new object is created */
|
||||
typedef int CRYPTO_EX_new(void* parent, void* ptr, CRYPTO_EX_DATA* ad,
|
||||
int idx, c_long argl, void* argp);
|
||||
/* Called when an object is free()ed */
|
||||
typedef void CRYPTO_EX_free(void* parent, void* ptr, CRYPTO_EX_DATA* ad,
|
||||
int idx, c_long argl, void* argp);
|
||||
/* Called when we need to dup an object */
|
||||
typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA* to, CRYPTO_EX_DATA* from, void* from_d,
|
||||
int idx, c_long argl, void* argp);
|
||||
#endif+/
|
||||
|
||||
/* A generic structure to pass assorted data in a expandable way */
|
||||
struct openssl_item_st {
|
||||
int code;
|
||||
void* value; /* Not used for flag attributes */
|
||||
size_t value_size; /* Max size of value for output, length for input */
|
||||
size_t* value_length; /* Returned length of value for output */
|
||||
}
|
||||
alias openssl_item_st OPENSSL_ITEM;
|
||||
|
||||
|
||||
/* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock
|
||||
* names in cryptlib.c
|
||||
*/
|
||||
|
||||
enum CRYPTO_LOCK_ERR = 1;
|
||||
enum CRYPTO_LOCK_EX_DATA = 2;
|
||||
enum CRYPTO_LOCK_X509 = 3;
|
||||
enum CRYPTO_LOCK_X509_INFO = 4;
|
||||
enum CRYPTO_LOCK_X509_PKEY = 5;
|
||||
enum CRYPTO_LOCK_X509_CRL = 6;
|
||||
enum CRYPTO_LOCK_X509_REQ = 7;
|
||||
enum CRYPTO_LOCK_DSA = 8;
|
||||
enum CRYPTO_LOCK_RSA = 9;
|
||||
enum CRYPTO_LOCK_EVP_PKEY = 10;
|
||||
enum CRYPTO_LOCK_X509_STORE = 11;
|
||||
enum CRYPTO_LOCK_SSL_CTX = 12;
|
||||
enum CRYPTO_LOCK_SSL_CERT = 13;
|
||||
enum CRYPTO_LOCK_SSL_SESSION = 14;
|
||||
enum CRYPTO_LOCK_SSL_SESS_CERT = 15;
|
||||
enum CRYPTO_LOCK_SSL = 16;
|
||||
enum CRYPTO_LOCK_SSL_METHOD = 17;
|
||||
enum CRYPTO_LOCK_RAND = 18;
|
||||
enum CRYPTO_LOCK_RAND2 = 19;
|
||||
enum CRYPTO_LOCK_MALLOC = 20;
|
||||
enum CRYPTO_LOCK_BIO = 21;
|
||||
enum CRYPTO_LOCK_GETHOSTBYNAME = 22;
|
||||
enum CRYPTO_LOCK_GETSERVBYNAME = 23;
|
||||
enum CRYPTO_LOCK_READDIR = 24;
|
||||
enum CRYPTO_LOCK_RSA_BLINDING = 25;
|
||||
enum CRYPTO_LOCK_DH = 26;
|
||||
enum CRYPTO_LOCK_MALLOC2 = 27;
|
||||
enum CRYPTO_LOCK_DSO = 28;
|
||||
enum CRYPTO_LOCK_DYNLOCK = 29;
|
||||
enum CRYPTO_LOCK_ENGINE = 30;
|
||||
enum CRYPTO_LOCK_UI = 31;
|
||||
enum CRYPTO_LOCK_ECDSA = 32;
|
||||
enum CRYPTO_LOCK_EC = 33;
|
||||
enum CRYPTO_LOCK_ECDH = 34;
|
||||
enum CRYPTO_LOCK_BN = 35;
|
||||
enum CRYPTO_LOCK_EC_PRE_COMP = 36;
|
||||
enum CRYPTO_LOCK_STORE = 37;
|
||||
enum CRYPTO_LOCK_COMP = 38;
|
||||
enum CRYPTO_LOCK_FIPS = 39;
|
||||
enum CRYPTO_LOCK_FIPS2 = 40;
|
||||
enum CRYPTO_NUM_LOCKS = 41;
|
||||
|
||||
enum CRYPTO_LOCK = 1;
|
||||
enum CRYPTO_UNLOCK = 2;
|
||||
enum CRYPTO_READ = 4;
|
||||
enum CRYPTO_WRITE = 8;
|
||||
|
||||
version (OPENSSL_NO_LOCKING) {
|
||||
void CRYPTO_w_lock()(int type) {}
|
||||
void CRYPTO_w_unlock()(int type) {}
|
||||
void CRYPTO_r_lock()(int type) {}
|
||||
void CRYPTO_r_unlock()(int type) {}
|
||||
void CRYPTO_add()(int* addr, int amount, int type) { *addr += amount; }
|
||||
} else {
|
||||
void CRYPTO_w_lock(string file = __FILE__, size_t line = __LINE__)(int type) {
|
||||
CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,file.ptr,line);
|
||||
}
|
||||
void CRYPTO_w_unlock(string file = __FILE__, size_t line = __LINE__)(int type) {
|
||||
CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,file.ptr,line);
|
||||
}
|
||||
void CRYPTO_r_lock(string file = __FILE__, size_t line = __LINE__)(int type) {
|
||||
CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,file.ptr,line);
|
||||
}
|
||||
void CRYPTO_r_unlock(string file = __FILE__, size_t line = __LINE__)(int type) {
|
||||
CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,file.ptr,line);
|
||||
}
|
||||
void CRYPTO_add(string file = __FILE__, size_t line = __LINE__)(int* addr, int amount, int type) {
|
||||
CRYPTO_add_lock(addr,amount,type,file.ptr,line);
|
||||
}
|
||||
}
|
||||
|
||||
/* Some applications as well as some parts of OpenSSL need to allocate
|
||||
and deallocate locks in a dynamic fashion. The following typedef
|
||||
makes this possible in a type-safe manner. */
|
||||
/* CRYPTO_dynlock_value has to be defined by the application. */
|
||||
// FIXME: struct CRYPTO_dynlock_value;
|
||||
struct CRYPTO_dynlock
|
||||
{
|
||||
int references;
|
||||
CRYPTO_dynlock_value* data;
|
||||
}
|
||||
|
||||
|
||||
/* The following can be used to detect memory leaks in the SSLeay library.
|
||||
* It used, it turns on malloc checking */
|
||||
|
||||
enum CRYPTO_MEM_CHECK_OFF = 0x0; /* an enume */
|
||||
enum CRYPTO_MEM_CHECK_ON = 0x1; /* a bit */
|
||||
enum CRYPTO_MEM_CHECK_ENABLE = 0x2; /* a bit */
|
||||
enum CRYPTO_MEM_CHECK_DISABLE = 0x3; /* an enume */
|
||||
|
||||
/* The following are bit values to turn on or off options connected to the
|
||||
* malloc checking functionality */
|
||||
|
||||
/* Adds time to the memory checking information */
|
||||
enum V_CRYPTO_MDEBUG_TIME = 0x1; /* a bit */
|
||||
/* Adds thread number to the memory checking information */
|
||||
enum V_CRYPTO_MDEBUG_THREAD = 0x2; /* a bit */
|
||||
|
||||
enum V_CRYPTO_MDEBUG_ALL = (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD);
|
||||
|
||||
|
||||
/* predec of the BIO type */
|
||||
import deimos.openssl.bio; /*struct bio_st;*/
|
||||
alias bio_st BIO_dummy;
|
||||
|
||||
struct crypto_ex_data_st
|
||||
{
|
||||
STACK_OF!() *sk;
|
||||
int dummy; /* gcc is screwing up this data structure :-( */
|
||||
};
|
||||
/+mixin DECLARE_STACK_OF!();+/
|
||||
|
||||
/* This stuff is basically class callback functions
|
||||
* The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */
|
||||
|
||||
struct crypto_ex_data_func_st {
|
||||
c_long argl; /* Arbitary c_long */
|
||||
void* argp; /* Arbitary void* */
|
||||
CRYPTO_EX_new* new_func;
|
||||
CRYPTO_EX_free* free_func;
|
||||
CRYPTO_EX_dup* dup_func;
|
||||
}
|
||||
alias crypto_ex_data_func_st CRYPTO_EX_DATA_FUNCS;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(CRYPTO_EX_DATA_FUNCS);+/
|
||||
|
||||
/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA
|
||||
* entry.
|
||||
*/
|
||||
|
||||
enum CRYPTO_EX_INDEX_BIO = 0;
|
||||
enum CRYPTO_EX_INDEX_SSL = 1;
|
||||
enum CRYPTO_EX_INDEX_SSL_CTX = 2;
|
||||
enum CRYPTO_EX_INDEX_SSL_SESSION = 3;
|
||||
enum CRYPTO_EX_INDEX_X509_STORE = 4;
|
||||
enum CRYPTO_EX_INDEX_X509_STORE_CTX = 5;
|
||||
enum CRYPTO_EX_INDEX_RSA = 6;
|
||||
enum CRYPTO_EX_INDEX_DSA = 7;
|
||||
enum CRYPTO_EX_INDEX_DH = 8;
|
||||
enum CRYPTO_EX_INDEX_ENGINE = 9;
|
||||
enum CRYPTO_EX_INDEX_X509 = 10;
|
||||
enum CRYPTO_EX_INDEX_UI = 11;
|
||||
enum CRYPTO_EX_INDEX_ECDSA = 12;
|
||||
enum CRYPTO_EX_INDEX_ECDH = 13;
|
||||
enum CRYPTO_EX_INDEX_COMP = 14;
|
||||
enum CRYPTO_EX_INDEX_STORE = 15;
|
||||
|
||||
/* Dynamically assigned indexes start from this value (don't use directly, use
|
||||
* via CRYPTO_ex_data_new_class). */
|
||||
enum CRYPTO_EX_INDEX_USER = 100;
|
||||
|
||||
|
||||
/* This is the default callbacks, but we can have others as well:
|
||||
* this is needed in Win32 where the application malloc and the
|
||||
* library malloc may not be the same.
|
||||
*/
|
||||
void CRYPTO_malloc_init()() {
|
||||
CRYPTO_set_mem_functions(&malloc, &realloc, &free);
|
||||
}
|
||||
|
||||
/+#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD
|
||||
# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */
|
||||
# define CRYPTO_MDEBUG
|
||||
# endif
|
||||
#endif+/
|
||||
|
||||
/* Set standard debugging functions (not done by default
|
||||
* unless CRYPTO_MDEBUG is defined) */
|
||||
void CRYPTO_malloc_debug_init()() {
|
||||
CRYPTO_set_mem_debug_functions(&CRYPTO_dbg_malloc, &CRYPTO_dbg_realloc,
|
||||
&CRYPTO_dbg_free, &CRYPTO_dbg_set_options, &CRYPTO_dbg_get_options);
|
||||
}
|
||||
|
||||
int CRYPTO_mem_ctrl(int mode);
|
||||
int CRYPTO_is_mem_check_on();
|
||||
|
||||
/* for applications */
|
||||
int MemCheck_start()() { return CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); }
|
||||
int MemCheck_stop()(){ return CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF); }
|
||||
|
||||
/* for library-internal use */
|
||||
int MemCheck_on()() { return CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); }
|
||||
int MemCheck_off()() { return CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE); }
|
||||
alias CRYPTO_is_mem_check_on is_MemCheck_on;
|
||||
|
||||
auto OPENSSL_malloc(string file = __FILE__, size_t line = __LINE__)(int num) {
|
||||
return CRYPTO_malloc(num,file.ptr,line);
|
||||
}
|
||||
auto OPENSSL_strdup(string file = __FILE__, size_t line = __LINE__)(const(char)* str) {
|
||||
return CRYPTO_strdup(str,file.ptr,line);
|
||||
}
|
||||
auto OPENSSL_realloc(string file = __FILE__, size_t line = __LINE__)(void* addr, int num) {
|
||||
return CRYPTO_realloc(addr,num,file.ptr,line);
|
||||
}
|
||||
auto OPENSSL_realloc_clean(string file = __FILE__, size_t line = __LINE__)(void* addr,int old_num,int num) {
|
||||
CRYPTO_realloc_clean(addr,old_num,num,file.ptr,line);
|
||||
}
|
||||
auto OPENSSL_remalloc(string file = __FILE__, size_t line = __LINE__)(void** addr, int num) {
|
||||
return CRYPTO_remalloc(cast(char**)addr,num,file.ptr,line);
|
||||
}
|
||||
alias CRYPTO_free OPENSSL_freeFunc;
|
||||
alias CRYPTO_free OPENSSL_free;
|
||||
|
||||
auto OPENSSL_malloc_locked(string file = __FILE__, size_t line = __LINE__)(int num) {
|
||||
return CRYPTO_malloc_locked(num, file.ptr, line);
|
||||
}
|
||||
alias CRYPTO_free_locked OPENSSL_free_locked;
|
||||
|
||||
|
||||
const(char)* SSLeay_version(int type);
|
||||
c_ulong SSLeay();
|
||||
|
||||
int OPENSSL_issetugid();
|
||||
|
||||
/* An opaque type representing an implementation of "ex_data" support */
|
||||
struct st_CRYPTO_EX_DATA_IMPL;
|
||||
alias st_CRYPTO_EX_DATA_IMPL CRYPTO_EX_DATA_IMPL;
|
||||
/* Return an opaque pointer to the current "ex_data" implementation */
|
||||
const(CRYPTO_EX_DATA_IMPL)* CRYPTO_get_ex_data_implementation();
|
||||
/* Sets the "ex_data" implementation to be used (if it's not too late) */
|
||||
int CRYPTO_set_ex_data_implementation(const(CRYPTO_EX_DATA_IMPL)* i);
|
||||
/* Get a new "ex_data" class, and return the corresponding "class_index" */
|
||||
int CRYPTO_ex_data_new_class();
|
||||
/* Within a given class, get/register a new index */
|
||||
int CRYPTO_get_ex_new_index(int class_index, c_long argl, void* argp,
|
||||
CRYPTO_EX_new* new_func, CRYPTO_EX_dup* dup_func,
|
||||
CRYPTO_EX_free* free_func);
|
||||
/* Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a given
|
||||
* class (invokes whatever per-class callbacks are applicable) */
|
||||
int CRYPTO_new_ex_data(int class_index, void* obj, CRYPTO_EX_DATA* ad);
|
||||
int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA* to,
|
||||
CRYPTO_EX_DATA* from);
|
||||
void CRYPTO_free_ex_data(int class_index, void* obj, CRYPTO_EX_DATA* ad);
|
||||
/* Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular index
|
||||
* (relative to the class type involved) */
|
||||
int CRYPTO_set_ex_data(CRYPTO_EX_DATA* ad, int idx, void* val);
|
||||
void* CRYPTO_get_ex_data(const(CRYPTO_EX_DATA)* ad,int idx);
|
||||
|
||||
int CRYPTO_get_new_lockid(char* name);
|
||||
|
||||
void CRYPTO_lock(int mode, int type,const(char)* file,int line);
|
||||
|
||||
/* Don't use this structure directly. */
|
||||
struct crypto_threadid_st {
|
||||
void* ptr;
|
||||
c_ulong val;
|
||||
}
|
||||
alias crypto_threadid_st CRYPTO_THREADID;
|
||||
/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */
|
||||
void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID* id, c_ulong val);
|
||||
void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID* id, void* ptr);
|
||||
int CRYPTO_THREADID_set_callback(ExternC!(void function(CRYPTO_THREADID*)) threadid_func);
|
||||
ExternC!(void function(CRYPTO_THREADID*)) CRYPTO_THREADID_get_callback();
|
||||
void CRYPTO_THREADID_current(CRYPTO_THREADID* id);
|
||||
int CRYPTO_THREADID_cmp(const(CRYPTO_THREADID)* a, const(CRYPTO_THREADID)* b);
|
||||
void CRYPTO_THREADID_cpy(CRYPTO_THREADID* dest, const(CRYPTO_THREADID)* src);
|
||||
c_ulong CRYPTO_THREADID_hash(const(CRYPTO_THREADID)* id);
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
void CRYPTO_set_id_callback(ExternC!(c_ulong function()) func);
|
||||
ExternC!(c_ulong function()) CRYPTO_get_id_callback();
|
||||
c_ulong CRYPTO_thread_id();
|
||||
}
|
||||
|
||||
const(char)* CRYPTO_get_lock_name(int type);
|
||||
int CRYPTO_add_lock(int* pointer,int amount,int type, const(char)* file,
|
||||
int line);
|
||||
|
||||
int CRYPTO_get_new_dynlockid();
|
||||
void CRYPTO_destroy_dynlockid(int i);
|
||||
struct CRYPTO_dynlock_value;
|
||||
CRYPTO_dynlock_value* CRYPTO_get_dynlock_value(int i);
|
||||
|
||||
/* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions --
|
||||
* call the latter last if you need different functions */
|
||||
int CRYPTO_set_mem_functions(ExternC!(void* function(size_t)) m,ExternC!(void* function(void*,size_t)) r, ExternC!(void function(void*)) f);
|
||||
int CRYPTO_set_locked_mem_functions(ExternC!(void* function(size_t)) m, ExternC!(void function(void*)) free_func);
|
||||
int CRYPTO_set_mem_ex_functions(ExternC!(void* function(size_t,const(char)*,int)) m,
|
||||
ExternC!(void* function(void*,size_t,const(char)*,int)) r,
|
||||
ExternC!(void function(void*)) f);
|
||||
int CRYPTO_set_locked_mem_ex_functions(ExternC!(void* function(size_t,const(char)*,int)) m,
|
||||
ExternC!(void function(void*)) free_func);
|
||||
int CRYPTO_set_mem_debug_functions(ExternC!(void function(void*,int,const(char)*,int,int)) m,
|
||||
ExternC!(void function(void*,void*,int,const(char)*,int,int)) r,
|
||||
ExternC!(void function(void*,int)) f,
|
||||
ExternC!(void function(c_long)) so,
|
||||
ExternC!(c_long function()) go);
|
||||
void CRYPTO_get_mem_functions(ExternC!(void* function(size_t))* m,ExternC!(void* function(void*, size_t))* r, ExternC!(void function(void*))* f);
|
||||
void CRYPTO_get_locked_mem_functions(ExternC!(void* function(size_t))* m, ExternC!(void function(void*))* f);
|
||||
void CRYPTO_get_mem_ex_functions(ExternC!(void* function(size_t,const(char)*,int))* m,
|
||||
ExternC!(void* function(void*, size_t,const(char)*,int))* r,
|
||||
ExternC!(void function(void*))* f);
|
||||
void CRYPTO_get_locked_mem_ex_functions(ExternC!(void* function(size_t,const(char)*,int))* m,
|
||||
ExternC!(void function(void*))* f);
|
||||
void CRYPTO_get_mem_debug_functions(ExternC!(void function(void*,int,const(char)*,int,int))* m,
|
||||
ExternC!(void function(void*,void*,int,const(char)*,int,int))* r,
|
||||
ExternC!(void function(void*,int))* f,
|
||||
ExternC!(void function(c_long))* so,
|
||||
ExternC!(c_long function())* go);
|
||||
|
||||
void* CRYPTO_malloc_locked(int num, const(char)* file, int line);
|
||||
void CRYPTO_free_locked(void* ptr);
|
||||
void* CRYPTO_malloc(int num, const(char)* file, int line);
|
||||
char* CRYPTO_strdup(const(char)* str, const(char)* file, int line);
|
||||
void CRYPTO_free(void* ptr);
|
||||
void* CRYPTO_realloc(void* addr,int num, const(char)* file, int line);
|
||||
void* CRYPTO_realloc_clean(void* addr,int old_num,int num,const(char)* file,
|
||||
int line);
|
||||
void* CRYPTO_remalloc(void* addr,int num, const(char)* file, int line);
|
||||
|
||||
void OPENSSL_cleanse(void* ptr, size_t len);
|
||||
|
||||
void CRYPTO_set_mem_debug_options(c_long bits);
|
||||
c_long CRYPTO_get_mem_debug_options();
|
||||
|
||||
auto CRYPTO_push_info(string file = __FILE__, size_t line = __LINE__)(const(char)* info) {
|
||||
return CRYPTO_push_info_(info, file.ptr, line);
|
||||
}
|
||||
int CRYPTO_push_info_(const(char)* info, const(char)* file, int line);
|
||||
int CRYPTO_pop_info();
|
||||
int CRYPTO_remove_all_info();
|
||||
|
||||
|
||||
/* Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro;
|
||||
* used as default in CRYPTO_MDEBUG compilations): */
|
||||
/* The last argument has the following significance:
|
||||
*
|
||||
* 0: called before the actual memory allocation has taken place
|
||||
* 1: called after the actual memory allocation has taken place
|
||||
*/
|
||||
void CRYPTO_dbg_malloc(void* addr,int num,const(char)* file,int line,int before_p);
|
||||
void CRYPTO_dbg_realloc(void* addr1,void* addr2,int num,const(char)* file,int line,int before_p);
|
||||
void CRYPTO_dbg_free(void* addr,int before_p);
|
||||
/* Tell the debugging code about options. By default, the following values
|
||||
* apply:
|
||||
*
|
||||
* 0: Clear all options.
|
||||
* V_CRYPTO_MDEBUG_TIME (1): Set the "Show Time" option.
|
||||
* V_CRYPTO_MDEBUG_THREAD (2): Set the "Show Thread Number" option.
|
||||
* V_CRYPTO_MDEBUG_ALL (3): 1 + 2
|
||||
*/
|
||||
void CRYPTO_dbg_set_options(c_long bits);
|
||||
c_long CRYPTO_dbg_get_options();
|
||||
|
||||
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
void CRYPTO_mem_leaks_fp(FILE*);
|
||||
}
|
||||
void CRYPTO_mem_leaks(bio_st* bio);
|
||||
/* c_ulong order, char* file, int line, int num_bytes, char* addr */
|
||||
alias typeof(*(void* function (c_ulong, const(char)*, int, int, void*)).init) CRYPTO_MEM_LEAK_CB;
|
||||
void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB* cb);
|
||||
|
||||
/* die if we have to */
|
||||
void OpenSSLDie(const(char)* file,int line,const(char)* assertion);
|
||||
void OPENSSL_assert(string file = __FILE__, size_t line = __LINE__)(int e) {
|
||||
if (!e) OpenSSLDie(file.ptr, line, "assertion failed"); // No good way to translate.
|
||||
}
|
||||
|
||||
c_ulong* OPENSSL_ia32cap_loc();
|
||||
auto OPENSSL_ia32cap()(){ return* OPENSSL_ia32cap_loc(); }
|
||||
int OPENSSL_isservice();
|
||||
|
||||
int FIPS_mode();
|
||||
int FIPS_mode_set(int r);
|
||||
|
||||
void OPENSSL_init();
|
||||
|
||||
/+ // TODO: only needed for implementation
|
||||
#define fips_md_init(alg) fips_md_init_ctx(alg, alg)
|
||||
|
||||
#ifdef OPENSSL_FIPS
|
||||
#define fips_md_init_ctx(alg, cx) \
|
||||
int alg##_Init(cx##_CTX *c) \
|
||||
{ \
|
||||
if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \
|
||||
"Low level API call to digest " #alg " forbidden in FIPS mode!"); \
|
||||
return private_##alg##_Init(c); \
|
||||
} \
|
||||
int private_##alg##_Init(cx##_CTX *c)
|
||||
|
||||
#define fips_cipher_abort(alg) \
|
||||
if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \
|
||||
"Low level API call to cipher " #alg " forbidden in FIPS mode!")
|
||||
|
||||
#else
|
||||
#define fips_md_init_ctx(alg, cx) \
|
||||
int alg##_Init(cx##_CTX *c)
|
||||
#define fips_cipher_abort(alg) while(0)
|
||||
#endif
|
||||
+/
|
||||
|
||||
/* CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It
|
||||
* takes an amount of time dependent on |len|, but independent of the contents
|
||||
* of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a
|
||||
* defined order as the return value when a != b is undefined, other than to be
|
||||
* non-zero. */
|
||||
int CRYPTO_memcmp(const(void)* a, const(void)* b, size_t len);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_CRYPTO_strings();
|
||||
|
||||
/* Error codes for the CRYPTO functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX = 100;
|
||||
enum CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID = 103;
|
||||
enum CRYPTO_F_CRYPTO_GET_NEW_LOCKID = 101;
|
||||
enum CRYPTO_F_CRYPTO_SET_EX_DATA = 102;
|
||||
enum CRYPTO_F_DEF_ADD_INDEX = 104;
|
||||
enum CRYPTO_F_DEF_GET_CLASS = 105;
|
||||
enum CRYPTO_F_FIPS_MODE_SET = 109;
|
||||
enum CRYPTO_F_INT_DUP_EX_DATA = 106;
|
||||
enum CRYPTO_F_INT_FREE_EX_DATA = 107;
|
||||
enum CRYPTO_F_INT_NEW_EX_DATA = 108;
|
||||
|
||||
/* Reason codes. */
|
||||
enum CRYPTO_R_FIPS_MODE_NOT_SUPPORTED = 101;
|
||||
enum CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK = 100;
|
|
@ -0,0 +1,236 @@
|
|||
/* crypto/des/des.h */
|
||||
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.des;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2; /* OPENSSL_EXTERN, OPENSSL_NO_DES,
|
||||
DES_LONG (via openssl/opensslconf.h */
|
||||
|
||||
version (OPENSSL_NO_DES) {
|
||||
static assert(false, "DES is disabled.");
|
||||
}
|
||||
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
alias ubyte[8] DES_cblock;
|
||||
alias ubyte[8] const_DES_cblock;
|
||||
/* With "const", gcc 2.8.1 on Solaris thinks that DES_cblock*
|
||||
* and const_DES_cblock* are incompatible pointer types. */
|
||||
|
||||
struct DES_ks
|
||||
{
|
||||
union ks_
|
||||
{
|
||||
DES_cblock cblock;
|
||||
/* make sure things are correct size on machines with
|
||||
* 8 byte longs */
|
||||
DES_LONG[2] deslong;
|
||||
}
|
||||
ks_[16] ks;
|
||||
}
|
||||
alias DES_ks DES_key_schedule;
|
||||
|
||||
// #ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT
|
||||
// # ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT
|
||||
// # define OPENSSL_ENABLE_OLD_DES_SUPPORT
|
||||
// # endif
|
||||
// #endif
|
||||
|
||||
version (OPENSSL_ENABLE_OLD_DES_SUPPORT) {
|
||||
public import deimos.openssl.des_old;
|
||||
}
|
||||
|
||||
enum DES_KEY_SZ = DES_cblock.sizeof;
|
||||
enum DES_SCHEDULE_SZ = DES_key_schedule.sizeof;
|
||||
|
||||
enum DES_ENCRYPT = 1;
|
||||
enum DES_DECRYPT = 0;
|
||||
|
||||
enum DES_CBC_MODE = 0;
|
||||
enum DES_PCBC_MODE = 1;
|
||||
|
||||
alias DES_ecb3_encrypt DES_ecb2_encrypt;
|
||||
|
||||
alias DES_ede3_cbc_encrypt DES_ede2_cbc_encrypt;
|
||||
|
||||
alias DES_ede3_cfb64_encrypt DES_ede2_cfb64_encrypt;
|
||||
|
||||
alias DES_ede3_ofb64_encrypt DES_ede2_ofb64_encrypt;
|
||||
|
||||
extern int _shadow_DES_check_key; /* defaults to false */
|
||||
alias _shadow_DES_check_key DES_check_key;
|
||||
extern int _shadow_DES_rw_mode; /* defaults to DES_PCBC_MODE */
|
||||
alias _shadow_DES_rw_mode DES_rw_mode;
|
||||
|
||||
const(char)* DES_options();
|
||||
void DES_ecb3_encrypt(const_DES_cblock* input, DES_cblock* output,
|
||||
DES_key_schedule* ks1,DES_key_schedule* ks2,
|
||||
DES_key_schedule* ks3, int enc);
|
||||
DES_LONG DES_cbc_cksum(const(ubyte)* input,DES_cblock* output,
|
||||
c_long length,DES_key_schedule* schedule,
|
||||
const_DES_cblock* ivec);
|
||||
/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */
|
||||
void DES_cbc_encrypt(const(ubyte)* input,ubyte* output,
|
||||
c_long length,DES_key_schedule* schedule,DES_cblock* ivec,
|
||||
int enc);
|
||||
void DES_ncbc_encrypt(const(ubyte)* input,ubyte* output,
|
||||
c_long length,DES_key_schedule* schedule,DES_cblock* ivec,
|
||||
int enc);
|
||||
void DES_xcbc_encrypt(const(ubyte)* input,ubyte* output,
|
||||
c_long length,DES_key_schedule* schedule,DES_cblock* ivec,
|
||||
const_DES_cblock* inw,const_DES_cblock* outw,int enc);
|
||||
void DES_cfb_encrypt(const(ubyte)* in_,ubyte* out_,int numbits,
|
||||
c_long length,DES_key_schedule* schedule,DES_cblock* ivec,
|
||||
int enc);
|
||||
void DES_ecb_encrypt(const_DES_cblock* input,DES_cblock* output,
|
||||
DES_key_schedule* ks,int enc);
|
||||
|
||||
/* This is the DES encryption function that gets called by just about
|
||||
every other DES routine in the library. You should not use this
|
||||
function except to implement 'modes' of DES. I say this because the
|
||||
functions that call this routine do the conversion from 'char* ' to
|
||||
c_long, and this needs to be done to make sure 'non-aligned' memory
|
||||
access do not occur. The characters are loaded 'little endian'.
|
||||
Data is a pointer to 2 c_ulong's and ks is the
|
||||
DES_key_schedule to use. enc, is non zero specifies encryption,
|
||||
zero if decryption. */
|
||||
void DES_encrypt1(DES_LONG* data,DES_key_schedule* ks, int enc);
|
||||
|
||||
/* This functions is the same as DES_encrypt1() except that the DES
|
||||
initial permutation (IP) and final permutation (FP) have been left
|
||||
out. As for DES_encrypt1(), you should not use this function.
|
||||
It is used by the routines in the library that implement triple DES.
|
||||
IP() DES_encrypt2() DES_encrypt2() DES_encrypt2() FP() is the same
|
||||
as DES_encrypt1() DES_encrypt1() DES_encrypt1() except faster :-). */
|
||||
void DES_encrypt2(DES_LONG* data,DES_key_schedule* ks, int enc);
|
||||
|
||||
void DES_encrypt3(DES_LONG* data, DES_key_schedule* ks1,
|
||||
DES_key_schedule* ks2, DES_key_schedule* ks3);
|
||||
void DES_decrypt3(DES_LONG* data, DES_key_schedule* ks1,
|
||||
DES_key_schedule* ks2, DES_key_schedule* ks3);
|
||||
void DES_ede3_cbc_encrypt(const(ubyte)* input,ubyte* output,
|
||||
c_long length,
|
||||
DES_key_schedule* ks1,DES_key_schedule* ks2,
|
||||
DES_key_schedule* ks3,DES_cblock* ivec,int enc);
|
||||
void DES_ede3_cbcm_encrypt(const(ubyte)* in_,ubyte* out_,
|
||||
c_long length,
|
||||
DES_key_schedule* ks1,DES_key_schedule* ks2,
|
||||
DES_key_schedule* ks3,
|
||||
DES_cblock* ivec1,DES_cblock* ivec2,
|
||||
int enc);
|
||||
void DES_ede3_cfb64_encrypt(const(ubyte)* in_,ubyte* out_,
|
||||
c_long length,DES_key_schedule* ks1,
|
||||
DES_key_schedule* ks2,DES_key_schedule* ks3,
|
||||
DES_cblock* ivec,int* num,int enc);
|
||||
void DES_ede3_cfb_encrypt(const(ubyte)* in_,ubyte* out_,
|
||||
int numbits,c_long length,DES_key_schedule* ks1,
|
||||
DES_key_schedule* ks2,DES_key_schedule* ks3,
|
||||
DES_cblock* ivec,int enc);
|
||||
void DES_ede3_ofb64_encrypt(const(ubyte)* in_,ubyte* out_,
|
||||
c_long length,DES_key_schedule* ks1,
|
||||
DES_key_schedule* ks2,DES_key_schedule* ks3,
|
||||
DES_cblock* ivec,int* num);
|
||||
version (none) {
|
||||
void DES_xwhite_in2out(const_DES_cblock* DES_key,const_DES_cblock* in_white,
|
||||
DES_cblock* out_white);
|
||||
}
|
||||
|
||||
int DES_enc_read(int fd,void* buf,int len,DES_key_schedule* sched,
|
||||
DES_cblock* iv);
|
||||
int DES_enc_write(int fd,const(void)* buf,int len,DES_key_schedule* sched,
|
||||
DES_cblock* iv);
|
||||
char* DES_fcrypt(const(char)* buf,const(char)* salt, char* ret);
|
||||
char* DES_crypt(const(char)* buf,const(char)* salt);
|
||||
void DES_ofb_encrypt(const(ubyte)* in_,ubyte* out_,int numbits,
|
||||
c_long length,DES_key_schedule* schedule,DES_cblock* ivec);
|
||||
void DES_pcbc_encrypt(const(ubyte)* input,ubyte* output,
|
||||
c_long length,DES_key_schedule* schedule,DES_cblock* ivec,
|
||||
int enc);
|
||||
DES_LONG DES_quad_cksum(const(ubyte)* input,DES_cblock[] output,
|
||||
c_long length,int out_count,DES_cblock* seed);
|
||||
int DES_random_key(DES_cblock* ret);
|
||||
void DES_set_odd_parity(DES_cblock* key);
|
||||
int DES_check_key_parity(const_DES_cblock* key);
|
||||
int DES_is_weak_key(const_DES_cblock* key);
|
||||
/* DES_set_key (= set_key = DES_key_sched = key_sched) calls
|
||||
* DES_set_key_checked if global variable DES_check_key is set,
|
||||
* DES_set_key_unchecked otherwise. */
|
||||
int DES_set_key(const_DES_cblock* key,DES_key_schedule* schedule);
|
||||
int DES_key_sched(const_DES_cblock* key,DES_key_schedule* schedule);
|
||||
int DES_set_key_checked(const_DES_cblock* key,DES_key_schedule* schedule);
|
||||
void DES_set_key_unchecked(const_DES_cblock* key,DES_key_schedule* schedule);
|
||||
version(OPENSSL_FIPS) {
|
||||
void private_DES_set_key_unchecked(const_DES_cblock* key,DES_key_schedule* schedule);
|
||||
}
|
||||
void DES_string_to_key(const(char)* str,DES_cblock* key);
|
||||
void DES_string_to_2keys(const(char)* str,DES_cblock* key1,DES_cblock* key2);
|
||||
void DES_cfb64_encrypt(const(ubyte)* in_,ubyte* out_,c_long length,
|
||||
DES_key_schedule* schedule,DES_cblock* ivec,int* num,
|
||||
int enc);
|
||||
void DES_ofb64_encrypt(const(ubyte)* in_,ubyte* out_,c_long length,
|
||||
DES_key_schedule* schedule,DES_cblock* ivec,int* num);
|
||||
|
||||
int DES_read_password(DES_cblock* key, const(char)* prompt, int verify);
|
||||
int DES_read_2passwords(DES_cblock* key1, DES_cblock* key2, const(char)* prompt,
|
||||
int verify);
|
||||
|
||||
alias DES_set_odd_parity DES_fixup_key_parity;
|
|
@ -0,0 +1,440 @@
|
|||
/* crypto/des/des_old.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
|
||||
/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||||
*
|
||||
* The function names in here are deprecated and are only present to
|
||||
* provide an interface compatible with openssl 0.9.6 and older as
|
||||
* well as libdes. OpenSSL now provides functions where "des_" has
|
||||
* been replaced with "DES_" in the names, to make it possible to
|
||||
* make incompatible changes that are needed for C type security and
|
||||
* other stuff.
|
||||
*
|
||||
* This include files has two compatibility modes:
|
||||
*
|
||||
* - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API
|
||||
* that is compatible with libdes and SSLeay.
|
||||
* - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an
|
||||
* API that is compatible with OpenSSL 0.9.5x to 0.9.6x.
|
||||
*
|
||||
* Note that these modes break earlier snapshots of OpenSSL, where
|
||||
* libdes compatibility was the only available mode or (later on) the
|
||||
* prefered compatibility mode. However, after much consideration
|
||||
* (and more or less violent discussions with external parties), it
|
||||
* was concluded that OpenSSL should be compatible with earlier versions
|
||||
* of itself before anything else. Also, in all honesty, libdes is
|
||||
* an old beast that shouldn't really be used any more.
|
||||
*
|
||||
* Please consider starting to use the DES_ functions rather than the
|
||||
* des_ ones. The des_ functions will disappear completely before
|
||||
* OpenSSL 1.0!
|
||||
*
|
||||
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||||
*/
|
||||
|
||||
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
|
||||
* project 2001.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2002 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
module deimos.openssl.des;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2; /* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */
|
||||
|
||||
version (OPENSSL_NO_DES) {
|
||||
static assert(false, "DES is disabled.");
|
||||
}
|
||||
|
||||
#ifndef HEADER_NEW_DES_H
|
||||
#error You must include des.h, not des_old.h directly.
|
||||
#endif
|
||||
|
||||
#ifdef _KERBEROS_DES_H
|
||||
#error <openssl/des_old.h> replaces <kerberos/des.h>.
|
||||
#endif
|
||||
|
||||
public import deimos.openssl.symhacks;
|
||||
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
#ifdef _
|
||||
#undef _
|
||||
#endif
|
||||
|
||||
typedef ubyte _ossl_old_des_cblock[8];
|
||||
typedef struct _ossl_old_des_ks_struct
|
||||
{
|
||||
union {
|
||||
_ossl_old_des_cblock _;
|
||||
/* make sure things are correct size on machines with
|
||||
* 8 byte longs */
|
||||
DES_LONG pad[2];
|
||||
} ks;
|
||||
} _ossl_old_des_key_schedule[16];
|
||||
|
||||
#ifndef OPENSSL_DES_LIBDES_COMPATIBILITY
|
||||
alias DES_cblock des_cblock;
|
||||
alias const_DES_cblock const_des_cblock;
|
||||
alias DES_key_schedule des_key_schedule;
|
||||
#define des_ecb3_encrypt(i,o,k1,k2,k3,e)\
|
||||
DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e))
|
||||
#define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\
|
||||
DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e))
|
||||
#define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\
|
||||
DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e))
|
||||
#define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\
|
||||
DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e))
|
||||
#define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\
|
||||
DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n))
|
||||
#define des_options()\
|
||||
DES_options()
|
||||
#define des_cbc_cksum(i,o,l,k,iv)\
|
||||
DES_cbc_cksum((i),(o),(l),&(k),(iv))
|
||||
#define des_cbc_encrypt(i,o,l,k,iv,e)\
|
||||
DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e))
|
||||
#define des_ncbc_encrypt(i,o,l,k,iv,e)\
|
||||
DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e))
|
||||
#define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\
|
||||
DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e))
|
||||
#define des_cfb_encrypt(i,o,n,l,k,iv,e)\
|
||||
DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e))
|
||||
#define des_ecb_encrypt(i,o,k,e)\
|
||||
DES_ecb_encrypt((i),(o),&(k),(e))
|
||||
#define des_encrypt1(d,k,e)\
|
||||
DES_encrypt1((d),&(k),(e))
|
||||
#define des_encrypt2(d,k,e)\
|
||||
DES_encrypt2((d),&(k),(e))
|
||||
#define des_encrypt3(d,k1,k2,k3)\
|
||||
DES_encrypt3((d),&(k1),&(k2),&(k3))
|
||||
#define des_decrypt3(d,k1,k2,k3)\
|
||||
DES_decrypt3((d),&(k1),&(k2),&(k3))
|
||||
#define des_xwhite_in2out(k,i,o)\
|
||||
DES_xwhite_in2out((k),(i),(o))
|
||||
#define des_enc_read(f,b,l,k,iv)\
|
||||
DES_enc_read((f),(b),(l),&(k),(iv))
|
||||
#define des_enc_write(f,b,l,k,iv)\
|
||||
DES_enc_write((f),(b),(l),&(k),(iv))
|
||||
#define des_fcrypt(b,s,r)\
|
||||
DES_fcrypt((b),(s),(r))
|
||||
#if 0
|
||||
#define des_crypt(b,s)\
|
||||
DES_crypt((b),(s))
|
||||
#if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__)
|
||||
#define crypt(b,s)\
|
||||
DES_crypt((b),(s))
|
||||
#endif
|
||||
#endif
|
||||
#define des_ofb_encrypt(i,o,n,l,k,iv)\
|
||||
DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv))
|
||||
#define des_pcbc_encrypt(i,o,l,k,iv,e)\
|
||||
DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e))
|
||||
#define des_quad_cksum(i,o,l,c,s)\
|
||||
DES_quad_cksum((i),(o),(l),(c),(s))
|
||||
#define des_random_seed(k)\
|
||||
_ossl_096_des_random_seed((k))
|
||||
#define des_random_key(r)\
|
||||
DES_random_key((r))
|
||||
#define des_read_password(k,p,v) \
|
||||
DES_read_password((k),(p),(v))
|
||||
#define des_read_2passwords(k1,k2,p,v) \
|
||||
DES_read_2passwords((k1),(k2),(p),(v))
|
||||
#define des_set_odd_parity(k)\
|
||||
DES_set_odd_parity((k))
|
||||
#define des_check_key_parity(k)\
|
||||
DES_check_key_parity((k))
|
||||
#define des_is_weak_key(k)\
|
||||
DES_is_weak_key((k))
|
||||
#define des_set_key(k,ks)\
|
||||
DES_set_key((k),&(ks))
|
||||
#define des_key_sched(k,ks)\
|
||||
DES_key_sched((k),&(ks))
|
||||
#define des_set_key_checked(k,ks)\
|
||||
DES_set_key_checked((k),&(ks))
|
||||
#define des_set_key_unchecked(k,ks)\
|
||||
DES_set_key_unchecked((k),&(ks))
|
||||
#define des_string_to_key(s,k)\
|
||||
DES_string_to_key((s),(k))
|
||||
#define des_string_to_2keys(s,k1,k2)\
|
||||
DES_string_to_2keys((s),(k1),(k2))
|
||||
#define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\
|
||||
DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e))
|
||||
#define des_ofb64_encrypt(i,o,l,ks,iv,n)\
|
||||
DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n))
|
||||
|
||||
|
||||
#define des_ecb2_encrypt(i,o,k1,k2,e) \
|
||||
des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))
|
||||
|
||||
#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
|
||||
des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))
|
||||
|
||||
#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
|
||||
des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))
|
||||
|
||||
#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
|
||||
des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
|
||||
|
||||
alias DES_check_key des_check_key;
|
||||
alias DES_rw_mode des_rw_mode;
|
||||
#else /* libdes compatibility */
|
||||
/* Map all symbol names to _ossl_old_des_* form, so we avoid all
|
||||
clashes with libdes */
|
||||
alias _ossl_old_des_cblock des_cblock;
|
||||
alias _ossl_old_des_key_schedule des_key_schedule;
|
||||
#define des_ecb3_encrypt(i,o,k1,k2,k3,e)\
|
||||
_ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e))
|
||||
#define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\
|
||||
_ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e))
|
||||
#define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\
|
||||
_ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e))
|
||||
#define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\
|
||||
_ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n))
|
||||
#define des_options()\
|
||||
_ossl_old_des_options()
|
||||
#define des_cbc_cksum(i,o,l,k,iv)\
|
||||
_ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv))
|
||||
#define des_cbc_encrypt(i,o,l,k,iv,e)\
|
||||
_ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e))
|
||||
#define des_ncbc_encrypt(i,o,l,k,iv,e)\
|
||||
_ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e))
|
||||
#define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\
|
||||
_ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e))
|
||||
#define des_cfb_encrypt(i,o,n,l,k,iv,e)\
|
||||
_ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e))
|
||||
#define des_ecb_encrypt(i,o,k,e)\
|
||||
_ossl_old_des_ecb_encrypt((i),(o),(k),(e))
|
||||
#define des_encrypt(d,k,e)\
|
||||
_ossl_old_des_encrypt((d),(k),(e))
|
||||
#define des_encrypt2(d,k,e)\
|
||||
_ossl_old_des_encrypt2((d),(k),(e))
|
||||
#define des_encrypt3(d,k1,k2,k3)\
|
||||
_ossl_old_des_encrypt3((d),(k1),(k2),(k3))
|
||||
#define des_decrypt3(d,k1,k2,k3)\
|
||||
_ossl_old_des_decrypt3((d),(k1),(k2),(k3))
|
||||
#define des_xwhite_in2out(k,i,o)\
|
||||
_ossl_old_des_xwhite_in2out((k),(i),(o))
|
||||
#define des_enc_read(f,b,l,k,iv)\
|
||||
_ossl_old_des_enc_read((f),(b),(l),(k),(iv))
|
||||
#define des_enc_write(f,b,l,k,iv)\
|
||||
_ossl_old_des_enc_write((f),(b),(l),(k),(iv))
|
||||
#define des_fcrypt(b,s,r)\
|
||||
_ossl_old_des_fcrypt((b),(s),(r))
|
||||
#define des_crypt(b,s)\
|
||||
_ossl_old_des_crypt((b),(s))
|
||||
#if 0
|
||||
#define crypt(b,s)\
|
||||
_ossl_old_crypt((b),(s))
|
||||
#endif
|
||||
#define des_ofb_encrypt(i,o,n,l,k,iv)\
|
||||
_ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv))
|
||||
#define des_pcbc_encrypt(i,o,l,k,iv,e)\
|
||||
_ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e))
|
||||
#define des_quad_cksum(i,o,l,c,s)\
|
||||
_ossl_old_des_quad_cksum((i),(o),(l),(c),(s))
|
||||
#define des_random_seed(k)\
|
||||
_ossl_old_des_random_seed((k))
|
||||
#define des_random_key(r)\
|
||||
_ossl_old_des_random_key((r))
|
||||
#define des_read_password(k,p,v) \
|
||||
_ossl_old_des_read_password((k),(p),(v))
|
||||
#define des_read_2passwords(k1,k2,p,v) \
|
||||
_ossl_old_des_read_2passwords((k1),(k2),(p),(v))
|
||||
#define des_set_odd_parity(k)\
|
||||
_ossl_old_des_set_odd_parity((k))
|
||||
#define des_is_weak_key(k)\
|
||||
_ossl_old_des_is_weak_key((k))
|
||||
#define des_set_key(k,ks)\
|
||||
_ossl_old_des_set_key((k),(ks))
|
||||
#define des_key_sched(k,ks)\
|
||||
_ossl_old_des_key_sched((k),(ks))
|
||||
#define des_string_to_key(s,k)\
|
||||
_ossl_old_des_string_to_key((s),(k))
|
||||
#define des_string_to_2keys(s,k1,k2)\
|
||||
_ossl_old_des_string_to_2keys((s),(k1),(k2))
|
||||
#define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\
|
||||
_ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e))
|
||||
#define des_ofb64_encrypt(i,o,l,ks,iv,n)\
|
||||
_ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n))
|
||||
|
||||
|
||||
#define des_ecb2_encrypt(i,o,k1,k2,e) \
|
||||
des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))
|
||||
|
||||
#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
|
||||
des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))
|
||||
|
||||
#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
|
||||
des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))
|
||||
|
||||
#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
|
||||
des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
|
||||
|
||||
alias DES_check_key des_check_key;
|
||||
alias DES_rw_mode des_rw_mode;
|
||||
#endif
|
||||
|
||||
const(char)* _ossl_old_des_options();
|
||||
void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,
|
||||
_ossl_old_des_key_schedule ks1,_ossl_old_des_key_schedule ks2,
|
||||
_ossl_old_des_key_schedule ks3, int enc);
|
||||
DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,
|
||||
c_long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec);
|
||||
void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,c_long length,
|
||||
_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec,int enc);
|
||||
void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,c_long length,
|
||||
_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec,int enc);
|
||||
void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,c_long length,
|
||||
_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec,
|
||||
_ossl_old_des_cblock* inw,_ossl_old_des_cblock* outw,int enc);
|
||||
void _ossl_old_des_cfb_encrypt(ubyte* in_,ubyte* out_,int numbits,
|
||||
c_long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec,int enc);
|
||||
void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,
|
||||
_ossl_old_des_key_schedule ks,int enc);
|
||||
void _ossl_old_des_encrypt(DES_LONG* data,_ossl_old_des_key_schedule ks, int enc);
|
||||
void _ossl_old_des_encrypt2(DES_LONG* data,_ossl_old_des_key_schedule ks, int enc);
|
||||
void _ossl_old_des_encrypt3(DES_LONG* data, _ossl_old_des_key_schedule ks1,
|
||||
_ossl_old_des_key_schedule ks2, _ossl_old_des_key_schedule ks3);
|
||||
void _ossl_old_des_decrypt3(DES_LONG* data, _ossl_old_des_key_schedule ks1,
|
||||
_ossl_old_des_key_schedule ks2, _ossl_old_des_key_schedule ks3);
|
||||
void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock* input, _ossl_old_des_cblock* output,
|
||||
c_long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2,
|
||||
_ossl_old_des_key_schedule ks3, _ossl_old_des_cblock* ivec, int enc);
|
||||
void _ossl_old_des_ede3_cfb64_encrypt(ubyte* in_, ubyte* out_,
|
||||
c_long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2,
|
||||
_ossl_old_des_key_schedule ks3, _ossl_old_des_cblock* ivec, int* num, int enc);
|
||||
void _ossl_old_des_ede3_ofb64_encrypt(ubyte* in_, ubyte* out_,
|
||||
c_long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2,
|
||||
_ossl_old_des_key_schedule ks3, _ossl_old_des_cblock* ivec, int* num);
|
||||
#if 0
|
||||
void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), _ossl_old_des_cblock (*in_white),
|
||||
_ossl_old_des_cblock (*out_white));
|
||||
#endif
|
||||
|
||||
int _ossl_old_des_enc_read(int fd,char* buf,int len,_ossl_old_des_key_schedule sched,
|
||||
_ossl_old_des_cblock* iv);
|
||||
int _ossl_old_des_enc_write(int fd,char* buf,int len,_ossl_old_des_key_schedule sched,
|
||||
_ossl_old_des_cblock* iv);
|
||||
char* _ossl_old_des_fcrypt(const(char)* buf,const(char)* salt, char* ret);
|
||||
char* _ossl_old_des_crypt(const(char)* buf,const(char)* salt);
|
||||
#if !defined(PERL5) && !defined(NeXT)
|
||||
char* _ossl_old_crypt(const(char)* buf,const(char)* salt);
|
||||
#endif
|
||||
void _ossl_old_des_ofb_encrypt(ubyte* in_,ubyte* out_,
|
||||
int numbits,c_long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec);
|
||||
void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,c_long length,
|
||||
_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock* ivec,int enc);
|
||||
DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock* input,_ossl_old_des_cblock* output,
|
||||
c_long length,int out_count,_ossl_old_des_cblock* seed);
|
||||
void _ossl_old_des_random_seed(_ossl_old_des_cblock key);
|
||||
void _ossl_old_des_random_key(_ossl_old_des_cblock ret);
|
||||
int _ossl_old_des_read_password(_ossl_old_des_cblock* key,const(char)* prompt,int verify);
|
||||
int _ossl_old_des_read_2passwords(_ossl_old_des_cblock* key1,_ossl_old_des_cblock* key2,
|
||||
const(char)* prompt,int verify);
|
||||
void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock* key);
|
||||
int _ossl_old_des_is_weak_key(_ossl_old_des_cblock* key);
|
||||
int _ossl_old_des_set_key(_ossl_old_des_cblock* key,_ossl_old_des_key_schedule schedule);
|
||||
int _ossl_old_des_key_sched(_ossl_old_des_cblock* key,_ossl_old_des_key_schedule schedule);
|
||||
void _ossl_old_des_string_to_key(char* str,_ossl_old_des_cblock* key);
|
||||
void _ossl_old_des_string_to_2keys(char* str,_ossl_old_des_cblock* key1,_ossl_old_des_cblock* key2);
|
||||
void _ossl_old_des_cfb64_encrypt(ubyte* in_, ubyte* out_, c_long length,
|
||||
_ossl_old_des_key_schedule schedule, _ossl_old_des_cblock* ivec, int* num, int enc);
|
||||
void _ossl_old_des_ofb64_encrypt(ubyte* in_, ubyte* out_, c_long length,
|
||||
_ossl_old_des_key_schedule schedule, _ossl_old_des_cblock* ivec, int* num);
|
||||
|
||||
void _ossl_096_des_random_seed(des_cblock* key);
|
||||
|
||||
/* The following definitions provide compatibility with the MIT Kerberos
|
||||
* library. The _ossl_old_des_key_schedule structure is not binary compatible. */
|
||||
|
||||
#define _KERBEROS_DES_H
|
||||
|
||||
alias DES_ENCRYPT KRBDES_ENCRYPT;
|
||||
alias DES_DECRYPT KRBDES_DECRYPT;
|
||||
|
||||
#ifdef KERBEROS
|
||||
# define ENCRYPT DES_ENCRYPT
|
||||
# define DECRYPT DES_DECRYPT
|
||||
#endif
|
||||
|
||||
#ifndef NCOMPAT
|
||||
# define C_Block des_cblock
|
||||
# define Key_schedule des_key_schedule
|
||||
# define KEY_SZ DES_KEY_SZ
|
||||
# define string_to_key des_string_to_key
|
||||
# define read_pw_string des_read_pw_string
|
||||
# define random_key des_random_key
|
||||
# define pcbc_encrypt des_pcbc_encrypt
|
||||
# define set_key des_set_key
|
||||
# define key_sched des_key_sched
|
||||
# define ecb_encrypt des_ecb_encrypt
|
||||
# define cbc_encrypt des_cbc_encrypt
|
||||
# define ncbc_encrypt des_ncbc_encrypt
|
||||
# define xcbc_encrypt des_xcbc_encrypt
|
||||
# define cbc_cksum des_cbc_cksum
|
||||
# define quad_cksum des_quad_cksum
|
||||
# define check_parity des_check_key_parity
|
||||
#endif
|
||||
|
||||
alias DES_fixup_key_parity des_fixup_key_parity;
|
||||
|
||||
/* for DES_read_pw_string et al */
|
||||
public import deimos.openssl.ui_compat;
|
||||
|
||||
#endif
|
||||
+/
|
|
@ -0,0 +1,280 @@
|
|||
/* crypto/dh/dh.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.dh;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.evp; // Needed for EVP_PKEY_ALG_CTRL.
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version (OPENSSL_NO_DH) {
|
||||
static assert(false, "DH is disabled.");
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
public import deimos.openssl.ossl_typ;
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.bn;
|
||||
}
|
||||
|
||||
// #ifndef OPENSSL_DH_MAX_MODULUS_BITS
|
||||
enum OPENSSL_DH_MAX_MODULUS_BITS = 10000;
|
||||
// #endif
|
||||
|
||||
enum DH_FLAG_CACHE_MONT_P = 0x01;
|
||||
enum DH_FLAG_NO_EXP_CONSTTIME = 0x02; /* new with 0.9.7h; the built-in DH
|
||||
* implementation now uses constant time
|
||||
* modular exponentiation for secret exponents
|
||||
* by default. This flag causes the
|
||||
* faster variable sliding window method to
|
||||
* be used for all exponents.
|
||||
*/
|
||||
|
||||
/* If this flag is set the DH method is FIPS compliant and can be used
|
||||
* in FIPS mode. This is set in the validated module method. If an
|
||||
* application sets this flag in its own methods it is its reposibility
|
||||
* to ensure the result is compliant.
|
||||
*/
|
||||
|
||||
enum DH_FLAG_FIPS_METHOD = 0x0400;
|
||||
|
||||
/* If this flag is set the operations normally disabled in FIPS mode are
|
||||
* permitted it is then the applications responsibility to ensure that the
|
||||
* usage is compliant.
|
||||
*/
|
||||
|
||||
enum DH_FLAG_NON_FIPS_ALLOW = 0x0400;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Already defined in ossl_typ.h */
|
||||
/* typedef dh_st DH; */
|
||||
/* typedef dh_method DH_METHOD; */
|
||||
|
||||
struct dh_method
|
||||
{
|
||||
const(char)* name;
|
||||
/* Methods here */
|
||||
ExternC!(int function(DH* dh)) generate_key;
|
||||
ExternC!(int function(ubyte* key,const(BIGNUM)* pub_key,DH* dh)) compute_key;
|
||||
ExternC!(int function(const(DH)* dh, BIGNUM* r, const(BIGNUM)* a,
|
||||
const(BIGNUM)* p, const(BIGNUM)* m, BN_CTX* ctx,
|
||||
BN_MONT_CTX* m_ctx)) bn_mod_exp; /* Can be null */
|
||||
|
||||
ExternC!(int function(DH* dh)) init_;
|
||||
ExternC!(int function(DH* dh)) finish;
|
||||
int flags;
|
||||
char* app_data;
|
||||
/* If this is non-NULL, it will be used to generate parameters */
|
||||
ExternC!(int function(DH* dh, int prime_len, int generator, BN_GENCB* cb)) generate_params;
|
||||
};
|
||||
|
||||
struct dh_st
|
||||
{
|
||||
/* This first argument is used to pick up errors when
|
||||
* a DH is passed instead of a EVP_PKEY */
|
||||
int pad;
|
||||
int version_;
|
||||
BIGNUM* p;
|
||||
BIGNUM* g;
|
||||
c_long length; /* optional */
|
||||
BIGNUM* pub_key; /* g^x */
|
||||
BIGNUM* priv_key; /* x */
|
||||
|
||||
int flags;
|
||||
BN_MONT_CTX* method_mont_p;
|
||||
/* Place holders if we want to do X9.42 DH */
|
||||
BIGNUM* q;
|
||||
BIGNUM* j;
|
||||
ubyte* seed;
|
||||
int seedlen;
|
||||
BIGNUM* counter;
|
||||
|
||||
int references;
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
const(DH_METHOD)* meth;
|
||||
ENGINE* engine;
|
||||
};
|
||||
|
||||
enum DH_GENERATOR_2 = 2;
|
||||
/* enum DH_GENERATOR_3 = 3; */
|
||||
enum DH_GENERATOR_5 = 5;
|
||||
|
||||
/* DH_check error codes */
|
||||
enum DH_CHECK_P_NOT_PRIME = 0x01;
|
||||
enum DH_CHECK_P_NOT_SAFE_PRIME = 0x02;
|
||||
enum DH_UNABLE_TO_CHECK_GENERATOR = 0x04;
|
||||
enum DH_NOT_SUITABLE_GENERATOR = 0x08;
|
||||
|
||||
/* DH_check_pub_key error codes */
|
||||
enum DH_CHECK_PUBKEY_TOO_SMALL = 0x01;
|
||||
enum DH_CHECK_PUBKEY_TOO_LARGE = 0x02;
|
||||
|
||||
/* primes p where (p-1)/2 is prime too are called "safe"; we define
|
||||
this for backward compatibility: */
|
||||
alias DH_CHECK_P_NOT_SAFE_PRIME DH_CHECK_P_NOT_STRONG_PRIME;
|
||||
|
||||
auto d2i_DHparams_fp()(FILE* fp, void** x) {
|
||||
return cast(DH*)ASN1_d2i_fp(cast(ExternC!(void* function()))&DH_new,
|
||||
cast(d2i_of_void*)&d2i_DHparams,fp,x);
|
||||
}
|
||||
auto i2d_DHparams_fp()(FILE* fp, void* x) { return ASN1_i2d_fp(cast(d2i_of_void*)&i2d_DHparams,fp, x); }
|
||||
auto d2i_DHparams_bio()(BIO* bp, void** x) { return ASN1_d2i_bio_of!DH(&DH_new,&d2i_DHparams,bp,x); }
|
||||
auto i2d_DHparams_bio()(BIO* bp, void** x) { return ASN1_i2d_bio_of_const!DH(&i2d_DHparams,bp,x); }
|
||||
|
||||
DH* DHparams_dup(DH*);
|
||||
|
||||
const(DH_METHOD)* DH_OpenSSL();
|
||||
|
||||
void DH_set_default_method(const(DH_METHOD)* meth);
|
||||
const(DH_METHOD)* DH_get_default_method();
|
||||
int DH_set_method(DH* dh, const(DH_METHOD)* meth);
|
||||
DH* DH_new_method(ENGINE* engine);
|
||||
|
||||
DH* DH_new();
|
||||
void DH_free(DH* dh);
|
||||
int DH_up_ref(DH* dh);
|
||||
int DH_size(const(DH)* dh);
|
||||
int DH_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int DH_set_ex_data(DH* d, int idx, void* arg);
|
||||
void* DH_get_ex_data(DH* d, int idx);
|
||||
|
||||
/* Deprecated version */
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
DH* DH_generate_parameters(int prime_len,int generator,
|
||||
ExternC!(void function(int,int,void*)) callback,void* cb_arg);
|
||||
} /* !defined(OPENSSL_NO_DEPRECATED) */
|
||||
|
||||
/* New version */
|
||||
int DH_generate_parameters_ex(DH* dh, int prime_len,int generator, BN_GENCB* cb);
|
||||
|
||||
int DH_check(const(DH)* dh,int* codes);
|
||||
int DH_check_pub_key(const(DH)* dh,const(BIGNUM)* pub_key, int* codes);
|
||||
int DH_generate_key(DH* dh);
|
||||
int DH_compute_key(ubyte* key,const(BIGNUM)* pub_key,DH* dh);
|
||||
DH* d2i_DHparams(DH** a,const(ubyte)** pp, c_long length);
|
||||
int i2d_DHparams(const(DH)* a,ubyte** pp);
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
int DHparams_print_fp(FILE* fp, const(DH)* x);
|
||||
}
|
||||
version(OPENSSL_NO_BIO) {
|
||||
int DHparams_print(char* bp, const(DH)* x);
|
||||
} else {
|
||||
int DHparams_print(BIO* bp, const(DH)* x);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_dh_paramgen_prime_len()(EVP_PKEY_CTX* ctx, int len) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN,
|
||||
EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, len, null);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_dh_paramgen_generator()(EVP_PKEY_CTX* ctx, int gen) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN,
|
||||
EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, null);
|
||||
}
|
||||
|
||||
enum EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN = (EVP_PKEY_ALG_CTRL + 1);
|
||||
enum EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR = (EVP_PKEY_ALG_CTRL + 2);
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_DH_strings();
|
||||
|
||||
/* Error codes for the DH functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum DH_F_COMPUTE_KEY = 102;
|
||||
enum DH_F_DHPARAMS_PRINT_FP = 101;
|
||||
enum DH_F_DH_BUILTIN_GENPARAMS = 106;
|
||||
enum DH_F_DH_COMPUTE_KEY = 114;
|
||||
enum DH_F_DH_GENERATE_KEY = 115;
|
||||
enum DH_F_DH_GENERATE_PARAMETERS_EX = 116;
|
||||
enum DH_F_DH_NEW_METHOD = 105;
|
||||
enum DH_F_DH_PARAM_DECODE = 107;
|
||||
enum DH_F_DH_PRIV_DECODE = 110;
|
||||
enum DH_F_DH_PRIV_ENCODE = 111;
|
||||
enum DH_F_DH_PUB_DECODE = 108;
|
||||
enum DH_F_DH_PUB_ENCODE = 109;
|
||||
enum DH_F_DO_DH_PRINT = 100;
|
||||
enum DH_F_GENERATE_KEY = 103;
|
||||
enum DH_F_GENERATE_PARAMETERS = 104;
|
||||
enum DH_F_PKEY_DH_DERIVE = 112;
|
||||
enum DH_F_PKEY_DH_KEYGEN = 113;
|
||||
|
||||
/* Reason codes. */
|
||||
enum DH_R_BAD_GENERATOR = 101;
|
||||
enum DH_R_BN_DECODE_ERROR = 109;
|
||||
enum DH_R_BN_ERROR = 106;
|
||||
enum DH_R_DECODE_ERROR = 104;
|
||||
enum DH_R_INVALID_PUBKEY = 102;
|
||||
enum DH_R_KEYS_NOT_SET = 108;
|
||||
enum DH_R_KEY_SIZE_TOO_SMALL = 110;
|
||||
enum DH_R_MODULUS_TOO_LARGE = 103;
|
||||
enum DH_R_NON_FIPS_METHOD = 111;
|
||||
enum DH_R_NO_PARAMETERS_SET = 107;
|
||||
enum DH_R_NO_PRIVATE_VALUE = 100;
|
||||
enum DH_R_PARAMETER_ENCODING_ERROR = 105;
|
|
@ -0,0 +1,327 @@
|
|||
/* crypto/dsa/dsa.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
/*
|
||||
* The DSS routines are based on patches supplied by
|
||||
* Steven Schoch <schoch@sheba.arc.nasa.gov>. He basically did the
|
||||
* work and I have just tweaked them a little to fit into my
|
||||
* stylistic vision for SSLeay :-) */
|
||||
|
||||
module deimos.openssl.dsa;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.evp; // Needed for EVP_PKEY_ALG_CTRL.
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version (OPENSSL_NO_DSA) {
|
||||
static assert(false, "DSA is disabled.");
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
public import deimos.openssl.crypto;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.bn;
|
||||
version(OPENSSL_NO_DH) {} else {
|
||||
public import deimos.openssl.dh;
|
||||
}
|
||||
}
|
||||
|
||||
// #ifndef OPENSSL_DSA_MAX_MODULUS_BITS
|
||||
enum OPENSSL_DSA_MAX_MODULUS_BITS = 10000;
|
||||
// #endif
|
||||
|
||||
enum DSA_FLAG_CACHE_MONT_P = 0x01;
|
||||
enum DSA_FLAG_NO_EXP_CONSTTIME = 0x02; /* new with 0.9.7h; the built-in DSA
|
||||
* implementation now uses constant time
|
||||
* modular exponentiation for secret exponents
|
||||
* by default. This flag causes the
|
||||
* faster variable sliding window method to
|
||||
* be used for all exponents.
|
||||
*/
|
||||
|
||||
/* If this flag is set the DSA method is FIPS compliant and can be used
|
||||
* in FIPS mode. This is set in the validated module method. If an
|
||||
* application sets this flag in its own methods it is its reposibility
|
||||
* to ensure the result is compliant.
|
||||
*/
|
||||
|
||||
enum DSA_FLAG_FIPS_METHOD = 0x0400;
|
||||
|
||||
/* If this flag is set the operations normally disabled in FIPS mode are
|
||||
* permitted it is then the applications responsibility to ensure that the
|
||||
* usage is compliant.
|
||||
*/
|
||||
|
||||
enum DSA_FLAG_NON_FIPS_ALLOW = 0x0400;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Already defined in ossl_typ.h */
|
||||
/* typedef dsa_st DSA; */
|
||||
/* typedef dsa_method DSA_METHOD; */
|
||||
|
||||
struct DSA_SIG_st {
|
||||
BIGNUM* r;
|
||||
BIGNUM* s;
|
||||
}
|
||||
alias DSA_SIG_st DSA_SIG;
|
||||
|
||||
struct dsa_method
|
||||
{
|
||||
const(char)* name;
|
||||
ExternC!(DSA_SIG* function(const(ubyte)* dgst, int dlen, DSA* dsa)) dsa_do_sign;
|
||||
ExternC!(int function(DSA* dsa, BN_CTX* ctx_in, BIGNUM** kinvp,
|
||||
BIGNUM** rp)) dsa_sign_setup;
|
||||
ExternC!(int function(const(ubyte)* dgst, int dgst_len,
|
||||
DSA_SIG* sig, DSA* dsa)) dsa_do_verify;
|
||||
ExternC!(int function(DSA* dsa, BIGNUM* rr, BIGNUM* a1, BIGNUM* p1,
|
||||
BIGNUM* a2, BIGNUM* p2, BIGNUM* m, BN_CTX* ctx,
|
||||
BN_MONT_CTX* in_mont)) dsa_mod_exp;
|
||||
ExternC!(int function(DSA* dsa, BIGNUM* r, BIGNUM* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx,
|
||||
BN_MONT_CTX* m_ctx)) bn_mod_exp; /* Can be null */
|
||||
ExternC!(int function(DSA* dsa)) init_;
|
||||
ExternC!(int function(DSA* dsa)) finish;
|
||||
int flags;
|
||||
char* app_data;
|
||||
/* If this is non-NULL, it is used to generate DSA parameters */
|
||||
ExternC!(int function(DSA* dsa, int bits,
|
||||
const(ubyte)* seed, int seed_len,
|
||||
int* counter_ret, c_ulong* h_ret,
|
||||
BN_GENCB* cb)) dsa_paramgen;
|
||||
/* If this is non-NULL, it is used to generate DSA keys */
|
||||
ExternC!(int function(DSA* dsa)) dsa_keygen;
|
||||
};
|
||||
|
||||
struct dsa_st
|
||||
{
|
||||
/* This first variable is used to pick up errors where
|
||||
* a DSA is passed instead of of a EVP_PKEY */
|
||||
int pad;
|
||||
c_long version_;
|
||||
int write_params;
|
||||
BIGNUM* p;
|
||||
BIGNUM* q; /* == 20 */
|
||||
BIGNUM* g;
|
||||
|
||||
BIGNUM* pub_key; /* y public key */
|
||||
BIGNUM* priv_key; /* x private key */
|
||||
|
||||
BIGNUM* kinv; /* Signing pre-calc */
|
||||
BIGNUM* r; /* Signing pre-calc */
|
||||
|
||||
int flags;
|
||||
/* Normally used to cache montgomery values */
|
||||
BN_MONT_CTX* method_mont_p;
|
||||
int references;
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
const(DSA_METHOD)* meth;
|
||||
/* functional reference if 'meth' is ENGINE-provided */
|
||||
ENGINE* engine;
|
||||
};
|
||||
|
||||
auto d2i_DSAparams_fp()(FILE* fp, void** x) {
|
||||
return cast(DSA*)ASN1_d2i_fp(cast(ExternC!(void* function()))&DSA_new,
|
||||
cast(d2i_of_void*)&d2i_DSAparams,fp,x);
|
||||
}
|
||||
auto i2d_DSAparams_fp()(FILE* fp, void* x) { return ASN1_i2d_fp(cast(d2i_of_void*)&i2d_DSAparams,fp, x); }
|
||||
auto d2i_DSAparams_bio()(BIO* bp, void** x) { return ASN1_d2i_bio_of!DSA(&DSA_new,&d2i_DSAparams,bp,x); }
|
||||
auto i2d_DSAparams_bio()(BIO* bp, void** x) { return ASN1_i2d_bio_of_const!DSA(&i2d_DSAparams,bp,x); }
|
||||
|
||||
DSA* DSAparams_dup(DSA* x);
|
||||
DSA_SIG* DSA_SIG_new();
|
||||
void DSA_SIG_free(DSA_SIG* a);
|
||||
int i2d_DSA_SIG(const(DSA_SIG)* a, ubyte** pp);
|
||||
DSA_SIG* d2i_DSA_SIG(DSA_SIG** v, const(ubyte)** pp, c_long length);
|
||||
|
||||
DSA_SIG* DSA_do_sign(const(ubyte)* dgst,int dlen,DSA* dsa);
|
||||
int DSA_do_verify(const(ubyte)* dgst,int dgst_len,
|
||||
DSA_SIG* sig,DSA* dsa);
|
||||
|
||||
const(DSA_METHOD)* DSA_OpenSSL();
|
||||
|
||||
void DSA_set_default_method(const(DSA_METHOD)*);
|
||||
const(DSA_METHOD)* DSA_get_default_method();
|
||||
int DSA_set_method(DSA* dsa, const(DSA_METHOD)*);
|
||||
|
||||
DSA* DSA_new();
|
||||
DSA* DSA_new_method(ENGINE* engine);
|
||||
void DSA_free (DSA* r);
|
||||
/* "up" the DSA object's reference count */
|
||||
int DSA_up_ref(DSA* r);
|
||||
int DSA_size(const(DSA)*);
|
||||
/* next 4 return -1 on error */
|
||||
int DSA_sign_setup( DSA* dsa,BN_CTX* ctx_in,BIGNUM** kinvp,BIGNUM** rp);
|
||||
int DSA_sign(int type,const(ubyte)* dgst,int dlen,
|
||||
ubyte* sig, uint* siglen, DSA* dsa);
|
||||
int DSA_verify(int type,const(ubyte)* dgst,int dgst_len,
|
||||
const(ubyte)* sigbuf, int siglen, DSA* dsa);
|
||||
int DSA_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int DSA_set_ex_data(DSA* d, int idx, void* arg);
|
||||
void* DSA_get_ex_data(DSA* d, int idx);
|
||||
|
||||
DSA* d2i_DSAPublicKey(DSA** a, const(ubyte)** pp, c_long length);
|
||||
DSA* d2i_DSAPrivateKey(DSA** a, const(ubyte)** pp, c_long length);
|
||||
DSA* d2i_DSAparams(DSA** a, const(ubyte)** pp, c_long length);
|
||||
|
||||
/* Deprecated version */
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
DSA* DSA_generate_parameters(int bits,
|
||||
ubyte* seed,int seed_len,
|
||||
int* counter_ret, c_ulong* h_ret,ExternC!(void
|
||||
function(int, int, void*)) callback,void* cb_arg);
|
||||
} /* !defined(OPENSSL_NO_DEPRECATED) */
|
||||
|
||||
/* New version */
|
||||
int DSA_generate_parameters_ex(DSA* dsa, int bits,
|
||||
const(ubyte)* seed,int seed_len,
|
||||
int* counter_ret, c_ulong* h_ret, BN_GENCB* cb);
|
||||
|
||||
int DSA_generate_key(DSA* a);
|
||||
int i2d_DSAPublicKey(const(DSA)* a, ubyte** pp);
|
||||
int i2d_DSAPrivateKey(const(DSA)* a, ubyte** pp);
|
||||
int i2d_DSAparams(const(DSA)* a,ubyte** pp);
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
int DSAparams_print(BIO* bp, const(DSA)* x);
|
||||
int DSA_print(BIO* bp, const(DSA)* x, int off);
|
||||
}
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
int DSAparams_print_fp(FILE* fp, const(DSA)* x);
|
||||
int DSA_print_fp(FILE* bp, const(DSA)* x, int off);
|
||||
}
|
||||
|
||||
enum DSS_prime_checks = 50;
|
||||
/* Primality test according to FIPS PUB 186[-1], Appendix 2.1:
|
||||
* 50 rounds of Rabin-Miller */
|
||||
int DSA_is_prime()(const(BIGNUM)* n, ExternC!(void function(int,int,void*)) callback, void* cb_arg) {
|
||||
return BN_is_prime(n, DSS_prime_checks, callback, null, cb_arg);
|
||||
}
|
||||
|
||||
|
||||
version(OPENSSL_NO_DH) {} else {
|
||||
/* Convert DSA structure (key or just parameters) into DH structure
|
||||
* (be careful to avoid small subgroup attacks when using this!) */
|
||||
DH* DSA_dup_DH(const(DSA)* r);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_dsa_paramgen_bits()(EVP_PKEY_CTX* ctx, int nbits) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN,
|
||||
EVP_PKEY_CTRL_DSA_PARAMGEN_BITS, nbits, null);
|
||||
}
|
||||
|
||||
enum EVP_PKEY_CTRL_DSA_PARAMGEN_BITS = (EVP_PKEY_ALG_CTRL + 1);
|
||||
enum EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS = (EVP_PKEY_ALG_CTRL + 2);
|
||||
enum EVP_PKEY_CTRL_DSA_PARAMGEN_MD = (EVP_PKEY_ALG_CTRL + 3);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_DSA_strings();
|
||||
|
||||
/* Error codes for the DSA functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum DSA_F_D2I_DSA_SIG = 110;
|
||||
enum DSA_F_DO_DSA_PRINT = 104;
|
||||
enum DSA_F_DSAPARAMS_PRINT = 100;
|
||||
enum DSA_F_DSAPARAMS_PRINT_FP = 101;
|
||||
enum DSA_F_DSA_DO_SIGN = 112;
|
||||
enum DSA_F_DSA_DO_VERIFY = 113;
|
||||
enum DSA_F_DSA_GENERATE_KEY = 124;
|
||||
enum DSA_F_DSA_GENERATE_PARAMETERS_EX = 123;
|
||||
enum DSA_F_DSA_NEW_METHOD = 103;
|
||||
enum DSA_F_DSA_PARAM_DECODE = 119;
|
||||
enum DSA_F_DSA_PRINT_FP = 105;
|
||||
enum DSA_F_DSA_PRIV_DECODE = 115;
|
||||
enum DSA_F_DSA_PRIV_ENCODE = 116;
|
||||
enum DSA_F_DSA_PUB_DECODE = 117;
|
||||
enum DSA_F_DSA_PUB_ENCODE = 118;
|
||||
enum DSA_F_DSA_SIGN = 106;
|
||||
enum DSA_F_DSA_SIGN_SETUP = 107;
|
||||
enum DSA_F_DSA_SIG_NEW = 109;
|
||||
enum DSA_F_DSA_SIG_PRINT = 125;
|
||||
enum DSA_F_DSA_VERIFY = 108;
|
||||
enum DSA_F_I2D_DSA_SIG = 111;
|
||||
enum DSA_F_OLD_DSA_PRIV_DECODE = 122;
|
||||
enum DSA_F_PKEY_DSA_CTRL = 120;
|
||||
enum DSA_F_PKEY_DSA_KEYGEN = 121;
|
||||
enum DSA_F_SIG_CB = 114;
|
||||
|
||||
/* Reason codes. */
|
||||
enum DSA_R_BAD_Q_VALUE = 102;
|
||||
enum DSA_R_BN_DECODE_ERROR = 108;
|
||||
enum DSA_R_BN_ERROR = 109;
|
||||
enum DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE = 100;
|
||||
enum DSA_R_DECODE_ERROR = 104;
|
||||
enum DSA_R_INVALID_DIGEST_TYPE = 106;
|
||||
enum DSA_R_MISSING_PARAMETERS = 101;
|
||||
enum DSA_R_MODULUS_TOO_LARGE = 103;
|
||||
enum DSA_R_NEED_NEW_SETUP_VALUES = 110;
|
||||
enum DSA_R_NON_FIPS_DSA_METHOD = 111;
|
||||
enum DSA_R_NO_PARAMETERS_SET = 107;
|
||||
enum DSA_R_PARAMETER_ENCODING_ERROR = 105;
|
|
@ -0,0 +1,405 @@
|
|||
/* dso.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) 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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.dso;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.crypto;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* These values are used as commands to DSO_ctrl() */
|
||||
enum DSO_CTRL_GET_FLAGS = 1;
|
||||
enum DSO_CTRL_SET_FLAGS = 2;
|
||||
enum DSO_CTRL_OR_FLAGS = 3;
|
||||
|
||||
/* By default, DSO_load() will translate the provided filename into a form
|
||||
* typical for the platform (more specifically the DSO_METHOD) using the
|
||||
* dso_name_converter function of the method. Eg. win32 will transform "blah"
|
||||
* into "blah.dll", and dlfcn will transform it into "libblah.so". The
|
||||
* behaviour can be overriden by setting the name_converter callback in the DSO
|
||||
* object (using DSO_set_name_converter()). This callback could even utilise
|
||||
* the DSO_METHOD's converter too if it only wants to override behaviour for
|
||||
* one or two possible DSO methods. However, the following flag can be set in a
|
||||
* DSO to prevent* any* native name-translation at all - eg. if the caller has
|
||||
* prompted the user for a path to a driver library so the filename should be
|
||||
* interpreted as-is. */
|
||||
enum DSO_FLAG_NO_NAME_TRANSLATION = 0x01;
|
||||
/* An extra flag to give if only the extension should be added as
|
||||
* translation. This is obviously only of importance on Unix and
|
||||
* other operating systems where the translation also may prefix
|
||||
* the name with something, like 'lib', and ignored everywhere else.
|
||||
* This flag is also ignored if DSO_FLAG_NO_NAME_TRANSLATION is used
|
||||
* at the same time. */
|
||||
enum DSO_FLAG_NAME_TRANSLATION_EXT_ONLY = 0x02;
|
||||
|
||||
/* The following flag controls the translation of symbol names to upper
|
||||
* case. This is currently only being implemented for OpenVMS.
|
||||
*/
|
||||
enum DSO_FLAG_UPCASE_SYMBOL = 0x10;
|
||||
|
||||
/* This flag loads the library with public symbols.
|
||||
* Meaning: The exported symbols of this library are public
|
||||
* to all libraries loaded after this library.
|
||||
* At the moment only implemented in unix.
|
||||
*/
|
||||
enum DSO_FLAG_GLOBAL_SYMBOLS = 0x20;
|
||||
|
||||
|
||||
alias ExternC!(void function()) DSO_FUNC_TYPE;
|
||||
|
||||
alias dso_st DSO;
|
||||
|
||||
/* The function prototype used for method functions (or caller-provided
|
||||
* callbacks) that transform filenames. They are passed a DSO structure pointer
|
||||
* (or NULL if they are to be used independantly of a DSO object) and a
|
||||
* filename to transform. They should either return NULL (if there is an error
|
||||
* condition) or a newly allocated string containing the transformed form that
|
||||
* the caller will need to free with OPENSSL_free() when done. */
|
||||
alias ExternC!(char*function(DSO*, const(char)*)) DSO_NAME_CONVERTER_FUNC;
|
||||
/* The function prototype used for method functions (or caller-provided
|
||||
* callbacks) that merge two file specifications. They are passed a
|
||||
* DSO structure pointer (or NULL if they are to be used independantly of
|
||||
* a DSO object) and two file specifications to merge. They should
|
||||
* either return NULL (if there is an error condition) or a newly allocated
|
||||
* string containing the result of merging that the caller will need
|
||||
* to free with OPENSSL_free() when done.
|
||||
* Here, merging means that bits and pieces are taken from each of the
|
||||
* file specifications and added together in whatever fashion that is
|
||||
* sensible for the DSO method in question. The only rule that really
|
||||
* applies is that if the two specification contain pieces of the same
|
||||
* type, the copy from the first string takes priority. One could see
|
||||
* it as the first specification is the one given by the user and the
|
||||
* second being a bunch of defaults to add on if they're missing in the
|
||||
* first. */
|
||||
alias ExternC!(char*function(DSO*, const(char)*, const(char)*)) DSO_MERGER_FUNC;
|
||||
|
||||
struct dso_meth_st
|
||||
{
|
||||
const(char)* name;
|
||||
/* Loads a shared library, NB: new DSO_METHODs must ensure that a
|
||||
* successful load populates the loaded_filename field, and likewise a
|
||||
* successful unload OPENSSL_frees and NULLs it out. */
|
||||
ExternC!(int function(DSO* dso)) dso_load;
|
||||
/* Unloads a shared library */
|
||||
ExternC!(int function(DSO* dso)) dso_unload;
|
||||
/* Binds a variable */
|
||||
ExternC!(void* function(DSO* dso, const(char)* symname)) dso_bind_var;
|
||||
/* Binds a function - assumes a return type of DSO_FUNC_TYPE.
|
||||
* This should be cast to the real function prototype by the
|
||||
* caller. Platforms that don't have compatible representations
|
||||
* for different prototypes (this is possible within ANSI C)
|
||||
* are highly unlikely to have shared libraries at all, let
|
||||
* alone a DSO_METHOD implemented for them. */
|
||||
ExternC!(DSO_FUNC_TYPE function(DSO* dso, const(char)* symname)) dso_bind_func;
|
||||
|
||||
/* I don't think this would actually be used in any circumstances. */
|
||||
version (none) {
|
||||
/* Unbinds a variable */
|
||||
ExternC!(int function(DSO* dso, char* symname, void* symptr)) dso_unbind_var;
|
||||
/* Unbinds a function */
|
||||
ExternC!(int function(DSO* dso, char* symname, DSO_FUNC_TYPE symptr)) dso_unbind_func;
|
||||
}
|
||||
/* The generic (yuck) "ctrl()" function. NB: Negative return
|
||||
* values (rather than zero) indicate errors. */
|
||||
ExternC!(c_long function(DSO* dso, int cmd, c_long larg, void* parg)) dso_ctrl;
|
||||
/* The default DSO_METHOD-specific function for converting filenames to
|
||||
* a canonical native form. */
|
||||
DSO_NAME_CONVERTER_FUNC dso_name_converter;
|
||||
/* The default DSO_METHOD-specific function for converting filenames to
|
||||
* a canonical native form. */
|
||||
DSO_MERGER_FUNC dso_merger;
|
||||
|
||||
/* [De]Initialisation handlers. */
|
||||
ExternC!(int function(DSO* dso)) init_;
|
||||
ExternC!(int function(DSO* dso)) finish;
|
||||
|
||||
/* Return pathname of the module containing location */
|
||||
ExternC!(int function(void* addr,char* path,int sz)) pathbyaddr;
|
||||
/* Perform global symbol lookup, i.e. among* all* modules */
|
||||
ExternC!(void* function(const(char)* symname)) globallookup;
|
||||
}
|
||||
alias dso_meth_st DSO_METHOD;
|
||||
|
||||
/**********************************************************************/
|
||||
/* The low-level handle type used to refer to a loaded shared library */
|
||||
|
||||
struct dso_st
|
||||
{
|
||||
DSO_METHOD* meth;
|
||||
/* Standard dlopen uses a (void*). Win32 uses a HANDLE. VMS
|
||||
* doesn't use anything but will need to cache the filename
|
||||
* for use in the dso_bind handler. All in all, let each
|
||||
* method control its own destiny. "Handles" and such go in
|
||||
* a STACK. */
|
||||
STACK_OF!() *meth_data;
|
||||
int references;
|
||||
int flags;
|
||||
/* For use by applications etc ... use this for your bits'n'pieces,
|
||||
* don't touch meth_data! */
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
/* If this callback function pointer is set to non-NULL, then it will
|
||||
* be used in DSO_load() in place of meth->dso_name_converter. NB: This
|
||||
* should normally set using DSO_set_name_converter(). */
|
||||
DSO_NAME_CONVERTER_FUNC name_converter;
|
||||
/* If this callback function pointer is set to non-NULL, then it will
|
||||
* be used in DSO_load() in place of meth->dso_merger. NB: This
|
||||
* should normally set using DSO_set_merger(). */
|
||||
DSO_MERGER_FUNC merger;
|
||||
/* This is populated with (a copy of) the platform-independant
|
||||
* filename used for this DSO. */
|
||||
char* filename;
|
||||
/* This is populated with (a copy of) the translated filename by which
|
||||
* the DSO was actually loaded. It is NULL iff the DSO is not currently
|
||||
* loaded. NB: This is here because the filename translation process
|
||||
* may involve a callback being invoked more than once not only to
|
||||
* convert to a platform-specific form, but also to try different
|
||||
* filenames in the process of trying to perform a load. As such, this
|
||||
* variable can be used to indicate (a) whether this DSO structure
|
||||
* corresponds to a loaded library or not, and (b) the filename with
|
||||
* which it was actually loaded. */
|
||||
char* loaded_filename;
|
||||
};
|
||||
|
||||
|
||||
DSO* DSO_new();
|
||||
DSO* DSO_new_method(DSO_METHOD* method);
|
||||
int DSO_free(DSO* dso);
|
||||
int DSO_flags(DSO* dso);
|
||||
int DSO_up_ref(DSO* dso);
|
||||
c_long DSO_ctrl(DSO* dso, int cmd, c_long larg, void* parg);
|
||||
|
||||
/* This function sets the DSO's name_converter callback. If it is non-NULL,
|
||||
* then it will be used instead of the associated DSO_METHOD's function. If
|
||||
* oldcb is non-NULL then it is set to the function pointer value being
|
||||
* replaced. Return value is non-zero for success. */
|
||||
int DSO_set_name_converter(DSO* dso, DSO_NAME_CONVERTER_FUNC cb,
|
||||
DSO_NAME_CONVERTER_FUNC* oldcb);
|
||||
/* These functions can be used to get/set the platform-independant filename
|
||||
* used for a DSO. NB: set will fail if the DSO is already loaded. */
|
||||
const(char)* DSO_get_filename(DSO* dso);
|
||||
int DSO_set_filename(DSO* dso, const(char)* filename);
|
||||
/* This function will invoke the DSO's name_converter callback to translate a
|
||||
* filename, or if the callback isn't set it will instead use the DSO_METHOD's
|
||||
* converter. If "filename" is NULL, the "filename" in the DSO itself will be
|
||||
* used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is
|
||||
* simply duplicated. NB: This function is usually called from within a
|
||||
* DSO_METHOD during the processing of a DSO_load() call, and is exposed so that
|
||||
* caller-created DSO_METHODs can do the same thing. A non-NULL return value
|
||||
* will need to be OPENSSL_free()'d. */
|
||||
char* DSO_convert_filename(DSO* dso, const(char)* filename);
|
||||
/* This function will invoke the DSO's merger callback to merge two file
|
||||
* specifications, or if the callback isn't set it will instead use the
|
||||
* DSO_METHOD's merger. A non-NULL return value will need to be
|
||||
* OPENSSL_free()'d. */
|
||||
char* DSO_merge(DSO* dso, const(char)* filespec1, const(char)* filespec2);
|
||||
/* If the DSO is currently loaded, this returns the filename that it was loaded
|
||||
* under, otherwise it returns NULL. So it is also useful as a test as to
|
||||
* whether the DSO is currently loaded. NB: This will not necessarily return
|
||||
* the same value as DSO_convert_filename(dso, dso->filename), because the
|
||||
* DSO_METHOD's load function may have tried a variety of filenames (with
|
||||
* and/or without the aid of the converters) before settling on the one it
|
||||
* actually loaded. */
|
||||
const(char)* DSO_get_loaded_filename(DSO* dso);
|
||||
|
||||
void DSO_set_default_method(DSO_METHOD* meth);
|
||||
DSO_METHOD* DSO_get_default_method();
|
||||
DSO_METHOD* DSO_get_method(DSO* dso);
|
||||
DSO_METHOD* DSO_set_method(DSO* dso, DSO_METHOD* meth);
|
||||
|
||||
/* The all-singing all-dancing load function, you normally pass NULL
|
||||
* for the first and third parameters. Use DSO_up and DSO_free for
|
||||
* subsequent reference count handling. Any flags passed in will be set
|
||||
* in the constructed DSO after its init() function but before the
|
||||
* load operation. If 'dso' is non-NULL, 'flags' is ignored. */
|
||||
DSO* DSO_load(DSO* dso, const(char)* filename, DSO_METHOD* meth, int flags);
|
||||
|
||||
/* This function binds to a variable inside a shared library. */
|
||||
void* DSO_bind_var(DSO* dso, const(char)* symname);
|
||||
|
||||
/* This function binds to a function inside a shared library. */
|
||||
DSO_FUNC_TYPE DSO_bind_func(DSO* dso, const(char)* symname);
|
||||
|
||||
/* This method is the default, but will beg, borrow, or steal whatever
|
||||
* method should be the default on any particular platform (including
|
||||
* DSO_METH_null() if necessary). */
|
||||
DSO_METHOD* DSO_METHOD_openssl();
|
||||
|
||||
/* This method is defined for all platforms - if a platform has no
|
||||
* DSO support then this will be the only method! */
|
||||
DSO_METHOD* DSO_METHOD_null();
|
||||
|
||||
/* If DSO_DLFCN is defined, the standard dlfcn.h-style functions
|
||||
* (dlopen, dlclose, dlsym, etc) will be used and incorporated into
|
||||
* this method. If not, this method will return NULL. */
|
||||
DSO_METHOD* DSO_METHOD_dlfcn();
|
||||
|
||||
/* If DSO_DL is defined, the standard dl.h-style functions (shl_load,
|
||||
* shl_unload, shl_findsym, etc) will be used and incorporated into
|
||||
* this method. If not, this method will return NULL. */
|
||||
DSO_METHOD* DSO_METHOD_dl();
|
||||
|
||||
/* If WIN32 is defined, use DLLs. If not, return NULL. */
|
||||
DSO_METHOD* DSO_METHOD_win32();
|
||||
|
||||
/* If VMS is defined, use shared images. If not, return NULL. */
|
||||
DSO_METHOD* DSO_METHOD_vms();
|
||||
|
||||
/* This function writes null-terminated pathname of DSO module
|
||||
* containing 'addr' into 'sz' large caller-provided 'path' and
|
||||
* returns the number of characters [including trailing zero]
|
||||
* written to it. If 'sz' is 0 or negative, 'path' is ignored and
|
||||
* required amount of charachers [including trailing zero] to
|
||||
* accomodate pathname is returned. If 'addr' is NULL, then
|
||||
* pathname of cryptolib itself is returned. Negative or zero
|
||||
* return value denotes error.
|
||||
*/
|
||||
int DSO_pathbyaddr(void* addr,char* path,int sz);
|
||||
|
||||
/* This function should be used with caution! It looks up symbols in
|
||||
** all* loaded modules and if module gets unloaded by somebody else
|
||||
* attempt to dereference the pointer is doomed to have fatal
|
||||
* consequences. Primary usage for this function is to probe* core*
|
||||
* system functionality, e.g. check if getnameinfo(3) is available
|
||||
* at run-time without bothering about OS-specific details such as
|
||||
* libc.so.versioning or where does it actually reside: in libc
|
||||
* itself or libsocket. */
|
||||
void* DSO_global_lookup(const(char)* name);
|
||||
|
||||
/* If BeOS is defined, use shared images. If not, return NULL. */
|
||||
DSO_METHOD* DSO_METHOD_beos();
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_DSO_strings();
|
||||
|
||||
/* Error codes for the DSO functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum DSO_F_BEOS_BIND_FUNC = 144;
|
||||
enum DSO_F_BEOS_BIND_VAR = 145;
|
||||
enum DSO_F_BEOS_LOAD = 146;
|
||||
enum DSO_F_BEOS_NAME_CONVERTER = 147;
|
||||
enum DSO_F_BEOS_UNLOAD = 148;
|
||||
enum DSO_F_DLFCN_BIND_FUNC = 100;
|
||||
enum DSO_F_DLFCN_BIND_VAR = 101;
|
||||
enum DSO_F_DLFCN_LOAD = 102;
|
||||
enum DSO_F_DLFCN_MERGER = 130;
|
||||
enum DSO_F_DLFCN_NAME_CONVERTER = 123;
|
||||
enum DSO_F_DLFCN_UNLOAD = 103;
|
||||
enum DSO_F_DL_BIND_FUNC = 104;
|
||||
enum DSO_F_DL_BIND_VAR = 105;
|
||||
enum DSO_F_DL_LOAD = 106;
|
||||
enum DSO_F_DL_MERGER = 131;
|
||||
enum DSO_F_DL_NAME_CONVERTER = 124;
|
||||
enum DSO_F_DL_UNLOAD = 107;
|
||||
enum DSO_F_DSO_BIND_FUNC = 108;
|
||||
enum DSO_F_DSO_BIND_VAR = 109;
|
||||
enum DSO_F_DSO_CONVERT_FILENAME = 126;
|
||||
enum DSO_F_DSO_CTRL = 110;
|
||||
enum DSO_F_DSO_FREE = 111;
|
||||
enum DSO_F_DSO_GET_FILENAME = 127;
|
||||
enum DSO_F_DSO_GET_LOADED_FILENAME = 128;
|
||||
enum DSO_F_DSO_GLOBAL_LOOKUP = 139;
|
||||
enum DSO_F_DSO_LOAD = 112;
|
||||
enum DSO_F_DSO_MERGE = 132;
|
||||
enum DSO_F_DSO_NEW_METHOD = 113;
|
||||
enum DSO_F_DSO_PATHBYADDR = 140;
|
||||
enum DSO_F_DSO_SET_FILENAME = 129;
|
||||
enum DSO_F_DSO_SET_NAME_CONVERTER = 122;
|
||||
enum DSO_F_DSO_UP_REF = 114;
|
||||
enum DSO_F_GLOBAL_LOOKUP_FUNC = 138;
|
||||
enum DSO_F_PATHBYADDR = 137;
|
||||
enum DSO_F_VMS_BIND_SYM = 115;
|
||||
enum DSO_F_VMS_LOAD = 116;
|
||||
enum DSO_F_VMS_MERGER = 133;
|
||||
enum DSO_F_VMS_UNLOAD = 117;
|
||||
enum DSO_F_WIN32_BIND_FUNC = 118;
|
||||
enum DSO_F_WIN32_BIND_VAR = 119;
|
||||
enum DSO_F_WIN32_GLOBALLOOKUP = 142;
|
||||
enum DSO_F_WIN32_GLOBALLOOKUP_FUNC = 143;
|
||||
enum DSO_F_WIN32_JOINER = 135;
|
||||
enum DSO_F_WIN32_LOAD = 120;
|
||||
enum DSO_F_WIN32_MERGER = 134;
|
||||
enum DSO_F_WIN32_NAME_CONVERTER = 125;
|
||||
enum DSO_F_WIN32_PATHBYADDR = 141;
|
||||
enum DSO_F_WIN32_SPLITTER = 136;
|
||||
enum DSO_F_WIN32_UNLOAD = 121;
|
||||
|
||||
/* Reason codes. */
|
||||
enum DSO_R_CTRL_FAILED = 100;
|
||||
enum DSO_R_DSO_ALREADY_LOADED = 110;
|
||||
enum DSO_R_EMPTY_FILE_STRUCTURE = 113;
|
||||
enum DSO_R_FAILURE = 114;
|
||||
enum DSO_R_FILENAME_TOO_BIG = 101;
|
||||
enum DSO_R_FINISH_FAILED = 102;
|
||||
enum DSO_R_INCORRECT_FILE_SYNTAX = 115;
|
||||
enum DSO_R_LOAD_FAILED = 103;
|
||||
enum DSO_R_NAME_TRANSLATION_FAILED = 109;
|
||||
enum DSO_R_NO_FILENAME = 111;
|
||||
enum DSO_R_NO_FILE_SPECIFICATION = 116;
|
||||
enum DSO_R_NULL_HANDLE = 104;
|
||||
enum DSO_R_SET_FILENAME_FAILED = 112;
|
||||
enum DSO_R_STACK_ERROR = 105;
|
||||
enum DSO_R_SYM_FAILURE = 106;
|
||||
enum DSO_R_UNLOAD_FAILED = 107;
|
||||
enum DSO_R_UNSUPPORTED = 108;
|
|
@ -0,0 +1,290 @@
|
|||
/* ssl/dtls1.h */
|
||||
/*
|
||||
* DTLS implementation written by Nagendra Modadugu
|
||||
* (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2005 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.dtls1;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.comp; // Needed for COMP_CTX.
|
||||
import deimos.openssl.ssl; // Needed for SSL_SESSION.
|
||||
import deimos.openssl.ssl3; // Needed for SSL3_BUFFER.
|
||||
|
||||
public import deimos.openssl.buffer;
|
||||
public import deimos.openssl.pqueue;
|
||||
// #ifdef OPENSSL_SYS_VMS
|
||||
// #include <resource.h>
|
||||
// #include <sys/timeb.h>
|
||||
// #endif
|
||||
version (Windows) {
|
||||
/* Needed for timeval */
|
||||
static if (__VERSION__ >= 2070)
|
||||
import core.sys.windows.winsock2;
|
||||
else
|
||||
import std.c.windows.winsock;
|
||||
// #elif defined(OPENSSL_SYS_NETWARE) && !defined(_WINSOCK2API_)
|
||||
// #include <sys/timeval.h>
|
||||
// #else
|
||||
// #if defined(OPENSSL_SYS_VXWORKS)
|
||||
// #include <sys/times.h>
|
||||
// #else
|
||||
} else version (Win64) {
|
||||
import core.sys.windows.winsock2;
|
||||
} else {
|
||||
import core.sys.posix.sys.time;
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
enum DTLS1_VERSION = 0xFEFF;
|
||||
enum DTLS1_BAD_VER = 0x0100;
|
||||
|
||||
version (none) {
|
||||
/* this alert description is not specified anywhere... */
|
||||
enum DTLS1_AD_MISSING_HANDSHAKE_MESSAGE = 110;
|
||||
}
|
||||
|
||||
/* lengths of messages */
|
||||
enum DTLS1_COOKIE_LENGTH = 256;
|
||||
|
||||
enum DTLS1_RT_HEADER_LENGTH = 13;
|
||||
|
||||
enum DTLS1_HM_HEADER_LENGTH = 12;
|
||||
|
||||
enum DTLS1_HM_BAD_FRAGMENT = -2;
|
||||
enum DTLS1_HM_FRAGMENT_RETRY = -3;
|
||||
|
||||
enum DTLS1_CCS_HEADER_LENGTH = 1;
|
||||
|
||||
version (none) { // #ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
|
||||
enum DTLS1_AL_HEADER_LENGTH = 7;
|
||||
} else {
|
||||
enum DTLS1_AL_HEADER_LENGTH = 2;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_SSL_INTERN) {} else {
|
||||
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
enum DTLS1_SCTP_AUTH_LABEL = "EXPORTER_DTLS_OVER_SCTP";
|
||||
}
|
||||
|
||||
struct dtls1_bitmap_st {
|
||||
c_ulong map; /* track 32 packets on 32-bit systems
|
||||
and 64 - on 64-bit systems */
|
||||
ubyte[8] max_seq_num; /* max record number seen so far,
|
||||
64-bit value in big-endian
|
||||
encoding */
|
||||
}
|
||||
alias dtls1_bitmap_st DTLS1_BITMAP;
|
||||
|
||||
struct dtls1_retransmit_state
|
||||
{
|
||||
EVP_CIPHER_CTX* enc_write_ctx; /* cryptographic state */
|
||||
EVP_MD_CTX* write_hash; /* used for mac generation */
|
||||
version(OPENSSL_NO_COMP) {
|
||||
char* compress;
|
||||
} else {
|
||||
COMP_CTX* compress; /* compression */
|
||||
}
|
||||
SSL_SESSION* session;
|
||||
ushort epoch;
|
||||
};
|
||||
|
||||
struct hm_header_st
|
||||
{
|
||||
ubyte type;
|
||||
c_ulong msg_len;
|
||||
ushort seq;
|
||||
c_ulong frag_off;
|
||||
c_ulong frag_len;
|
||||
uint is_ccs;
|
||||
dtls1_retransmit_state saved_retransmit_state;
|
||||
};
|
||||
|
||||
struct ccs_header_st
|
||||
{
|
||||
ubyte type;
|
||||
ushort seq;
|
||||
};
|
||||
|
||||
struct dtls1_timeout_st
|
||||
{
|
||||
/* Number of read timeouts so far */
|
||||
uint read_timeouts;
|
||||
|
||||
/* Number of write timeouts so far */
|
||||
uint write_timeouts;
|
||||
|
||||
/* Number of alerts received so far */
|
||||
uint num_alerts;
|
||||
};
|
||||
|
||||
struct record_pqueue_st {
|
||||
ushort epoch;
|
||||
pqueue q;
|
||||
}
|
||||
alias record_pqueue_st record_pqueue;
|
||||
|
||||
struct hm_fragment_st {
|
||||
hm_header_st msg_header;
|
||||
ubyte* fragment;
|
||||
ubyte* reassembly;
|
||||
}
|
||||
alias hm_fragment_st hm_fragment;
|
||||
|
||||
struct dtls1_state_st {
|
||||
uint send_cookie;
|
||||
ubyte[DTLS1_COOKIE_LENGTH] cookie;
|
||||
ubyte[DTLS1_COOKIE_LENGTH] rcvd_cookie;
|
||||
uint cookie_len;
|
||||
|
||||
/*
|
||||
* The current data and handshake epoch. This is initially
|
||||
* undefined, and starts at zero once the initial handshake is
|
||||
* completed
|
||||
*/
|
||||
ushort r_epoch;
|
||||
ushort w_epoch;
|
||||
|
||||
/* records being received in the current epoch */
|
||||
DTLS1_BITMAP bitmap;
|
||||
|
||||
/* renegotiation starts a new set of sequence numbers */
|
||||
DTLS1_BITMAP next_bitmap;
|
||||
|
||||
/* handshake message numbers */
|
||||
ushort handshake_write_seq;
|
||||
ushort next_handshake_write_seq;
|
||||
|
||||
ushort handshake_read_seq;
|
||||
|
||||
/* save last sequence number for retransmissions */
|
||||
ubyte[8] last_write_sequence;
|
||||
|
||||
/* Received handshake records (processed and unprocessed) */
|
||||
record_pqueue unprocessed_rcds;
|
||||
record_pqueue processed_rcds;
|
||||
|
||||
/* Buffered handshake messages */
|
||||
pqueue buffered_messages;
|
||||
|
||||
/* Buffered (sent) handshake records */
|
||||
pqueue sent_messages;
|
||||
|
||||
/* Buffered application records.
|
||||
* Only for records between CCS and Finished
|
||||
* to prevent either protocol violation or
|
||||
* unnecessary message loss.
|
||||
*/
|
||||
record_pqueue buffered_app_data;
|
||||
|
||||
/* Is set when listening for new connections with dtls1_listen() */
|
||||
uint listen;
|
||||
|
||||
uint mtu; /* max DTLS packet size */
|
||||
|
||||
hm_header_st w_msg_hdr;
|
||||
hm_header_st r_msg_hdr;
|
||||
|
||||
dtls1_timeout_st timeout;
|
||||
|
||||
/* Indicates when the last handshake msg or heartbeat sent will timeout */
|
||||
timeval next_timeout;
|
||||
|
||||
/* Timeout duration */
|
||||
ushort timeout_duration;
|
||||
|
||||
/* storage for Alert/Handshake protocol data received but not
|
||||
* yet processed by ssl3_read_bytes: */
|
||||
ubyte[DTLS1_AL_HEADER_LENGTH] alert_fragment;
|
||||
uint alert_fragment_len;
|
||||
ubyte[DTLS1_HM_HEADER_LENGTH] handshake_fragment;
|
||||
uint handshake_fragment_len;
|
||||
|
||||
uint retransmitting;
|
||||
uint change_cipher_spec_ok;
|
||||
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
/* used when SSL_ST_XX_FLUSH is entered */
|
||||
int next_state;
|
||||
|
||||
int shutdown_received;
|
||||
}
|
||||
|
||||
}
|
||||
alias dtls1_state_st DTLS1_STATE;
|
||||
|
||||
struct dtls1_record_data_st {
|
||||
ubyte* packet;
|
||||
uint packet_length;
|
||||
SSL3_BUFFER rbuf;
|
||||
SSL3_RECORD rrec;
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
bio_dgram_sctp_rcvinfo recordinfo;
|
||||
}
|
||||
}
|
||||
alias dtls1_record_data_st DTLS1_RECORD_DATA;
|
||||
|
||||
}
|
||||
|
||||
/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */
|
||||
enum DTLS1_TMO_READ_COUNT = 2;
|
||||
enum DTLS1_TMO_WRITE_COUNT = 2;
|
||||
|
||||
enum DTLS1_TMO_ALERT_COUNT = 12;
|
|
@ -0,0 +1,64 @@
|
|||
/* e_os2.h */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.e_os2;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
/+ For D, the predefined OS version identifiers are used. +/
|
||||
|
||||
alias ossl_ssize_t = ptrdiff_t;
|
|
@ -0,0 +1,16 @@
|
|||
/* crypto/ebcdic.h */
|
||||
|
||||
module deimos.openssl.ebcdic;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
/* Avoid name clashes with other applications */
|
||||
alias _openssl_os_toascii os_toascii;
|
||||
alias _openssl_os_toebcdic os_toebcdic;
|
||||
alias _openssl_ebcdic2ascii ebcdic2ascii;
|
||||
alias _openssl_ascii2ebcdic ascii2ebcdic;
|
||||
|
||||
extern const ubyte[256] _openssl_os_toascii;
|
||||
extern const ubyte[256] _openssl_os_toebcdic;
|
||||
void* _openssl_ebcdic2ascii(void* dest, const(void)* srce, size_t count);
|
||||
void* _openssl_ascii2ebcdic(void* dest, const(void)* srce, size_t count);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,120 @@
|
|||
/* crypto/ecdh/ecdh.h */
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
*
|
||||
* The Elliptic Curve Public-Key Crypto Library (ECC Code) included
|
||||
* herein is developed by SUN MICROSYSTEMS, INC., and is contributed
|
||||
* to the OpenSSL project.
|
||||
*
|
||||
* The ECC Code is licensed pursuant to the OpenSSL open source
|
||||
* license provided below.
|
||||
*
|
||||
* The ECDH software is originally written by Douglas Stebila of
|
||||
* Sun Microsystems Laboratories.
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000-2002 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).
|
||||
*
|
||||
*/
|
||||
module deimos.openssl.ecdh;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_ECDH) {
|
||||
static assert(false, "ECDH is disabled.");
|
||||
}
|
||||
|
||||
public import deimos.openssl.ec;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.bn;
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
const(ECDH_METHOD)* ECDH_OpenSSL();
|
||||
|
||||
void ECDH_set_default_method(const(ECDH_METHOD)*);
|
||||
const(ECDH_METHOD)* ECDH_get_default_method();
|
||||
int ECDH_set_method(EC_KEY*, const(ECDH_METHOD)*);
|
||||
|
||||
int ECDH_compute_key(void* out_, size_t outlen, const(EC_POINT)* pub_key, EC_KEY* ecdh,
|
||||
ExternC!(void* function(const(void)* in_, size_t inlen, void* out_, size_t* outlen)) KDF);
|
||||
|
||||
int ECDH_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new
|
||||
*new_func, CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int ECDH_set_ex_data(EC_KEY* d, int idx, void* arg);
|
||||
void* ECDH_get_ex_data(EC_KEY* d, int idx);
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_ECDH_strings();
|
||||
|
||||
/* Error codes for the ECDH functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum ECDH_F_ECDH_CHECK = 102;
|
||||
enum ECDH_F_ECDH_COMPUTE_KEY = 100;
|
||||
enum ECDH_F_ECDH_DATA_NEW_METHOD = 101;
|
||||
|
||||
/* Reason codes. */
|
||||
enum ECDH_R_KDF_FAILED = 102;
|
||||
enum ECDH_R_NON_FIPS_METHOD = 103;
|
||||
enum ECDH_R_NO_PRIVATE_VALUE = 100;
|
||||
enum ECDH_R_POINT_ARITHMETIC_FAILURE = 101;
|
|
@ -0,0 +1,255 @@
|
|||
/* crypto/ecdsa/ecdsa.h */
|
||||
/**
|
||||
* \file crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions
|
||||
* \author Written by Nils Larsch for the OpenSSL project
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000-2005 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).
|
||||
*
|
||||
*/
|
||||
module deimos.openssl.ecdsa;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_ECDSA) {
|
||||
static assert(false, "ECDSA is disabled.");
|
||||
}
|
||||
|
||||
public import deimos.openssl.ec;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.bn;
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct ECDSA_SIG_st {
|
||||
BIGNUM* r;
|
||||
BIGNUM* s;
|
||||
}
|
||||
alias ECDSA_SIG_st ECDSA_SIG;
|
||||
|
||||
/** Allocates and initialize a ECDSA_SIG structure
|
||||
* \return pointer to a ECDSA_SIG structure or NULL if an error occurred
|
||||
*/
|
||||
ECDSA_SIG* ECDSA_SIG_new();
|
||||
|
||||
/** frees a ECDSA_SIG structure
|
||||
* \param sig pointer to the ECDSA_SIG structure
|
||||
*/
|
||||
void ECDSA_SIG_free(ECDSA_SIG* sig);
|
||||
|
||||
/** DER encode content of ECDSA_SIG object (note: this function modifies* pp
|
||||
* (*pp += length of the DER encoded signature)).
|
||||
* \param sig pointer to the ECDSA_SIG object
|
||||
* \param pp pointer to a ubyte pointer for the output or NULL
|
||||
* \return the length of the DER encoded ECDSA_SIG object or 0
|
||||
*/
|
||||
int i2d_ECDSA_SIG(const(ECDSA_SIG)* sig, ubyte** pp);
|
||||
|
||||
/** Decodes a DER encoded ECDSA signature (note: this function changes* pp
|
||||
* (*pp += len)).
|
||||
* \param sig pointer to ECDSA_SIG pointer (may be NULL)
|
||||
* \param pp memory buffer with the DER encoded signature
|
||||
* \param len length of the buffer
|
||||
* \return pointer to the decoded ECDSA_SIG structure (or NULL)
|
||||
*/
|
||||
ECDSA_SIG* d2i_ECDSA_SIG(ECDSA_SIG** sig, const(ubyte)** pp, c_long len);
|
||||
|
||||
/** Computes the ECDSA signature of the given hash value using
|
||||
* the supplied private key and returns the created signature.
|
||||
* \param dgst pointer to the hash value
|
||||
* \param dgst_len length of the hash value
|
||||
* \param eckey EC_KEY object containing a private EC key
|
||||
* \return pointer to a ECDSA_SIG structure or NULL if an error occurred
|
||||
*/
|
||||
ECDSA_SIG* ECDSA_do_sign(const(ubyte)* dgst,int dgst_len,EC_KEY* eckey);
|
||||
|
||||
/** Computes ECDSA signature of a given hash value using the supplied
|
||||
* private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
|
||||
* \param dgst pointer to the hash value to sign
|
||||
* \param dgstlen length of the hash value
|
||||
* \param kinv BIGNUM with a pre-computed inverse k (optional)
|
||||
* \param rp BIGNUM with a pre-computed rp value (optioanl),
|
||||
* see ECDSA_sign_setup
|
||||
* \param eckey EC_KEY object containing a private EC key
|
||||
* \return pointer to a ECDSA_SIG structure or NULL if an error occurred
|
||||
*/
|
||||
ECDSA_SIG* ECDSA_do_sign_ex(const(ubyte)* dgst, int dgstlen,
|
||||
const(BIGNUM)* kinv, const(BIGNUM)* rp, EC_KEY* eckey);
|
||||
|
||||
/** Verifies that the supplied signature is a valid ECDSA
|
||||
* signature of the supplied hash value using the supplied public key.
|
||||
* \param dgst pointer to the hash value
|
||||
* \param dgst_len length of the hash value
|
||||
* \param sig ECDSA_SIG structure
|
||||
* \param eckey EC_KEY object containing a public EC key
|
||||
* \return 1 if the signature is valid, 0 if the signature is invalid
|
||||
* and -1 on error
|
||||
*/
|
||||
int ECDSA_do_verify(const(ubyte)* dgst, int dgst_len,
|
||||
const(ECDSA_SIG)* sig, EC_KEY* eckey);
|
||||
|
||||
const(ECDSA_METHOD)* ECDSA_OpenSSL();
|
||||
|
||||
/** Sets the default ECDSA method
|
||||
* \param meth new default ECDSA_METHOD
|
||||
*/
|
||||
void ECDSA_set_default_method(const(ECDSA_METHOD)* meth);
|
||||
|
||||
/** Returns the default ECDSA method
|
||||
* \return pointer to ECDSA_METHOD structure containing the default method
|
||||
*/
|
||||
const(ECDSA_METHOD)* ECDSA_get_default_method();
|
||||
|
||||
/** Sets method to be used for the ECDSA operations
|
||||
* \param eckey EC_KEY object
|
||||
* \param meth new method
|
||||
* \return 1 on success and 0 otherwise
|
||||
*/
|
||||
int ECDSA_set_method(EC_KEY* eckey, const(ECDSA_METHOD)* meth);
|
||||
|
||||
/** Returns the maximum length of the DER encoded signature
|
||||
* \param eckey EC_KEY object
|
||||
* \return numbers of bytes required for the DER encoded signature
|
||||
*/
|
||||
int ECDSA_size(const(EC_KEY)* eckey);
|
||||
|
||||
/** Precompute parts of the signing operation
|
||||
* \param eckey EC_KEY object containing a private EC key
|
||||
* \param ctx BN_CTX object (optional)
|
||||
* \param kinv BIGNUM pointer for the inverse of k
|
||||
* \param rp BIGNUM pointer for x coordinate of k* generator
|
||||
* \return 1 on success and 0 otherwise
|
||||
*/
|
||||
int ECDSA_sign_setup(EC_KEY* eckey, BN_CTX* ctx, BIGNUM** kinv,
|
||||
BIGNUM** rp);
|
||||
|
||||
/** Computes ECDSA signature of a given hash value using the supplied
|
||||
* private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
|
||||
* \param type this parameter is ignored
|
||||
* \param dgst pointer to the hash value to sign
|
||||
* \param dgstlen length of the hash value
|
||||
* \param sig memory for the DER encoded created signature
|
||||
* \param siglen pointer to the length of the returned signature
|
||||
* \param eckey EC_KEY object containing a private EC key
|
||||
* \return 1 on success and 0 otherwise
|
||||
*/
|
||||
int ECDSA_sign(int type, const(ubyte)* dgst, int dgstlen,
|
||||
ubyte* sig, uint* siglen, EC_KEY* eckey);
|
||||
|
||||
|
||||
/** Computes ECDSA signature of a given hash value using the supplied
|
||||
* private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
|
||||
* \param type this parameter is ignored
|
||||
* \param dgst pointer to the hash value to sign
|
||||
* \param dgstlen length of the hash value
|
||||
* \param sig buffer to hold the DER encoded signature
|
||||
* \param siglen pointer to the length of the returned signature
|
||||
* \param kinv BIGNUM with a pre-computed inverse k (optional)
|
||||
* \param rp BIGNUM with a pre-computed rp value (optioanl),
|
||||
* see ECDSA_sign_setup
|
||||
* \param eckey EC_KEY object containing a private EC key
|
||||
* \return 1 on success and 0 otherwise
|
||||
*/
|
||||
int ECDSA_sign_ex(int type, const(ubyte)* dgst, int dgstlen,
|
||||
ubyte* sig, uint* siglen, const(BIGNUM)* kinv,
|
||||
const(BIGNUM)* rp, EC_KEY* eckey);
|
||||
|
||||
/** Verifies that the given signature is valid ECDSA signature
|
||||
* of the supplied hash value using the specified public key.
|
||||
* \param type this parameter is ignored
|
||||
* \param dgst pointer to the hash value
|
||||
* \param dgstlen length of the hash value
|
||||
* \param sig pointer to the DER encoded signature
|
||||
* \param siglen length of the DER encoded signature
|
||||
* \param eckey EC_KEY object containing a public EC key
|
||||
* \return 1 if the signature is valid, 0 if the signature is invalid
|
||||
* and -1 on error
|
||||
*/
|
||||
int ECDSA_verify(int type, const(ubyte)* dgst, int dgstlen,
|
||||
const(ubyte)* sig, int siglen, EC_KEY* eckey);
|
||||
|
||||
/* the standard ex_data functions */
|
||||
int ECDSA_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new
|
||||
*new_func, CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int ECDSA_set_ex_data(EC_KEY* d, int idx, void* arg);
|
||||
void* ECDSA_get_ex_data(EC_KEY* d, int idx);
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_ECDSA_strings();
|
||||
|
||||
/* Error codes for the ECDSA functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum ECDSA_F_ECDSA_CHECK = 104;
|
||||
enum ECDSA_F_ECDSA_DATA_NEW_METHOD = 100;
|
||||
enum ECDSA_F_ECDSA_DO_SIGN = 101;
|
||||
enum ECDSA_F_ECDSA_DO_VERIFY = 102;
|
||||
enum ECDSA_F_ECDSA_SIGN_SETUP = 103;
|
||||
|
||||
/* Reason codes. */
|
||||
enum ECDSA_R_BAD_SIGNATURE = 100;
|
||||
enum ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE = 101;
|
||||
enum ECDSA_R_ERR_EC_LIB = 102;
|
||||
enum ECDSA_R_MISSING_PARAMETERS = 103;
|
||||
enum ECDSA_R_NEED_NEW_SETUP_VALUES = 106;
|
||||
enum ECDSA_R_NON_FIPS_METHOD = 107;
|
||||
enum ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED = 104;
|
||||
enum ECDSA_R_SIGNATURE_MALLOC_FAILED = 105;
|
|
@ -0,0 +1,850 @@
|
|||
/* openssl/engine.h */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2004 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).
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
* ECDH support in OpenSSL originally developed by
|
||||
* SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
|
||||
*/
|
||||
|
||||
module deimos.openssl.engine;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_ENGINE) {
|
||||
static assert(false, "ENGINE is disabled.");
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.bn;
|
||||
version(OPENSSL_NO_RSA) {} else {
|
||||
public import deimos.openssl.rsa;
|
||||
}
|
||||
version(OPENSSL_NO_DSA) {} else {
|
||||
public import deimos.openssl.dsa;
|
||||
}
|
||||
version(OPENSSL_NO_DH) {} else {
|
||||
public import deimos.openssl.dh;
|
||||
}
|
||||
version(OPENSSL_NO_ECDH) {} else {
|
||||
public import deimos.openssl.ecdh;
|
||||
}
|
||||
version(OPENSSL_NO_ECDSA) {} else {
|
||||
public import deimos.openssl.ecdsa;
|
||||
}
|
||||
public import deimos.openssl.rand;
|
||||
public import deimos.openssl.ui;
|
||||
public import deimos.openssl.err;
|
||||
}
|
||||
|
||||
public import deimos.openssl.ossl_typ;
|
||||
import deimos.openssl.ssl : SSL;
|
||||
public import deimos.openssl.symhacks;
|
||||
|
||||
public import deimos.openssl.x509;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* These flags are used to control combinations of algorithm (methods)
|
||||
* by bitwise "OR"ing. */
|
||||
enum ENGINE_METHOD_RSA = 0x0001;
|
||||
enum ENGINE_METHOD_DSA = 0x0002;
|
||||
enum ENGINE_METHOD_DH = 0x0004;
|
||||
enum ENGINE_METHOD_RAND = 0x0008;
|
||||
enum ENGINE_METHOD_ECDH = 0x0010;
|
||||
enum ENGINE_METHOD_ECDSA = 0x0020;
|
||||
enum ENGINE_METHOD_CIPHERS = 0x0040;
|
||||
enum ENGINE_METHOD_DIGESTS = 0x0080;
|
||||
enum ENGINE_METHOD_STORE = 0x0100;
|
||||
enum ENGINE_METHOD_PKEY_METHS = 0x0200;
|
||||
enum ENGINE_METHOD_PKEY_ASN1_METHS = 0x0400;
|
||||
/* Obvious all-or-nothing cases. */
|
||||
enum ENGINE_METHOD_ALL = 0xFFFF;
|
||||
enum ENGINE_METHOD_NONE = 0x0000;
|
||||
|
||||
/* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used
|
||||
* internally to control registration of ENGINE implementations, and can be set
|
||||
* by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to
|
||||
* initialise registered ENGINEs if they are not already initialised. */
|
||||
enum ENGINE_TABLE_FLAG_NOINIT = 0x0001;
|
||||
|
||||
/* ENGINE flags that can be set by ENGINE_set_flags(). */
|
||||
/* enum ENGINE_FLAGS_MALLOCED = 0x0001; */ /* Not used */
|
||||
|
||||
/* This flag is for ENGINEs that wish to handle the various 'CMD'-related
|
||||
* control commands on their own. Without this flag, ENGINE_ctrl() handles these
|
||||
* control commands on behalf of the ENGINE using their "cmd_defns" data. */
|
||||
enum ENGINE_FLAGS_MANUAL_CMD_CTRL = 0x0002;
|
||||
|
||||
/* This flag is for ENGINEs who return new duplicate structures when found via
|
||||
* "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl()
|
||||
* commands are called in sequence as part of some stateful process like
|
||||
* key-generation setup and execution), it can set this flag - then each attempt
|
||||
* to obtain the ENGINE will result in it being copied into a new structure.
|
||||
* Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments
|
||||
* the existing ENGINE's structural reference count. */
|
||||
enum ENGINE_FLAGS_BY_ID_COPY = 0x0004;
|
||||
|
||||
/* This flag if for an ENGINE that does not want its methods registered as
|
||||
* part of ENGINE_register_all_complete() for example if the methods are
|
||||
* not usable as default methods.
|
||||
*/
|
||||
|
||||
enum ENGINE_FLAGS_NO_REGISTER_ALL = 0x0008;
|
||||
|
||||
/* ENGINEs can support their own command types, and these flags are used in
|
||||
* ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each
|
||||
* command expects. Currently only numeric and string input is supported. If a
|
||||
* control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options,
|
||||
* then it is regarded as an "internal" control command - and not for use in
|
||||
* config setting situations. As such, they're not available to the
|
||||
* ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to
|
||||
* this list of 'command types' should be reflected carefully in
|
||||
* ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */
|
||||
|
||||
/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */
|
||||
enum ENGINE_CMD_FLAG_NUMERIC = 0x0001;
|
||||
/* accepts string input (cast from 'void*' to 'const(char)* ', 4th parameter to
|
||||
* ENGINE_ctrl) */
|
||||
enum ENGINE_CMD_FLAG_STRING = 0x0002;
|
||||
/* Indicates that the control command takes* no* input. Ie. the control command
|
||||
* is unparameterised. */
|
||||
enum ENGINE_CMD_FLAG_NO_INPUT = 0x0004;
|
||||
/* Indicates that the control command is internal. This control command won't
|
||||
* be shown in any output, and is only usable through the ENGINE_ctrl_cmd()
|
||||
* function. */
|
||||
enum ENGINE_CMD_FLAG_INTERNAL = 0x0008;
|
||||
|
||||
/* NB: These 3 control commands are deprecated and should not be used. ENGINEs
|
||||
* relying on these commands should compile conditional support for
|
||||
* compatibility (eg. if these symbols are defined) but should also migrate the
|
||||
* same functionality to their own ENGINE-specific control functions that can be
|
||||
* "discovered" by calling applications. The fact these control commands
|
||||
* wouldn't be "executable" (ie. usable by text-based config) doesn't change the
|
||||
* fact that application code can find and use them without requiring per-ENGINE
|
||||
* hacking. */
|
||||
|
||||
/* These flags are used to tell the ctrl function what should be done.
|
||||
* All command numbers are shared between all engines, even if some don't
|
||||
* make sense to some engines. In such a case, they do nothing but return
|
||||
* the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */
|
||||
enum ENGINE_CTRL_SET_LOGSTREAM = 1;
|
||||
enum ENGINE_CTRL_SET_PASSWORD_CALLBACK = 2;
|
||||
enum ENGINE_CTRL_HUP = 3; /* Close and reinitialise any
|
||||
handles/connections etc. */
|
||||
enum ENGINE_CTRL_SET_USER_INTERFACE = 4; /* Alternative to callback */
|
||||
enum ENGINE_CTRL_SET_CALLBACK_DATA = 5; /* User-specific data, used
|
||||
when calling the password
|
||||
callback and the user
|
||||
interface */
|
||||
enum ENGINE_CTRL_LOAD_CONFIGURATION = 6; /* Load a configuration, given
|
||||
a string that represents a
|
||||
file name or so */
|
||||
enum ENGINE_CTRL_LOAD_SECTION = 7; /* Load data from a given
|
||||
section in the already loaded
|
||||
configuration */
|
||||
|
||||
/* These control commands allow an application to deal with an arbitrary engine
|
||||
* in a dynamic way. Warn: Negative return values indicate errors FOR THESE
|
||||
* COMMANDS because zero is used to indicate 'end-of-list'. Other commands,
|
||||
* including ENGINE-specific command types, return zero for an error.
|
||||
*
|
||||
* An ENGINE can choose to implement these ctrl functions, and can internally
|
||||
* manage things however it chooses - it does so by setting the
|
||||
* ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the
|
||||
* ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns
|
||||
* data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl()
|
||||
* handler need only implement its own commands - the above "meta" commands will
|
||||
* be taken care of. */
|
||||
|
||||
/* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then
|
||||
* all the remaining control commands will return failure, so it is worth
|
||||
* checking this first if the caller is trying to "discover" the engine's
|
||||
* capabilities and doesn't want errors generated unnecessarily. */
|
||||
enum ENGINE_CTRL_HAS_CTRL_FUNCTION = 10;
|
||||
/* Returns a positive command number for the first command supported by the
|
||||
* engine. Returns zero if no ctrl commands are supported. */
|
||||
enum ENGINE_CTRL_GET_FIRST_CMD_TYPE = 11;
|
||||
/* The 'long' argument specifies a command implemented by the engine, and the
|
||||
* return value is the next command supported, or zero if there are no more. */
|
||||
enum ENGINE_CTRL_GET_NEXT_CMD_TYPE = 12;
|
||||
/* The 'void*' argument is a command name (cast from 'const(char)* '), and the
|
||||
* return value is the command that corresponds to it. */
|
||||
enum ENGINE_CTRL_GET_CMD_FROM_NAME = 13;
|
||||
/* The next two allow a command to be converted into its corresponding string
|
||||
* form. In each case, the 'long' argument supplies the command. In the NAME_LEN
|
||||
* case, the return value is the length of the command name (not counting a
|
||||
* trailing EOL). In the NAME case, the 'void*' argument must be a string buffer
|
||||
* large enough, and it will be populated with the name of the command (WITH a
|
||||
* trailing EOL). */
|
||||
enum ENGINE_CTRL_GET_NAME_LEN_FROM_CMD = 14;
|
||||
enum ENGINE_CTRL_GET_NAME_FROM_CMD = 15;
|
||||
/* The next two are similar but give a "short description" of a command. */
|
||||
enum ENGINE_CTRL_GET_DESC_LEN_FROM_CMD = 16;
|
||||
enum ENGINE_CTRL_GET_DESC_FROM_CMD = 17;
|
||||
/* With this command, the return value is the OR'd combination of
|
||||
* ENGINE_CMD_FLAG_*** values that indicate what kind of input a given
|
||||
* engine-specific ctrl command expects. */
|
||||
enum ENGINE_CTRL_GET_CMD_FLAGS = 18;
|
||||
|
||||
/* ENGINE implementations should start the numbering of their own control
|
||||
* commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */
|
||||
enum ENGINE_CMD_BASE = 200;
|
||||
|
||||
/* NB: These 2 nCipher "chil" control commands are deprecated, and their
|
||||
* functionality is now available through ENGINE-specific control commands
|
||||
* (exposed through the above-mentioned 'CMD'-handling). Code using these 2
|
||||
* commands should be migrated to the more general command handling before these
|
||||
* are removed. */
|
||||
|
||||
/* Flags specific to the nCipher "chil" engine */
|
||||
enum ENGINE_CTRL_CHIL_SET_FORKCHECK = 100;
|
||||
/* Depending on the value of the (c_long)i argument, this sets or
|
||||
* unsets the SimpleForkCheck flag in the CHIL API to enable or
|
||||
* disable checking and workarounds for applications that fork().
|
||||
*/
|
||||
enum ENGINE_CTRL_CHIL_NO_LOCKING = 101;
|
||||
/* This prevents the initialisation function from providing mutex
|
||||
* callbacks to the nCipher library. */
|
||||
|
||||
/* If an ENGINE supports its own specific control commands and wishes the
|
||||
* framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its
|
||||
* behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries
|
||||
* to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that
|
||||
* supports the stated commands (ie. the "cmd_num" entries as described by the
|
||||
* array). NB: The array must be ordered in increasing order of cmd_num.
|
||||
* "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set
|
||||
* to zero and/or cmd_name set to NULL. */
|
||||
struct ENGINE_CMD_DEFN_st {
|
||||
uint cmd_num; /* The command number */
|
||||
const(char)* cmd_name; /* The command name itself */
|
||||
const(char)* cmd_desc; /* A short description of the command */
|
||||
uint cmd_flags; /* The input the command expects */
|
||||
}
|
||||
alias ENGINE_CMD_DEFN_st ENGINE_CMD_DEFN;
|
||||
|
||||
/* Generic function pointer */
|
||||
alias ExternC!(int function()) ENGINE_GEN_FUNC_PTR;
|
||||
/* Generic function pointer taking no arguments */
|
||||
alias ExternC!(int function(ENGINE*)) ENGINE_GEN_INT_FUNC_PTR;
|
||||
/* Specific control function pointer */
|
||||
alias ExternC!(int function(ENGINE*, int, c_long, void*, ExternC!(void function()) f)) ENGINE_CTRL_FUNC_PTR;
|
||||
/* Generic load_key function pointer */
|
||||
alias ExternC!(EVP_PKEY*function(ENGINE*, const(char)*,
|
||||
UI_METHOD* ui_method, void* callback_data)) ENGINE_LOAD_KEY_PTR;
|
||||
alias ExternC!(int function(ENGINE*, SSL* ssl,
|
||||
STACK_OF!(X509_NAME) *ca_dn, X509** pcert, EVP_PKEY** pkey,
|
||||
STACK_OF!(X509) **pother, UI_METHOD* ui_method, void* callback_data)) ENGINE_SSL_CLIENT_CERT_PTR;
|
||||
/* These callback types are for an ENGINE's handler for cipher and digest logic.
|
||||
* These handlers have these prototypes;
|
||||
* int foo(ENGINE* e, const(EVP_CIPHER)** cipher, const(int)** nids, int nid);
|
||||
* int foo(ENGINE* e, const(EVP_MD)** digest, const(int)** nids, int nid);
|
||||
* Looking at how to implement these handlers in the case of cipher support, if
|
||||
* the framework wants the EVP_CIPHER for 'nid', it will call;
|
||||
* foo(e, &p_evp_cipher, NULL, nid); (return zero for failure)
|
||||
* If the framework wants a list of supported 'nid's, it will call;
|
||||
* foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error)
|
||||
*/
|
||||
/* Returns to a pointer to the array of supported cipher 'nid's. If the second
|
||||
* parameter is non-NULL it is set to the size of the returned array. */
|
||||
alias ExternC!(int function(ENGINE*, const(EVP_CIPHER)**, const(int)**, int)) ENGINE_CIPHERS_PTR;
|
||||
alias ExternC!(int function(ENGINE*, const(EVP_MD)**, const(int)**, int)) ENGINE_DIGESTS_PTR;
|
||||
alias ExternC!(int function(ENGINE*, EVP_PKEY_METHOD**, const(int)**, int)) ENGINE_PKEY_METHS_PTR;
|
||||
alias ExternC!(int function(ENGINE*, EVP_PKEY_ASN1_METHOD**, const(int)**, int)) ENGINE_PKEY_ASN1_METHS_PTR;
|
||||
/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE
|
||||
* structures where the pointers have a "structural reference". This means that
|
||||
* their reference is to allowed access to the structure but it does not imply
|
||||
* that the structure is functional. To simply increment or decrement the
|
||||
* structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not
|
||||
* required when iterating using ENGINE_get_next as it will automatically
|
||||
* decrement the structural reference count of the "current" ENGINE and
|
||||
* increment the structural reference count of the ENGINE it returns (unless it
|
||||
* is NULL). */
|
||||
|
||||
/* Get the first/last "ENGINE" type available. */
|
||||
ENGINE* ENGINE_get_first();
|
||||
ENGINE* ENGINE_get_last();
|
||||
/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */
|
||||
ENGINE* ENGINE_get_next(ENGINE* e);
|
||||
ENGINE* ENGINE_get_prev(ENGINE* e);
|
||||
/* Add another "ENGINE" type into the array. */
|
||||
int ENGINE_add(ENGINE* e);
|
||||
/* Remove an existing "ENGINE" type from the array. */
|
||||
int ENGINE_remove(ENGINE* e);
|
||||
/* Retrieve an engine from the list by its unique "id" value. */
|
||||
ENGINE* ENGINE_by_id(const(char)* id);
|
||||
/* Add all the built-in engines. */
|
||||
void ENGINE_load_openssl();
|
||||
void ENGINE_load_dynamic();
|
||||
version(OPENSSL_NO_STATIC_ENGINE) {} else {
|
||||
void ENGINE_load_4758cca();
|
||||
void ENGINE_load_aep();
|
||||
void ENGINE_load_atalla();
|
||||
void ENGINE_load_chil();
|
||||
void ENGINE_load_cswift();
|
||||
void ENGINE_load_nuron();
|
||||
void ENGINE_load_sureware();
|
||||
void ENGINE_load_ubsec();
|
||||
void ENGINE_load_padlock();
|
||||
void ENGINE_load_capi();
|
||||
version(OPENSSL_NO_GMP) {} else {
|
||||
void ENGINE_load_gmp();
|
||||
}
|
||||
version(OPENSSL_NO_GOST) {} else {
|
||||
void ENGINE_load_gost();
|
||||
}
|
||||
}
|
||||
void ENGINE_load_cryptodev();
|
||||
void ENGINE_load_rsax();
|
||||
void ENGINE_load_rdrand();
|
||||
void ENGINE_load_builtin_engines();
|
||||
|
||||
/* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation
|
||||
* "registry" handling. */
|
||||
uint ENGINE_get_table_flags();
|
||||
void ENGINE_set_table_flags(uint flags);
|
||||
|
||||
/* Manage registration of ENGINEs per "table". For each type, there are 3
|
||||
* functions;
|
||||
* ENGINE_register_***(e) - registers the implementation from 'e' (if it has one)
|
||||
* ENGINE_unregister_***(e) - unregister the implementation from 'e'
|
||||
* ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list
|
||||
* Cleanup is automatically registered from each table when required, so
|
||||
* ENGINE_cleanup() will reverse any "register" operations. */
|
||||
|
||||
int ENGINE_register_RSA(ENGINE* e);
|
||||
void ENGINE_unregister_RSA(ENGINE* e);
|
||||
void ENGINE_register_all_RSA();
|
||||
|
||||
int ENGINE_register_DSA(ENGINE* e);
|
||||
void ENGINE_unregister_DSA(ENGINE* e);
|
||||
void ENGINE_register_all_DSA();
|
||||
|
||||
int ENGINE_register_ECDH(ENGINE* e);
|
||||
void ENGINE_unregister_ECDH(ENGINE* e);
|
||||
void ENGINE_register_all_ECDH();
|
||||
|
||||
int ENGINE_register_ECDSA(ENGINE* e);
|
||||
void ENGINE_unregister_ECDSA(ENGINE* e);
|
||||
void ENGINE_register_all_ECDSA();
|
||||
|
||||
int ENGINE_register_DH(ENGINE* e);
|
||||
void ENGINE_unregister_DH(ENGINE* e);
|
||||
void ENGINE_register_all_DH();
|
||||
|
||||
int ENGINE_register_RAND(ENGINE* e);
|
||||
void ENGINE_unregister_RAND(ENGINE* e);
|
||||
void ENGINE_register_all_RAND();
|
||||
|
||||
int ENGINE_register_STORE(ENGINE* e);
|
||||
void ENGINE_unregister_STORE(ENGINE* e);
|
||||
void ENGINE_register_all_STORE();
|
||||
|
||||
int ENGINE_register_ciphers(ENGINE* e);
|
||||
void ENGINE_unregister_ciphers(ENGINE* e);
|
||||
void ENGINE_register_all_ciphers();
|
||||
|
||||
int ENGINE_register_digests(ENGINE* e);
|
||||
void ENGINE_unregister_digests(ENGINE* e);
|
||||
void ENGINE_register_all_digests();
|
||||
|
||||
int ENGINE_register_pkey_meths(ENGINE* e);
|
||||
void ENGINE_unregister_pkey_meths(ENGINE* e);
|
||||
void ENGINE_register_all_pkey_meths();
|
||||
|
||||
int ENGINE_register_pkey_asn1_meths(ENGINE* e);
|
||||
void ENGINE_unregister_pkey_asn1_meths(ENGINE* e);
|
||||
void ENGINE_register_all_pkey_asn1_meths();
|
||||
|
||||
/* These functions register all support from the above categories. Note, use of
|
||||
* these functions can result in static linkage of code your application may not
|
||||
* need. If you only need a subset of functionality, consider using more
|
||||
* selective initialisation. */
|
||||
int ENGINE_register_complete(ENGINE* e);
|
||||
int ENGINE_register_all_complete();
|
||||
|
||||
/* Send parametrised control commands to the engine. The possibilities to send
|
||||
* down an integer, a pointer to data or a function pointer are provided. Any of
|
||||
* the parameters may or may not be NULL, depending on the command number. In
|
||||
* actuality, this function only requires a structural (rather than functional)
|
||||
* reference to an engine, but many control commands may require the engine be
|
||||
* functional. The caller should be aware of trying commands that require an
|
||||
* operational ENGINE, and only use functional references in such situations. */
|
||||
int ENGINE_ctrl(ENGINE* e, int cmd, c_long i, void* p, ExternC!(void function()) f);
|
||||
|
||||
/* This function tests if an ENGINE-specific command is usable as a "setting".
|
||||
* Eg. in an application's config file that gets processed through
|
||||
* ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to
|
||||
* ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */
|
||||
int ENGINE_cmd_is_executable(ENGINE* e, int cmd);
|
||||
|
||||
/* This function works like ENGINE_ctrl() with the exception of taking a
|
||||
* command name instead of a command number, and can handle optional commands.
|
||||
* See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to
|
||||
* use the cmd_name and cmd_optional. */
|
||||
int ENGINE_ctrl_cmd(ENGINE* e, const(char)* cmd_name,
|
||||
c_long i, void* p, ExternC!(void function()) f, int cmd_optional);
|
||||
|
||||
/* This function passes a command-name and argument to an ENGINE. The cmd_name
|
||||
* is converted to a command number and the control command is called using
|
||||
* 'arg' as an argument (unless the ENGINE doesn't support such a command, in
|
||||
* which case no control command is called). The command is checked for input
|
||||
* flags, and if necessary the argument will be converted to a numeric value. If
|
||||
* cmd_optional is non-zero, then if the ENGINE doesn't support the given
|
||||
* cmd_name the return value will be success anyway. This function is intended
|
||||
* for applications to use so that users (or config files) can supply
|
||||
* engine-specific config data to the ENGINE at run-time to control behaviour of
|
||||
* specific engines. As such, it shouldn't be used for calling ENGINE_ctrl()
|
||||
* functions that return data, deal with binary data, or that are otherwise
|
||||
* supposed to be used directly through ENGINE_ctrl() in application code. Any
|
||||
* "return" data from an ENGINE_ctrl() operation in this function will be lost -
|
||||
* the return value is interpreted as failure if the return value is zero,
|
||||
* success otherwise, and this function returns a boolean value as a result. In
|
||||
* other words, vendors of 'ENGINE'-enabled devices should write ENGINE
|
||||
* implementations with parameterisations that work in this scheme, so that
|
||||
* compliant ENGINE-based applications can work consistently with the same
|
||||
* configuration for the same ENGINE-enabled devices, across applications. */
|
||||
int ENGINE_ctrl_cmd_string(ENGINE* e, const(char)* cmd_name, const(char)* arg,
|
||||
int cmd_optional);
|
||||
|
||||
/* These functions are useful for manufacturing new ENGINE structures. They
|
||||
* don't address reference counting at all - one uses them to populate an ENGINE
|
||||
* structure with personalised implementations of things prior to using it
|
||||
* directly or adding it to the builtin ENGINE list in OpenSSL. These are also
|
||||
* here so that the ENGINE structure doesn't have to be exposed and break binary
|
||||
* compatibility! */
|
||||
ENGINE* ENGINE_new();
|
||||
int ENGINE_free(ENGINE* e);
|
||||
int ENGINE_up_ref(ENGINE* e);
|
||||
int ENGINE_set_id(ENGINE* e, const(char)* id);
|
||||
int ENGINE_set_name(ENGINE* e, const(char)* name);
|
||||
int ENGINE_set_RSA(ENGINE* e, const(RSA_METHOD)* rsa_meth);
|
||||
int ENGINE_set_DSA(ENGINE* e, const(DSA_METHOD)* dsa_meth);
|
||||
int ENGINE_set_ECDH(ENGINE* e, const(ECDH_METHOD)* ecdh_meth);
|
||||
int ENGINE_set_ECDSA(ENGINE* e, const(ECDSA_METHOD)* ecdsa_meth);
|
||||
int ENGINE_set_DH(ENGINE* e, const(DH_METHOD)* dh_meth);
|
||||
int ENGINE_set_RAND(ENGINE* e, const(RAND_METHOD)* rand_meth);
|
||||
int ENGINE_set_STORE(ENGINE* e, const(STORE_METHOD)* store_meth);
|
||||
int ENGINE_set_destroy_function(ENGINE* e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
|
||||
int ENGINE_set_init_function(ENGINE* e, ENGINE_GEN_INT_FUNC_PTR init_f);
|
||||
int ENGINE_set_finish_function(ENGINE* e, ENGINE_GEN_INT_FUNC_PTR finish_f);
|
||||
int ENGINE_set_ctrl_function(ENGINE* e, ENGINE_CTRL_FUNC_PTR ctrl_f);
|
||||
int ENGINE_set_load_privkey_function(ENGINE* e, ENGINE_LOAD_KEY_PTR loadpriv_f);
|
||||
int ENGINE_set_load_pubkey_function(ENGINE* e, ENGINE_LOAD_KEY_PTR loadpub_f);
|
||||
int ENGINE_set_load_ssl_client_cert_function(ENGINE* e,
|
||||
ENGINE_SSL_CLIENT_CERT_PTR loadssl_f);
|
||||
int ENGINE_set_ciphers(ENGINE* e, ENGINE_CIPHERS_PTR f);
|
||||
int ENGINE_set_digests(ENGINE* e, ENGINE_DIGESTS_PTR f);
|
||||
int ENGINE_set_pkey_meths(ENGINE* e, ENGINE_PKEY_METHS_PTR f);
|
||||
int ENGINE_set_pkey_asn1_meths(ENGINE* e, ENGINE_PKEY_ASN1_METHS_PTR f);
|
||||
int ENGINE_set_flags(ENGINE* e, int flags);
|
||||
int ENGINE_set_cmd_defns(ENGINE* e, const(ENGINE_CMD_DEFN)* defns);
|
||||
/* These functions allow control over any per-structure ENGINE data. */
|
||||
int ENGINE_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int ENGINE_set_ex_data(ENGINE* e, int idx, void* arg);
|
||||
void* ENGINE_get_ex_data(const(ENGINE)* e, int idx);
|
||||
|
||||
/* This function cleans up anything that needs it. Eg. the ENGINE_add() function
|
||||
* automatically ensures the list cleanup function is registered to be called
|
||||
* from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure
|
||||
* ENGINE_cleanup() will clean up after them. */
|
||||
void ENGINE_cleanup();
|
||||
|
||||
/* These return values from within the ENGINE structure. These can be useful
|
||||
* with functional references as well as structural references - it depends
|
||||
* which you obtained. Using the result for functional purposes if you only
|
||||
* obtained a structural reference may be problematic! */
|
||||
const(char)* ENGINE_get_id(const(ENGINE)* e);
|
||||
const(char)* ENGINE_get_name(const(ENGINE)* e);
|
||||
const(RSA_METHOD)* ENGINE_get_RSA(const(ENGINE)* e);
|
||||
const(DSA_METHOD)* ENGINE_get_DSA(const(ENGINE)* e);
|
||||
const(ECDH_METHOD)* ENGINE_get_ECDH(const(ENGINE)* e);
|
||||
const(ECDSA_METHOD)* ENGINE_get_ECDSA(const(ENGINE)* e);
|
||||
const(DH_METHOD)* ENGINE_get_DH(const(ENGINE)* e);
|
||||
const(RAND_METHOD)* ENGINE_get_RAND(const(ENGINE)* e);
|
||||
const(STORE_METHOD)* ENGINE_get_STORE(const(ENGINE)* e);
|
||||
ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const(ENGINE)* e);
|
||||
ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const(ENGINE)* e);
|
||||
ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const(ENGINE)* e);
|
||||
ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const(ENGINE)* e);
|
||||
ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const(ENGINE)* e);
|
||||
ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const(ENGINE)* e);
|
||||
ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const(ENGINE)* e);
|
||||
ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const(ENGINE)* e);
|
||||
ENGINE_DIGESTS_PTR ENGINE_get_digests(const(ENGINE)* e);
|
||||
ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const(ENGINE)* e);
|
||||
ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const(ENGINE)* e);
|
||||
const(EVP_CIPHER)* ENGINE_get_cipher(ENGINE* e, int nid);
|
||||
const(EVP_MD)* ENGINE_get_digest(ENGINE* e, int nid);
|
||||
const(EVP_PKEY_METHOD)* ENGINE_get_pkey_meth(ENGINE* e, int nid);
|
||||
const(EVP_PKEY_ASN1_METHOD)* ENGINE_get_pkey_asn1_meth(ENGINE* e, int nid);
|
||||
const(EVP_PKEY_ASN1_METHOD)* ENGINE_get_pkey_asn1_meth_str(ENGINE* e,
|
||||
const(char)* str, int len);
|
||||
const(EVP_PKEY_ASN1_METHOD)* ENGINE_pkey_asn1_find_str(ENGINE** pe,
|
||||
const(char)* str, int len);
|
||||
const(ENGINE_CMD_DEFN)* ENGINE_get_cmd_defns(const(ENGINE)* e);
|
||||
int ENGINE_get_flags(const(ENGINE)* e);
|
||||
|
||||
/* FUNCTIONAL functions. These functions deal with ENGINE structures
|
||||
* that have (or will) be initialised for use. Broadly speaking, the
|
||||
* structural functions are useful for iterating the list of available
|
||||
* engine types, creating new engine types, and other "list" operations.
|
||||
* These functions actually deal with ENGINEs that are to be used. As
|
||||
* such these functions can fail (if applicable) when particular
|
||||
* engines are unavailable - eg. if a hardware accelerator is not
|
||||
* attached or not functioning correctly. Each ENGINE has 2 reference
|
||||
* counts; structural and functional. Every time a functional reference
|
||||
* is obtained or released, a corresponding structural reference is
|
||||
* automatically obtained or released too. */
|
||||
|
||||
/* Initialise a engine type for use (or up its reference count if it's
|
||||
* already in use). This will fail if the engine is not currently
|
||||
* operational and cannot initialise. */
|
||||
int ENGINE_init(ENGINE* e);
|
||||
/* Free a functional reference to a engine type. This does not require
|
||||
* a corresponding call to ENGINE_free as it also releases a structural
|
||||
* reference. */
|
||||
int ENGINE_finish(ENGINE* e);
|
||||
|
||||
/* The following functions handle keys that are stored in some secondary
|
||||
* location, handled by the engine. The storage may be on a card or
|
||||
* whatever. */
|
||||
EVP_PKEY* ENGINE_load_private_key(ENGINE* e, const(char)* key_id,
|
||||
UI_METHOD* ui_method, void* callback_data);
|
||||
EVP_PKEY* ENGINE_load_public_key(ENGINE* e, const(char)* key_id,
|
||||
UI_METHOD* ui_method, void* callback_data);
|
||||
int ENGINE_load_ssl_client_cert(ENGINE* e, SSL* s,
|
||||
STACK_OF!(X509_NAME) *ca_dn, X509** pcert, EVP_PKEY** ppkey,
|
||||
STACK_OF!(X509) **pother,
|
||||
UI_METHOD* ui_method, void* callback_data);
|
||||
|
||||
/* This returns a pointer for the current ENGINE structure that
|
||||
* is (by default) performing any RSA operations. The value returned
|
||||
* is an incremented reference, so it should be free'd (ENGINE_finish)
|
||||
* before it is discarded. */
|
||||
ENGINE* ENGINE_get_default_RSA();
|
||||
/* Same for the other "methods" */
|
||||
ENGINE* ENGINE_get_default_DSA();
|
||||
ENGINE* ENGINE_get_default_ECDH();
|
||||
ENGINE* ENGINE_get_default_ECDSA();
|
||||
ENGINE* ENGINE_get_default_DH();
|
||||
ENGINE* ENGINE_get_default_RAND();
|
||||
/* These functions can be used to get a functional reference to perform
|
||||
* ciphering or digesting corresponding to "nid". */
|
||||
ENGINE* ENGINE_get_cipher_engine(int nid);
|
||||
ENGINE* ENGINE_get_digest_engine(int nid);
|
||||
ENGINE* ENGINE_get_pkey_meth_engine(int nid);
|
||||
ENGINE* ENGINE_get_pkey_asn1_meth_engine(int nid);
|
||||
|
||||
/* This sets a new default ENGINE structure for performing RSA
|
||||
* operations. If the result is non-zero (success) then the ENGINE
|
||||
* structure will have had its reference count up'd so the caller
|
||||
* should still free their own reference 'e'. */
|
||||
int ENGINE_set_default_RSA(ENGINE* e);
|
||||
int ENGINE_set_default_string(ENGINE* e, const(char)* def_list);
|
||||
/* Same for the other "methods" */
|
||||
int ENGINE_set_default_DSA(ENGINE* e);
|
||||
int ENGINE_set_default_ECDH(ENGINE* e);
|
||||
int ENGINE_set_default_ECDSA(ENGINE* e);
|
||||
int ENGINE_set_default_DH(ENGINE* e);
|
||||
int ENGINE_set_default_RAND(ENGINE* e);
|
||||
int ENGINE_set_default_ciphers(ENGINE* e);
|
||||
int ENGINE_set_default_digests(ENGINE* e);
|
||||
int ENGINE_set_default_pkey_meths(ENGINE* e);
|
||||
int ENGINE_set_default_pkey_asn1_meths(ENGINE* e);
|
||||
|
||||
/* The combination "set" - the flags are bitwise "OR"d from the
|
||||
* ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()"
|
||||
* function, this function can result in unnecessary static linkage. If your
|
||||
* application requires only specific functionality, consider using more
|
||||
* selective functions. */
|
||||
int ENGINE_set_default(ENGINE* e, uint flags);
|
||||
|
||||
void ENGINE_add_conf_module();
|
||||
|
||||
/* Deprecated functions ... */
|
||||
/* int ENGINE_clear_defaults(); */
|
||||
|
||||
/**************************/
|
||||
/* DYNAMIC ENGINE SUPPORT */
|
||||
/**************************/
|
||||
|
||||
/* Binary/behaviour compatibility levels */
|
||||
enum OSSL_DYNAMIC_VERSION = 0x00020000;
|
||||
/* Binary versions older than this are too old for us (whether we're a loader or
|
||||
* a loadee) */
|
||||
enum OSSL_DYNAMIC_OLDEST = 0x00020000;
|
||||
|
||||
/* When compiling an ENGINE entirely as an external shared library, loadable by
|
||||
* the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure
|
||||
* type provides the calling application's (or library's) error functionality
|
||||
* and memory management function pointers to the loaded library. These should
|
||||
* be used/set in the loaded library code so that the loading application's
|
||||
* 'state' will be used/changed in all operations. The 'static_state' pointer
|
||||
* allows the loaded library to know if it shares the same static data as the
|
||||
* calling application (or library), and thus whether these callbacks need to be
|
||||
* set or not. */
|
||||
alias ExternC!(void*function(size_t)) dyn_MEM_malloc_cb;
|
||||
alias ExternC!(void*function(void*, size_t)) dyn_MEM_realloc_cb;
|
||||
alias ExternC!(void function(void*)) dyn_MEM_free_cb;
|
||||
struct st_dynamic_MEM_fns {
|
||||
dyn_MEM_malloc_cb malloc_cb;
|
||||
dyn_MEM_realloc_cb realloc_cb;
|
||||
dyn_MEM_free_cb free_cb;
|
||||
}
|
||||
alias st_dynamic_MEM_fns dynamic_MEM_fns;
|
||||
/* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use
|
||||
* these types so we (and any other dependant code) can simplify a bit?? */
|
||||
alias ExternC!(void function(int,int,const(char)*,int)) dyn_lock_locking_cb;
|
||||
alias ExternC!(int function(int*,int,int,const(char)*,int)) dyn_lock_add_lock_cb;
|
||||
alias ExternC!(CRYPTO_dynlock_value*function(
|
||||
const(char)*,int)) dyn_dynlock_create_cb;
|
||||
alias ExternC!(void function(int,CRYPTO_dynlock_value*,
|
||||
const(char)*,int)) dyn_dynlock_lock_cb;
|
||||
alias ExternC!(void function(CRYPTO_dynlock_value*,
|
||||
const(char)*,int)) dyn_dynlock_destroy_cb;
|
||||
struct st_dynamic_LOCK_fns {
|
||||
dyn_lock_locking_cb lock_locking_cb;
|
||||
dyn_lock_add_lock_cb lock_add_lock_cb;
|
||||
dyn_dynlock_create_cb dynlock_create_cb;
|
||||
dyn_dynlock_lock_cb dynlock_lock_cb;
|
||||
dyn_dynlock_destroy_cb dynlock_destroy_cb;
|
||||
}
|
||||
alias st_dynamic_LOCK_fns dynamic_LOCK_fns;
|
||||
/* The top-level structure */
|
||||
struct st_dynamic_fns {
|
||||
void* static_state;
|
||||
const(ERR_FNS)* err_fns;
|
||||
const(CRYPTO_EX_DATA_IMPL)* ex_data_fns;
|
||||
dynamic_MEM_fns mem_fns;
|
||||
dynamic_LOCK_fns lock_fns;
|
||||
}
|
||||
alias st_dynamic_fns dynamic_fns;
|
||||
|
||||
/* The version checking function should be of this prototype. NB: The
|
||||
* ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code.
|
||||
* If this function returns zero, it indicates a (potential) version
|
||||
* incompatibility and the loaded library doesn't believe it can proceed.
|
||||
* Otherwise, the returned value is the (latest) version supported by the
|
||||
* loading library. The loader may still decide that the loaded code's version
|
||||
* is unsatisfactory and could veto the load. The function is expected to
|
||||
* be implemented with the symbol name "v_check", and a default implementation
|
||||
* can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */
|
||||
alias ExternC!(c_ulong function(c_ulong ossl_version)) dynamic_v_check_fn;
|
||||
template IMPLEMENT_DYNAMIC_CHECK_FN() {
|
||||
enum IMPLEMENT_DYNAMIC_CHECK_FN = q{
|
||||
extern(C) c_ulong v_check(c_ulong v);
|
||||
extern(C) c_ulong v_check(c_ulong v) {
|
||||
if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION;
|
||||
return 0; }
|
||||
};
|
||||
}
|
||||
|
||||
/* This function is passed the ENGINE structure to initialise with its own
|
||||
* function and command settings. It should not adjust the structural or
|
||||
* functional reference counts. If this function returns zero, (a) the load will
|
||||
* be aborted, (b) the previous ENGINE state will be memcpy'd back onto the
|
||||
* structure, and (c) the shared library will be unloaded. So implementations
|
||||
* should do their own internal cleanup in failure circumstances otherwise they
|
||||
* could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that
|
||||
* the loader is looking for. If this is NULL, the shared library can choose to
|
||||
* return failure or to initialise a 'default' ENGINE. If non-NULL, the shared
|
||||
* library must initialise only an ENGINE matching the passed 'id'. The function
|
||||
* is expected to be implemented with the symbol name "bind_engine". A standard
|
||||
* implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where
|
||||
* the parameter 'fn' is a callback function that populates the ENGINE structure
|
||||
* and returns an int value (zero for failure). 'fn' should have prototype;
|
||||
* [static] int fn(ENGINE* e, const(char)* id); */
|
||||
alias ExternC!(int function(ENGINE* e, const(char)* id,
|
||||
const(dynamic_fns)* fns)) dynamic_bind_engine;
|
||||
template IMPLEMENT_DYNAMIC_BIND_FN(fn) {
|
||||
enum IMPLEMENT_DYNAMIC_BIND_FN = "
|
||||
extern(C)
|
||||
int bind_engine(ENGINE* e, const(char)* id, const(dynamic_fns)* fns);
|
||||
extern(C)
|
||||
int bind_engine(ENGINE* e, const(char)* id, const(dynamic_fns)* fns) {
|
||||
if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs;
|
||||
if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb,
|
||||
fns->mem_fns.realloc_cb, fns->mem_fns.free_cb))
|
||||
return 0;
|
||||
CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb);
|
||||
CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb);
|
||||
CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb);
|
||||
CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb);
|
||||
CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb);
|
||||
if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns))
|
||||
return 0;
|
||||
if(!ERR_set_implementation(fns->err_fns)) return 0;
|
||||
skip_cbs:
|
||||
if(!" ~ fn ~ "(e,id)) return 0;
|
||||
return 1; }
|
||||
";
|
||||
}
|
||||
|
||||
/* If the loading application (or library) and the loaded ENGINE library share
|
||||
* the same static data (eg. they're both dynamically linked to the same
|
||||
* libcrypto.so) we need a way to avoid trying to set system callbacks - this
|
||||
* would fail, and for the same reason that it's unnecessary to try. If the
|
||||
* loaded ENGINE has (or gets from through the loader) its own copy of the
|
||||
* libcrypto static data, we will need to set the callbacks. The easiest way to
|
||||
* detect this is to have a function that returns a pointer to some static data
|
||||
* and let the loading application and loaded ENGINE compare their respective
|
||||
* values. */
|
||||
void* ENGINE_get_static_state();
|
||||
|
||||
version (BSD) {
|
||||
void ENGINE_setup_bsd_cryptodev();
|
||||
}
|
||||
version (HAVE_CRYPTODEV) {
|
||||
void ENGINE_setup_bsd_cryptodev();
|
||||
}
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_ENGINE_strings();
|
||||
|
||||
/* Error codes for the ENGINE functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum ENGINE_F_DYNAMIC_CTRL = 180;
|
||||
enum ENGINE_F_DYNAMIC_GET_DATA_CTX = 181;
|
||||
enum ENGINE_F_DYNAMIC_LOAD = 182;
|
||||
enum ENGINE_F_DYNAMIC_SET_DATA_CTX = 183;
|
||||
enum ENGINE_F_ENGINE_ADD = 105;
|
||||
enum ENGINE_F_ENGINE_BY_ID = 106;
|
||||
enum ENGINE_F_ENGINE_CMD_IS_EXECUTABLE = 170;
|
||||
enum ENGINE_F_ENGINE_CTRL = 142;
|
||||
enum ENGINE_F_ENGINE_CTRL_CMD = 178;
|
||||
enum ENGINE_F_ENGINE_CTRL_CMD_STRING = 171;
|
||||
enum ENGINE_F_ENGINE_FINISH = 107;
|
||||
enum ENGINE_F_ENGINE_FREE_UTIL = 108;
|
||||
enum ENGINE_F_ENGINE_GET_CIPHER = 185;
|
||||
enum ENGINE_F_ENGINE_GET_DEFAULT_TYPE = 177;
|
||||
enum ENGINE_F_ENGINE_GET_DIGEST = 186;
|
||||
enum ENGINE_F_ENGINE_GET_NEXT = 115;
|
||||
enum ENGINE_F_ENGINE_GET_PKEY_ASN1_METH = 193;
|
||||
enum ENGINE_F_ENGINE_GET_PKEY_METH = 192;
|
||||
enum ENGINE_F_ENGINE_GET_PREV = 116;
|
||||
enum ENGINE_F_ENGINE_INIT = 119;
|
||||
enum ENGINE_F_ENGINE_LIST_ADD = 120;
|
||||
enum ENGINE_F_ENGINE_LIST_REMOVE = 121;
|
||||
enum ENGINE_F_ENGINE_LOAD_PRIVATE_KEY = 150;
|
||||
enum ENGINE_F_ENGINE_LOAD_PUBLIC_KEY = 151;
|
||||
enum ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT = 194;
|
||||
enum ENGINE_F_ENGINE_NEW = 122;
|
||||
enum ENGINE_F_ENGINE_REMOVE = 123;
|
||||
enum ENGINE_F_ENGINE_SET_DEFAULT_STRING = 189;
|
||||
enum ENGINE_F_ENGINE_SET_DEFAULT_TYPE = 126;
|
||||
enum ENGINE_F_ENGINE_SET_ID = 129;
|
||||
enum ENGINE_F_ENGINE_SET_NAME = 130;
|
||||
enum ENGINE_F_ENGINE_TABLE_REGISTER = 184;
|
||||
enum ENGINE_F_ENGINE_UNLOAD_KEY = 152;
|
||||
enum ENGINE_F_ENGINE_UNLOCKED_FINISH = 191;
|
||||
enum ENGINE_F_ENGINE_UP_REF = 190;
|
||||
enum ENGINE_F_INT_CTRL_HELPER = 172;
|
||||
enum ENGINE_F_INT_ENGINE_CONFIGURE = 188;
|
||||
enum ENGINE_F_INT_ENGINE_MODULE_INIT = 187;
|
||||
enum ENGINE_F_LOG_MESSAGE = 141;
|
||||
|
||||
/* Reason codes. */
|
||||
enum ENGINE_R_ALREADY_LOADED = 100;
|
||||
enum ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER = 133;
|
||||
enum ENGINE_R_CMD_NOT_EXECUTABLE = 134;
|
||||
enum ENGINE_R_COMMAND_TAKES_INPUT = 135;
|
||||
enum ENGINE_R_COMMAND_TAKES_NO_INPUT = 136;
|
||||
enum ENGINE_R_CONFLICTING_ENGINE_ID = 103;
|
||||
enum ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED = 119;
|
||||
enum ENGINE_R_DH_NOT_IMPLEMENTED = 139;
|
||||
enum ENGINE_R_DSA_NOT_IMPLEMENTED = 140;
|
||||
enum ENGINE_R_DSO_FAILURE = 104;
|
||||
enum ENGINE_R_DSO_NOT_FOUND = 132;
|
||||
enum ENGINE_R_ENGINES_SECTION_ERROR = 148;
|
||||
enum ENGINE_R_ENGINE_CONFIGURATION_ERROR = 102;
|
||||
enum ENGINE_R_ENGINE_IS_NOT_IN_LIST = 105;
|
||||
enum ENGINE_R_ENGINE_SECTION_ERROR = 149;
|
||||
enum ENGINE_R_FAILED_LOADING_PRIVATE_KEY = 128;
|
||||
enum ENGINE_R_FAILED_LOADING_PUBLIC_KEY = 129;
|
||||
enum ENGINE_R_FINISH_FAILED = 106;
|
||||
enum ENGINE_R_GET_HANDLE_FAILED = 107;
|
||||
enum ENGINE_R_ID_OR_NAME_MISSING = 108;
|
||||
enum ENGINE_R_INIT_FAILED = 109;
|
||||
enum ENGINE_R_INTERNAL_LIST_ERROR = 110;
|
||||
enum ENGINE_R_INVALID_ARGUMENT = 143;
|
||||
enum ENGINE_R_INVALID_CMD_NAME = 137;
|
||||
enum ENGINE_R_INVALID_CMD_NUMBER = 138;
|
||||
enum ENGINE_R_INVALID_INIT_VALUE = 151;
|
||||
enum ENGINE_R_INVALID_STRING = 150;
|
||||
enum ENGINE_R_NOT_INITIALISED = 117;
|
||||
enum ENGINE_R_NOT_LOADED = 112;
|
||||
enum ENGINE_R_NO_CONTROL_FUNCTION = 120;
|
||||
enum ENGINE_R_NO_INDEX = 144;
|
||||
enum ENGINE_R_NO_LOAD_FUNCTION = 125;
|
||||
enum ENGINE_R_NO_REFERENCE = 130;
|
||||
enum ENGINE_R_NO_SUCH_ENGINE = 116;
|
||||
enum ENGINE_R_NO_UNLOAD_FUNCTION = 126;
|
||||
enum ENGINE_R_PROVIDE_PARAMETERS = 113;
|
||||
enum ENGINE_R_RSA_NOT_IMPLEMENTED = 141;
|
||||
enum ENGINE_R_UNIMPLEMENTED_CIPHER = 146;
|
||||
enum ENGINE_R_UNIMPLEMENTED_DIGEST = 147;
|
||||
enum ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD = 101;
|
||||
enum ENGINE_R_VERSION_INCOMPATIBILITY = 145;
|
|
@ -0,0 +1,391 @@
|
|||
/* crypto/err/err.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2006 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.err;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
import core.stdc.stdio;
|
||||
import core.stdc.stdlib;
|
||||
}
|
||||
|
||||
public import deimos.openssl.ossl_typ;
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
version(OPENSSL_NO_LHASH) {} else {
|
||||
public import deimos.openssl.lhash;
|
||||
}
|
||||
|
||||
import core.vararg : va_list;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
// #ifndef OPENSSL_NO_ERR
|
||||
// #define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,d,e)
|
||||
// #else
|
||||
// #define ERR_PUT_error(a,b,c,d,e) ERR_put_error(a,b,c,NULL,0)
|
||||
// #endif
|
||||
version (OPENSSL_NO_ERR) {
|
||||
void ERR_PUT_error()(int a, int b,int c,const(char)* d,int e) {
|
||||
ERR_put_error(a,b,c,null,0);
|
||||
}
|
||||
} else {
|
||||
alias ERR_put_error ERR_PUT_error;
|
||||
}
|
||||
|
||||
// #include <errno.h>
|
||||
|
||||
enum ERR_TXT_MALLOCED = 0x01;
|
||||
enum ERR_TXT_STRING = 0x02;
|
||||
|
||||
enum ERR_FLAG_MARK = 0x01;
|
||||
|
||||
enum ERR_NUM_ERRORS = 16;
|
||||
struct err_state_st {
|
||||
CRYPTO_THREADID tid;
|
||||
int[ERR_NUM_ERRORS] err_flags;
|
||||
c_ulong[ERR_NUM_ERRORS] err_buffer;
|
||||
char*[ERR_NUM_ERRORS] err_data;
|
||||
int[ERR_NUM_ERRORS] err_data_flags;
|
||||
const(char)*[ERR_NUM_ERRORS] err_file;
|
||||
int[ERR_NUM_ERRORS] err_line;
|
||||
int top,bottom;
|
||||
}
|
||||
alias err_state_st ERR_STATE;
|
||||
|
||||
/* library */
|
||||
enum ERR_LIB_NONE = 1;
|
||||
enum ERR_LIB_SYS = 2;
|
||||
enum ERR_LIB_BN = 3;
|
||||
enum ERR_LIB_RSA = 4;
|
||||
enum ERR_LIB_DH = 5;
|
||||
enum ERR_LIB_EVP = 6;
|
||||
enum ERR_LIB_BUF = 7;
|
||||
enum ERR_LIB_OBJ = 8;
|
||||
enum ERR_LIB_PEM = 9;
|
||||
enum ERR_LIB_DSA = 10;
|
||||
enum ERR_LIB_X509 = 11;
|
||||
/* enum ERR_LIB_METH = 12; */
|
||||
enum ERR_LIB_ASN1 = 13;
|
||||
enum ERR_LIB_CONF = 14;
|
||||
enum ERR_LIB_CRYPTO = 15;
|
||||
enum ERR_LIB_EC = 16;
|
||||
enum ERR_LIB_SSL = 20;
|
||||
/* enum ERR_LIB_SSL23 = 21; */
|
||||
/* enum ERR_LIB_SSL2 = 22; */
|
||||
/* enum ERR_LIB_SSL3 = 23; */
|
||||
/* enum ERR_LIB_RSAREF = 30; */
|
||||
/* enum ERR_LIB_PROXY = 31; */
|
||||
enum ERR_LIB_BIO = 32;
|
||||
enum ERR_LIB_PKCS7 = 33;
|
||||
enum ERR_LIB_X509V3 = 34;
|
||||
enum ERR_LIB_PKCS12 = 35;
|
||||
enum ERR_LIB_RAND = 36;
|
||||
enum ERR_LIB_DSO = 37;
|
||||
enum ERR_LIB_ENGINE = 38;
|
||||
enum ERR_LIB_OCSP = 39;
|
||||
enum ERR_LIB_UI = 40;
|
||||
enum ERR_LIB_COMP = 41;
|
||||
enum ERR_LIB_ECDSA = 42;
|
||||
enum ERR_LIB_ECDH = 43;
|
||||
enum ERR_LIB_STORE = 44;
|
||||
enum ERR_LIB_FIPS = 45;
|
||||
enum ERR_LIB_CMS = 46;
|
||||
enum ERR_LIB_TS = 47;
|
||||
enum ERR_LIB_HMAC = 48;
|
||||
enum ERR_LIB_JPAKE = 49;
|
||||
|
||||
enum ERR_LIB_USER = 128;
|
||||
|
||||
void SYSerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_SYS,f,r,file,line); }
|
||||
void BNerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_BN,f,r,file,line); }
|
||||
void RSAerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_RSA,f,r,file,line); }
|
||||
void DHerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_DH,f,r,file,line); }
|
||||
void EVPerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_EVP,f,r,file,line); }
|
||||
void BUFerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_BUF,f,r,file,line); }
|
||||
void OBJerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_OBJ,f,r,file,line); }
|
||||
void PEMerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_PEM,f,r,file,line); }
|
||||
void DSAerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_DSA,f,r,file,line); }
|
||||
void X509err_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_X509,f,r,file,line); }
|
||||
void ASN1err_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_ASN1,f,r,file,line); }
|
||||
void CONFerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_CONF,f,r,file,line); }
|
||||
void CRYPTOerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_CRYPTO,f,r,file,line); }
|
||||
void ECerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_EC,f,r,file,line); }
|
||||
void SSLerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_SSL,f,r,file,line); }
|
||||
void BIOerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_BIO,f,r,file,line); }
|
||||
void PKCS7err_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_PKCS7,f,r,file,line); }
|
||||
void X509V3err_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_X509V3,f,r,file,line); }
|
||||
void PKCS12err_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_PKCS12,f,r,file,line); }
|
||||
void RANDerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_RAND,f,r,file,line); }
|
||||
void DSOerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_DSO,f,r,file,line); }
|
||||
void ENGINEerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_ENGINE,f,r,file,line); }
|
||||
void OCSPerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_OCSP,f,r,file,line); }
|
||||
void UIerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_UI,f,r,file,line); }
|
||||
void COMPerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_COMP,f,r,file,line); }
|
||||
void ECDSAerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_ECDSA,f,r,file,line); }
|
||||
void ECDHerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_ECDH,f,r,file,line); }
|
||||
void STOREerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_STORE,f,r,file,line); }
|
||||
void FIPSerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_FIPS,f,r,file,line); }
|
||||
void CMSerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_CMS,f,r,file,line); }
|
||||
void TSerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_TS,f,r,file,line); }
|
||||
void HMACerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_HMAC,f,r,file,line); }
|
||||
void JPAKEerr_err(string file = __FILE__, size_t line = __LINE__)(int f, int r){ ERR_PUT_error(ERR_LIB_JPAKE,f,r,file,line); }
|
||||
|
||||
/* Borland C seems too stupid to be able to shift and do longs in
|
||||
* the pre-processor :-( */
|
||||
auto ERR_PACK()(c_ulong l, c_ulong f, c_ulong r) {
|
||||
return ((((l)&0xffL)*0x1000000)|
|
||||
(((f)&0xfffL)*0x1000)|
|
||||
(((r)&0xfffL)));
|
||||
}
|
||||
auto ERR_GET_LIB()(c_ulong l) { return cast(int)(((l)>>24L)&0xffL); }
|
||||
auto ERR_GET_FUNC()(c_ulong l) { return cast(int)(((l)>>12L)&0xfffL); }
|
||||
auto ERR_GET_REASON()(c_ulong l) { return cast(int)((l)&0xfffL); }
|
||||
auto ERR_FATAL_ERROR()(c_ulong l) { return cast(int)((l)&ERR_R_FATAL); }
|
||||
|
||||
|
||||
/* OS functions */
|
||||
enum SYS_F_FOPEN = 1;
|
||||
enum SYS_F_CONNECT = 2;
|
||||
enum SYS_F_GETSERVBYNAME = 3;
|
||||
enum SYS_F_SOCKET = 4;
|
||||
enum SYS_F_IOCTLSOCKET = 5;
|
||||
enum SYS_F_BIND = 6;
|
||||
enum SYS_F_LISTEN = 7;
|
||||
enum SYS_F_ACCEPT = 8;
|
||||
enum SYS_F_WSASTARTUP = 9; /* Winsock stuff */
|
||||
enum SYS_F_OPENDIR = 10;
|
||||
enum SYS_F_FREAD = 11;
|
||||
|
||||
|
||||
/* reasons */
|
||||
alias ERR_LIB_SYS ERR_R_SYS_LIB ; /* 2 */
|
||||
alias ERR_LIB_BN ERR_R_BN_LIB ; /* 3 */
|
||||
alias ERR_LIB_RSA ERR_R_RSA_LIB ; /* 4 */
|
||||
alias ERR_LIB_DH ERR_R_DH_LIB ; /* 5 */
|
||||
alias ERR_LIB_EVP ERR_R_EVP_LIB ; /* 6 */
|
||||
alias ERR_LIB_BUF ERR_R_BUF_LIB ; /* 7 */
|
||||
alias ERR_LIB_OBJ ERR_R_OBJ_LIB ; /* 8 */
|
||||
alias ERR_LIB_PEM ERR_R_PEM_LIB ; /* 9 */
|
||||
alias ERR_LIB_DSA ERR_R_DSA_LIB ; /* 10 */
|
||||
alias ERR_LIB_X509 ERR_R_X509_LIB ; /* 11 */
|
||||
alias ERR_LIB_ASN1 ERR_R_ASN1_LIB ; /* 13 */
|
||||
alias ERR_LIB_CONF ERR_R_CONF_LIB ; /* 14 */
|
||||
alias ERR_LIB_CRYPTO ERR_R_CRYPTO_LIB ; /* 15 */
|
||||
alias ERR_LIB_EC ERR_R_EC_LIB ; /* 16 */
|
||||
alias ERR_LIB_SSL ERR_R_SSL_LIB ; /* 20 */
|
||||
alias ERR_LIB_BIO ERR_R_BIO_LIB ; /* 32 */
|
||||
alias ERR_LIB_PKCS7 ERR_R_PKCS7_LIB ; /* 33 */
|
||||
alias ERR_LIB_X509V3 ERR_R_X509V3_LIB ; /* 34 */
|
||||
alias ERR_LIB_PKCS12 ERR_R_PKCS12_LIB ; /* 35 */
|
||||
alias ERR_LIB_RAND ERR_R_RAND_LIB ; /* 36 */
|
||||
alias ERR_LIB_DSO ERR_R_DSO_LIB ; /* 37 */
|
||||
alias ERR_LIB_ENGINE ERR_R_ENGINE_LIB ; /* 38 */
|
||||
alias ERR_LIB_OCSP ERR_R_OCSP_LIB ; /* 39 */
|
||||
alias ERR_LIB_UI ERR_R_UI_LIB ; /* 40 */
|
||||
alias ERR_LIB_COMP ERR_R_COMP_LIB ; /* 41 */
|
||||
alias ERR_LIB_ECDSA ERR_R_ECDSA_LIB ; /* 42 */
|
||||
alias ERR_LIB_ECDH ERR_R_ECDH_LIB ; /* 43 */
|
||||
alias ERR_LIB_STORE ERR_R_STORE_LIB ; /* 44 */
|
||||
alias ERR_LIB_TS ERR_R_TS_LIB ; /* 45 */
|
||||
|
||||
enum ERR_R_NESTED_ASN1_ERROR = 58;
|
||||
enum ERR_R_BAD_ASN1_OBJECT_HEADER = 59;
|
||||
enum ERR_R_BAD_GET_ASN1_OBJECT_CALL = 60;
|
||||
enum ERR_R_EXPECTING_AN_ASN1_SEQUENCE = 61;
|
||||
enum ERR_R_ASN1_LENGTH_MISMATCH = 62;
|
||||
enum ERR_R_MISSING_ASN1_EOS = 63;
|
||||
|
||||
/* fatal error */
|
||||
enum ERR_R_FATAL = 64;
|
||||
enum ERR_R_MALLOC_FAILURE = (1|ERR_R_FATAL);
|
||||
enum ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED = (2|ERR_R_FATAL);
|
||||
enum ERR_R_PASSED_NULL_PARAMETER = (3|ERR_R_FATAL);
|
||||
enum ERR_R_INTERNAL_ERROR = (4|ERR_R_FATAL);
|
||||
enum ERR_R_DISABLED = (5|ERR_R_FATAL);
|
||||
|
||||
/* 99 is the maximum possible ERR_R_... code, higher values
|
||||
* are reserved for the individual libraries */
|
||||
|
||||
|
||||
struct ERR_string_data_st {
|
||||
c_ulong error;
|
||||
const(char)* string;
|
||||
}
|
||||
alias ERR_string_data_st ERR_STRING_DATA;
|
||||
|
||||
void ERR_put_error(int lib, int func,int reason,const(char)* file,int line);
|
||||
void ERR_set_error_data(char* data,int flags);
|
||||
|
||||
c_ulong ERR_get_error();
|
||||
c_ulong ERR_get_error_line(const(char)** file,int* line);
|
||||
c_ulong ERR_get_error_line_data(const(char)** file,int* line,
|
||||
const(char)** data, int* flags);
|
||||
c_ulong ERR_peek_error();
|
||||
c_ulong ERR_peek_error_line(const(char)** file,int* line);
|
||||
c_ulong ERR_peek_error_line_data(const(char)** file,int* line,
|
||||
const(char)** data,int* flags);
|
||||
c_ulong ERR_peek_last_error();
|
||||
c_ulong ERR_peek_last_error_line(const(char)** file,int* line);
|
||||
c_ulong ERR_peek_last_error_line_data(const(char)** file,int* line,
|
||||
const(char)** data,int* flags);
|
||||
void ERR_clear_error();
|
||||
char* ERR_error_string(c_ulong e,char* buf);
|
||||
void ERR_error_string_n(c_ulong e, char* buf, size_t len);
|
||||
const(char)* ERR_lib_error_string(c_ulong e);
|
||||
const(char)* ERR_func_error_string(c_ulong e);
|
||||
const(char)* ERR_reason_error_string(c_ulong e);
|
||||
void ERR_print_errors_cb(ExternC!(int function(const(char)* str, size_t len, void* u)) cb,
|
||||
void* u);
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
void ERR_print_errors_fp(FILE* fp);
|
||||
}
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
void ERR_print_errors(BIO* bp);
|
||||
}
|
||||
void ERR_add_error_data(int num, ...);
|
||||
void ERR_add_error_vdata(int num, va_list args);
|
||||
void ERR_load_strings(int lib,ERR_STRING_DATA[] str);
|
||||
void ERR_unload_strings(int lib,ERR_STRING_DATA[] str);
|
||||
void ERR_load_ERR_strings();
|
||||
void ERR_load_crypto_strings();
|
||||
void ERR_free_strings();
|
||||
|
||||
void ERR_remove_thread_state(const(CRYPTO_THREADID)* tid);
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
void ERR_remove_state(c_ulong pid); /* if zero we look it up */
|
||||
}
|
||||
ERR_STATE* ERR_get_state();
|
||||
|
||||
version(OPENSSL_NO_LHASH) {} else {
|
||||
LHASH_OF!(ERR_STRING_DATA) *ERR_get_string_table();
|
||||
LHASH_OF!(ERR_STATE) *ERR_get_err_state_table();
|
||||
void ERR_release_err_state_table(LHASH_OF!(ERR_STATE) **hash);
|
||||
}
|
||||
|
||||
int ERR_get_next_error_library();
|
||||
|
||||
int ERR_set_mark();
|
||||
int ERR_pop_to_mark();
|
||||
|
||||
/* Already defined in ossl_typ.h */
|
||||
/* typedef st_ERR_FNS ERR_FNS; */
|
||||
/* An application can use this function and provide the return value to loaded
|
||||
* modules that should use the application's ERR state/functionality */
|
||||
const(ERR_FNS)* ERR_get_implementation();
|
||||
/* A loaded module should call this function prior to any ERR operations using
|
||||
* the application's "ERR_FNS". */
|
||||
int ERR_set_implementation(const(ERR_FNS)* fns);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,104 @@
|
|||
/* crypto/hmac/hmac.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
module deimos.openssl.hmac;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
version (OPENSSL_NO_HMAC) {
|
||||
static assert(false, "HMAC is disabled.");
|
||||
}
|
||||
|
||||
public import deimos.openssl.evp;
|
||||
|
||||
enum HMAC_MAX_MD_CBLOCK = 128; /* largest known is SHA512 */
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct hmac_ctx_st {
|
||||
const(EVP_MD)* md;
|
||||
EVP_MD_CTX md_ctx;
|
||||
EVP_MD_CTX i_ctx;
|
||||
EVP_MD_CTX o_ctx;
|
||||
uint key_length;
|
||||
ubyte[HMAC_MAX_MD_CBLOCK] key;
|
||||
}
|
||||
alias hmac_ctx_st HMAC_CTX;
|
||||
|
||||
auto HMAC_size()(HMAC_CTX* e) { return EVP_MD_size(e.md); }
|
||||
|
||||
|
||||
void HMAC_CTX_init(HMAC_CTX* ctx);
|
||||
void HMAC_CTX_cleanup(HMAC_CTX* ctx);
|
||||
|
||||
alias HMAC_CTX_cleanup HMAC_cleanup; /* deprecated */
|
||||
|
||||
int HMAC_Init(HMAC_CTX* ctx, const(void)* key, int len,
|
||||
const(EVP_MD)* md); /* deprecated */
|
||||
int HMAC_Init_ex(HMAC_CTX* ctx, const(void)* key, int len,
|
||||
const(EVP_MD)* md, ENGINE* impl);
|
||||
int HMAC_Update(HMAC_CTX* ctx, const(ubyte)* data, size_t len);
|
||||
int HMAC_Final(HMAC_CTX* ctx, ubyte* md, uint* len);
|
||||
ubyte* HMAC(const(EVP_MD)* evp_md, const(void)* key, int key_len,
|
||||
const(ubyte)* d, size_t n, ubyte* md,
|
||||
uint* md_len);
|
||||
int HMAC_CTX_copy(HMAC_CTX* dctx, HMAC_CTX* sctx);
|
||||
|
||||
void HMAC_CTX_set_flags(HMAC_CTX* ctx, c_ulong flags);
|
|
@ -0,0 +1,98 @@
|
|||
/* crypto/idea/idea.h */
|
||||
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.idea;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf; /* IDEA_INT, OPENSSL_NO_IDEA */
|
||||
|
||||
version (OPENSSL_NO_IDEA) {
|
||||
static assert(false, "IDEA is disabled.");
|
||||
}
|
||||
|
||||
enum IDEA_ENCRYPT = 1;
|
||||
enum IDEA_DECRYPT = 0;
|
||||
|
||||
enum IDEA_BLOCK = 8;
|
||||
enum IDEA_KEY_LENGTH = 16;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct idea_key_st {
|
||||
IDEA_INT[9][6] data;
|
||||
}
|
||||
alias idea_key_st IDEA_KEY_SCHEDULE;
|
||||
|
||||
const(char)* idea_options();
|
||||
void idea_ecb_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
IDEA_KEY_SCHEDULE* ks);
|
||||
version(OPENSSL_FIPS) {
|
||||
void private_idea_set_encrypt_key(const(ubyte)* key, IDEA_KEY_SCHEDULE* ks);
|
||||
}
|
||||
void idea_set_encrypt_key(const(ubyte)* key, IDEA_KEY_SCHEDULE* ks);
|
||||
void idea_set_decrypt_key(IDEA_KEY_SCHEDULE* ek, IDEA_KEY_SCHEDULE* dk);
|
||||
void idea_cbc_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, IDEA_KEY_SCHEDULE* ks, ubyte* iv,int enc);
|
||||
void idea_cfb64_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, IDEA_KEY_SCHEDULE* ks, ubyte* iv,
|
||||
int* num,int enc);
|
||||
void idea_ofb64_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, IDEA_KEY_SCHEDULE* ks, ubyte* iv, int* num);
|
||||
void idea_encrypt(c_ulong* in_, IDEA_KEY_SCHEDULE* ks);
|
|
@ -0,0 +1,252 @@
|
|||
/* krb5_asn.h */
|
||||
/* Written by Vern Staats <staatsvr@asc.hpc.mil> for the OpenSSL project,
|
||||
** using ocsp/{*.h,*asn*.c} as a starting point
|
||||
*/
|
||||
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.krb5_asn;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.asn1;
|
||||
|
||||
/*
|
||||
#include <krb5.h>
|
||||
*/
|
||||
public import deimos.openssl.safestack;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
|
||||
/* ASN.1 from Kerberos RFC 1510
|
||||
*/
|
||||
|
||||
/* EncryptedData ::= SEQUENCE {
|
||||
** etype[0] INTEGER, -- EncryptionType
|
||||
** kvno[1] INTEGER OPTIONAL,
|
||||
** cipher[2] OCTET STRING -- ciphertext
|
||||
** }
|
||||
*/
|
||||
struct krb5_encdata_st {
|
||||
ASN1_INTEGER* etype;
|
||||
ASN1_INTEGER* kvno;
|
||||
ASN1_OCTET_STRING* cipher;
|
||||
}
|
||||
alias krb5_encdata_st KRB5_ENCDATA;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_ENCDATA);+/
|
||||
|
||||
/* PrincipalName ::= SEQUENCE {
|
||||
** name-type[0] INTEGER,
|
||||
** name-string[1] SEQUENCE OF GeneralString
|
||||
** }
|
||||
*/
|
||||
struct krb5_princname_st {
|
||||
ASN1_INTEGER* nametype;
|
||||
STACK_OF!(ASN1_GENERALSTRING) *namestring;
|
||||
}
|
||||
alias krb5_princname_st KRB5_PRINCNAME;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_PRINCNAME);+/
|
||||
|
||||
|
||||
/* Ticket ::= [APPLICATION 1] SEQUENCE {
|
||||
** tkt-vno[0] INTEGER,
|
||||
** realm[1] Realm,
|
||||
** sname[2] PrincipalName,
|
||||
** enc-part[3] EncryptedData
|
||||
** }
|
||||
*/
|
||||
struct krb5_tktbody_st {
|
||||
ASN1_INTEGER* tktvno;
|
||||
ASN1_GENERALSTRING* realm;
|
||||
KRB5_PRINCNAME* sname;
|
||||
KRB5_ENCDATA* encdata;
|
||||
}
|
||||
alias krb5_tktbody_st KRB5_TKTBODY;
|
||||
|
||||
alias STACK_OF!(KRB5_TKTBODY) KRB5_TICKET;
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_TKTBODY);+/
|
||||
|
||||
|
||||
/* AP-REQ ::= [APPLICATION 14] SEQUENCE {
|
||||
** pvno[0] INTEGER,
|
||||
** msg-type[1] INTEGER,
|
||||
** ap-options[2] APOptions,
|
||||
** ticket[3] Ticket,
|
||||
** authenticator[4] EncryptedData
|
||||
** }
|
||||
**
|
||||
** APOptions ::= BIT STRING {
|
||||
** reserved(0), use-session-key(1), mutual-required(2) }
|
||||
*/
|
||||
struct krb5_ap_req_st {
|
||||
ASN1_INTEGER* pvno;
|
||||
ASN1_INTEGER* msgtype;
|
||||
ASN1_BIT_STRING* apoptions;
|
||||
KRB5_TICKET* ticket;
|
||||
KRB5_ENCDATA* authenticator;
|
||||
}
|
||||
alias krb5_ap_req_st KRB5_APREQBODY;
|
||||
|
||||
alias STACK_OF!(KRB5_APREQBODY) KRB5_APREQ;
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_APREQBODY);+/
|
||||
|
||||
|
||||
/* Authenticator Stuff */
|
||||
|
||||
|
||||
/* Checksum ::= SEQUENCE {
|
||||
** cksumtype[0] INTEGER,
|
||||
** checksum[1] OCTET STRING
|
||||
** }
|
||||
*/
|
||||
struct krb5_checksum_st {
|
||||
ASN1_INTEGER* ctype;
|
||||
ASN1_OCTET_STRING* checksum;
|
||||
}
|
||||
alias krb5_checksum_st KRB5_CHECKSUM;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_CHECKSUM);+/
|
||||
|
||||
|
||||
/* EncryptionKey ::= SEQUENCE {
|
||||
** keytype[0] INTEGER,
|
||||
** keyvalue[1] OCTET STRING
|
||||
** }
|
||||
*/
|
||||
struct krb5_encryptionkey_st {
|
||||
ASN1_INTEGER* ktype;
|
||||
ASN1_OCTET_STRING* keyvalue;
|
||||
}
|
||||
alias krb5_encryptionkey_st KRB5_ENCKEY;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_ENCKEY);+/
|
||||
|
||||
|
||||
/* AuthorizationData ::= SEQUENCE OF SEQUENCE {
|
||||
** ad-type[0] INTEGER,
|
||||
** ad-data[1] OCTET STRING
|
||||
** }
|
||||
*/
|
||||
struct krb5_authorization_st {
|
||||
ASN1_INTEGER* adtype;
|
||||
ASN1_OCTET_STRING* addata;
|
||||
}
|
||||
alias krb5_authorization_st KRB5_AUTHDATA;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_AUTHDATA);+/
|
||||
|
||||
|
||||
/* -- Unencrypted authenticator
|
||||
** Authenticator ::= [APPLICATION 2] SEQUENCE {
|
||||
** authenticator-vno[0] INTEGER,
|
||||
** crealm[1] Realm,
|
||||
** cname[2] PrincipalName,
|
||||
** cksum[3] Checksum OPTIONAL,
|
||||
** cusec[4] INTEGER,
|
||||
** ctime[5] KerberosTime,
|
||||
** subkey[6] EncryptionKey OPTIONAL,
|
||||
** seq-number[7] INTEGER OPTIONAL,
|
||||
** authorization-data[8] AuthorizationData OPTIONAL
|
||||
** }
|
||||
*/
|
||||
struct krb5_authenticator_st {
|
||||
ASN1_INTEGER* avno;
|
||||
ASN1_GENERALSTRING* crealm;
|
||||
KRB5_PRINCNAME* cname;
|
||||
KRB5_CHECKSUM* cksum;
|
||||
ASN1_INTEGER* cusec;
|
||||
ASN1_GENERALIZEDTIME* ctime;
|
||||
KRB5_ENCKEY* subkey;
|
||||
ASN1_INTEGER* seqnum;
|
||||
KRB5_AUTHDATA* authorization;
|
||||
}
|
||||
alias krb5_authenticator_st KRB5_AUTHENTBODY;
|
||||
|
||||
alias STACK_OF!(KRB5_AUTHENTBODY) KRB5_AUTHENT;
|
||||
/+mixin DECLARE_STACK_OF!(KRB5_AUTHENTBODY);+/
|
||||
|
||||
|
||||
/* DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) =
|
||||
** type* name##_new();
|
||||
** void name##_free(type* a);
|
||||
** DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) =
|
||||
** DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) =
|
||||
** type* d2i_##name(type** a, const(ubyte)** in_, c_long len);
|
||||
** int i2d_##name(type* a, ubyte** out_);
|
||||
** DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it
|
||||
*/
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_ENCDATA");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_PRINCNAME");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_TKTBODY");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_APREQBODY");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_TICKET");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_APREQ");
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_CHECKSUM");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_ENCKEY");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_AUTHDATA");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_AUTHENTBODY");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"KRB5_AUTHENT");
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
|
@ -0,0 +1,194 @@
|
|||
/* ssl/kssl.h -*- mode: C; c-file-style: "eay" -*- */
|
||||
/* Written by Vern Staats <staatsvr@asc.hpc.mil> for the OpenSSL project 2000.
|
||||
* 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).
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
** 19990701 VRS Started.
|
||||
*/
|
||||
|
||||
module deimos.openssl.kssl;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
|
||||
// FIXME: krb5.h port available, thus not yet usable.
|
||||
version (OPENSSL_NO_KRB5) {} else {
|
||||
|
||||
import core.stdc.stdio;
|
||||
// #include <ctype.h>
|
||||
// #include <krb5.h>
|
||||
// #ifdef OPENSSL_SYS_WIN32
|
||||
// /* These can sometimes get redefined indirectly by krb5 header files
|
||||
// * after they get undefed in ossl_typ.h
|
||||
// */
|
||||
// #undef X509_NAME
|
||||
// #undef X509_EXTENSIONS
|
||||
// #undef OCSP_REQUEST
|
||||
// #undef OCSP_RESPONSE
|
||||
// #endif
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/*
|
||||
** Depending on which KRB5 implementation used, some types from
|
||||
** the other may be missing. Resolve that here and now
|
||||
*/
|
||||
// #ifdef KRB5_HEIMDAL
|
||||
alias ubyte krb5_octet;
|
||||
// #define FAR
|
||||
// #else
|
||||
|
||||
//#ifndef FAR
|
||||
//#define FAR
|
||||
//#endif
|
||||
|
||||
|
||||
/* Uncomment this to debug kssl problems or
|
||||
** to trace usage of the Kerberos session key
|
||||
**
|
||||
** #define KSSL_DEBUG
|
||||
*/
|
||||
|
||||
// #ifndef KRB5SVC
|
||||
enum KRB5SVC = "host";
|
||||
// #endif
|
||||
|
||||
// #ifndef KRB5KEYTAB
|
||||
enum KRB5KEYTAB = "/etc/krb5.keytab";
|
||||
// #endif
|
||||
|
||||
// #ifndef KRB5SENDAUTH
|
||||
enum KRB5SENDAUTH = 1;
|
||||
// #endif
|
||||
|
||||
// #ifndef KRB5CHECKAUTH
|
||||
enum KRB5CHECKAUTH = 1;
|
||||
// #endif
|
||||
|
||||
// #ifndef KSSL_CLOCKSKEW
|
||||
enum KSSL_CLOCKSKEW = 300;;
|
||||
// #endif
|
||||
|
||||
enum KSSL_ERR_MAX = 255;
|
||||
struct kssl_err_st {
|
||||
int reason;
|
||||
char[KSSL_ERR_MAX+1] text;
|
||||
}
|
||||
alias kssl_err_st KSSL_ERR;
|
||||
|
||||
|
||||
|
||||
// FIXME: krb5.h not available, thus just declare an opaque type.
|
||||
struct KSSL_CTX;
|
||||
/+
|
||||
/* Context for passing
|
||||
** (1) Kerberos session key to SSL, and
|
||||
** (2) Config data between application and SSL lib
|
||||
*/
|
||||
struct kssl_ctx_st {
|
||||
/* used by: disposition: */
|
||||
char* service_name; /* C,S default ok (kssl) */
|
||||
char* service_host; /* C input, REQUIRED */
|
||||
char* client_princ; /* S output from krb5 ticket */
|
||||
char* keytab_file; /* S NULL (/etc/krb5.keytab) */
|
||||
char* cred_cache; /* C NULL (default) */
|
||||
krb5_enctype enctype;
|
||||
int length;
|
||||
krb5_octet* key;
|
||||
}
|
||||
alias kssl_ctx_st KSSL_CTX;
|
||||
+/
|
||||
|
||||
enum KSSL_CLIENT = 1;
|
||||
enum KSSL_SERVER = 2;
|
||||
enum KSSL_SERVICE = 3;
|
||||
enum KSSL_KEYTAB = 4;
|
||||
|
||||
enum KSSL_CTX_OK = 0;
|
||||
enum KSSL_CTX_ERR = 1;
|
||||
enum KSSL_NOMEM = 2;
|
||||
|
||||
/* Public (for use by applications that use OpenSSL with Kerberos 5 support */
|
||||
// FIXME: krb5.h not available.
|
||||
/+krb5_error_code kssl_ctx_setstring(KSSL_CTX* kssl_ctx, int which, char* text);
|
||||
KSSL_CTX* kssl_ctx_new();
|
||||
KSSL_CTX* kssl_ctx_free(KSSL_CTX* kssl_ctx);
|
||||
void kssl_ctx_show(KSSL_CTX* kssl_ctx);
|
||||
krb5_error_code kssl_ctx_setprinc(KSSL_CTX* kssl_ctx, int which,
|
||||
krb5_data* realm, krb5_data* entity, int nentities);
|
||||
krb5_error_code kssl_cget_tkt(KSSL_CTX* kssl_ctx, krb5_data** enc_tktp,
|
||||
krb5_data* authenp, KSSL_ERR* kssl_err);
|
||||
krb5_error_code kssl_sget_tkt(KSSL_CTX* kssl_ctx, krb5_data* indata,
|
||||
krb5_ticket_times* ttimes, KSSL_ERR* kssl_err);
|
||||
krb5_error_code kssl_ctx_setkey(KSSL_CTX* kssl_ctx, krb5_keyblock* session);
|
||||
void kssl_err_set(KSSL_ERR* kssl_err, int reason, char* text);
|
||||
void kssl_krb5_free_data_contents(krb5_context context, krb5_data* data);
|
||||
krb5_error_code kssl_build_principal_2(krb5_context context,
|
||||
krb5_principal* princ, int rlen, const(char)* realm,
|
||||
int slen, const(char)* svc, int hlen, const(char)* host);
|
||||
krb5_error_code kssl_validate_times(krb5_timestamp atime,
|
||||
krb5_ticket_times* ttimes);
|
||||
krb5_error_code kssl_check_authent(KSSL_CTX* kssl_ctx, krb5_data* authentp,
|
||||
krb5_timestamp* atimep, KSSL_ERR* kssl_err);
|
||||
ubyte* kssl_skip_confound(krb5_enctype enctype, ubyte* authn);+/
|
||||
|
||||
import deimos.openssl.ssl : SSL;
|
||||
void SSL_set0_kssl_ctx(SSL* s, KSSL_CTX* kctx);
|
||||
KSSL_CTX* SSL_get0_kssl_ctx(SSL* s);
|
||||
char* kssl_ctx_get0_client_princ(KSSL_CTX* kctx);
|
||||
|
||||
}
|
|
@ -0,0 +1,242 @@
|
|||
/* crypto/lhash/lhash.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
/* Header for dynamic hash table routines
|
||||
* Author - Eric Young
|
||||
*/
|
||||
|
||||
module deimos.openssl.lhash;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
import core.stdc.stdio;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct lhash_node_st {
|
||||
void* data;
|
||||
lhash_node_st* next;
|
||||
version(OPENSSL_NO_HASH_COMP) {} else {
|
||||
c_ulong hash;
|
||||
}
|
||||
}
|
||||
alias lhash_node_st LHASH_NODE;
|
||||
|
||||
alias ExternC!(int function(const(void)*, const(void)*)) LHASH_COMP_FN_TYPE;
|
||||
alias ExternC!(c_ulong function(const(void)*)) LHASH_HASH_FN_TYPE;
|
||||
alias ExternC!(void function(void*)) LHASH_DOALL_FN_TYPE;
|
||||
alias ExternC!(void function(void*, void*)) LHASH_DOALL_ARG_FN_TYPE;
|
||||
|
||||
/* Macros for declaring and implementing type-safe wrappers for LHASH callbacks.
|
||||
* This way, callbacks can be provided to LHASH structures without function
|
||||
* pointer casting and the macro-defined callbacks provide per-variable casting
|
||||
* before deferring to the underlying type-specific callbacks. NB: It is
|
||||
* possible to place a "static" in front of both the DECLARE and IMPLEMENT
|
||||
* macros if the functions are strictly internal. */
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
/* First: "hash" functions */
|
||||
#define DECLARE_LHASH_HASH_FN(name, o_type) \
|
||||
c_ulong name##_LHASH_HASH(const(void)*);
|
||||
#define IMPLEMENT_LHASH_HASH_FN(name, o_type) \
|
||||
c_ulong name##_LHASH_HASH(const(void)* arg) { \
|
||||
const(o_type)* a = arg; \
|
||||
return name##_hash(a); }
|
||||
#define LHASH_HASH_FN(name) name##_LHASH_HASH
|
||||
|
||||
/* Second: "compare" functions */
|
||||
#define DECLARE_LHASH_COMP_FN(name, o_type) \
|
||||
int name##_LHASH_COMP(const(void)*, const(void)*);
|
||||
#define IMPLEMENT_LHASH_COMP_FN(name, o_type) \
|
||||
int name##_LHASH_COMP(const(void)* arg1, const(void)* arg2) { \
|
||||
const(o_type)* a = arg1; \
|
||||
const(o_type)* b = arg2; \
|
||||
return name##_cmp(a,b); }
|
||||
#define LHASH_COMP_FN(name) name##_LHASH_COMP
|
||||
|
||||
/* Third: "doall" functions */
|
||||
#define DECLARE_LHASH_DOALL_FN(name, o_type) \
|
||||
void name##_LHASH_DOALL(void*);
|
||||
#define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \
|
||||
void name##_LHASH_DOALL(void* arg) { \
|
||||
o_type* a = arg; \
|
||||
name##_doall(a); }
|
||||
#define LHASH_DOALL_FN(name) name##_LHASH_DOALL
|
||||
|
||||
/* Fourth: "doall_arg" functions */
|
||||
#define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \
|
||||
void name##_LHASH_DOALL_ARG(void*, void*);
|
||||
#define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \
|
||||
void name##_LHASH_DOALL_ARG(void* arg1, void* arg2) { \
|
||||
o_type* a = arg1; \
|
||||
a_type* b = arg2; \
|
||||
name##_doall_arg(a, b); }
|
||||
#define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG
|
||||
+/
|
||||
|
||||
struct lhash_st {
|
||||
LHASH_NODE** b;
|
||||
LHASH_COMP_FN_TYPE comp;
|
||||
LHASH_HASH_FN_TYPE hash;
|
||||
uint num_nodes;
|
||||
uint num_alloc_nodes;
|
||||
uint p;
|
||||
uint pmax;
|
||||
c_ulong up_load; /* load times 256 */
|
||||
c_ulong down_load; /* load times 256 */
|
||||
c_ulong num_items;
|
||||
|
||||
c_ulong num_expands;
|
||||
c_ulong num_expand_reallocs;
|
||||
c_ulong num_contracts;
|
||||
c_ulong num_contract_reallocs;
|
||||
c_ulong num_hash_calls;
|
||||
c_ulong num_comp_calls;
|
||||
c_ulong num_insert;
|
||||
c_ulong num_replace;
|
||||
c_ulong num_delete;
|
||||
c_ulong num_no_delete;
|
||||
c_ulong num_retrieve;
|
||||
c_ulong num_retrieve_miss;
|
||||
c_ulong num_hash_comps;
|
||||
|
||||
int error;
|
||||
}
|
||||
alias lhash_st _LHASH; /* Do not use _LHASH directly, use LHASH_OF
|
||||
* and friends */
|
||||
|
||||
enum LH_LOAD_MULT = 256;
|
||||
|
||||
/* Indicates a malloc() error in the last call, this is only bad
|
||||
* in lh_insert(). */
|
||||
auto lh_error()(_LHASH* lh) { return lh.error; }
|
||||
|
||||
_LHASH* lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c);
|
||||
void lh_free(_LHASH* lh);
|
||||
void* lh_insert(_LHASH* lh, void* data);
|
||||
void* lh_delete(_LHASH* lh, const(void)* data);
|
||||
void* lh_retrieve(_LHASH* lh, const(void)* data);
|
||||
void lh_doall(_LHASH* lh, LHASH_DOALL_FN_TYPE func);
|
||||
void lh_doall_arg(_LHASH* lh, LHASH_DOALL_ARG_FN_TYPE func, void* arg);
|
||||
c_ulong lh_strhash(const(char)* c);
|
||||
c_ulong lh_num_items(const(_LHASH)* lh);
|
||||
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
void lh_stats(const(_LHASH)* lh, FILE* out_);
|
||||
void lh_node_stats(const(_LHASH)* lh, FILE* out_);
|
||||
void lh_node_usage_stats(const(_LHASH)* lh, FILE* out_);
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
void lh_stats_bio(const(_LHASH)* lh, BIO* out_);
|
||||
void lh_node_stats_bio(const(_LHASH)* lh, BIO* out_);
|
||||
void lh_node_usage_stats_bio(const(_LHASH)* lh, BIO* out_);
|
||||
}
|
||||
|
||||
/* Type checking... */
|
||||
|
||||
struct LHASH_OF (type) {
|
||||
int dummy;
|
||||
}
|
||||
|
||||
// Empty because we use LHASH_OF directly as a struct.
|
||||
mixin template DECLARE_LHASH_OF (type) {}
|
||||
|
||||
auto CHECKED_LHASH_OF (type)(LHASH_OF!type* lh) {
|
||||
return cast(_LHASH*)CHECKED_PTR_OF!(LHASH_OF!type)(lh);
|
||||
}
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
/* Define wrapper functions. */
|
||||
#define LHM_lh_new(type, name) \
|
||||
((LHASH_OF!(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name)))
|
||||
#define LHM_lh_error(type, lh) \
|
||||
lh_error(CHECKED_LHASH_OF(type,lh))
|
||||
#define LHM_lh_insert(type, lh, inst) \
|
||||
((type*)lh_insert(CHECKED_LHASH_OF(type, lh), \
|
||||
CHECKED_PTR_OF(type, inst)))
|
||||
#define LHM_lh_retrieve(type, lh, inst) \
|
||||
((type*)lh_retrieve(CHECKED_LHASH_OF(type, lh), \
|
||||
CHECKED_PTR_OF(type, inst)))
|
||||
#define LHM_lh_delete(type, lh, inst) \
|
||||
((type*)lh_delete(CHECKED_LHASH_OF(type, lh), \
|
||||
CHECKED_PTR_OF(type, inst)))
|
||||
#define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn)
|
||||
#define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \
|
||||
lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg))
|
||||
#define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh))
|
||||
#define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load)
|
||||
#define LHM_lh_node_stats_bio(type, lh, out_) \
|
||||
lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out_)
|
||||
#define LHM_lh_node_usage_stats_bio(type, lh, out_) \
|
||||
lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out_)
|
||||
#define LHM_lh_stats_bio(type, lh, out_) \
|
||||
lh_stats_bio(CHECKED_LHASH_OF(type, lh), out_)
|
||||
#define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh))
|
||||
|
||||
mixin DECLARE_LHASH_OF!(OPENSSL_STRING);
|
||||
mixin DECLARE_LHASH_OF!(OPENSSL_CSTRING);
|
||||
+/
|
|
@ -0,0 +1,116 @@
|
|||
/* crypto/md4/md4.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.md4;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
import core.stdc.config;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_NO_MD4) {
|
||||
static assert(false, "MD4 is disabled.");
|
||||
}
|
||||
|
||||
/*
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
* ! MD4_LONG has to be at least 32 bits wide. If it's wider, then !
|
||||
* ! MD4_LONG_LOG2 has to be defined along. !
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
*/
|
||||
|
||||
// #if defined(__LP32__)
|
||||
// alias c_ulong MD4_LONG;
|
||||
// #elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
|
||||
// alias c_ulong MD4_LONG;
|
||||
// enum MD4_LONG_LOG2 = 3;
|
||||
// /*
|
||||
// * _CRAY note. I could declare short, but I have no idea what impact
|
||||
// * does it have on performance on none-T3E machines. I could declare
|
||||
// * int, but at least on C90 sizeof(int) can be chosen at compile time.
|
||||
// * So I've chosen long...
|
||||
// * <appro@fy.chalmers.se>
|
||||
// */
|
||||
// #else
|
||||
// alias uint MD4_LONG;
|
||||
// #endif
|
||||
alias uint MD4_LONG;
|
||||
|
||||
enum MD4_CBLOCK = 64;
|
||||
enum MD4_LBLOCK = (MD4_CBLOCK/4);
|
||||
enum MD4_DIGEST_LENGTH = 16;
|
||||
|
||||
struct MD4state_st {
|
||||
MD4_LONG A,B,C,D;
|
||||
MD4_LONG Nl,Nh;
|
||||
MD4_LONG[MD4_LBLOCK] data;
|
||||
uint num;
|
||||
}
|
||||
alias MD4state_st MD4_CTX;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_MD4_Init(MD4_CTX* c);
|
||||
}
|
||||
int MD4_Init(MD4_CTX* c);
|
||||
int MD4_Update(MD4_CTX* c, const(void)* data, size_t len);
|
||||
int MD4_Final(ubyte* md, MD4_CTX* c);
|
||||
ubyte* MD4(const(ubyte)* d, size_t n, ubyte* md);
|
||||
void MD4_Transform(MD4_CTX* c, const(ubyte)* b);
|
|
@ -0,0 +1,116 @@
|
|||
/* crypto/md5/md5.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.md5;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
import core.stdc.config;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_NO_MD5) {
|
||||
static assert(false, "MD5 is disabled.");
|
||||
}
|
||||
|
||||
/*
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
* ! MD5_LONG has to be at least 32 bits wide. If it's wider, then !
|
||||
* ! MD5_LONG_LOG2 has to be defined along. !
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
*/
|
||||
|
||||
// #if defined(__LP32__)
|
||||
// alias c_ulong MD5_LONG;
|
||||
// #elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
|
||||
// alias c_ulong MD5_LONG;
|
||||
// enum MD5_LONG_LOG2 = 3;
|
||||
// /*
|
||||
// * _CRAY note. I could declare short, but I have no idea what impact
|
||||
// * does it have on performance on none-T3E machines. I could declare
|
||||
// * int, but at least on C90 sizeof(int) can be chosen at compile time.
|
||||
// * So I've chosen long...
|
||||
// * <appro@fy.chalmers.se>
|
||||
// */
|
||||
// #else
|
||||
// alias uint MD5_LONG;
|
||||
// #endif
|
||||
alias uint MD5_LONG;
|
||||
|
||||
enum MD5_CBLOCK = 64;
|
||||
enum MD5_LBLOCK = (MD5_CBLOCK/4);
|
||||
enum MD5_DIGEST_LENGTH = 16;
|
||||
|
||||
struct MD5state_st {
|
||||
MD5_LONG A,B,C,D;
|
||||
MD5_LONG Nl,Nh;
|
||||
MD5_LONG[MD5_LBLOCK] data;
|
||||
uint num;
|
||||
}
|
||||
alias MD5state_st MD5_CTX;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_MD5_Init(MD5_CTX* c);
|
||||
}
|
||||
int MD5_Init(MD5_CTX* c);
|
||||
int MD5_Update(MD5_CTX* c, const(void)* data, size_t len);
|
||||
int MD5_Final(ubyte* md, MD5_CTX* c);
|
||||
ubyte* MD5(const(ubyte)* d, size_t n, ubyte* md);
|
||||
void MD5_Transform(MD5_CTX* c, const(ubyte)* b);
|
|
@ -0,0 +1,91 @@
|
|||
/* crypto/mdc2/mdc2.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.mdc2;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.des;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_NO_MDC2) {
|
||||
static assert(false, "MDC2 is disabled.");
|
||||
}
|
||||
|
||||
enum MDC2_BLOCK = 8;
|
||||
enum MDC2_DIGEST_LENGTH = 16;
|
||||
|
||||
struct mdc2_ctx_st {
|
||||
uint num;
|
||||
ubyte[MDC2_BLOCK] data;
|
||||
DES_cblock h,hh;
|
||||
int pad_type; /* either 1 or 2, default 1 */
|
||||
}
|
||||
alias mdc2_ctx_st MDC2_CTX;
|
||||
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_MDC2_Init(MDC2_CTX* c);
|
||||
}
|
||||
int MDC2_Init(MDC2_CTX* c);
|
||||
int MDC2_Update(MDC2_CTX* c, const(ubyte)* data, size_t len);
|
||||
int MDC2_Final(ubyte* md, MDC2_CTX* c);
|
||||
ubyte* MDC2(const(ubyte)* d, size_t n,
|
||||
ubyte* md);
|
|
@ -0,0 +1,141 @@
|
|||
/* ====================================================================
|
||||
* Copyright (c) 2008 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Rights for redistribution and usage in source and binary
|
||||
* forms are granted according to the OpenSSL license.
|
||||
*/
|
||||
module deimos.openssl.modes;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import core.stdc.config;
|
||||
|
||||
alias ExternC!(void function(const(ubyte[16])* in_,
|
||||
ubyte[16]* out_,
|
||||
const(void)* key)) block128_f;
|
||||
|
||||
alias ExternC!(void function(const(ubyte)* in_, ubyte* out_,
|
||||
size_t blocks, const(void)* key,
|
||||
const(ubyte[16])* ivec)) ctr128_f;
|
||||
|
||||
alias ExternC!(void function(const(ubyte)* in_, ubyte* out_,
|
||||
size_t blocks, const(void)* key,
|
||||
const(ubyte[16])* ivec, ubyte[16]* cmac)) ccm128_f;
|
||||
|
||||
alias ExternC!(void function(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, int enc)) cbc128_f;
|
||||
|
||||
void CRYPTO_cbc128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, block128_f block);
|
||||
void CRYPTO_cbc128_decrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, block128_f block);
|
||||
|
||||
void CRYPTO_ctr128_encrypt_ctr32(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, ubyte[16]* ecount_buf,
|
||||
uint *num, ctr128_f ctr);
|
||||
|
||||
void CRYPTO_ctr128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, ubyte[16]* ecount_buf,
|
||||
uint* num, block128_f block);
|
||||
|
||||
void CRYPTO_ofb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, int* num,
|
||||
block128_f block);
|
||||
|
||||
void CRYPTO_cfb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, int* num,
|
||||
int enc, block128_f block);
|
||||
void CRYPTO_cfb128_8_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t length, const(void)* key,
|
||||
ubyte[16]* ivec, int* num,
|
||||
int enc, block128_f block);
|
||||
void CRYPTO_cfb128_1_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t bits, const(void)* key,
|
||||
ubyte[16]* ivec, int* num,
|
||||
int enc, block128_f block);
|
||||
|
||||
size_t CRYPTO_cts128_encrypt_block(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, block128_f block);
|
||||
size_t CRYPTO_cts128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, cbc128_f cbc);
|
||||
size_t CRYPTO_cts128_decrypt_block(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, block128_f block);
|
||||
size_t CRYPTO_cts128_decrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(void)* key,
|
||||
ubyte[16]* ivec, cbc128_f cbc);
|
||||
|
||||
size_t CRYPTO_nistcts128_encrypt_block(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const void *key,
|
||||
ubyte[16]* ivec, block128_f block);
|
||||
size_t CRYPTO_nistcts128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const void *key,
|
||||
ubyte[16]* ivec, cbc128_f cbc);
|
||||
size_t CRYPTO_nistcts128_decrypt_block(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const void *key,
|
||||
ubyte[16]* ivec, block128_f block);
|
||||
size_t CRYPTO_nistcts128_decrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const void *key,
|
||||
ubyte[16]* ivec, cbc128_f cbc);
|
||||
|
||||
struct gcm128_context;
|
||||
alias gcm128_context GCM128_CONTEXT;
|
||||
|
||||
GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block);
|
||||
void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx,void *key,block128_f block);
|
||||
void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const(ubyte)* iv,
|
||||
size_t len);
|
||||
int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const(ubyte)* aad,
|
||||
size_t len);
|
||||
int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx,
|
||||
const(ubyte)* in_, ubyte* out_,
|
||||
size_t len);
|
||||
int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx,
|
||||
const(ubyte)* in_, ubyte* out_,
|
||||
size_t len);
|
||||
int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx,
|
||||
const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, ctr128_f stream);
|
||||
int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx,
|
||||
const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, ctr128_f stream);
|
||||
int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx,const(ubyte)* tag,
|
||||
size_t len);
|
||||
void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, ubyte* tag, size_t len);
|
||||
void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx);
|
||||
|
||||
struct ccm128_context;
|
||||
alias ccm128_context CCM128_CONTEXT;
|
||||
|
||||
void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx,
|
||||
uint M, uint L, void *key,block128_f block);
|
||||
int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx,
|
||||
const(ubyte)* nonce, size_t nlen, size_t mlen);
|
||||
void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx,
|
||||
const(ubyte)* aad, size_t alen);
|
||||
int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx,
|
||||
const(ubyte)* inp, ubyte* out_, size_t len);
|
||||
int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx,
|
||||
const(ubyte)* inp, ubyte* out_, size_t len);
|
||||
int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx,
|
||||
const(ubyte)* inp, ubyte* out_, size_t len,
|
||||
ccm128_f stream);
|
||||
int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx,
|
||||
const(ubyte)* inp, ubyte* out_, size_t len,
|
||||
ccm128_f stream);
|
||||
size_t CRYPTO_ccm128_tag(CCM128_CONTEXT* ctx, ubyte* tag, size_t len);
|
||||
|
||||
struct xts128_context;
|
||||
alias xts128_context XTS128_CONTEXT;
|
||||
|
||||
int CRYPTO_xts128_encrypt(const(XTS128_CONTEXT)* ctx, const(ubyte[16])* iv,
|
||||
const(ubyte)* inp, ubyte* out_, size_t len, int enc);
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,624 @@
|
|||
/* ocsp.h */
|
||||
/* Written by Tom Titchener <Tom_Titchener@groove.net> for the OpenSSL
|
||||
* project. */
|
||||
|
||||
/* History:
|
||||
This file was transfered to Richard Levitte from CertCo by Kathy
|
||||
Weinhold in mid-spring 2000 to be included in OpenSSL or released
|
||||
as a patch kit. */
|
||||
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.ocsp;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.ossl_typ;
|
||||
public import deimos.openssl.x509;
|
||||
public import deimos.openssl.x509v3;
|
||||
public import deimos.openssl.safestack;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Various flags and values */
|
||||
|
||||
enum OCSP_DEFAULT_NONCE_LENGTH = 16;
|
||||
|
||||
enum OCSP_NOCERTS = 0x1;
|
||||
enum OCSP_NOINTERN = 0x2;
|
||||
enum OCSP_NOSIGS = 0x4;
|
||||
enum OCSP_NOCHAIN = 0x8;
|
||||
enum OCSP_NOVERIFY = 0x10;
|
||||
enum OCSP_NOEXPLICIT = 0x20;
|
||||
enum OCSP_NOCASIGN = 0x40;
|
||||
enum OCSP_NODELEGATED = 0x80;
|
||||
enum OCSP_NOCHECKS = 0x100;
|
||||
enum OCSP_TRUSTOTHER = 0x200;
|
||||
enum OCSP_RESPID_KEY = 0x400;
|
||||
enum OCSP_NOTIME = 0x800;
|
||||
|
||||
/* CertID ::= SEQUENCE {
|
||||
* hashAlgorithm AlgorithmIdentifier,
|
||||
* issuerNameHash OCTET STRING, -- Hash of Issuer's DN
|
||||
* issuerKeyHash OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields)
|
||||
* serialNumber CertificateSerialNumber }
|
||||
*/
|
||||
struct ocsp_cert_id_st {
|
||||
X509_ALGOR* hashAlgorithm;
|
||||
ASN1_OCTET_STRING* issuerNameHash;
|
||||
ASN1_OCTET_STRING* issuerKeyHash;
|
||||
ASN1_INTEGER* serialNumber;
|
||||
}
|
||||
alias ocsp_cert_id_st OCSP_CERTID;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(OCSP_CERTID);+/
|
||||
|
||||
/* Request ::= SEQUENCE {
|
||||
* reqCert CertID,
|
||||
* singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }
|
||||
*/
|
||||
struct ocsp_one_request_st {
|
||||
OCSP_CERTID* reqCert;
|
||||
STACK_OF!(X509_EXTENSION) *singleRequestExtensions;
|
||||
}
|
||||
alias ocsp_one_request_st OCSP_ONEREQ;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(OCSP_ONEREQ);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(OCSP_ONEREQ);
|
||||
|
||||
|
||||
/* TBSRequest ::= SEQUENCE {
|
||||
* version [0] EXPLICIT Version DEFAULT v1,
|
||||
* requestorName [1] EXPLICIT GeneralName OPTIONAL,
|
||||
* requestList SEQUENCE OF Request,
|
||||
* requestExtensions [2] EXPLICIT Extensions OPTIONAL }
|
||||
*/
|
||||
struct ocsp_req_info_st {
|
||||
ASN1_INTEGER* version_;
|
||||
GENERAL_NAME* requestorName;
|
||||
STACK_OF!(OCSP_ONEREQ) *requestList;
|
||||
STACK_OF!(X509_EXTENSION) *requestExtensions;
|
||||
}
|
||||
alias ocsp_req_info_st OCSP_REQINFO;
|
||||
|
||||
/* Signature ::= SEQUENCE {
|
||||
* signatureAlgorithm AlgorithmIdentifier,
|
||||
* signature BIT STRING,
|
||||
* certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
|
||||
*/
|
||||
struct ocsp_signature_st {
|
||||
X509_ALGOR* signatureAlgorithm;
|
||||
ASN1_BIT_STRING* signature;
|
||||
STACK_OF!(X509) *certs;
|
||||
}
|
||||
alias ocsp_signature_st OCSP_SIGNATURE;
|
||||
|
||||
/* OCSPRequest ::= SEQUENCE {
|
||||
* tbsRequest TBSRequest,
|
||||
* optionalSignature [0] EXPLICIT Signature OPTIONAL }
|
||||
*/
|
||||
struct ocsp_request_st {
|
||||
OCSP_REQINFO* tbsRequest;
|
||||
OCSP_SIGNATURE* optionalSignature; /* OPTIONAL */
|
||||
}
|
||||
alias ocsp_request_st OCSP_REQUEST;
|
||||
|
||||
/* OCSPResponseStatus ::= ENUMERATED {
|
||||
* successful (0), --Response has valid confirmations
|
||||
* malformedRequest (1), --Illegal confirmation request
|
||||
* internalError (2), --Internal error in issuer
|
||||
* tryLater (3), --Try again later
|
||||
* --(4) is not used
|
||||
* sigRequired (5), --Must sign the request
|
||||
* unauthorized (6) --Request unauthorized
|
||||
* }
|
||||
*/
|
||||
enum OCSP_RESPONSE_STATUS_SUCCESSFUL = 0;
|
||||
enum OCSP_RESPONSE_STATUS_MALFORMEDREQUEST = 1;
|
||||
enum OCSP_RESPONSE_STATUS_INTERNALERROR = 2;
|
||||
enum OCSP_RESPONSE_STATUS_TRYLATER = 3;
|
||||
enum OCSP_RESPONSE_STATUS_SIGREQUIRED = 5;
|
||||
enum OCSP_RESPONSE_STATUS_UNAUTHORIZED = 6;
|
||||
|
||||
/* ResponseBytes ::= SEQUENCE {
|
||||
* responseType OBJECT IDENTIFIER,
|
||||
* response OCTET STRING }
|
||||
*/
|
||||
struct ocsp_resp_bytes_st {
|
||||
ASN1_OBJECT* responseType;
|
||||
ASN1_OCTET_STRING* response;
|
||||
}
|
||||
alias ocsp_resp_bytes_st OCSP_RESPBYTES;
|
||||
|
||||
/* OCSPResponse ::= SEQUENCE {
|
||||
* responseStatus OCSPResponseStatus,
|
||||
* responseBytes [0] EXPLICIT ResponseBytes OPTIONAL }
|
||||
*/
|
||||
struct ocsp_response_st
|
||||
{
|
||||
ASN1_ENUMERATED* responseStatus;
|
||||
OCSP_RESPBYTES* responseBytes;
|
||||
};
|
||||
|
||||
/* ResponderID ::= CHOICE {
|
||||
* byName [1] Name,
|
||||
* byKey [2] KeyHash }
|
||||
*/
|
||||
enum V_OCSP_RESPID_NAME = 0;
|
||||
enum V_OCSP_RESPID_KEY = 1;
|
||||
struct ocsp_responder_id_st
|
||||
{
|
||||
int type;
|
||||
union value_ {
|
||||
X509_NAME* byName;
|
||||
ASN1_OCTET_STRING* byKey;
|
||||
}
|
||||
value_ value;
|
||||
};
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(OCSP_RESPID);+/
|
||||
// Already declared above
|
||||
// mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_RESPID");
|
||||
|
||||
/* KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key
|
||||
* --(excluding the tag and length fields)
|
||||
*/
|
||||
|
||||
/* RevokedInfo ::= SEQUENCE {
|
||||
* revocationTime GeneralizedTime,
|
||||
* revocationReason [0] EXPLICIT CRLReason OPTIONAL }
|
||||
*/
|
||||
struct ocsp_revoked_info_st {
|
||||
ASN1_GENERALIZEDTIME* revocationTime;
|
||||
ASN1_ENUMERATED* revocationReason;
|
||||
}
|
||||
alias ocsp_revoked_info_st OCSP_REVOKEDINFO;
|
||||
|
||||
/* CertStatus ::= CHOICE {
|
||||
* good [0] IMPLICIT NULL,
|
||||
* revoked [1] IMPLICIT RevokedInfo,
|
||||
* unknown [2] IMPLICIT UnknownInfo }
|
||||
*/
|
||||
enum V_OCSP_CERTSTATUS_GOOD = 0;
|
||||
enum V_OCSP_CERTSTATUS_REVOKED = 1;
|
||||
enum V_OCSP_CERTSTATUS_UNKNOWN = 2;
|
||||
struct ocsp_cert_status_st
|
||||
{
|
||||
int type;
|
||||
union value_ {
|
||||
ASN1_NULL* good;
|
||||
OCSP_REVOKEDINFO* revoked;
|
||||
ASN1_NULL* unknown;
|
||||
}
|
||||
value_ value;
|
||||
}
|
||||
alias ocsp_cert_status_st OCSP_CERTSTATUS;
|
||||
|
||||
/* SingleResponse ::= SEQUENCE {
|
||||
* certID CertID,
|
||||
* certStatus CertStatus,
|
||||
* thisUpdate GeneralizedTime,
|
||||
* nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
|
||||
* singleExtensions [1] EXPLICIT Extensions OPTIONAL }
|
||||
*/
|
||||
struct ocsp_single_response_st {
|
||||
OCSP_CERTID* certId;
|
||||
OCSP_CERTSTATUS* certStatus;
|
||||
ASN1_GENERALIZEDTIME* thisUpdate;
|
||||
ASN1_GENERALIZEDTIME* nextUpdate;
|
||||
STACK_OF!(X509_EXTENSION) *singleExtensions;
|
||||
}
|
||||
alias ocsp_single_response_st OCSP_SINGLERESP;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(OCSP_SINGLERESP);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(OCSP_SINGLERESP);
|
||||
|
||||
/* ResponseData ::= SEQUENCE {
|
||||
* version [0] EXPLICIT Version DEFAULT v1,
|
||||
* responderID ResponderID,
|
||||
* producedAt GeneralizedTime,
|
||||
* responses SEQUENCE OF SingleResponse,
|
||||
* responseExtensions [1] EXPLICIT Extensions OPTIONAL }
|
||||
*/
|
||||
struct ocsp_response_data_st {
|
||||
ASN1_INTEGER* version_;
|
||||
OCSP_RESPID* responderId;
|
||||
ASN1_GENERALIZEDTIME* producedAt;
|
||||
STACK_OF!(OCSP_SINGLERESP) *responses;
|
||||
STACK_OF!(X509_EXTENSION) *responseExtensions;
|
||||
}
|
||||
alias ocsp_response_data_st OCSP_RESPDATA;
|
||||
|
||||
/* BasicOCSPResponse ::= SEQUENCE {
|
||||
* tbsResponseData ResponseData,
|
||||
* signatureAlgorithm AlgorithmIdentifier,
|
||||
* signature BIT STRING,
|
||||
* certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
|
||||
*/
|
||||
/* Note 1:
|
||||
The value for "signature" is specified in the OCSP rfc2560 as follows:
|
||||
"The value for the signature SHALL be computed on the hash of the DER
|
||||
encoding ResponseData." This means that you must hash the DER-encoded
|
||||
tbsResponseData, and then run it through a crypto-signing function, which
|
||||
will (at least w/RSA) do a hash-'n'-private-encrypt operation. This seems
|
||||
a bit odd, but that's the spec. Also note that the data structures do not
|
||||
leave anywhere to independently specify the algorithm used for the initial
|
||||
hash. So, we look at the signature-specification algorithm, and try to do
|
||||
something intelligent. -- Kathy Weinhold, CertCo */
|
||||
/* Note 2:
|
||||
It seems that the mentioned passage from RFC 2560 (section 4.2.1) is open
|
||||
for interpretation. I've done tests against another responder, and found
|
||||
that it doesn't do the double hashing that the RFC seems to say one
|
||||
should. Therefore, all relevant functions take a flag saying which
|
||||
variant should be used. -- Richard Levitte, OpenSSL team and CeloCom */
|
||||
struct ocsp_basic_response_st {
|
||||
OCSP_RESPDATA* tbsResponseData;
|
||||
X509_ALGOR* signatureAlgorithm;
|
||||
ASN1_BIT_STRING* signature;
|
||||
STACK_OF!(X509) *certs;
|
||||
}
|
||||
alias ocsp_basic_response_st OCSP_BASICRESP;
|
||||
|
||||
/*
|
||||
* CRLReason ::= ENUMERATED {
|
||||
* unspecified (0),
|
||||
* keyCompromise (1),
|
||||
* cACompromise (2),
|
||||
* affiliationChanged (3),
|
||||
* superseded (4),
|
||||
* cessationOfOperation (5),
|
||||
* certificateHold (6),
|
||||
* removeFromCRL (8) }
|
||||
*/
|
||||
enum OCSP_REVOKED_STATUS_NOSTATUS = -1;
|
||||
enum OCSP_REVOKED_STATUS_UNSPECIFIED = 0;
|
||||
enum OCSP_REVOKED_STATUS_KEYCOMPROMISE = 1;
|
||||
enum OCSP_REVOKED_STATUS_CACOMPROMISE = 2;
|
||||
enum OCSP_REVOKED_STATUS_AFFILIATIONCHANGED = 3;
|
||||
enum OCSP_REVOKED_STATUS_SUPERSEDED = 4;
|
||||
enum OCSP_REVOKED_STATUS_CESSATIONOFOPERATION = 5;
|
||||
enum OCSP_REVOKED_STATUS_CERTIFICATEHOLD = 6;
|
||||
enum OCSP_REVOKED_STATUS_REMOVEFROMCRL = 8;
|
||||
|
||||
/* CrlID ::= SEQUENCE {
|
||||
* crlUrl [0] EXPLICIT IA5String OPTIONAL,
|
||||
* crlNum [1] EXPLICIT INTEGER OPTIONAL,
|
||||
* crlTime [2] EXPLICIT GeneralizedTime OPTIONAL }
|
||||
*/
|
||||
struct ocsp_crl_id_st {
|
||||
ASN1_IA5STRING* crlUrl;
|
||||
ASN1_INTEGER* crlNum;
|
||||
ASN1_GENERALIZEDTIME* crlTime;
|
||||
}
|
||||
alias ocsp_crl_id_st OCSP_CRLID;
|
||||
|
||||
/* ServiceLocator ::= SEQUENCE {
|
||||
* issuer Name,
|
||||
* locator AuthorityInfoAccessSyntax OPTIONAL }
|
||||
*/
|
||||
struct ocsp_service_locator_st {
|
||||
X509_NAME* issuer;
|
||||
STACK_OF!(ACCESS_DESCRIPTION) *locator;
|
||||
}
|
||||
alias ocsp_service_locator_st OCSP_SERVICELOC;
|
||||
|
||||
enum PEM_STRING_OCSP_REQUEST = "OCSP REQUEST";
|
||||
enum PEM_STRING_OCSP_RESPONSE = "OCSP RESPONSE";
|
||||
|
||||
/+ FIXME: Not yet ported.
|
||||
#define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p)
|
||||
|
||||
#define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p)
|
||||
|
||||
#define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST*)PEM_ASN1_read_bio( \
|
||||
(ExternC!(char* function()) )d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char**)x,cb,NULL)
|
||||
|
||||
#define PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE*)PEM_ASN1_read_bio(\
|
||||
(ExternC!(char* function()) )d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char**)x,cb,NULL)
|
||||
|
||||
#define PEM_write_bio_OCSP_REQUEST(bp,o) \
|
||||
PEM_ASN1_write_bio((ExternC!(int function()) )i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\
|
||||
bp,(char*)o, NULL,NULL,0,NULL,NULL)
|
||||
|
||||
#define PEM_write_bio_OCSP_RESPONSE(bp,o) \
|
||||
PEM_ASN1_write_bio((ExternC!(int function()) )i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\
|
||||
bp,(char*)o, NULL,NULL,0,NULL,NULL)
|
||||
|
||||
#define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o)
|
||||
|
||||
#define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o)
|
||||
|
||||
#define OCSP_REQUEST_sign(o,pkey,md) \
|
||||
ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\
|
||||
o->optionalSignature->signatureAlgorithm,NULL,\
|
||||
o->optionalSignature->signature,o->tbsRequest,pkey,md)
|
||||
|
||||
#define OCSP_BASICRESP_sign(o,pkey,md,d) \
|
||||
ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\
|
||||
o->signature,o->tbsResponseData,pkey,md)
|
||||
|
||||
#define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\
|
||||
a->optionalSignature->signatureAlgorithm,\
|
||||
a->optionalSignature->signature,a->tbsRequest,r)
|
||||
|
||||
#define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\
|
||||
a->signatureAlgorithm,a->signature,a->tbsResponseData,r)
|
||||
|
||||
#define ASN1_BIT_STRING_digest(data,type,md,len) \
|
||||
ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len)
|
||||
|
||||
#define OCSP_CERTSTATUS_dup(cs)\
|
||||
(OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\
|
||||
(ExternC!(char* function()) )d2i_OCSP_CERTSTATUS,(char*)(cs))
|
||||
+/
|
||||
|
||||
OCSP_CERTID* OCSP_CERTID_dup(OCSP_CERTID* id);
|
||||
|
||||
OCSP_RESPONSE* OCSP_sendreq_bio(BIO* b, char* path, OCSP_REQUEST* req);
|
||||
OCSP_REQ_CTX* OCSP_sendreq_new(BIO* io, char* path, OCSP_REQUEST* req,
|
||||
int maxline);
|
||||
int OCSP_sendreq_nbio(OCSP_RESPONSE** presp, OCSP_REQ_CTX* rctx);
|
||||
void OCSP_REQ_CTX_free(OCSP_REQ_CTX* rctx);
|
||||
int OCSP_REQ_CTX_set1_req(OCSP_REQ_CTX* rctx, OCSP_REQUEST* req);
|
||||
int OCSP_REQ_CTX_add1_header(OCSP_REQ_CTX* rctx,
|
||||
const(char)* name, const(char)* value);
|
||||
|
||||
OCSP_CERTID* OCSP_cert_to_id(const(EVP_MD)* dgst, X509* subject, X509* issuer);
|
||||
|
||||
OCSP_CERTID* OCSP_cert_id_new(const(EVP_MD)* dgst,
|
||||
X509_NAME* issuerName,
|
||||
ASN1_BIT_STRING* issuerKey,
|
||||
ASN1_INTEGER* serialNumber);
|
||||
|
||||
OCSP_ONEREQ* OCSP_request_add0_id(OCSP_REQUEST* req, OCSP_CERTID* cid);
|
||||
|
||||
int OCSP_request_add1_nonce(OCSP_REQUEST* req, ubyte* val, int len);
|
||||
int OCSP_basic_add1_nonce(OCSP_BASICRESP* resp, ubyte* val, int len);
|
||||
int OCSP_check_nonce(OCSP_REQUEST* req, OCSP_BASICRESP* bs);
|
||||
int OCSP_copy_nonce(OCSP_BASICRESP* resp, OCSP_REQUEST* req);
|
||||
|
||||
int OCSP_request_set1_name(OCSP_REQUEST* req, X509_NAME* nm);
|
||||
int OCSP_request_add1_cert(OCSP_REQUEST* req, X509* cert);
|
||||
|
||||
int OCSP_request_sign(OCSP_REQUEST* req,
|
||||
X509* signer,
|
||||
EVP_PKEY* key,
|
||||
const(EVP_MD)* dgst,
|
||||
STACK_OF!(X509) *certs,
|
||||
c_ulong flags);
|
||||
|
||||
int OCSP_response_status(OCSP_RESPONSE* resp);
|
||||
OCSP_BASICRESP* OCSP_response_get1_basic(OCSP_RESPONSE* resp);
|
||||
|
||||
int OCSP_resp_count(OCSP_BASICRESP* bs);
|
||||
OCSP_SINGLERESP* OCSP_resp_get0(OCSP_BASICRESP* bs, int idx);
|
||||
int OCSP_resp_find(OCSP_BASICRESP* bs, OCSP_CERTID* id, int last);
|
||||
int OCSP_single_get0_status(OCSP_SINGLERESP* single, int* reason,
|
||||
ASN1_GENERALIZEDTIME** revtime,
|
||||
ASN1_GENERALIZEDTIME** thisupd,
|
||||
ASN1_GENERALIZEDTIME** nextupd);
|
||||
int OCSP_resp_find_status(OCSP_BASICRESP* bs, OCSP_CERTID* id, int* status,
|
||||
int* reason,
|
||||
ASN1_GENERALIZEDTIME** revtime,
|
||||
ASN1_GENERALIZEDTIME** thisupd,
|
||||
ASN1_GENERALIZEDTIME** nextupd);
|
||||
int OCSP_check_validity(ASN1_GENERALIZEDTIME* thisupd,
|
||||
ASN1_GENERALIZEDTIME* nextupd,
|
||||
c_long sec, c_long maxsec);
|
||||
|
||||
int OCSP_request_verify(OCSP_REQUEST* req, STACK_OF!(X509) *certs, X509_STORE* store, c_ulong flags);
|
||||
|
||||
int OCSP_parse_url(char* url, char** phost, char** pport, char** ppath, int* pssl);
|
||||
|
||||
int OCSP_id_issuer_cmp(OCSP_CERTID* a, OCSP_CERTID* b);
|
||||
int OCSP_id_cmp(OCSP_CERTID* a, OCSP_CERTID* b);
|
||||
|
||||
int OCSP_request_onereq_count(OCSP_REQUEST* req);
|
||||
OCSP_ONEREQ* OCSP_request_onereq_get0(OCSP_REQUEST* req, int i);
|
||||
OCSP_CERTID* OCSP_onereq_get0_id(OCSP_ONEREQ* one);
|
||||
int OCSP_id_get0_info(ASN1_OCTET_STRING** piNameHash, ASN1_OBJECT** pmd,
|
||||
ASN1_OCTET_STRING** pikeyHash,
|
||||
ASN1_INTEGER** pserial, OCSP_CERTID* cid);
|
||||
int OCSP_request_is_signed(OCSP_REQUEST* req);
|
||||
OCSP_RESPONSE* OCSP_response_create(int status, OCSP_BASICRESP* bs);
|
||||
OCSP_SINGLERESP* OCSP_basic_add1_status(OCSP_BASICRESP* rsp,
|
||||
OCSP_CERTID* cid,
|
||||
int status, int reason,
|
||||
ASN1_TIME* revtime,
|
||||
ASN1_TIME* thisupd, ASN1_TIME* nextupd);
|
||||
int OCSP_basic_add1_cert(OCSP_BASICRESP* resp, X509* cert);
|
||||
int OCSP_basic_sign(OCSP_BASICRESP* brsp,
|
||||
X509* signer, EVP_PKEY* key, const(EVP_MD)* dgst,
|
||||
STACK_OF!(X509) *certs, c_ulong flags);
|
||||
|
||||
X509_EXTENSION* OCSP_crlID_new(char* url, c_long* n, char* tim);
|
||||
|
||||
X509_EXTENSION* OCSP_accept_responses_new(char** oids);
|
||||
|
||||
X509_EXTENSION* OCSP_archive_cutoff_new(char* tim);
|
||||
|
||||
X509_EXTENSION* OCSP_url_svcloc_new(X509_NAME* issuer, char** urls);
|
||||
|
||||
int OCSP_REQUEST_get_ext_count(OCSP_REQUEST* x);
|
||||
int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST* x, int nid, int lastpos);
|
||||
int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST* x, ASN1_OBJECT* obj, int lastpos);
|
||||
int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST* x, int crit, int lastpos);
|
||||
X509_EXTENSION* OCSP_REQUEST_get_ext(OCSP_REQUEST* x, int loc);
|
||||
X509_EXTENSION* OCSP_REQUEST_delete_ext(OCSP_REQUEST* x, int loc);
|
||||
void* OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST* x, int nid, int* crit, int* idx);
|
||||
int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST* x, int nid, void* value, int crit,
|
||||
c_ulong flags);
|
||||
int OCSP_REQUEST_add_ext(OCSP_REQUEST* x, X509_EXTENSION* ex, int loc);
|
||||
|
||||
int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ* x);
|
||||
int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ* x, int nid, int lastpos);
|
||||
int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ* x, ASN1_OBJECT* obj, int lastpos);
|
||||
int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ* x, int crit, int lastpos);
|
||||
X509_EXTENSION* OCSP_ONEREQ_get_ext(OCSP_ONEREQ* x, int loc);
|
||||
X509_EXTENSION* OCSP_ONEREQ_delete_ext(OCSP_ONEREQ* x, int loc);
|
||||
void* OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ* x, int nid, int* crit, int* idx);
|
||||
int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ* x, int nid, void* value, int crit,
|
||||
c_ulong flags);
|
||||
int OCSP_ONEREQ_add_ext(OCSP_ONEREQ* x, X509_EXTENSION* ex, int loc);
|
||||
|
||||
int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP* x);
|
||||
int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP* x, int nid, int lastpos);
|
||||
int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP* x, ASN1_OBJECT* obj, int lastpos);
|
||||
int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP* x, int crit, int lastpos);
|
||||
X509_EXTENSION* OCSP_BASICRESP_get_ext(OCSP_BASICRESP* x, int loc);
|
||||
X509_EXTENSION* OCSP_BASICRESP_delete_ext(OCSP_BASICRESP* x, int loc);
|
||||
void* OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP* x, int nid, int* crit, int* idx);
|
||||
int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP* x, int nid, void* value, int crit,
|
||||
c_ulong flags);
|
||||
int OCSP_BASICRESP_add_ext(OCSP_BASICRESP* x, X509_EXTENSION* ex, int loc);
|
||||
|
||||
int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP* x);
|
||||
int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP* x, int nid, int lastpos);
|
||||
int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP* x, ASN1_OBJECT* obj, int lastpos);
|
||||
int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP* x, int crit, int lastpos);
|
||||
X509_EXTENSION* OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP* x, int loc);
|
||||
X509_EXTENSION* OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP* x, int loc);
|
||||
void* OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP* x, int nid, int* crit, int* idx);
|
||||
int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP* x, int nid, void* value, int crit,
|
||||
c_ulong flags);
|
||||
int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP* x, X509_EXTENSION* ex, int loc);
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_SINGLERESP");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_CERTSTATUS");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_REVOKEDINFO");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_BASICRESP");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_RESPDATA");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_RESPID");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_RESPONSE");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_RESPBYTES");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_ONEREQ");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_CERTID");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_REQUEST");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_SIGNATURE");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_REQINFO");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_CRLID");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"OCSP_SERVICELOC");
|
||||
|
||||
const(char)* OCSP_response_status_str(c_long s);
|
||||
const(char)* OCSP_cert_status_str(c_long s);
|
||||
const(char)* OCSP_crl_reason_str(c_long s);
|
||||
|
||||
int OCSP_REQUEST_print(BIO* bp, OCSP_REQUEST* a, c_ulong flags);
|
||||
int OCSP_RESPONSE_print(BIO* bp, OCSP_RESPONSE* o, c_ulong flags);
|
||||
|
||||
int OCSP_basic_verify(OCSP_BASICRESP* bs, STACK_OF!(X509) *certs,
|
||||
X509_STORE* st, c_ulong flags);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_OCSP_strings();
|
||||
|
||||
/* Error codes for the OCSP functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum OCSP_F_ASN1_STRING_ENCODE = 100;
|
||||
enum OCSP_F_D2I_OCSP_NONCE = 102;
|
||||
enum OCSP_F_OCSP_BASIC_ADD1_STATUS = 103;
|
||||
enum OCSP_F_OCSP_BASIC_SIGN = 104;
|
||||
enum OCSP_F_OCSP_BASIC_VERIFY = 105;
|
||||
enum OCSP_F_OCSP_CERT_ID_NEW = 101;
|
||||
enum OCSP_F_OCSP_CHECK_DELEGATED = 106;
|
||||
enum OCSP_F_OCSP_CHECK_IDS = 107;
|
||||
enum OCSP_F_OCSP_CHECK_ISSUER = 108;
|
||||
enum OCSP_F_OCSP_CHECK_VALIDITY = 115;
|
||||
enum OCSP_F_OCSP_MATCH_ISSUERID = 109;
|
||||
enum OCSP_F_OCSP_PARSE_URL = 114;
|
||||
enum OCSP_F_OCSP_REQUEST_SIGN = 110;
|
||||
enum OCSP_F_OCSP_REQUEST_VERIFY = 116;
|
||||
enum OCSP_F_OCSP_RESPONSE_GET1_BASIC = 111;
|
||||
enum OCSP_F_OCSP_SENDREQ_BIO = 112;
|
||||
enum OCSP_F_OCSP_SENDREQ_NBIO = 117;
|
||||
enum OCSP_F_PARSE_HTTP_LINE1 = 118;
|
||||
enum OCSP_F_REQUEST_VERIFY = 113;
|
||||
|
||||
/* Reason codes. */
|
||||
enum OCSP_R_BAD_DATA = 100;
|
||||
enum OCSP_R_CERTIFICATE_VERIFY_ERROR = 101;
|
||||
enum OCSP_R_DIGEST_ERR = 102;
|
||||
enum OCSP_R_ERROR_IN_NEXTUPDATE_FIELD = 122;
|
||||
enum OCSP_R_ERROR_IN_THISUPDATE_FIELD = 123;
|
||||
enum OCSP_R_ERROR_PARSING_URL = 121;
|
||||
enum OCSP_R_MISSING_OCSPSIGNING_USAGE = 103;
|
||||
enum OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE = 124;
|
||||
enum OCSP_R_NOT_BASIC_RESPONSE = 104;
|
||||
enum OCSP_R_NO_CERTIFICATES_IN_CHAIN = 105;
|
||||
enum OCSP_R_NO_CONTENT = 106;
|
||||
enum OCSP_R_NO_PUBLIC_KEY = 107;
|
||||
enum OCSP_R_NO_RESPONSE_DATA = 108;
|
||||
enum OCSP_R_NO_REVOKED_TIME = 109;
|
||||
enum OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE = 110;
|
||||
enum OCSP_R_REQUEST_NOT_SIGNED = 128;
|
||||
enum OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA = 111;
|
||||
enum OCSP_R_ROOT_CA_NOT_TRUSTED = 112;
|
||||
enum OCSP_R_SERVER_READ_ERROR = 113;
|
||||
enum OCSP_R_SERVER_RESPONSE_ERROR = 114;
|
||||
enum OCSP_R_SERVER_RESPONSE_PARSE_ERROR = 115;
|
||||
enum OCSP_R_SERVER_WRITE_ERROR = 116;
|
||||
enum OCSP_R_SIGNATURE_FAILURE = 117;
|
||||
enum OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND = 118;
|
||||
enum OCSP_R_STATUS_EXPIRED = 125;
|
||||
enum OCSP_R_STATUS_NOT_YET_VALID = 126;
|
||||
enum OCSP_R_STATUS_TOO_OLD = 127;
|
||||
enum OCSP_R_UNKNOWN_MESSAGE_DIGEST = 119;
|
||||
enum OCSP_R_UNKNOWN_NID = 120;
|
||||
enum OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE = 129;
|
|
@ -0,0 +1,233 @@
|
|||
/* opensslconf.h */
|
||||
/* WARNING: Generated automatically from opensslconf.h.in by Configure. */
|
||||
module deimos.openssl.opensslconf;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
/* OpenSSL was configured with the following options: */
|
||||
// FIXME: How should these be handled?
|
||||
/+#ifndef OPENSSL_DOING_MAKEDEPEND
|
||||
|
||||
#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128
|
||||
# define OPENSSL_NO_EC_NISTP_64_GCC_128
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_GMP
|
||||
# define OPENSSL_NO_GMP
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_JPAKE
|
||||
# define OPENSSL_NO_JPAKE
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_KRB5
|
||||
# define OPENSSL_NO_KRB5
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_MD2
|
||||
# define OPENSSL_NO_MD2
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_RC5
|
||||
# define OPENSSL_NO_RC5
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_RFC3779
|
||||
# define OPENSSL_NO_RFC3779
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_SCTP
|
||||
# define OPENSSL_NO_SCTP
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_STORE
|
||||
# define OPENSSL_NO_STORE
|
||||
#endif
|
||||
|
||||
#endif /* OPENSSL_DOING_MAKEDEPEND */
|
||||
|
||||
#ifndef OPENSSL_NO_DYNAMIC_ENGINE
|
||||
# define OPENSSL_NO_DYNAMIC_ENGINE
|
||||
#endif
|
||||
|
||||
/* The OPENSSL_NO_* macros are also defined as NO_* if the application
|
||||
asks for it. This is a transient feature that is provided for those
|
||||
who haven't had the time to do the appropriate changes in their
|
||||
applications. */
|
||||
#ifdef OPENSSL_ALGORITHM_DEFINES
|
||||
# if defined(OPENSSL_NO_EC_NISTP_64_GCC_128) && !defined(NO_EC_NISTP_64_GCC_128)
|
||||
# define NO_EC_NISTP_64_GCC_128
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP)
|
||||
# define NO_GMP
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE)
|
||||
# define NO_JPAKE
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5)
|
||||
# define NO_KRB5
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_MD2) && !defined(NO_MD2)
|
||||
# define NO_MD2
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5)
|
||||
# define NO_RC5
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779)
|
||||
# define NO_RFC3779
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_SCTP) && !defined(NO_SCTP)
|
||||
# define NO_SCTP
|
||||
# endif
|
||||
# if defined(OPENSSL_NO_STORE) && !defined(NO_STORE)
|
||||
# define NO_STORE
|
||||
# endif
|
||||
#endif
|
||||
+/
|
||||
/* crypto/opensslconf.h.in */
|
||||
|
||||
/* Generate 80386 code? */
|
||||
/+#undef I386_ONLY
|
||||
|
||||
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
|
||||
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
|
||||
enum ENGINESDIR = "/usr/local/ssl/lib/engines";
|
||||
enum OPENSSLDIR = "/usr/local/ssl";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef OPENSSL_UNISTD
|
||||
#define OPENSSL_UNISTD <unistd.h>
|
||||
|
||||
#undef OPENSSL_EXPORT_VAR_AS_FUNCTION
|
||||
+/
|
||||
// #if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
|
||||
alias uint IDEA_INT;
|
||||
// #endif
|
||||
|
||||
// #if defined(HEADER_MD2_H) && !defined(MD2_INT)
|
||||
alias uint MD2_INT;
|
||||
// #endif
|
||||
|
||||
// #if defined(HEADER_RC2_H) && !defined(RC2_INT)
|
||||
/* I need to put in a mod for the alpha - eay */
|
||||
alias uint RC2_INT;
|
||||
// #endif
|
||||
|
||||
// #if defined(HEADER_RC4_H)
|
||||
// #if !defined(RC4_INT)
|
||||
/* using int types make the structure larger but make the code faster
|
||||
* on most boxes I have tested - up to %20 faster. */
|
||||
/*
|
||||
* I don't know what does "most" mean, but declaring "int" is a must on:
|
||||
* - Intel P6 because partial register stalls are very expensive;
|
||||
* - elder Alpha because it lacks byte load/store instructions;
|
||||
*/
|
||||
alias uint RC4_INT;
|
||||
// #endif
|
||||
/+#if !defined(RC4_CHUNK)
|
||||
/*
|
||||
* This enables code handling data aligned at natural CPU word
|
||||
* boundary. See crypto/rc4/rc4_enc.c for further details.
|
||||
*/
|
||||
#undef RC4_CHUNK
|
||||
#endif+/
|
||||
// #endif
|
||||
|
||||
// #if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG)
|
||||
/* If this is set to 'uint' on a DEC Alpha, this gives about a
|
||||
* %20 speed up (longs are 8 bytes, int's are 4). */
|
||||
// #ifndef DES_LONG
|
||||
alias c_ulong DES_LONG;
|
||||
// #endif
|
||||
// #endif
|
||||
|
||||
/+
|
||||
#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
|
||||
#define CONFIG_HEADER_BN_H
|
||||
#undef BN_LLONG
|
||||
|
||||
/* Should we define BN_DIV2W here? */
|
||||
|
||||
/* Only one for the following should be defined */
|
||||
#undef SIXTY_FOUR_BIT_LONG
|
||||
#undef SIXTY_FOUR_BIT
|
||||
#define THIRTY_TWO_BIT
|
||||
#endif
|
||||
|
||||
#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H)
|
||||
#define CONFIG_HEADER_RC4_LOCL_H
|
||||
/* if this is defined data[i] is used instead of* data, this is a %20
|
||||
* speedup on x86 */
|
||||
#undef RC4_INDEX
|
||||
#endif
|
||||
|
||||
#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
|
||||
#define CONFIG_HEADER_BF_LOCL_H
|
||||
#undef BF_PTR
|
||||
#endif /* HEADER_BF_LOCL_H */
|
||||
|
||||
#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H)
|
||||
#define CONFIG_HEADER_DES_LOCL_H
|
||||
#ifndef DES_DEFAULT_OPTIONS
|
||||
/* the following is tweaked from a config script, that is why it is a
|
||||
* protected undef/define */
|
||||
#ifndef DES_PTR
|
||||
#undef DES_PTR
|
||||
#endif
|
||||
|
||||
/* This helps C compiler generate the correct code for multiple functional
|
||||
* units. It reduces register dependancies at the expense of 2 more
|
||||
* registers */
|
||||
#ifndef DES_RISC1
|
||||
#undef DES_RISC1
|
||||
#endif
|
||||
|
||||
#ifndef DES_RISC2
|
||||
#undef DES_RISC2
|
||||
#endif
|
||||
|
||||
#if defined(DES_RISC1) && defined(DES_RISC2)
|
||||
YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
|
||||
#endif
|
||||
|
||||
/* Unroll the inner loop, this sometimes helps, sometimes hinders.
|
||||
* Very mucy CPU dependant */
|
||||
#ifndef DES_UNROLL
|
||||
#undef DES_UNROLL
|
||||
#endif
|
||||
|
||||
/* These default values were supplied by
|
||||
* Peter Gutman <pgut001@cs.auckland.ac.nz>
|
||||
* They are only used if nothing else has been defined */
|
||||
#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL)
|
||||
/* Special defines which change the way the code is built depending on the
|
||||
CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
|
||||
even newer MIPS CPU's, but at the moment one size fits all for
|
||||
optimization options. Older Sparc's work better with only UNROLL, but
|
||||
there's no way to tell at compile time what it is you're running on */
|
||||
|
||||
#if defined( sun ) /* Newer Sparc's */
|
||||
# define DES_PTR
|
||||
# define DES_RISC1
|
||||
# define DES_UNROLL
|
||||
#elif defined( __ultrix ) /* Older MIPS */
|
||||
# define DES_PTR
|
||||
# define DES_RISC2
|
||||
# define DES_UNROLL
|
||||
#elif defined( __osf1__ ) /* Alpha */
|
||||
# define DES_PTR
|
||||
# define DES_RISC2
|
||||
#elif defined ( _AIX ) /* RS6000 */
|
||||
/* Unknown */
|
||||
#elif defined( __hpux ) /* HP-PA */
|
||||
/* Unknown */
|
||||
#elif defined( __aux ) /* 68K */
|
||||
/* Unknown */
|
||||
#elif defined( __dgux ) /* 88K (but P6 in latest boxes) */
|
||||
# define DES_UNROLL
|
||||
#elif defined( __sgi ) /* Newer MIPS */
|
||||
# define DES_PTR
|
||||
# define DES_RISC2
|
||||
# define DES_UNROLL
|
||||
#elif defined(i386) || defined(__i386__) /* x86 boxes, should be gcc */
|
||||
# define DES_PTR
|
||||
# define DES_RISC1
|
||||
# define DES_UNROLL
|
||||
#endif /* Systems-specific speed defines */
|
||||
#endif
|
||||
|
||||
#endif /* DES_DEFAULT_OPTIONS */
|
||||
+/
|
|
@ -0,0 +1,113 @@
|
|||
module deimos.openssl.opensslv;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
/* Numeric release version identifier:
|
||||
* MNNFFPPS: major minor fix patch status
|
||||
* The status nibble has one of the values 0 for development, 1 to e for betas
|
||||
* 1 to 14, and f for release. The patch level is exactly that.
|
||||
* For example:
|
||||
* 0.9.3-dev 0x00903000
|
||||
* 0.9.3-beta1 0x00903001
|
||||
* 0.9.3-beta2-dev 0x00903002
|
||||
* 0.9.3-beta2 0x00903002 (same as ...beta2-dev)
|
||||
* 0.9.3 0x0090300f
|
||||
* 0.9.3a 0x0090301f
|
||||
* 0.9.4 0x0090400f
|
||||
* 1.2.3z 0x102031af
|
||||
*
|
||||
* For continuity reasons (because 0.9.5 is already out, and is coded
|
||||
* 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level
|
||||
* part is slightly different, by setting the highest bit. This means
|
||||
* that 0.9.5a looks like this: 0x0090581f. At 0.9.6, we can start
|
||||
* with 0x0090600S...
|
||||
*
|
||||
* (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.)
|
||||
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
|
||||
* major minor fix final patch/beta)
|
||||
*/
|
||||
|
||||
/* Version macros for compile-time API version detection */
|
||||
enum
|
||||
{
|
||||
OPENSSL_VERSION_MAJOR = 1,
|
||||
OPENSSL_VERSION_MINOR = 1,
|
||||
OPENSSL_VERSION_PATCH = 0,
|
||||
OPENSSL_VERSION_BUILD = 'h' - '`'
|
||||
}
|
||||
|
||||
int OPENSSL_MAKE_VERSION(int major, int minor, int patch, int build)
|
||||
{
|
||||
return (major << 28) | (minor << 20) | (patch << 12) | (build << 4) | 0xf;
|
||||
}
|
||||
|
||||
enum OPENSSL_VERSION_NUMBER =
|
||||
OPENSSL_MAKE_VERSION(OPENSSL_VERSION_MAJOR, OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH, OPENSSL_VERSION_BUILD);
|
||||
|
||||
bool OPENSSL_VERSION_AT_LEAST(int major, int minor, int patch = 0, int build = 0)
|
||||
{
|
||||
return OPENSSL_VERSION_NUMBER >= OPENSSL_MAKE_VERSION(major, minor, patch, build);
|
||||
}
|
||||
|
||||
bool OPENSSL_VERSION_BEFORE(int major, int minor, int patch = 0, int build = 0)
|
||||
{
|
||||
return OPENSSL_VERSION_NUMBER < OPENSSL_MAKE_VERSION(major, minor, patch, build);
|
||||
}
|
||||
|
||||
version (OPENSSL_FIPS) {
|
||||
enum OPENSSL_VERSION_TEXT = "OpenSSL 1.1.0h-fips 27 Mar 2018";
|
||||
} else {
|
||||
enum OPENSSL_VERSION_TEXT = "OpenSSL 1.1.0h 27 Mar 2018";
|
||||
}
|
||||
enum OPENSSL_VERSION_PTEXT = " part of " ~ OPENSSL_VERSION_TEXT;
|
||||
|
||||
/* The macros below are to be used for shared library (.so, .dll, ...)
|
||||
* versioning. That kind of versioning works a bit differently between
|
||||
* operating systems. The most usual scheme is to set a major and a minor
|
||||
* number, and have the runtime loader check that the major number is equal
|
||||
* to what it was at application link time, while the minor number has to
|
||||
* be greater or equal to what it was at application link time. With this
|
||||
* scheme, the version number is usually part of the file name, like this:
|
||||
*
|
||||
* libcrypto.so.0.9
|
||||
*
|
||||
* Some unixen also make a softlink with the major version number only:
|
||||
*
|
||||
* libcrypto.so.0
|
||||
*
|
||||
* On Tru64 and IRIX 6.x it works a little bit differently. There, the
|
||||
* shared library version is stored in the file, and is actually a series
|
||||
* of versions, separated by colons. The rightmost version present in the
|
||||
* library when linking an application is stored in the application to be
|
||||
* matched at run time. When the application is run, a check is done to
|
||||
* see if the library version stored in the application matches any of the
|
||||
* versions in the version string of the library itself.
|
||||
* This version string can be constructed in any way, depending on what
|
||||
* kind of matching is desired. However, to implement the same scheme as
|
||||
* the one used in the other unixen, all compatible versions, from lowest
|
||||
* to highest, should be part of the string. Consecutive builds would
|
||||
* give the following versions strings:
|
||||
*
|
||||
* 3.0
|
||||
* 3.0:3.1
|
||||
* 3.0:3.1:3.2
|
||||
* 4.0
|
||||
* 4.0:4.1
|
||||
*
|
||||
* Notice how version 4 is completely incompatible with version, and
|
||||
* therefore give the breach you can see.
|
||||
*
|
||||
* There may be other schemes as well that I haven't yet discovered.
|
||||
*
|
||||
* So, here's the way it works here: first of all, the library version
|
||||
* number doesn't need at all to match the overall OpenSSL version.
|
||||
* However, it's nice and more understandable if it actually does.
|
||||
* The current library version is stored in the macro SHLIB_VERSION_NUMBER,
|
||||
* which is just a piece of text in the format "M.m.e" (Major, minor, edit).
|
||||
* For the sake of Tru64, IRIX, and any other OS that behaves in similar ways,
|
||||
* we need to keep a history of version numbers, which is done in the
|
||||
* macro SHLIB_VERSION_HISTORY. The numbers are separated by colons and
|
||||
* should only keep the versions that are binary compatible with the current.
|
||||
*/
|
||||
enum SHLIB_VERSION_HISTORY = "";
|
||||
enum SHLIB_VERSION_NUMBER = "1.0.0";
|
|
@ -0,0 +1,242 @@
|
|||
/* ====================================================================
|
||||
* Copyright (c) 1998-2001 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.ossl_typ;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version (NO_ASN1_TYPEDEFS) {
|
||||
alias ASN1_STRING ASN1_INTEGER;
|
||||
alias ASN1_STRING ASN1_ENUMERATED;
|
||||
alias ASN1_STRING ASN1_BIT_STRING;
|
||||
alias ASN1_STRING ASN1_OCTET_STRING;
|
||||
alias ASN1_STRING ASN1_PRINTABLESTRING;
|
||||
alias ASN1_STRING ASN1_T61STRING;
|
||||
alias ASN1_STRING ASN1_IA5STRING;
|
||||
alias ASN1_STRING ASN1_UTCTIME;
|
||||
alias ASN1_STRING ASN1_GENERALIZEDTIME;
|
||||
alias ASN1_STRING ASN1_TIME;
|
||||
alias ASN1_STRING ASN1_GENERALSTRING;
|
||||
alias ASN1_STRING ASN1_UNIVERSALSTRING;
|
||||
alias ASN1_STRING ASN1_BMPSTRING;
|
||||
alias ASN1_STRING ASN1_VISIBLESTRING;
|
||||
alias ASN1_STRING ASN1_UTF8STRING;
|
||||
alias int ASN1_BOOLEAN;
|
||||
alias int ASN1_NULL;
|
||||
} else {
|
||||
import deimos.openssl.asn1;
|
||||
alias asn1_string_st ASN1_INTEGER;
|
||||
alias asn1_string_st ASN1_ENUMERATED;
|
||||
alias asn1_string_st ASN1_BIT_STRING;
|
||||
alias asn1_string_st ASN1_OCTET_STRING;
|
||||
alias asn1_string_st ASN1_PRINTABLESTRING;
|
||||
alias asn1_string_st ASN1_T61STRING;
|
||||
alias asn1_string_st ASN1_IA5STRING;
|
||||
alias asn1_string_st ASN1_GENERALSTRING;
|
||||
alias asn1_string_st ASN1_UNIVERSALSTRING;
|
||||
alias asn1_string_st ASN1_BMPSTRING;
|
||||
alias asn1_string_st ASN1_UTCTIME;
|
||||
alias asn1_string_st ASN1_TIME;
|
||||
alias asn1_string_st ASN1_GENERALIZEDTIME;
|
||||
alias asn1_string_st ASN1_VISIBLESTRING;
|
||||
alias asn1_string_st ASN1_UTF8STRING;
|
||||
alias asn1_string_st ASN1_STRING;
|
||||
alias int ASN1_BOOLEAN;
|
||||
alias int ASN1_NULL;
|
||||
}
|
||||
|
||||
import deimos.openssl.asn1t;
|
||||
alias ASN1_ITEM_st ASN1_ITEM;
|
||||
|
||||
struct asn1_pctx_st;
|
||||
alias asn1_pctx_st ASN1_PCTX;
|
||||
|
||||
//#ifdef OPENSSL_SYS_WIN32
|
||||
//#undef X509_NAME
|
||||
//#undef X509_EXTENSIONS
|
||||
//#undef X509_CERT_PAIR
|
||||
//#undef PKCS7_ISSUER_AND_SERIAL
|
||||
//#undef OCSP_REQUEST
|
||||
//#undef OCSP_RESPONSE
|
||||
//#endif
|
||||
|
||||
//#ifdef BIGNUM
|
||||
//#undef BIGNUM
|
||||
//#endif
|
||||
import deimos.openssl.bn;
|
||||
alias bignum_st BIGNUM;
|
||||
struct bignum_ctx;
|
||||
alias bignum_ctx BN_CTX;
|
||||
struct bn_blinding_st;
|
||||
alias bn_blinding_st BN_BLINDING;
|
||||
alias bn_mont_ctx_st BN_MONT_CTX;
|
||||
alias bn_recp_ctx_st BN_RECP_CTX;
|
||||
alias bn_gencb_st BN_GENCB;
|
||||
|
||||
import deimos.openssl.buffer;
|
||||
alias buf_mem_st BUF_MEM;
|
||||
|
||||
import deimos.openssl.evp;
|
||||
alias evp_cipher_st EVP_CIPHER;
|
||||
alias evp_cipher_ctx_st EVP_CIPHER_CTX;
|
||||
alias env_md_st EVP_MD;
|
||||
alias env_md_ctx_st EVP_MD_CTX;
|
||||
alias evp_pkey_st EVP_PKEY;
|
||||
|
||||
struct evp_pkey_asn1_method_st;
|
||||
alias evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD;
|
||||
struct evp_pkey_method_st;
|
||||
alias evp_pkey_method_st EVP_PKEY_METHOD;
|
||||
struct evp_pkey_ctx_st;
|
||||
alias evp_pkey_ctx_st EVP_PKEY_CTX;
|
||||
|
||||
import deimos.openssl.dh;
|
||||
/*struct dh_st;*/
|
||||
alias dh_st DH;
|
||||
/*struct dh_method;*/
|
||||
alias dh_method DH_METHOD;
|
||||
|
||||
import deimos.openssl.dsa;
|
||||
/*struct dsa_st;*/
|
||||
alias dsa_st DSA;
|
||||
/*struct dsa_method;*/
|
||||
alias dsa_method DSA_METHOD;
|
||||
|
||||
import deimos.openssl.rsa;
|
||||
/*struct rsa_st;*/
|
||||
alias rsa_st RSA;
|
||||
/*struct rsa_meth_st;*/
|
||||
alias rsa_meth_st RSA_METHOD;
|
||||
|
||||
import deimos.openssl.rand;
|
||||
alias rand_meth_st RAND_METHOD;
|
||||
|
||||
struct ecdh_method;
|
||||
alias ecdh_method ECDH_METHOD;
|
||||
struct ecdsa_method;
|
||||
alias ecdsa_method ECDSA_METHOD;
|
||||
|
||||
import deimos.openssl.x509;
|
||||
import deimos.openssl.x509_vfy;
|
||||
alias x509_st X509;
|
||||
alias X509_algor_st X509_ALGOR;
|
||||
alias X509_crl_st X509_CRL;
|
||||
struct x509_crl_method_st;
|
||||
alias x509_crl_method_st X509_CRL_METHOD;
|
||||
alias x509_revoked_st X509_REVOKED;
|
||||
alias X509_name_st X509_NAME;
|
||||
alias X509_pubkey_st X509_PUBKEY;
|
||||
alias x509_store_st X509_STORE;
|
||||
/*struct x509_store_ctx_st;*/
|
||||
alias x509_store_ctx_st X509_STORE_CTX;
|
||||
alias pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO;
|
||||
|
||||
import deimos.openssl.x509v3;
|
||||
alias v3_ext_ctx X509V3_CTX;
|
||||
import deimos.openssl.conf;
|
||||
alias conf_st CONF;
|
||||
|
||||
struct store_st;
|
||||
alias store_st STORE;
|
||||
struct store_method_st;
|
||||
alias store_method_st STORE_METHOD;
|
||||
|
||||
struct ui_st;
|
||||
alias ui_st UI;
|
||||
struct ui_method_st;
|
||||
alias ui_method_st UI_METHOD;
|
||||
|
||||
struct st_ERR_FNS;
|
||||
alias st_ERR_FNS ERR_FNS;
|
||||
|
||||
struct engine_st;
|
||||
alias engine_st ENGINE;
|
||||
|
||||
struct X509_POLICY_NODE_st;
|
||||
alias X509_POLICY_NODE_st X509_POLICY_NODE;
|
||||
struct X509_POLICY_LEVEL_st;
|
||||
alias X509_POLICY_LEVEL_st X509_POLICY_LEVEL;
|
||||
struct X509_POLICY_TREE_st;
|
||||
alias X509_POLICY_TREE_st X509_POLICY_TREE;
|
||||
struct X509_POLICY_CACHE_st;
|
||||
alias X509_POLICY_CACHE_st X509_POLICY_CACHE;
|
||||
|
||||
alias AUTHORITY_KEYID_st AUTHORITY_KEYID;
|
||||
alias DIST_POINT_st DIST_POINT;
|
||||
alias ISSUING_DIST_POINT_st ISSUING_DIST_POINT;
|
||||
alias NAME_CONSTRAINTS_st NAME_CONSTRAINTS;
|
||||
|
||||
/* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */
|
||||
mixin template DECLARE_PKCS12_STACK_OF (type) { /* Nothing */ }
|
||||
//#define IMPLEMENT_PKCS12_STACK_OF!(type) /* Nothing */
|
||||
|
||||
import deimos.openssl.crypto;
|
||||
alias crypto_ex_data_st CRYPTO_EX_DATA;
|
||||
/* Callback types for crypto.h */
|
||||
alias typeof(*(ExternC!(int function(void* parent, void* ptr, CRYPTO_EX_DATA* ad,
|
||||
int idx, c_long argl, void* argp))).init) CRYPTO_EX_new;
|
||||
alias typeof(*(ExternC!(void function(void* parent, void* ptr, CRYPTO_EX_DATA* ad,
|
||||
int idx, c_long argl, void* argp))).init) CRYPTO_EX_free;
|
||||
alias typeof(*(ExternC!(int function(CRYPTO_EX_DATA* to, CRYPTO_EX_DATA* from, void* from_d,
|
||||
int idx, c_long argl, void* argp))).init) CRYPTO_EX_dup;
|
||||
|
||||
import deimos.openssl.ocsp;
|
||||
struct ocsp_req_ctx_st;
|
||||
alias ocsp_req_ctx_st OCSP_REQ_CTX;
|
||||
/*struct ocsp_response_st;*/
|
||||
alias ocsp_response_st OCSP_RESPONSE;
|
||||
/*struct ocsp_responder_id_st;*/
|
||||
alias ocsp_responder_id_st OCSP_RESPID;
|
|
@ -0,0 +1,650 @@
|
|||
/* crypto/pem/pem.h */
|
||||
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.pem;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.pkcs7; // Needed for PKCS7.
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
version(OPENSSL_NO_STACK) {} else {
|
||||
public import deimos.openssl.stack;
|
||||
}
|
||||
public import deimos.openssl.evp;
|
||||
public import deimos.openssl.x509;
|
||||
public import deimos.openssl.pem2;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
enum PEM_BUFSIZE = 1024;
|
||||
|
||||
enum PEM_OBJ_UNDEF = 0;
|
||||
enum PEM_OBJ_X509 = 1;
|
||||
enum PEM_OBJ_X509_REQ = 2;
|
||||
enum PEM_OBJ_CRL = 3;
|
||||
enum PEM_OBJ_SSL_SESSION = 4;
|
||||
enum PEM_OBJ_PRIV_KEY = 10;
|
||||
enum PEM_OBJ_PRIV_RSA = 11;
|
||||
enum PEM_OBJ_PRIV_DSA = 12;
|
||||
enum PEM_OBJ_PRIV_DH = 13;
|
||||
enum PEM_OBJ_PUB_RSA = 14;
|
||||
enum PEM_OBJ_PUB_DSA = 15;
|
||||
enum PEM_OBJ_PUB_DH = 16;
|
||||
enum PEM_OBJ_DHPARAMS = 17;
|
||||
enum PEM_OBJ_DSAPARAMS = 18;
|
||||
enum PEM_OBJ_PRIV_RSA_PUBLIC = 19;
|
||||
enum PEM_OBJ_PRIV_ECDSA = 20;
|
||||
enum PEM_OBJ_PUB_ECDSA = 21;
|
||||
enum PEM_OBJ_ECPARAMETERS = 22;
|
||||
|
||||
enum PEM_ERROR = 30;
|
||||
enum PEM_DEK_DES_CBC = 40;
|
||||
enum PEM_DEK_IDEA_CBC = 45;
|
||||
enum PEM_DEK_DES_EDE = 50;
|
||||
enum PEM_DEK_DES_ECB = 60;
|
||||
enum PEM_DEK_RSA = 70;
|
||||
enum PEM_DEK_RSA_MD2 = 80;
|
||||
enum PEM_DEK_RSA_MD5 = 90;
|
||||
|
||||
alias NID_md2 PEM_MD_MD2;
|
||||
alias NID_md5 PEM_MD_MD5;
|
||||
alias NID_sha PEM_MD_SHA;
|
||||
alias NID_md2WithRSAEncryption PEM_MD_MD2_RSA;
|
||||
alias NID_md5WithRSAEncryption PEM_MD_MD5_RSA;
|
||||
alias NID_sha1WithRSAEncryption PEM_MD_SHA_RSA;
|
||||
|
||||
enum PEM_STRING_X509_OLD = "X509 CERTIFICATE";
|
||||
enum PEM_STRING_X509 = "CERTIFICATE";
|
||||
enum PEM_STRING_X509_PAIR = "CERTIFICATE PAIR";
|
||||
enum PEM_STRING_X509_TRUSTED = "TRUSTED CERTIFICATE";
|
||||
enum PEM_STRING_X509_REQ_OLD = "NEW CERTIFICATE REQUEST";
|
||||
enum PEM_STRING_X509_REQ = "CERTIFICATE REQUEST";
|
||||
enum PEM_STRING_X509_CRL = "X509 CRL";
|
||||
enum PEM_STRING_EVP_PKEY = "ANY PRIVATE KEY";
|
||||
enum PEM_STRING_PUBLIC = "PUBLIC KEY";
|
||||
enum PEM_STRING_RSA = "RSA PRIVATE KEY";
|
||||
enum PEM_STRING_RSA_PUBLIC = "RSA PUBLIC KEY";
|
||||
enum PEM_STRING_DSA = "DSA PRIVATE KEY";
|
||||
enum PEM_STRING_DSA_PUBLIC = "DSA PUBLIC KEY";
|
||||
enum PEM_STRING_PKCS7 = "PKCS7";
|
||||
enum PEM_STRING_PKCS7_SIGNED = "PKCS #7 SIGNED DATA";
|
||||
enum PEM_STRING_PKCS8 = "ENCRYPTED PRIVATE KEY";
|
||||
enum PEM_STRING_PKCS8INF = "PRIVATE KEY";
|
||||
enum PEM_STRING_DHPARAMS = "DH PARAMETERS";
|
||||
enum PEM_STRING_SSL_SESSION = "SSL SESSION PARAMETERS";
|
||||
enum PEM_STRING_DSAPARAMS = "DSA PARAMETERS";
|
||||
enum PEM_STRING_ECDSA_PUBLIC = "ECDSA PUBLIC KEY";
|
||||
enum PEM_STRING_ECPARAMETERS = "EC PARAMETERS";
|
||||
enum PEM_STRING_ECPRIVATEKEY = "EC PRIVATE KEY";
|
||||
enum PEM_STRING_PARAMETERS = "PARAMETERS";
|
||||
enum PEM_STRING_CMS = "CMS";
|
||||
|
||||
/* Note that this structure is initialised by PEM_SealInit and cleaned up
|
||||
by PEM_SealFinal (at least for now) */
|
||||
struct PEM_Encode_Seal_st {
|
||||
EVP_ENCODE_CTX encode;
|
||||
EVP_MD_CTX md;
|
||||
EVP_CIPHER_CTX cipher;
|
||||
}
|
||||
alias PEM_Encode_Seal_st PEM_ENCODE_SEAL_CTX;
|
||||
|
||||
/* enc_type is one off */
|
||||
enum PEM_TYPE_ENCRYPTED = 10;
|
||||
enum PEM_TYPE_MIC_ONLY = 20;
|
||||
enum PEM_TYPE_MIC_CLEAR = 30;
|
||||
enum PEM_TYPE_CLEAR = 40;
|
||||
|
||||
struct pem_recip_st {
|
||||
char* name;
|
||||
X509_NAME* dn;
|
||||
|
||||
int cipher;
|
||||
int key_enc;
|
||||
/* char iv[8]; unused and wrong size */
|
||||
}
|
||||
alias pem_recip_st PEM_USER;
|
||||
|
||||
struct pem_ctx_st
|
||||
{
|
||||
int type; /* what type of object */
|
||||
|
||||
struct proc_type_ {
|
||||
int version_;
|
||||
int mode;
|
||||
}
|
||||
proc_type_ proc_type;
|
||||
|
||||
char* domain;
|
||||
|
||||
struct DEK_info_{
|
||||
int cipher;
|
||||
/* unused, and wrong size
|
||||
ubyte[8] iv; */
|
||||
}
|
||||
DEK_info_ DEK_info;
|
||||
|
||||
PEM_USER* originator;
|
||||
|
||||
int num_recipient;
|
||||
PEM_USER** recipient;
|
||||
|
||||
/* XXX(ben): don#t think this is used!
|
||||
STACK* x509_chain; / * certificate chain */
|
||||
EVP_MD* md; /* signature type */
|
||||
|
||||
int md_enc; /* is the md encrypted or not? */
|
||||
int md_len; /* length of md_data */
|
||||
char* md_data; /* message digest, could be pkey encrypted */
|
||||
|
||||
EVP_CIPHER* dec; /* date encryption cipher */
|
||||
int key_len; /* key length */
|
||||
ubyte* key; /* key */
|
||||
/* unused, and wrong size
|
||||
ubyte[8] iv; */
|
||||
|
||||
|
||||
int data_enc; /* is the data encrypted */
|
||||
int data_len;
|
||||
ubyte* data;
|
||||
}
|
||||
alias pem_ctx_st PEM_CTX;
|
||||
|
||||
/* These macros make the PEM_read/PEM_write functions easier to maintain and
|
||||
* write. Now they are all implemented with either:
|
||||
* IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...)
|
||||
*/
|
||||
|
||||
/+#ifdef OPENSSL_NO_FP_API
|
||||
|
||||
#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/
|
||||
#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/
|
||||
#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/
|
||||
#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/
|
||||
#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/
|
||||
|
||||
#else
|
||||
|
||||
#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \
|
||||
type* PEM_read_##name(FILE* fp, type** x, pem_password_cb* cb, void* u)\
|
||||
{ \
|
||||
return PEM_ASN1_read((d2i_of_void*)d2i_##asn1, str,fp,(void**)x,cb,u); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \
|
||||
int PEM_write_##name(FILE* fp, type* x) \
|
||||
{ \
|
||||
return PEM_ASN1_write((i2d_of_void*)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \
|
||||
int PEM_write_##name(FILE* fp, const(type)* x) \
|
||||
{ \
|
||||
return PEM_ASN1_write((i2d_of_void*)i2d_##asn1,str,fp,(void*)x,NULL,NULL,0,NULL,NULL); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \
|
||||
int PEM_write_##name(FILE* fp, type* x, const(EVP_CIPHER)* enc, \
|
||||
ubyte* kstr, int klen, pem_password_cb* cb, \
|
||||
void* u) \
|
||||
{ \
|
||||
return PEM_ASN1_write((i2d_of_void*)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \
|
||||
int PEM_write_##name(FILE* fp, type* x, const(EVP_CIPHER)* enc, \
|
||||
ubyte* kstr, int klen, pem_password_cb* cb, \
|
||||
void* u) \
|
||||
{ \
|
||||
return PEM_ASN1_write((i2d_of_void*)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \
|
||||
type* PEM_read_bio_##name(BIO* bp, type** x, pem_password_cb* cb, void* u)\
|
||||
{ \
|
||||
return PEM_ASN1_read_bio((d2i_of_void*)d2i_##asn1, str,bp,(void**)x,cb,u); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \
|
||||
int PEM_write_bio_##name(BIO* bp, type* x) \
|
||||
{ \
|
||||
return PEM_ASN1_write_bio((i2d_of_void*)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \
|
||||
int PEM_write_bio_##name(BIO* bp, const(type)* x) \
|
||||
{ \
|
||||
return PEM_ASN1_write_bio((i2d_of_void*)i2d_##asn1,str,bp,(void*)x,NULL,NULL,0,NULL,NULL); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \
|
||||
int PEM_write_bio_##name(BIO* bp, type* x, const(EVP_CIPHER)* enc, \
|
||||
ubyte* kstr, int klen, pem_password_cb* cb, void* u) \
|
||||
{ \
|
||||
return PEM_ASN1_write_bio((i2d_of_void*)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \
|
||||
int PEM_write_bio_##name(BIO* bp, type* x, const(EVP_CIPHER)* enc, \
|
||||
ubyte* kstr, int klen, pem_password_cb* cb, void* u) \
|
||||
{ \
|
||||
return PEM_ASN1_write_bio((i2d_of_void*)i2d_##asn1,str,bp,(void*)x,enc,kstr,klen,cb,u); \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_PEM_write(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_bio(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_fp(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_write_const(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_fp_const(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_read(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_read_bio(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_read_fp(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_rw(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_read(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_read(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_const(name, type, str, asn1)
|
||||
|
||||
#define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_read(name, type, str, asn1) \
|
||||
IMPLEMENT_PEM_write_cb(name, type, str, asn1)
|
||||
+/
|
||||
|
||||
/* These are the same except they are for the declarations */
|
||||
|
||||
version (OPENSSL_NO_FP_API) {
|
||||
string DECLARE_PEM_read_fp(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_read_fp(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_write_fp(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_write_fp_const(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_write_cb_fp(string name, string type)() { return ""; }
|
||||
} else {
|
||||
string DECLARE_PEM_read_fp(string name, string type)() {
|
||||
return type ~ "* PEM_read_" ~ name ~ "(FILE* fp, " ~ type ~ "** x, pem_password_cb* cb, void* u);";
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_fp(string name, string type)() {
|
||||
return "int PEM_write_" ~ name ~ "(FILE* fp, " ~ type ~ "* x);";
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_fp_const(string name, string type)() {
|
||||
return "int PEM_write_" ~ name ~ "(FILE* fp, const(" ~ type ~ ")* x);";
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_cb_fp(string name, string type)() {
|
||||
return "int PEM_write_" ~ name ~ "(FILE* fp, " ~ type ~ "* x, const(EVP_CIPHER)* enc,
|
||||
ubyte* kstr, int klen, pem_password_cb* cb, void* u);";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
version (OPENSSL_NO_BIO) {
|
||||
string DECLARE_PEM_read_bio(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_write_bio(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_write_bio_const(string name, string type)() { return ""; }
|
||||
string DECLARE_PEM_write_cb_bio(string name, string type)() { return ""; }
|
||||
} else {
|
||||
string DECLARE_PEM_read_bio(string name, string type)() {
|
||||
return type ~ "* PEM_read_bio_" ~ name ~ "(BIO* bp, " ~ type ~ "** x, pem_password_cb* cb, void* u);";
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_bio(string name, string type)() {
|
||||
return "int PEM_write_bio_" ~ name ~ "(BIO* bp, " ~ type ~ "* x);";
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_bio_const(string name, string type)() {
|
||||
return "int PEM_write_bio_" ~ name ~ "(BIO* bp, const(" ~ type ~ ")* x);";
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_cb_bio(string name, string type)() {
|
||||
return "int PEM_write_bio_" ~ name ~ "(BIO* bp, " ~ type ~ "* x, const(EVP_CIPHER)* enc,
|
||||
ubyte* kstr, int klen, pem_password_cb* cb, void* u);";
|
||||
}
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write(string name, string type)() {
|
||||
return DECLARE_PEM_write_bio!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_write_fp!(name, type)();
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_const(string name, string type)() {
|
||||
return DECLARE_PEM_write_bio_const!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_write_fp_const!(name, type)();
|
||||
}
|
||||
|
||||
string DECLARE_PEM_write_cb(string name, string type)() {
|
||||
return DECLARE_PEM_write_cb_bio!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_write_cb_fp!(name, type)();
|
||||
}
|
||||
|
||||
string DECLARE_PEM_read(string name, string type)() {
|
||||
return DECLARE_PEM_read_bio!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_read_fp!(name, type)();
|
||||
}
|
||||
|
||||
string DECLARE_PEM_rw(string name, string type)() {
|
||||
return DECLARE_PEM_read!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_write!(name, type)();
|
||||
}
|
||||
|
||||
string DECLARE_PEM_rw_const(string name, string type)() {
|
||||
return DECLARE_PEM_read!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_write_const!(name, type)();
|
||||
}
|
||||
|
||||
string DECLARE_PEM_rw_cb(string name, string type)() {
|
||||
return DECLARE_PEM_read!(name, type)() ~ "\n" ~
|
||||
DECLARE_PEM_write_cb!(name, type)();
|
||||
}
|
||||
|
||||
version (all) {
|
||||
/* "userdata": new with OpenSSL 0.9.4 */
|
||||
alias typeof(*(ExternC!(int function(char* buf, int size, int rwflag, void* userdata))).init) pem_password_cb;
|
||||
} else {
|
||||
/* OpenSSL 0.9.3, 0.9.3a */
|
||||
alias typeof(*(ExternC!(int function(char* buf, int size, int rwflag))).init) pem_password_cb;
|
||||
}
|
||||
|
||||
int PEM_get_EVP_CIPHER_INFO(char* header, EVP_CIPHER_INFO* cipher);
|
||||
int PEM_do_header (EVP_CIPHER_INFO* cipher, ubyte* data,c_long* len,
|
||||
pem_password_cb* callback,void* u);
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
int PEM_read_bio(BIO* bp, char** name, char** header,
|
||||
ubyte** data,c_long* len);
|
||||
int PEM_write_bio(BIO* bp,const(char)* name,char* hdr,ubyte* data,
|
||||
c_long len);
|
||||
int PEM_bytes_read_bio(ubyte** pdata, c_long* plen, char** pnm, const(char)* name, BIO* bp,
|
||||
pem_password_cb* cb, void* u);
|
||||
void* PEM_ASN1_read_bio(d2i_of_void* d2i, const(char)* name, BIO* bp,
|
||||
void** x, pem_password_cb* cb, void* u);
|
||||
int PEM_ASN1_write_bio(i2d_of_void* i2d, const(char)* name,BIO* bp, void* x,
|
||||
const(EVP_CIPHER)* enc,ubyte* kstr,int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
|
||||
STACK_OF!(X509_INFO) * PEM_X509_INFO_read_bio(BIO* bp, STACK_OF!(X509_INFO) *sk, pem_password_cb* cb, void* u);
|
||||
int PEM_X509_INFO_write_bio(BIO* bp,X509_INFO* xi, EVP_CIPHER* enc,
|
||||
ubyte* kstr, int klen, pem_password_cb* cd, void* u);
|
||||
}
|
||||
|
||||
int PEM_read(FILE* fp, char** name, char** header,
|
||||
ubyte** data,c_long* len);
|
||||
int PEM_write(FILE* fp,char* name,char* hdr,ubyte* data,c_long len);
|
||||
void* PEM_ASN1_read(d2i_of_void* d2i, const(char)* name, FILE* fp, void** x,
|
||||
pem_password_cb* cb, void* u);
|
||||
int PEM_ASN1_write(i2d_of_void* i2d,const(char)* name,FILE* fp,
|
||||
void* x,const(EVP_CIPHER)* enc,ubyte* kstr,
|
||||
int klen,pem_password_cb* callback, void* u);
|
||||
STACK_OF!(X509_INFO) * PEM_X509_INFO_read(FILE* fp, STACK_OF!(X509_INFO) *sk,
|
||||
pem_password_cb* cb, void* u);
|
||||
|
||||
int PEM_SealInit(PEM_ENCODE_SEAL_CTX* ctx, EVP_CIPHER* type,
|
||||
EVP_MD* md_type, ubyte** ek, int* ekl,
|
||||
ubyte* iv, EVP_PKEY** pubk, int npubk);
|
||||
void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX* ctx, ubyte* out_, int* outl,
|
||||
ubyte* in_, int inl);
|
||||
int PEM_SealFinal(PEM_ENCODE_SEAL_CTX* ctx, ubyte* sig,int* sigl,
|
||||
ubyte* out_, int* outl, EVP_PKEY* priv);
|
||||
|
||||
void PEM_SignInit(EVP_MD_CTX* ctx, EVP_MD* type);
|
||||
void PEM_SignUpdate(EVP_MD_CTX* ctx,ubyte* d,uint cnt);
|
||||
int PEM_SignFinal(EVP_MD_CTX* ctx, ubyte* sigret,
|
||||
uint* siglen, EVP_PKEY* pkey);
|
||||
|
||||
int PEM_def_callback(char* buf, int num, int w, void* key);
|
||||
void PEM_proc_type(char* buf, int type);
|
||||
void PEM_dek_info(char* buf, const(char)* type, int len, char* str);
|
||||
|
||||
|
||||
public import deimos.openssl.symhacks;
|
||||
|
||||
mixin(DECLARE_PEM_rw!("X509", "X509")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("X509_AUX", "X509")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("X509_CERT_PAIR", "X509_CERT_PAIR")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("X509_REQ", "X509_REQ")());
|
||||
mixin(DECLARE_PEM_write!("X509_REQ_NEW", "X509_REQ")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("X509_CRL", "X509_CRL")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("PKCS7", "PKCS7")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("NETSCAPE_CERT_SEQUENCE", "NETSCAPE_CERT_SEQUENCE")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("PKCS8", "X509_SIG")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("PKCS8_PRIV_KEY_INFO", "PKCS8_PRIV_KEY_INFO")());
|
||||
|
||||
version(OPENSSL_NO_RSA) {} else {
|
||||
mixin(DECLARE_PEM_rw_cb!("RSAPrivateKey", "RSA")());
|
||||
|
||||
mixin(DECLARE_PEM_rw_const!("RSAPublicKey", "RSA")());
|
||||
mixin(DECLARE_PEM_rw!("RSA_PUBKEY", "RSA")());
|
||||
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_DSA) {} else {
|
||||
mixin(DECLARE_PEM_rw_cb!("DSAPrivateKey", "DSA")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("DSA_PUBKEY", "DSA")());
|
||||
|
||||
mixin(DECLARE_PEM_rw_const!("DSAparams", "DSA")());
|
||||
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_EC) {} else {
|
||||
mixin(DECLARE_PEM_rw_const!("ECPKParameters", "EC_GROUP")());
|
||||
mixin(DECLARE_PEM_rw_cb!("ECPrivateKey", "EC_KEY")());
|
||||
mixin(DECLARE_PEM_rw!("EC_PUBKEY", "EC_KEY")());
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_DH) {} else {
|
||||
mixin(DECLARE_PEM_rw_const!("DHparams", "DH")());
|
||||
|
||||
}
|
||||
|
||||
mixin(DECLARE_PEM_rw_cb!("PrivateKey", "EVP_PKEY")());
|
||||
|
||||
mixin(DECLARE_PEM_rw!("PUBKEY", "EVP_PKEY")());
|
||||
|
||||
int PEM_write_bio_PKCS8PrivateKey_nid(BIO* bp, EVP_PKEY* x, int nid,
|
||||
char* kstr, int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
int PEM_write_bio_PKCS8PrivateKey(BIO*, EVP_PKEY*, const(EVP_CIPHER)*,
|
||||
char*, int, pem_password_cb*, void*);
|
||||
int i2d_PKCS8PrivateKey_bio(BIO* bp, EVP_PKEY* x, const(EVP_CIPHER)* enc,
|
||||
char* kstr, int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
int i2d_PKCS8PrivateKey_nid_bio(BIO* bp, EVP_PKEY* x, int nid,
|
||||
char* kstr, int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
EVP_PKEY* d2i_PKCS8PrivateKey_bio(BIO* bp, EVP_PKEY** x, pem_password_cb* cb, void* u);
|
||||
|
||||
int i2d_PKCS8PrivateKey_fp(FILE* fp, EVP_PKEY* x, const(EVP_CIPHER)* enc,
|
||||
char* kstr, int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
int i2d_PKCS8PrivateKey_nid_fp(FILE* fp, EVP_PKEY* x, int nid,
|
||||
char* kstr, int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
int PEM_write_PKCS8PrivateKey_nid(FILE* fp, EVP_PKEY* x, int nid,
|
||||
char* kstr, int klen,
|
||||
pem_password_cb* cb, void* u);
|
||||
|
||||
EVP_PKEY* d2i_PKCS8PrivateKey_fp(FILE* fp, EVP_PKEY** x, pem_password_cb* cb, void* u);
|
||||
|
||||
int PEM_write_PKCS8PrivateKey(FILE* fp,EVP_PKEY* x,const(EVP_CIPHER)* enc,
|
||||
char* kstr,int klen, pem_password_cb* cd, void* u);
|
||||
|
||||
EVP_PKEY* PEM_read_bio_Parameters(BIO* bp, EVP_PKEY** x);
|
||||
int PEM_write_bio_Parameters(BIO* bp, EVP_PKEY* x);
|
||||
|
||||
|
||||
EVP_PKEY* b2i_PrivateKey(const(ubyte)** in_, c_long length);
|
||||
EVP_PKEY* b2i_PublicKey(const(ubyte)** in_, c_long length);
|
||||
EVP_PKEY* b2i_PrivateKey_bio(BIO* in_);
|
||||
EVP_PKEY* b2i_PublicKey_bio(BIO* in_);
|
||||
int i2b_PrivateKey_bio(BIO* out_, EVP_PKEY* pk);
|
||||
int i2b_PublicKey_bio(BIO* out_, EVP_PKEY* pk);
|
||||
version(OPENSSL_NO_RC4) {} else {
|
||||
EVP_PKEY* b2i_PVK_bio(BIO* in_, pem_password_cb* cb, void* u);
|
||||
int i2b_PVK_bio(BIO* out_, EVP_PKEY* pk, int enclevel,
|
||||
pem_password_cb* cb, void* u);
|
||||
}
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_PEM_strings();
|
||||
|
||||
/* Error codes for the PEM functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum PEM_F_B2I_DSS = 127;
|
||||
enum PEM_F_B2I_PVK_BIO = 128;
|
||||
enum PEM_F_B2I_RSA = 129;
|
||||
enum PEM_F_CHECK_BITLEN_DSA = 130;
|
||||
enum PEM_F_CHECK_BITLEN_RSA = 131;
|
||||
enum PEM_F_D2I_PKCS8PRIVATEKEY_BIO = 120;
|
||||
enum PEM_F_D2I_PKCS8PRIVATEKEY_FP = 121;
|
||||
enum PEM_F_DO_B2I = 132;
|
||||
enum PEM_F_DO_B2I_BIO = 133;
|
||||
enum PEM_F_DO_BLOB_HEADER = 134;
|
||||
enum PEM_F_DO_PK8PKEY = 126;
|
||||
enum PEM_F_DO_PK8PKEY_FP = 125;
|
||||
enum PEM_F_DO_PVK_BODY = 135;
|
||||
enum PEM_F_DO_PVK_HEADER = 136;
|
||||
enum PEM_F_I2B_PVK = 137;
|
||||
enum PEM_F_I2B_PVK_BIO = 138;
|
||||
enum PEM_F_LOAD_IV = 101;
|
||||
enum PEM_F_PEM_ASN1_READ = 102;
|
||||
enum PEM_F_PEM_ASN1_READ_BIO = 103;
|
||||
enum PEM_F_PEM_ASN1_WRITE = 104;
|
||||
enum PEM_F_PEM_ASN1_WRITE_BIO = 105;
|
||||
enum PEM_F_PEM_DEF_CALLBACK = 100;
|
||||
enum PEM_F_PEM_DO_HEADER = 106;
|
||||
enum PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY = 118;
|
||||
enum PEM_F_PEM_GET_EVP_CIPHER_INFO = 107;
|
||||
enum PEM_F_PEM_PK8PKEY = 119;
|
||||
enum PEM_F_PEM_READ = 108;
|
||||
enum PEM_F_PEM_READ_BIO = 109;
|
||||
enum PEM_F_PEM_READ_BIO_PARAMETERS = 140;
|
||||
enum PEM_F_PEM_READ_BIO_PRIVATEKEY = 123;
|
||||
enum PEM_F_PEM_READ_PRIVATEKEY = 124;
|
||||
enum PEM_F_PEM_SEALFINAL = 110;
|
||||
enum PEM_F_PEM_SEALINIT = 111;
|
||||
enum PEM_F_PEM_SIGNFINAL = 112;
|
||||
enum PEM_F_PEM_WRITE = 113;
|
||||
enum PEM_F_PEM_WRITE_BIO = 114;
|
||||
enum PEM_F_PEM_WRITE_PRIVATEKEY = 139;
|
||||
enum PEM_F_PEM_X509_INFO_READ = 115;
|
||||
enum PEM_F_PEM_X509_INFO_READ_BIO = 116;
|
||||
enum PEM_F_PEM_X509_INFO_WRITE_BIO = 117;
|
||||
|
||||
/* Reason codes. */
|
||||
enum PEM_R_BAD_BASE64_DECODE = 100;
|
||||
enum PEM_R_BAD_DECRYPT = 101;
|
||||
enum PEM_R_BAD_END_LINE = 102;
|
||||
enum PEM_R_BAD_IV_CHARS = 103;
|
||||
enum PEM_R_BAD_MAGIC_NUMBER = 116;
|
||||
enum PEM_R_BAD_PASSWORD_READ = 104;
|
||||
enum PEM_R_BAD_VERSION_NUMBER = 117;
|
||||
enum PEM_R_BIO_WRITE_FAILURE = 118;
|
||||
enum PEM_R_CIPHER_IS_NULL = 127;
|
||||
enum PEM_R_ERROR_CONVERTING_PRIVATE_KEY = 115;
|
||||
enum PEM_R_EXPECTING_PRIVATE_KEY_BLOB = 119;
|
||||
enum PEM_R_EXPECTING_PUBLIC_KEY_BLOB = 120;
|
||||
enum PEM_R_INCONSISTENT_HEADER = 121;
|
||||
enum PEM_R_KEYBLOB_HEADER_PARSE_ERROR = 122;
|
||||
enum PEM_R_KEYBLOB_TOO_SHORT = 123;
|
||||
enum PEM_R_NOT_DEK_INFO = 105;
|
||||
enum PEM_R_NOT_ENCRYPTED = 106;
|
||||
enum PEM_R_NOT_PROC_TYPE = 107;
|
||||
enum PEM_R_NO_START_LINE = 108;
|
||||
enum PEM_R_PROBLEMS_GETTING_PASSWORD = 109;
|
||||
enum PEM_R_PUBLIC_KEY_NO_RSA = 110;
|
||||
enum PEM_R_PVK_DATA_TOO_SHORT = 124;
|
||||
enum PEM_R_PVK_TOO_SHORT = 125;
|
||||
enum PEM_R_READ_KEY = 111;
|
||||
enum PEM_R_SHORT_HEADER = 112;
|
||||
enum PEM_R_UNSUPPORTED_CIPHER = 113;
|
||||
enum PEM_R_UNSUPPORTED_ENCRYPTION = 114;
|
||||
enum PEM_R_UNSUPPORTED_KEY_COMPONENTS = 126;
|
|
@ -0,0 +1,65 @@
|
|||
/* ====================================================================
|
||||
* Copyright (c) 1999 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).
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This header only exists to break a circular dependency between pem and err
|
||||
* Ben 30 Jan 1999.
|
||||
*/
|
||||
|
||||
module deimos.openssl.pem2;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
void ERR_load_PEM_strings();
|
|
@ -0,0 +1,330 @@
|
|||
/* pkcs12.h */
|
||||
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
||||
* project 1999.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999 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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.pkcs12;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.bio;
|
||||
public import deimos.openssl.x509;
|
||||
public import deimos.openssl.pkcs7;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
enum PKCS12_KEY_ID = 1;
|
||||
enum PKCS12_IV_ID = 2;
|
||||
enum PKCS12_MAC_ID = 3;
|
||||
|
||||
/* Default iteration count */
|
||||
// #ifndef PKCS12_DEFAULT_ITER
|
||||
alias PKCS5_DEFAULT_ITER PKCS12_DEFAULT_ITER;
|
||||
// #endif
|
||||
|
||||
enum PKCS12_MAC_KEY_LENGTH = 20;
|
||||
|
||||
enum PKCS12_SALT_LEN = 8;
|
||||
|
||||
/* Uncomment out next line for unicode password and names, otherwise ASCII */
|
||||
|
||||
/*#define PBE_UNICODE*/
|
||||
|
||||
version (PBE_UNICODE) {
|
||||
alias PKCS12_key_gen_uni PKCS12_key_gen;
|
||||
alias PKCS12_add_friendlyname_uni PKCS12_add_friendlyname;
|
||||
} else {
|
||||
alias PKCS12_key_gen_asc PKCS12_key_gen;
|
||||
alias PKCS12_add_friendlyname_asc PKCS12_add_friendlyname;
|
||||
}
|
||||
|
||||
/* MS key usage constants */
|
||||
|
||||
enum KEY_EX = 0x10;
|
||||
enum KEY_SIG = 0x80;
|
||||
|
||||
struct PKCS12_MAC_DATA {
|
||||
X509_SIG* dinfo;
|
||||
ASN1_OCTET_STRING* salt;
|
||||
ASN1_INTEGER* iter; /* defaults to 1 */
|
||||
}
|
||||
|
||||
struct PKCS12 {
|
||||
ASN1_INTEGER* version_;
|
||||
PKCS12_MAC_DATA* mac;
|
||||
PKCS7* authsafes;
|
||||
}
|
||||
|
||||
struct PKCS12_SAFEBAG {
|
||||
ASN1_OBJECT* type;
|
||||
union value_ {
|
||||
pkcs12_bag_st* bag; /* secret, crl and certbag */
|
||||
pkcs8_priv_key_info_st* keybag; /* keybag */
|
||||
X509_SIG* shkeybag; /* shrouded key bag */
|
||||
STACK_OF!(PKCS12_SAFEBAG) *safes;
|
||||
ASN1_TYPE* other;
|
||||
}
|
||||
value_ value;
|
||||
STACK_OF!(X509_ATTRIBUTE) *attrib;
|
||||
}
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(PKCS12_SAFEBAG);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(PKCS12_SAFEBAG);
|
||||
mixin DECLARE_PKCS12_STACK_OF!(PKCS12_SAFEBAG);
|
||||
|
||||
struct pkcs12_bag_st {
|
||||
ASN1_OBJECT* type;
|
||||
union value_ {
|
||||
ASN1_OCTET_STRING* x509cert;
|
||||
ASN1_OCTET_STRING* x509crl;
|
||||
ASN1_OCTET_STRING* octet;
|
||||
ASN1_IA5STRING* sdsicert;
|
||||
ASN1_TYPE* other; /* Secret or other bag */
|
||||
}
|
||||
value_ value;
|
||||
}
|
||||
alias pkcs12_bag_st PKCS12_BAGS;
|
||||
|
||||
enum PKCS12_ERROR = 0;
|
||||
enum PKCS12_OK = 1;
|
||||
|
||||
/* Compatibility macros */
|
||||
|
||||
alias PKCS12_x5092certbag M_PKCS12_x5092certbag;
|
||||
alias PKCS12_x509crl2certbag M_PKCS12_x509crl2certbag;
|
||||
|
||||
alias PKCS12_certbag2x509 M_PKCS12_certbag2x509;
|
||||
alias PKCS12_certbag2x509crl M_PKCS12_certbag2x509crl;
|
||||
|
||||
alias PKCS12_unpack_p7data M_PKCS12_unpack_p7data;
|
||||
alias PKCS12_pack_authsafes M_PKCS12_pack_authsafes;
|
||||
alias PKCS12_unpack_authsafes M_PKCS12_unpack_authsafes;
|
||||
alias PKCS12_unpack_p7encdata M_PKCS12_unpack_p7encdata;
|
||||
|
||||
alias PKCS12_decrypt_skey M_PKCS12_decrypt_skey;
|
||||
alias PKCS8_decrypt M_PKCS8_decrypt;
|
||||
|
||||
auto M_PKCS12_bag_type(B)(B bg) {return OBJ_obj2nid(bg.type); }
|
||||
auto M_PKCS12_cert_bag_type(B)(B bg) {return OBJ_obj2nid(bg.value.bag.type); }
|
||||
alias M_PKCS12_cert_bag_type M_PKCS12_crl_bag_type;
|
||||
|
||||
auto PKCS12_get_attr()(PKCS12_SAFEBAG* bag, int attr_nid) {
|
||||
return PKCS12_get_attr_gen(bag.attrib, attr_nid); }
|
||||
|
||||
auto PKCS8_get_attr(P)(P p8, int attr_nid) {
|
||||
return PKCS12_get_attr_gen(p8.attributes, attr_nid);}
|
||||
|
||||
auto PKCS12_mac_present()(PKCS12* p12) { return p12.mac ? 1 : 0; }
|
||||
|
||||
|
||||
PKCS12_SAFEBAG* PKCS12_x5092certbag(X509* x509);
|
||||
PKCS12_SAFEBAG* PKCS12_x509crl2certbag(X509_CRL* crl);
|
||||
X509* PKCS12_certbag2x509(PKCS12_SAFEBAG* bag);
|
||||
X509_CRL* PKCS12_certbag2x509crl(PKCS12_SAFEBAG* bag);
|
||||
|
||||
PKCS12_SAFEBAG* PKCS12_item_pack_safebag(void* obj, const(ASN1_ITEM)* it, int nid1,
|
||||
int nid2);
|
||||
PKCS12_SAFEBAG* PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO* p8);
|
||||
PKCS8_PRIV_KEY_INFO* PKCS8_decrypt(X509_SIG* p8, const(char)* pass, int passlen);
|
||||
PKCS8_PRIV_KEY_INFO* PKCS12_decrypt_skey(PKCS12_SAFEBAG* bag, const(char)* pass,
|
||||
int passlen);
|
||||
X509_SIG* PKCS8_encrypt(int pbe_nid, const(EVP_CIPHER)* cipher,
|
||||
const(char)* pass, int passlen,
|
||||
ubyte* salt, int saltlen, int iter,
|
||||
PKCS8_PRIV_KEY_INFO* p8);
|
||||
PKCS12_SAFEBAG* PKCS12_MAKE_SHKEYBAG(int pbe_nid, const(char)* pass,
|
||||
int passlen, ubyte* salt,
|
||||
int saltlen, int iter,
|
||||
PKCS8_PRIV_KEY_INFO* p8);
|
||||
PKCS7* PKCS12_pack_p7data(STACK_OF!(PKCS12_SAFEBAG) *sk);
|
||||
STACK_OF!(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7* p7);
|
||||
PKCS7* PKCS12_pack_p7encdata(int pbe_nid, const(char)* pass, int passlen,
|
||||
ubyte* salt, int saltlen, int iter,
|
||||
STACK_OF!(PKCS12_SAFEBAG) *bags);
|
||||
STACK_OF!(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7* p7, const(char)* pass, int passlen);
|
||||
|
||||
int PKCS12_pack_authsafes(PKCS12* p12, STACK_OF!(PKCS7) *safes);
|
||||
STACK_OF!(PKCS7) *PKCS12_unpack_authsafes(PKCS12* p12);
|
||||
|
||||
int PKCS12_add_localkeyid(PKCS12_SAFEBAG* bag, ubyte* name, int namelen);
|
||||
int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG* bag, const(char)* name,
|
||||
int namelen);
|
||||
int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG* bag, const(char)* name,
|
||||
int namelen);
|
||||
int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG* bag, const(ubyte)* name,
|
||||
int namelen);
|
||||
int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO* p8, int usage);
|
||||
ASN1_TYPE* PKCS12_get_attr_gen(STACK_OF!(X509_ATTRIBUTE) *attrs, int attr_nid);
|
||||
char* PKCS12_get_friendlyname(PKCS12_SAFEBAG* bag);
|
||||
ubyte* PKCS12_pbe_crypt(X509_ALGOR* algor, const(char)* pass,
|
||||
int passlen, ubyte* in_, int inlen,
|
||||
ubyte** data, int* datalen, int en_de);
|
||||
void* PKCS12_item_decrypt_d2i(X509_ALGOR* algor, const(ASN1_ITEM)* it,
|
||||
const(char)* pass, int passlen, ASN1_OCTET_STRING* oct, int zbuf);
|
||||
ASN1_OCTET_STRING* PKCS12_item_i2d_encrypt(X509_ALGOR* algor, const(ASN1_ITEM)* it,
|
||||
const(char)* pass, int passlen,
|
||||
void* obj, int zbuf);
|
||||
PKCS12* PKCS12_init(int mode);
|
||||
int PKCS12_key_gen_asc(const(char)* pass, int passlen, ubyte* salt,
|
||||
int saltlen, int id, int iter, int n,
|
||||
ubyte* out_, const(EVP_MD)* md_type);
|
||||
int PKCS12_key_gen_uni(ubyte* pass, int passlen, ubyte* salt, int saltlen, int id, int iter, int n, ubyte* out_, const(EVP_MD)* md_type);
|
||||
int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX* ctx, const(char)* pass, int passlen,
|
||||
ASN1_TYPE* param, const(EVP_CIPHER)* cipher, const(EVP_MD)* md_type,
|
||||
int en_de);
|
||||
int PKCS12_gen_mac(PKCS12* p12, const(char)* pass, int passlen,
|
||||
ubyte* mac, uint* maclen);
|
||||
int PKCS12_verify_mac(PKCS12* p12, const(char)* pass, int passlen);
|
||||
int PKCS12_set_mac(PKCS12* p12, const(char)* pass, int passlen,
|
||||
ubyte* salt, int saltlen, int iter,
|
||||
const(EVP_MD)* md_type);
|
||||
int PKCS12_setup_mac(PKCS12* p12, int iter, ubyte* salt,
|
||||
int saltlen, const(EVP_MD)* md_type);
|
||||
ubyte* OPENSSL_asc2uni(const(char)* asc, int asclen, ubyte** uni, int* unilen);
|
||||
char* OPENSSL_uni2asc(ubyte* uni, int unilen);
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS12");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS12_MAC_DATA");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS12_SAFEBAG");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS12_BAGS");
|
||||
|
||||
mixin(DECLARE_ASN1_ITEM!"PKCS12_SAFEBAGS");
|
||||
mixin(DECLARE_ASN1_ITEM!"PKCS12_AUTHSAFES");
|
||||
|
||||
void PKCS12_PBE_add();
|
||||
int PKCS12_parse(PKCS12* p12, const(char)* pass, EVP_PKEY** pkey, X509** cert,
|
||||
STACK_OF!(X509) **ca);
|
||||
PKCS12* PKCS12_create(char* pass, char* name, EVP_PKEY* pkey, X509* cert,
|
||||
STACK_OF!(X509) *ca, int nid_key, int nid_cert, int iter,
|
||||
int mac_iter, int keytype);
|
||||
|
||||
PKCS12_SAFEBAG* PKCS12_add_cert(STACK_OF!(PKCS12_SAFEBAG) **pbags, X509* cert);
|
||||
PKCS12_SAFEBAG* PKCS12_add_key(STACK_OF!(PKCS12_SAFEBAG) **pbags, EVP_PKEY* key,
|
||||
int key_usage, int iter,
|
||||
int key_nid, char* pass);
|
||||
int PKCS12_add_safe(STACK_OF!(PKCS7) **psafes, STACK_OF!(PKCS12_SAFEBAG) *bags,
|
||||
int safe_nid, int iter, char* pass);
|
||||
PKCS12* PKCS12_add_safes(STACK_OF!(PKCS7) *safes, int p7_nid);
|
||||
|
||||
int i2d_PKCS12_bio(BIO* bp, PKCS12* p12);
|
||||
int i2d_PKCS12_fp(FILE* fp, PKCS12* p12);
|
||||
PKCS12* d2i_PKCS12_bio(BIO* bp, PKCS12** p12);
|
||||
PKCS12* d2i_PKCS12_fp(FILE* fp, PKCS12** p12);
|
||||
int PKCS12_newpass(PKCS12* p12, char* oldpass, char* newpass);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_PKCS12_strings();
|
||||
|
||||
/* Error codes for the PKCS12 functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum PKCS12_F_PARSE_BAG = 129;
|
||||
enum PKCS12_F_PARSE_BAGS = 103;
|
||||
enum PKCS12_F_PKCS12_ADD_FRIENDLYNAME = 100;
|
||||
enum PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC = 127;
|
||||
enum PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI = 102;
|
||||
enum PKCS12_F_PKCS12_ADD_LOCALKEYID = 104;
|
||||
enum PKCS12_F_PKCS12_CREATE = 105;
|
||||
enum PKCS12_F_PKCS12_GEN_MAC = 107;
|
||||
enum PKCS12_F_PKCS12_INIT = 109;
|
||||
enum PKCS12_F_PKCS12_ITEM_DECRYPT_D2I = 106;
|
||||
enum PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT = 108;
|
||||
enum PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG = 117;
|
||||
enum PKCS12_F_PKCS12_KEY_GEN_ASC = 110;
|
||||
enum PKCS12_F_PKCS12_KEY_GEN_UNI = 111;
|
||||
enum PKCS12_F_PKCS12_MAKE_KEYBAG = 112;
|
||||
enum PKCS12_F_PKCS12_MAKE_SHKEYBAG = 113;
|
||||
enum PKCS12_F_PKCS12_NEWPASS = 128;
|
||||
enum PKCS12_F_PKCS12_PACK_P7DATA = 114;
|
||||
enum PKCS12_F_PKCS12_PACK_P7ENCDATA = 115;
|
||||
enum PKCS12_F_PKCS12_PARSE = 118;
|
||||
enum PKCS12_F_PKCS12_PBE_CRYPT = 119;
|
||||
enum PKCS12_F_PKCS12_PBE_KEYIVGEN = 120;
|
||||
enum PKCS12_F_PKCS12_SETUP_MAC = 122;
|
||||
enum PKCS12_F_PKCS12_SET_MAC = 123;
|
||||
enum PKCS12_F_PKCS12_UNPACK_AUTHSAFES = 130;
|
||||
enum PKCS12_F_PKCS12_UNPACK_P7DATA = 131;
|
||||
enum PKCS12_F_PKCS12_VERIFY_MAC = 126;
|
||||
enum PKCS12_F_PKCS8_ADD_KEYUSAGE = 124;
|
||||
enum PKCS12_F_PKCS8_ENCRYPT = 125;
|
||||
|
||||
/* Reason codes. */
|
||||
enum PKCS12_R_CANT_PACK_STRUCTURE = 100;
|
||||
enum PKCS12_R_CONTENT_TYPE_NOT_DATA = 121;
|
||||
enum PKCS12_R_DECODE_ERROR = 101;
|
||||
enum PKCS12_R_ENCODE_ERROR = 102;
|
||||
enum PKCS12_R_ENCRYPT_ERROR = 103;
|
||||
enum PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE = 120;
|
||||
enum PKCS12_R_INVALID_NULL_ARGUMENT = 104;
|
||||
enum PKCS12_R_INVALID_NULL_PKCS12_POINTER = 105;
|
||||
enum PKCS12_R_IV_GEN_ERROR = 106;
|
||||
enum PKCS12_R_KEY_GEN_ERROR = 107;
|
||||
enum PKCS12_R_MAC_ABSENT = 108;
|
||||
enum PKCS12_R_MAC_GENERATION_ERROR = 109;
|
||||
enum PKCS12_R_MAC_SETUP_ERROR = 110;
|
||||
enum PKCS12_R_MAC_STRING_SET_ERROR = 111;
|
||||
enum PKCS12_R_MAC_VERIFY_ERROR = 112;
|
||||
enum PKCS12_R_MAC_VERIFY_FAILURE = 113;
|
||||
enum PKCS12_R_PARSE_ERROR = 114;
|
||||
enum PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR = 115;
|
||||
enum PKCS12_R_PKCS12_CIPHERFINAL_ERROR = 116;
|
||||
enum PKCS12_R_PKCS12_PBE_CRYPT_ERROR = 117;
|
||||
enum PKCS12_R_UNKNOWN_DIGEST_ALGORITHM = 118;
|
||||
enum PKCS12_R_UNSUPPORTED_PKCS12_MODE = 119;
|
|
@ -0,0 +1,500 @@
|
|||
/* crypto/pkcs7/pkcs7.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.pkcs7;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.x509; // Needed for X509_ATTRIBUTE.
|
||||
|
||||
public import deimos.openssl.asn1;
|
||||
public import deimos.openssl.bio;
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
public import deimos.openssl.symhacks;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
// #ifdef OPENSSL_SYS_WIN32
|
||||
// /* Under Win32 thes are defined in wincrypt.h */
|
||||
// #undef PKCS7_ISSUER_AND_SERIAL
|
||||
// #undef PKCS7_SIGNER_INFO
|
||||
// #endif
|
||||
|
||||
/*
|
||||
Encryption_ID DES-CBC
|
||||
Digest_ID MD5
|
||||
Digest_Encryption_ID rsaEncryption
|
||||
Key_Encryption_ID rsaEncryption
|
||||
*/
|
||||
|
||||
struct pkcs7_issuer_and_serial_st {
|
||||
X509_NAME* issuer;
|
||||
ASN1_INTEGER* serial;
|
||||
}
|
||||
alias pkcs7_issuer_and_serial_st PKCS7_ISSUER_AND_SERIAL;
|
||||
|
||||
struct pkcs7_signer_info_st {
|
||||
ASN1_INTEGER* version_; /* version 1 */
|
||||
PKCS7_ISSUER_AND_SERIAL* issuer_and_serial;
|
||||
X509_ALGOR* digest_alg;
|
||||
STACK_OF!(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
|
||||
X509_ALGOR* digest_enc_alg;
|
||||
ASN1_OCTET_STRING* enc_digest;
|
||||
STACK_OF!(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
|
||||
|
||||
/* The private key to sign with */
|
||||
EVP_PKEY* pkey;
|
||||
}
|
||||
alias pkcs7_signer_info_st PKCS7_SIGNER_INFO;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(PKCS7_SIGNER_INFO);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(PKCS7_SIGNER_INFO);
|
||||
|
||||
struct pkcs7_recip_info_st {
|
||||
ASN1_INTEGER* version_; /* version 0 */
|
||||
PKCS7_ISSUER_AND_SERIAL* issuer_and_serial;
|
||||
X509_ALGOR* key_enc_algor;
|
||||
ASN1_OCTET_STRING* enc_key;
|
||||
X509* cert; /* get the pub-key from this */
|
||||
}
|
||||
alias pkcs7_recip_info_st PKCS7_RECIP_INFO;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(PKCS7_RECIP_INFO);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(PKCS7_RECIP_INFO);
|
||||
|
||||
struct pkcs7_signed_st {
|
||||
ASN1_INTEGER* version_; /* version 1 */
|
||||
STACK_OF!(X509_ALGOR) *md_algs; /* md used */
|
||||
STACK_OF!(X509) *cert; /* [ 0 ] */
|
||||
STACK_OF!(X509_CRL) *crl; /* [ 1 ] */
|
||||
STACK_OF!(PKCS7_SIGNER_INFO) *signer_info;
|
||||
|
||||
pkcs7_st* contents;
|
||||
}
|
||||
alias pkcs7_signed_st PKCS7_SIGNED;
|
||||
/* The above structure is very very similar to PKCS7_SIGN_ENVELOPE.
|
||||
* How about merging the two */
|
||||
|
||||
struct pkcs7_enc_content_st {
|
||||
ASN1_OBJECT* content_type;
|
||||
X509_ALGOR* algorithm;
|
||||
ASN1_OCTET_STRING* enc_data; /* [ 0 ] */
|
||||
const(EVP_CIPHER)* cipher;
|
||||
}
|
||||
alias pkcs7_enc_content_st PKCS7_ENC_CONTENT;
|
||||
|
||||
struct pkcs7_enveloped_st {
|
||||
ASN1_INTEGER* version_; /* version 0 */
|
||||
STACK_OF!(PKCS7_RECIP_INFO) *recipientinfo;
|
||||
PKCS7_ENC_CONTENT* enc_data;
|
||||
}
|
||||
alias pkcs7_enveloped_st PKCS7_ENVELOPE;
|
||||
|
||||
struct pkcs7_signedandenveloped_st {
|
||||
ASN1_INTEGER* version_; /* version 1 */
|
||||
STACK_OF!(X509_ALGOR) *md_algs; /* md used */
|
||||
STACK_OF!(X509) *cert; /* [ 0 ] */
|
||||
STACK_OF!(X509_CRL) *crl; /* [ 1 ] */
|
||||
STACK_OF!(PKCS7_SIGNER_INFO) *signer_info;
|
||||
|
||||
PKCS7_ENC_CONTENT* enc_data;
|
||||
STACK_OF!(PKCS7_RECIP_INFO) *recipientinfo;
|
||||
}
|
||||
alias pkcs7_signedandenveloped_st PKCS7_SIGN_ENVELOPE;
|
||||
|
||||
struct pkcs7_digest_st {
|
||||
ASN1_INTEGER* version_; /* version 0 */
|
||||
X509_ALGOR* md; /* md used */
|
||||
pkcs7_st* contents;
|
||||
ASN1_OCTET_STRING* digest;
|
||||
}
|
||||
alias pkcs7_digest_st PKCS7_DIGEST;
|
||||
|
||||
struct pkcs7_encrypted_st {
|
||||
ASN1_INTEGER* version_; /* version 0 */
|
||||
PKCS7_ENC_CONTENT* enc_data;
|
||||
}
|
||||
alias pkcs7_encrypted_st PKCS7_ENCRYPT;
|
||||
|
||||
struct pkcs7_st
|
||||
{
|
||||
/* The following is non NULL if it contains ASN1 encoding of
|
||||
* this structure */
|
||||
ubyte* asn1;
|
||||
c_long length;
|
||||
|
||||
enum PKCS7_S_HEADER = 0;
|
||||
enum PKCS7_S_BODY = 1;
|
||||
enum PKCS7_S_TAIL = 2;
|
||||
int state; /* used during processing */
|
||||
|
||||
int detached;
|
||||
|
||||
ASN1_OBJECT* type;
|
||||
/* content as defined by the type */
|
||||
/* all encryption/message digests are applied to the 'contents',
|
||||
* leaving out the 'type' field. */
|
||||
union d_ {
|
||||
char* ptr;
|
||||
|
||||
/* NID_pkcs7_data */
|
||||
ASN1_OCTET_STRING* data;
|
||||
|
||||
/* NID_pkcs7_signed */
|
||||
PKCS7_SIGNED* sign;
|
||||
|
||||
/* NID_pkcs7_enveloped */
|
||||
PKCS7_ENVELOPE* enveloped;
|
||||
|
||||
/* NID_pkcs7_signedAndEnveloped */
|
||||
PKCS7_SIGN_ENVELOPE* signed_and_enveloped;
|
||||
|
||||
/* NID_pkcs7_digest */
|
||||
PKCS7_DIGEST* digest;
|
||||
|
||||
/* NID_pkcs7_encrypted */
|
||||
PKCS7_ENCRYPT* encrypted;
|
||||
|
||||
/* Anything else */
|
||||
ASN1_TYPE* other;
|
||||
}
|
||||
d_ d;
|
||||
}
|
||||
alias pkcs7_st PKCS7;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(PKCS7);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(PKCS7);
|
||||
mixin DECLARE_PKCS12_STACK_OF!(PKCS7);
|
||||
|
||||
enum PKCS7_OP_SET_DETACHED_SIGNATURE = 1;
|
||||
enum PKCS7_OP_GET_DETACHED_SIGNATURE = 2;
|
||||
|
||||
auto PKCS7_get_signed_attributes()(PKCS7_SIGNER_INFO* si) { return si.auth_attr; }
|
||||
auto PKCS7_get_attributes()(PKCS7_SIGNER_INFO* si) { return si.unauth_attr; }
|
||||
|
||||
auto PKCS7_type_is_signed()(const(ASN1_OBJECT)* a) { return (OBJ_obj2nid(a.type) == NID_pkcs7_signed); }
|
||||
auto PKCS7_type_is_encrypted()(const(ASN1_OBJECT)* a) { return (OBJ_obj2nid(a.type) == NID_pkcs7_encrypted); }
|
||||
auto PKCS7_type_is_enveloped()(const(ASN1_OBJECT)* a) { return (OBJ_obj2nid(a.type) == NID_pkcs7_enveloped); }
|
||||
auto PKCS7_type_is_signedAndEnveloped()(const(ASN1_OBJECT)* a) { return
|
||||
(OBJ_obj2nid(a.type) == NID_pkcs7_signedAndEnveloped); }
|
||||
auto PKCS7_type_is_data()(const(ASN1_OBJECT)* a) { return (OBJ_obj2nid(a.type) == NID_pkcs7_data); }
|
||||
auto PKCS7_type_is_digest()(const(ASN1_OBJECT)* a) { return (OBJ_obj2nid(a.type) == NID_pkcs7_digest); }
|
||||
auto PKCS7_type_is_encrypted()(const(ASN1_OBJECT)* a) { return
|
||||
(OBJ_obj2nid(a.type) == NID_pkcs7_encrypted); }
|
||||
|
||||
auto PKCS7_type_is_digest()(const(ASN1_OBJECT)* a) { return (OBJ_obj2nid(a.type) == NID_pkcs7_digest); }
|
||||
|
||||
auto PKCS7_set_detached()(PKCS7* p, c_long v) {
|
||||
return PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,null);
|
||||
}
|
||||
auto PKCS7_get_detached()(PKCS7* p) {
|
||||
return PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,null);
|
||||
}
|
||||
|
||||
auto PKCS7_is_detached()(PKCS7* p7) { return (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)); }
|
||||
|
||||
/* S/MIME related flags */
|
||||
|
||||
enum PKCS7_TEXT = 0x1;
|
||||
enum PKCS7_NOCERTS = 0x2;
|
||||
enum PKCS7_NOSIGS = 0x4;
|
||||
enum PKCS7_NOCHAIN = 0x8;
|
||||
enum PKCS7_NOINTERN = 0x10;
|
||||
enum PKCS7_NOVERIFY = 0x20;
|
||||
enum PKCS7_DETACHED = 0x40;
|
||||
enum PKCS7_BINARY = 0x80;
|
||||
enum PKCS7_NOATTR = 0x100;
|
||||
enum PKCS7_NOSMIMECAP = 0x200;
|
||||
enum PKCS7_NOOLDMIMETYPE = 0x400;
|
||||
enum PKCS7_CRLFEOL = 0x800;
|
||||
enum PKCS7_STREAM = 0x1000;
|
||||
enum PKCS7_NOCRL = 0x2000;
|
||||
enum PKCS7_PARTIAL = 0x4000;
|
||||
enum PKCS7_REUSE_DIGEST = 0x8000;
|
||||
|
||||
/* Flags: for compatibility with older code */
|
||||
|
||||
alias PKCS7_TEXT SMIME_TEXT;
|
||||
alias PKCS7_NOCERTS SMIME_NOCERTS;
|
||||
alias PKCS7_NOSIGS SMIME_NOSIGS;
|
||||
alias PKCS7_NOCHAIN SMIME_NOCHAIN;
|
||||
alias PKCS7_NOINTERN SMIME_NOINTERN;
|
||||
alias PKCS7_NOVERIFY SMIME_NOVERIFY;
|
||||
alias PKCS7_DETACHED SMIME_DETACHED;
|
||||
alias PKCS7_BINARY SMIME_BINARY;
|
||||
alias PKCS7_NOATTR SMIME_NOATTR;
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_ISSUER_AND_SERIAL");
|
||||
|
||||
int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL* data,const(EVP_MD)* type,
|
||||
ubyte* md,uint* len);
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
PKCS7* d2i_PKCS7_fp(FILE* fp,PKCS7** p7);
|
||||
int i2d_PKCS7_fp(FILE* fp,PKCS7* p7);
|
||||
}
|
||||
PKCS7* PKCS7_dup(PKCS7* p7);
|
||||
PKCS7* d2i_PKCS7_bio(BIO* bp,PKCS7** p7);
|
||||
int i2d_PKCS7_bio(BIO* bp,PKCS7* p7);
|
||||
int i2d_PKCS7_bio_stream(BIO* out_, PKCS7* p7, BIO* in_, int flags);
|
||||
int PEM_write_bio_PKCS7_stream(BIO* out_, PKCS7* p7, BIO* in_, int flags);
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_SIGNER_INFO");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_RECIP_INFO");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_SIGNED");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_ENC_CONTENT");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_ENVELOPE");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_SIGN_ENVELOPE");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_DIGEST");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7_ENCRYPT");
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"PKCS7");
|
||||
|
||||
mixin(DECLARE_ASN1_ITEM!"PKCS7_ATTR_SIGN");
|
||||
mixin(DECLARE_ASN1_ITEM!"PKCS7_ATTR_VERIFY");
|
||||
|
||||
mixin(DECLARE_ASN1_NDEF_FUNCTION!"PKCS7");
|
||||
mixin(DECLARE_ASN1_PRINT_FUNCTION!"PKCS7");
|
||||
|
||||
c_long PKCS7_ctrl(PKCS7* p7, int cmd, c_long larg, char* parg);
|
||||
|
||||
int PKCS7_set_type(PKCS7* p7, int type);
|
||||
int PKCS7_set0_type_other(PKCS7* p7, int type, ASN1_TYPE* other);
|
||||
int PKCS7_set_content(PKCS7* p7, PKCS7* p7_data);
|
||||
int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO* p7i, X509* x509, EVP_PKEY* pkey,
|
||||
const(EVP_MD)* dgst);
|
||||
int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO* si);
|
||||
int PKCS7_add_signer(PKCS7* p7, PKCS7_SIGNER_INFO* p7i);
|
||||
int PKCS7_add_certificate(PKCS7* p7, X509* x509);
|
||||
int PKCS7_add_crl(PKCS7* p7, X509_CRL* x509);
|
||||
int PKCS7_content_new(PKCS7* p7, int nid);
|
||||
int PKCS7_dataVerify(X509_STORE* cert_store, X509_STORE_CTX* ctx,
|
||||
BIO* bio, PKCS7* p7, PKCS7_SIGNER_INFO* si);
|
||||
int PKCS7_signatureVerify(BIO* bio, PKCS7* p7, PKCS7_SIGNER_INFO* si,
|
||||
X509* x509);
|
||||
|
||||
BIO* PKCS7_dataInit(PKCS7* p7, BIO* bio);
|
||||
int PKCS7_dataFinal(PKCS7* p7, BIO* bio);
|
||||
BIO* PKCS7_dataDecode(PKCS7* p7, EVP_PKEY* pkey, BIO* in_bio, X509* pcert);
|
||||
|
||||
|
||||
PKCS7_SIGNER_INFO* PKCS7_add_signature(PKCS7* p7, X509* x509,
|
||||
EVP_PKEY* pkey, const(EVP_MD)* dgst);
|
||||
X509* PKCS7_cert_from_signer_info(PKCS7* p7, PKCS7_SIGNER_INFO* si);
|
||||
int PKCS7_set_digest(PKCS7* p7, const(EVP_MD)* md);
|
||||
STACK_OF!(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7* p7);
|
||||
|
||||
PKCS7_RECIP_INFO* PKCS7_add_recipient(PKCS7* p7, X509* x509);
|
||||
void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO* si, EVP_PKEY** pk,
|
||||
X509_ALGOR** pdig, X509_ALGOR** psig);
|
||||
void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO* ri, X509_ALGOR** penc);
|
||||
int PKCS7_add_recipient_info(PKCS7* p7, PKCS7_RECIP_INFO* ri);
|
||||
int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO* p7i, X509* x509);
|
||||
int PKCS7_set_cipher(PKCS7* p7, const(EVP_CIPHER)* cipher);
|
||||
int PKCS7_stream(ubyte*** boundary, PKCS7* p7);
|
||||
|
||||
PKCS7_ISSUER_AND_SERIAL* PKCS7_get_issuer_and_serial(PKCS7* p7, int idx);
|
||||
ASN1_OCTET_STRING* PKCS7_digest_from_attributes(STACK_OF!(X509_ATTRIBUTE) *sk);
|
||||
int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO* p7si,int nid,int type,
|
||||
void* data);
|
||||
int PKCS7_add_attribute (PKCS7_SIGNER_INFO* p7si, int nid, int atrtype,
|
||||
void* value);
|
||||
ASN1_TYPE* PKCS7_get_attribute(PKCS7_SIGNER_INFO* si, int nid);
|
||||
ASN1_TYPE* PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO* si, int nid);
|
||||
int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO* p7si,
|
||||
STACK_OF!(X509_ATTRIBUTE) *sk);
|
||||
int PKCS7_set_attributes(PKCS7_SIGNER_INFO* p7si,STACK_OF!(X509_ATTRIBUTE) *sk);
|
||||
|
||||
|
||||
PKCS7* PKCS7_sign(X509* signcert, EVP_PKEY* pkey, STACK_OF!(X509) *certs,
|
||||
BIO* data, int flags);
|
||||
|
||||
PKCS7_SIGNER_INFO* PKCS7_sign_add_signer(PKCS7* p7,
|
||||
X509* signcert, EVP_PKEY* pkey, const(EVP_MD)* md,
|
||||
int flags);
|
||||
|
||||
int PKCS7_final(PKCS7* p7, BIO* data, int flags);
|
||||
int PKCS7_verify(PKCS7* p7, STACK_OF!(X509) *certs, X509_STORE* store,
|
||||
BIO* indata, BIO* out_, int flags);
|
||||
STACK_OF!(X509) *PKCS7_get0_signers(PKCS7* p7, STACK_OF!(X509) *certs, int flags);
|
||||
PKCS7* PKCS7_encrypt(STACK_OF!(X509) *certs, BIO* in_, const(EVP_CIPHER)* cipher,
|
||||
int flags);
|
||||
int PKCS7_decrypt(PKCS7* p7, EVP_PKEY* pkey, X509* cert, BIO* data, int flags);
|
||||
|
||||
int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO* si,
|
||||
STACK_OF!(X509_ALGOR) *cap);
|
||||
STACK_OF!(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO* si);
|
||||
int PKCS7_simple_smimecap(STACK_OF!(X509_ALGOR) *sk, int nid, int arg);
|
||||
|
||||
int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO* si, ASN1_OBJECT* coid);
|
||||
int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO* si, ASN1_TIME* t);
|
||||
int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO* si,
|
||||
const(ubyte)* md, int mdlen);
|
||||
|
||||
int SMIME_write_PKCS7(BIO* bio, PKCS7* p7, BIO* data, int flags);
|
||||
PKCS7* SMIME_read_PKCS7(BIO* bio, BIO** bcont);
|
||||
|
||||
BIO* BIO_new_PKCS7(BIO* out_, PKCS7* p7);
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_PKCS7_strings();
|
||||
|
||||
/* Error codes for the PKCS7 functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum PKCS7_F_B64_READ_PKCS7 = 120;
|
||||
enum PKCS7_F_B64_WRITE_PKCS7 = 121;
|
||||
enum PKCS7_F_DO_PKCS7_SIGNED_ATTRIB = 136;
|
||||
enum PKCS7_F_I2D_PKCS7_BIO_STREAM = 140;
|
||||
enum PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME = 135;
|
||||
enum PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP = 118;
|
||||
enum PKCS7_F_PKCS7_ADD_CERTIFICATE = 100;
|
||||
enum PKCS7_F_PKCS7_ADD_CRL = 101;
|
||||
enum PKCS7_F_PKCS7_ADD_RECIPIENT_INFO = 102;
|
||||
enum PKCS7_F_PKCS7_ADD_SIGNATURE = 131;
|
||||
enum PKCS7_F_PKCS7_ADD_SIGNER = 103;
|
||||
enum PKCS7_F_PKCS7_BIO_ADD_DIGEST = 125;
|
||||
enum PKCS7_F_PKCS7_COPY_EXISTING_DIGEST = 138;
|
||||
enum PKCS7_F_PKCS7_CTRL = 104;
|
||||
enum PKCS7_F_PKCS7_DATADECODE = 112;
|
||||
enum PKCS7_F_PKCS7_DATAFINAL = 128;
|
||||
enum PKCS7_F_PKCS7_DATAINIT = 105;
|
||||
enum PKCS7_F_PKCS7_DATASIGN = 106;
|
||||
enum PKCS7_F_PKCS7_DATAVERIFY = 107;
|
||||
enum PKCS7_F_PKCS7_DECRYPT = 114;
|
||||
enum PKCS7_F_PKCS7_DECRYPT_RINFO = 133;
|
||||
enum PKCS7_F_PKCS7_ENCODE_RINFO = 132;
|
||||
enum PKCS7_F_PKCS7_ENCRYPT = 115;
|
||||
enum PKCS7_F_PKCS7_FINAL = 134;
|
||||
enum PKCS7_F_PKCS7_FIND_DIGEST = 127;
|
||||
enum PKCS7_F_PKCS7_GET0_SIGNERS = 124;
|
||||
enum PKCS7_F_PKCS7_RECIP_INFO_SET = 130;
|
||||
enum PKCS7_F_PKCS7_SET_CIPHER = 108;
|
||||
enum PKCS7_F_PKCS7_SET_CONTENT = 109;
|
||||
enum PKCS7_F_PKCS7_SET_DIGEST = 126;
|
||||
enum PKCS7_F_PKCS7_SET_TYPE = 110;
|
||||
enum PKCS7_F_PKCS7_SIGN = 116;
|
||||
enum PKCS7_F_PKCS7_SIGNATUREVERIFY = 113;
|
||||
enum PKCS7_F_PKCS7_SIGNER_INFO_SET = 129;
|
||||
enum PKCS7_F_PKCS7_SIGNER_INFO_SIGN = 139;
|
||||
enum PKCS7_F_PKCS7_SIGN_ADD_SIGNER = 137;
|
||||
enum PKCS7_F_PKCS7_SIMPLE_SMIMECAP = 119;
|
||||
enum PKCS7_F_PKCS7_VERIFY = 117;
|
||||
enum PKCS7_F_SMIME_READ_PKCS7 = 122;
|
||||
enum PKCS7_F_SMIME_TEXT = 123;
|
||||
|
||||
/* Reason codes. */
|
||||
enum PKCS7_R_CERTIFICATE_VERIFY_ERROR = 117;
|
||||
enum PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER = 144;
|
||||
enum PKCS7_R_CIPHER_NOT_INITIALIZED = 116;
|
||||
enum PKCS7_R_CONTENT_AND_DATA_PRESENT = 118;
|
||||
enum PKCS7_R_CTRL_ERROR = 152;
|
||||
enum PKCS7_R_DECODE_ERROR = 130;
|
||||
enum PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH = 100;
|
||||
enum PKCS7_R_DECRYPT_ERROR = 119;
|
||||
enum PKCS7_R_DIGEST_FAILURE = 101;
|
||||
enum PKCS7_R_ENCRYPTION_CTRL_FAILURE = 149;
|
||||
enum PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE = 150;
|
||||
enum PKCS7_R_ERROR_ADDING_RECIPIENT = 120;
|
||||
enum PKCS7_R_ERROR_SETTING_CIPHER = 121;
|
||||
enum PKCS7_R_INVALID_MIME_TYPE = 131;
|
||||
enum PKCS7_R_INVALID_NULL_POINTER = 143;
|
||||
enum PKCS7_R_MIME_NO_CONTENT_TYPE = 132;
|
||||
enum PKCS7_R_MIME_PARSE_ERROR = 133;
|
||||
enum PKCS7_R_MIME_SIG_PARSE_ERROR = 134;
|
||||
enum PKCS7_R_MISSING_CERIPEND_INFO = 103;
|
||||
enum PKCS7_R_NO_CONTENT = 122;
|
||||
enum PKCS7_R_NO_CONTENT_TYPE = 135;
|
||||
enum PKCS7_R_NO_DEFAULT_DIGEST = 151;
|
||||
enum PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND = 154;
|
||||
enum PKCS7_R_NO_MULTIPART_BODY_FAILURE = 136;
|
||||
enum PKCS7_R_NO_MULTIPART_BOUNDARY = 137;
|
||||
enum PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE = 115;
|
||||
enum PKCS7_R_NO_RECIPIENT_MATCHES_KEY = 146;
|
||||
enum PKCS7_R_NO_SIGNATURES_ON_DATA = 123;
|
||||
enum PKCS7_R_NO_SIGNERS = 142;
|
||||
enum PKCS7_R_NO_SIG_CONTENT_TYPE = 138;
|
||||
enum PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE = 104;
|
||||
enum PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR = 124;
|
||||
enum PKCS7_R_PKCS7_ADD_SIGNER_ERROR = 153;
|
||||
enum PKCS7_R_PKCS7_DATAFINAL = 126;
|
||||
enum PKCS7_R_PKCS7_DATAFINAL_ERROR = 125;
|
||||
enum PKCS7_R_PKCS7_DATASIGN = 145;
|
||||
enum PKCS7_R_PKCS7_PARSE_ERROR = 139;
|
||||
enum PKCS7_R_PKCS7_SIG_PARSE_ERROR = 140;
|
||||
enum PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE = 127;
|
||||
enum PKCS7_R_SIGNATURE_FAILURE = 105;
|
||||
enum PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND = 128;
|
||||
enum PKCS7_R_SIGNING_CTRL_FAILURE = 147;
|
||||
enum PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE = 148;
|
||||
enum PKCS7_R_SIG_INVALID_MIME_TYPE = 141;
|
||||
enum PKCS7_R_SMIME_TEXT_ERROR = 129;
|
||||
enum PKCS7_R_UNABLE_TO_FIND_CERTIFICATE = 106;
|
||||
enum PKCS7_R_UNABLE_TO_FIND_MEM_BIO = 107;
|
||||
enum PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST = 108;
|
||||
enum PKCS7_R_UNKNOWN_DIGEST_TYPE = 109;
|
||||
enum PKCS7_R_UNKNOWN_OPERATION = 110;
|
||||
enum PKCS7_R_UNSUPPORTED_CIPHER_TYPE = 111;
|
||||
enum PKCS7_R_UNSUPPORTED_CONTENT_TYPE = 112;
|
||||
enum PKCS7_R_WRONG_CONTENT_TYPE = 113;
|
||||
enum PKCS7_R_WRONG_PKCS7_TYPE = 114;
|
|
@ -0,0 +1,94 @@
|
|||
/* crypto/pqueue/pqueue.h */
|
||||
/*
|
||||
* DTLS implementation written by Nagendra Modadugu
|
||||
* (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2005 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.pqueue;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import core.stdc.stdio;
|
||||
import core.stdc.stdlib;
|
||||
// #include <string.h>
|
||||
|
||||
struct _pqueue;
|
||||
alias _pqueue* pqueue;
|
||||
|
||||
struct _pitem {
|
||||
ubyte[8] priority; /* 64-bit value in big-endian encoding */
|
||||
void* data;
|
||||
_pitem* next;
|
||||
}
|
||||
alias _pitem pitem;
|
||||
|
||||
alias _pitem* piterator;
|
||||
|
||||
pitem* pitem_new(ubyte* prio64be, void* data);
|
||||
void pitem_free(pitem* item);
|
||||
|
||||
pqueue pqueue_new();
|
||||
void pqueue_free(pqueue pq);
|
||||
|
||||
pitem* pqueue_insert(pqueue pq, pitem* item);
|
||||
pitem* pqueue_peek(pqueue pq);
|
||||
pitem* pqueue_pop(pqueue pq);
|
||||
pitem* pqueue_find(pqueue pq, ubyte* prio64be);
|
||||
pitem* pqueue_iterator(pqueue pq);
|
||||
pitem* pqueue_next(piterator* iter);
|
||||
|
||||
void pqueue_print(pqueue pq);
|
||||
int pqueue_size(pqueue pq);
|
|
@ -0,0 +1,148 @@
|
|||
/* crypto/rand/rand.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.rand;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import core.stdc.stdlib;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
version (Win32) {
|
||||
import core.sys.windows.windows;
|
||||
} else version (Win64) {
|
||||
import core.sys.windows.windows;
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_FIPS) {
|
||||
alias size_t FIPS_RAND_SIZE_T;
|
||||
}
|
||||
|
||||
/* Already defined in ossl_typ.h */
|
||||
/* typedef rand_meth_st RAND_METHOD; */
|
||||
|
||||
struct rand_meth_st
|
||||
{
|
||||
ExternC!(void function(const(void)* buf, int num)) seed;
|
||||
ExternC!(int function(ubyte* buf, int num)) bytes;
|
||||
ExternC!(void function()) cleanup;
|
||||
ExternC!(void function(const(void)* buf, int num, double entropy)) add;
|
||||
ExternC!(int function(ubyte* buf, int num)) pseudorand;
|
||||
ExternC!(int function()) status;
|
||||
};
|
||||
|
||||
version (BN_DEBUG) {
|
||||
extern int rand_predictable;
|
||||
}
|
||||
|
||||
int RAND_set_rand_method(const(RAND_METHOD)* meth);
|
||||
const(RAND_METHOD)* RAND_get_rand_method();
|
||||
version(OPENSSL_NO_ENGINE) {} else {
|
||||
int RAND_set_rand_engine(ENGINE* engine);
|
||||
}
|
||||
RAND_METHOD* RAND_SSLeay();
|
||||
void RAND_cleanup();
|
||||
int RAND_bytes(ubyte* buf,int num);
|
||||
int RAND_pseudo_bytes(ubyte* buf,int num);
|
||||
void RAND_seed(const(void)* buf,int num);
|
||||
void RAND_add(const(void)* buf,int num,double entropy);
|
||||
int RAND_load_file(const(char)* file,c_long max_bytes);
|
||||
int RAND_write_file(const(char)* file);
|
||||
const(char)* RAND_file_name(char* file,size_t num);
|
||||
int RAND_status();
|
||||
int RAND_query_egd_bytes(const(char)* path, ubyte* buf, int bytes);
|
||||
int RAND_egd(const(char)* path);
|
||||
int RAND_egd_bytes(const(char)* path,int bytes);
|
||||
int RAND_poll();
|
||||
|
||||
version (Win32) {
|
||||
void RAND_screen();
|
||||
int RAND_event(UINT, WPARAM, LPARAM);
|
||||
} else version (Win64) {
|
||||
void RAND_screen();
|
||||
int RAND_event(UINT, WPARAM, LPARAM);
|
||||
}
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
void RAND_set_fips_drbg_type(int type, int flags);
|
||||
int RAND_init_fips(void);
|
||||
}
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_RAND_strings();
|
||||
|
||||
/* Error codes for the RAND functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum RAND_F_RAND_GET_RAND_METHOD = 101;
|
||||
enum RAND_F_RAND_INIT_FIPS = 102;
|
||||
enum RAND_F_SSLEAY_RAND_BYTES = 100;
|
||||
|
||||
/* Reason codes. */
|
||||
enum RAND_R_DUAL_EC_DRBG_DISABLED = 104;
|
||||
enum RAND_R_ERROR_INITIALISING_DRBG = 102;
|
||||
enum RAND_R_ERROR_INSTANTIATING_DRBG = 103;
|
||||
enum RAND_R_NO_FIPS_RANDOM_METHOD_SET = 101;
|
||||
enum RAND_R_PRNG_NOT_SEEDED = 100;
|
|
@ -0,0 +1,97 @@
|
|||
/* crypto/rc2/rc2.h */
|
||||
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.rc2;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf; /* OPENSSL_NO_RC2, RC2_INT */
|
||||
version (OPENSSL_NO_RC2) {
|
||||
static assert(false, "RC2 is disabled.");
|
||||
}
|
||||
|
||||
enum RC2_ENCRYPT = 1;
|
||||
enum RC2_DECRYPT = 0;
|
||||
|
||||
enum RC2_BLOCK = 8;
|
||||
enum RC2_KEY_LENGTH = 16;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct rc2_key_st {
|
||||
RC2_INT[64] data;
|
||||
}
|
||||
alias rc2_key_st RC2_KEY;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
void private_RC2_set_key(RC2_KEY* key, int len, const(ubyte)* data,int bits);
|
||||
}
|
||||
void RC2_set_key(RC2_KEY* key, int len, const(ubyte)* data,int bits);
|
||||
void RC2_ecb_encrypt(const(ubyte)* in_,ubyte* out_,RC2_KEY* key,
|
||||
int enc);
|
||||
void RC2_encrypt(c_ulong* data,RC2_KEY* key);
|
||||
void RC2_decrypt(c_ulong* data,RC2_KEY* key);
|
||||
void RC2_cbc_encrypt(const(ubyte)* in_, ubyte* out_, c_long length,
|
||||
RC2_KEY* ks, ubyte* iv, int enc);
|
||||
void RC2_cfb64_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, RC2_KEY* schedule, ubyte* ivec,
|
||||
int* num, int enc);
|
||||
void RC2_ofb64_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
c_long length, RC2_KEY* schedule, ubyte* ivec,
|
||||
int* num);
|
|
@ -0,0 +1,84 @@
|
|||
/* crypto/rc4/rc4.h */
|
||||
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.rc4;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf; /* OPENSSL_NO_RC4, RC4_INT */
|
||||
version (OPENSSL_NO_RC4) {
|
||||
static assert(false, "RC4 is disabled.");
|
||||
}
|
||||
|
||||
import core.stdc.config;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct rc4_key_st {
|
||||
RC4_INT x,y;
|
||||
RC4_INT[256] data;
|
||||
}
|
||||
alias rc4_key_st RC4_KEY;
|
||||
|
||||
|
||||
const(char)* RC4_options();
|
||||
void RC4_set_key(RC4_KEY* key, int len, const(ubyte)* data);
|
||||
void private_RC4_set_key(RC4_KEY* key, int len, const(ubyte)* data);
|
||||
void RC4(RC4_KEY* key, size_t len, const(ubyte)* indata,
|
||||
ubyte* outdata);
|
|
@ -0,0 +1,103 @@
|
|||
/* crypto/ripemd/ripemd.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.ripemd;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
import core.stdc.config;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_NO_RIPEMD) {
|
||||
static assert(false, "RIPEMD is disabled.");
|
||||
}
|
||||
|
||||
// #if defined(__LP32__)
|
||||
// alias c_ulong RIPEMD160_LONG;
|
||||
// #elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
|
||||
// alias c_ulong RIPEMD160_LONG;
|
||||
// enum RIPEMD160_LONG_LOG2 = 3;
|
||||
// #else
|
||||
// alias uint RIPEMD160_LONG;
|
||||
// #endif
|
||||
alias uint RIPEMD160_LONG;
|
||||
|
||||
enum RIPEMD160_CBLOCK = 64;
|
||||
enum RIPEMD160_LBLOCK = (RIPEMD160_CBLOCK/4);
|
||||
enum RIPEMD160_DIGEST_LENGTH = 20;
|
||||
|
||||
struct RIPEMD160state_st {
|
||||
RIPEMD160_LONG A,B,C,D,E;
|
||||
RIPEMD160_LONG Nl,Nh;
|
||||
RIPEMD160_LONG[RIPEMD160_LBLOCK] data;
|
||||
uint num;
|
||||
}
|
||||
alias RIPEMD160state_st RIPEMD160_CTX;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_RIPEMD160_Init(RIPEMD160_CTX* c);
|
||||
}
|
||||
int RIPEMD160_Init(RIPEMD160_CTX* c);
|
||||
int RIPEMD160_Update(RIPEMD160_CTX* c, const(void)* data, size_t len);
|
||||
int RIPEMD160_Final(ubyte* md, RIPEMD160_CTX* c);
|
||||
ubyte* RIPEMD160(const(ubyte)* d, size_t n,
|
||||
ubyte* md);
|
||||
void RIPEMD160_Transform(RIPEMD160_CTX* c, const(ubyte)* b);
|
|
@ -0,0 +1,588 @@
|
|||
/* crypto/rsa/rsa.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.rsa;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.evp; // Needed for EVP_PKEY_ALG_CTRL.
|
||||
|
||||
public import deimos.openssl.asn1;
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
public import deimos.openssl.crypto;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.bn;
|
||||
}
|
||||
|
||||
version (OPENSSL_NO_RSA) {
|
||||
static assert(false, "RSA is disabled.");
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Declared already in ossl_typ.h */
|
||||
/* typedef rsa_st RSA; */
|
||||
/* typedef rsa_meth_st RSA_METHOD; */
|
||||
|
||||
struct rsa_meth_st
|
||||
{
|
||||
const(char)* name;
|
||||
ExternC!(int function(int flen,const(ubyte)* from,
|
||||
ubyte* to,
|
||||
RSA* rsa,int padding)) rsa_pub_enc;
|
||||
ExternC!(int function(int flen,const(ubyte)* from,
|
||||
ubyte* to,
|
||||
RSA* rsa,int padding)) rsa_pub_dec;
|
||||
ExternC!(int function(int flen,const(ubyte)* from,
|
||||
ubyte* to,
|
||||
RSA* rsa,int padding)) rsa_priv_enc;
|
||||
ExternC!(int function(int flen,const(ubyte)* from,
|
||||
ubyte* to,
|
||||
RSA* rsa,int padding)) rsa_priv_dec;
|
||||
ExternC!(int function(BIGNUM* r0,const(BIGNUM)* I,RSA* rsa,BN_CTX* ctx)) rsa_mod_exp; /* Can be null */
|
||||
ExternC!(int function(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,
|
||||
const(BIGNUM)* m, BN_CTX* ctx,
|
||||
BN_MONT_CTX* m_ctx)) bn_mod_exp; /* Can be null */
|
||||
ExternC!(int function(RSA* rsa)) init_; /* called at new */
|
||||
ExternC!(int function(RSA* rsa)) finish; /* called at free */
|
||||
int flags; /* RSA_METHOD_FLAG_* things */
|
||||
char* app_data; /* may be needed! */
|
||||
/* New sign and verify functions: some libraries don't allow arbitrary data
|
||||
* to be signed/verified: this allows them to be used. Note: for this to work
|
||||
* the RSA_public_decrypt() and RSA_private_encrypt() should* NOT* be used
|
||||
* RSA_sign(), RSA_verify() should be used instead. Note: for backwards
|
||||
* compatibility this functionality is only enabled if the RSA_FLAG_SIGN_VER
|
||||
* option is set in 'flags'.
|
||||
*/
|
||||
ExternC!(int function(int type,
|
||||
const(ubyte)* m, uint m_length,
|
||||
ubyte* sigret, uint* siglen, const(RSA)* rsa)) rsa_sign;
|
||||
ExternC!(int function(int dtype,
|
||||
const(ubyte)* m, uint m_length,
|
||||
const(ubyte)* sigbuf, uint siglen,
|
||||
const(RSA)* rsa)) rsa_verify;
|
||||
/* If this callback is NULL, the builtin software RSA key-gen will be used. This
|
||||
* is for behavioural compatibility whilst the code gets rewired, but one day
|
||||
* it would be nice to assume there are no such things as "builtin software"
|
||||
* implementations. */
|
||||
ExternC!(int function(RSA* rsa, int bits, BIGNUM* e, BN_GENCB* cb)) rsa_keygen;
|
||||
};
|
||||
|
||||
struct rsa_st
|
||||
{
|
||||
/* The first parameter is used to pickup errors where
|
||||
* this is passed instead of aEVP_PKEY, it is set to 0 */
|
||||
int pad;
|
||||
c_long version_;
|
||||
const(RSA_METHOD)* meth;
|
||||
/* functional reference if 'meth' is ENGINE-provided */
|
||||
ENGINE* engine;
|
||||
BIGNUM* n;
|
||||
BIGNUM* e;
|
||||
BIGNUM* d;
|
||||
BIGNUM* p;
|
||||
BIGNUM* q;
|
||||
BIGNUM* dmp1;
|
||||
BIGNUM* dmq1;
|
||||
BIGNUM* iqmp;
|
||||
/* be careful using this if the RSA structure is shared */
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
int references;
|
||||
int flags;
|
||||
|
||||
/* Used to cache montgomery values */
|
||||
BN_MONT_CTX* _method_mod_n;
|
||||
BN_MONT_CTX* _method_mod_p;
|
||||
BN_MONT_CTX* _method_mod_q;
|
||||
|
||||
/* all BIGNUM values are actually in the following data, if it is not
|
||||
* NULL */
|
||||
char* bignum_data;
|
||||
BN_BLINDING* blinding;
|
||||
BN_BLINDING* mt_blinding;
|
||||
};
|
||||
|
||||
// #ifndef OPENSSL_RSA_MAX_MODULUS_BITS
|
||||
enum OPENSSL_RSA_MAX_MODULUS_BITS = 16384;
|
||||
// #endif
|
||||
|
||||
// #ifndef OPENSSL_RSA_SMALL_MODULUS_BITS
|
||||
enum OPENSSL_RSA_SMALL_MODULUS_BITS = 3072;
|
||||
// #endif
|
||||
// #ifndef OPENSSL_RSA_MAX_PUBEXP_BITS
|
||||
enum OPENSSL_RSA_MAX_PUBEXP_BITS = 64; /* exponent limit enforced for "large" modulus only */
|
||||
// #endif
|
||||
|
||||
enum RSA_3 = 0x3;
|
||||
enum RSA_F4 = 0x10001;
|
||||
|
||||
enum RSA_METHOD_FLAG_NO_CHECK = 0x0001; /* don't check pub/private match */
|
||||
|
||||
enum RSA_FLAG_CACHE_PUBLIC = 0x0002;
|
||||
enum RSA_FLAG_CACHE_PRIVATE = 0x0004;
|
||||
enum RSA_FLAG_BLINDING = 0x0008;
|
||||
enum RSA_FLAG_THREAD_SAFE = 0x0010;
|
||||
/* This flag means the private key operations will be handled by rsa_mod_exp
|
||||
* and that they do not depend on the private key components being present:
|
||||
* for example a key stored in external hardware. Without this flag bn_mod_exp
|
||||
* gets called when private key components are absent.
|
||||
*/
|
||||
enum RSA_FLAG_EXT_PKEY = 0x0020;
|
||||
|
||||
/* This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify functions.
|
||||
*/
|
||||
enum RSA_FLAG_SIGN_VER = 0x0040;
|
||||
|
||||
enum RSA_FLAG_NO_BLINDING = 0x0080; /* new with 0.9.6j and 0.9.7b; the built-in
|
||||
* RSA implementation now uses blinding by
|
||||
* default (ignoring RSA_FLAG_BLINDING),
|
||||
* but other engines might not need it
|
||||
*/
|
||||
enum RSA_FLAG_NO_CONSTTIME = 0x0100; /* new with 0.9.8f; the built-in RSA
|
||||
* implementation now uses constant time
|
||||
* operations by default in private key operations,
|
||||
* e.g., constant time modular exponentiation,
|
||||
* modular inverse without leaking branches,
|
||||
* division without leaking branches. This
|
||||
* flag disables these constant time
|
||||
* operations and results in faster RSA
|
||||
* private key operations.
|
||||
*/
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
alias RSA_FLAG_NO_CONSTTIME RSA_FLAG_NO_EXP_CONSTTIME; /* deprecated name for the flag*/
|
||||
/* new with 0.9.7h; the built-in RSA
|
||||
* implementation now uses constant time
|
||||
* modular exponentiation for secret exponents
|
||||
* by default. This flag causes the
|
||||
* faster variable sliding window method to
|
||||
* be used for all exponents.
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
auto EVP_PKEY_CTX_set_rsa_padding()(EVP_PKEY_CTX* ctx, int pad) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING,
|
||||
pad, null);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_get_rsa_padding()(EVP_PKEY_CTX* ctx, int *ppad) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1,
|
||||
EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_rsa_pss_saltlen()(EVP_PKEY_CTX* ctx, int len) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA,
|
||||
(EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY),
|
||||
EVP_PKEY_CTRL_RSA_PSS_SALTLEN,
|
||||
len, null);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_get_rsa_pss_saltlen()(EVP_PKEY_CTX* ctx, int *plen) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA,
|
||||
(EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY),
|
||||
EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN,
|
||||
0, plen);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_rsa_keygen_bits()(EVP_PKEY_CTX* ctx, int bits) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN,
|
||||
EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, null);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_rsa_keygen_pubexp()(EVP_PKEY_CTX* ctx, void* pubexp) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_KEYGEN,
|
||||
EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_set_rsa_mgf1_md()(EVP_PKEY_CTX* ctx, EVP_MD* md) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_SIG,
|
||||
EVP_PKEY_CTRL_RSA_MGF1_MD, 0, cast(void*)md);
|
||||
}
|
||||
|
||||
auto EVP_PKEY_CTX_get_rsa_mgf1_md()(EVP_PKEY_CTX* ctx, EVP_MD** pmd) {
|
||||
return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_SIG,
|
||||
EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, cast(void*)pmd);
|
||||
}
|
||||
|
||||
enum EVP_PKEY_CTRL_RSA_PADDING = (EVP_PKEY_ALG_CTRL + 1);
|
||||
enum EVP_PKEY_CTRL_RSA_PSS_SALTLEN = (EVP_PKEY_ALG_CTRL + 2);
|
||||
|
||||
enum EVP_PKEY_CTRL_RSA_KEYGEN_BITS = (EVP_PKEY_ALG_CTRL + 3);
|
||||
enum EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP = (EVP_PKEY_ALG_CTRL + 4);
|
||||
enum EVP_PKEY_CTRL_RSA_MGF1_MD = (EVP_PKEY_ALG_CTRL + 5);
|
||||
|
||||
enum EVP_PKEY_CTRL_GET_RSA_PADDING = (EVP_PKEY_ALG_CTRL + 6);
|
||||
enum EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN = (EVP_PKEY_ALG_CTRL + 7);
|
||||
enum EVP_PKEY_CTRL_GET_RSA_MGF1_MD = (EVP_PKEY_ALG_CTRL + 8);
|
||||
|
||||
enum RSA_PKCS1_PADDING = 1;
|
||||
enum RSA_SSLV23_PADDING = 2;
|
||||
enum RSA_NO_PADDING = 3;
|
||||
enum RSA_PKCS1_OAEP_PADDING = 4;
|
||||
enum RSA_X931_PADDING = 5;
|
||||
/* EVP_PKEY_ only */
|
||||
enum RSA_PKCS1_PSS_PADDING = 6;
|
||||
|
||||
enum RSA_PKCS1_PADDING_SIZE = 11;
|
||||
|
||||
int RSA_set_app_data()(RSA* s, void* arg) { return RSA_set_ex_data(s,0,arg); }
|
||||
void* RSA_get_app_data()(const(RSA)* s) { return RSA_get_ex_data(s,0); }
|
||||
|
||||
RSA* RSA_new();
|
||||
RSA* RSA_new_method(ENGINE* engine);
|
||||
int RSA_size(const(RSA)* rsa);
|
||||
|
||||
/* Deprecated version */
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
RSA* RSA_generate_key(int bits, c_ulong e,ExternC!(void
|
||||
function(int,int,void*)) callback,void* cb_arg);
|
||||
} /* !defined(OPENSSL_NO_DEPRECATED) */
|
||||
|
||||
/* New version */
|
||||
int RSA_generate_key_ex(RSA* rsa, int bits, BIGNUM* e, BN_GENCB* cb);
|
||||
|
||||
int RSA_check_key(const(RSA)*);
|
||||
/* next 4 return -1 on error */
|
||||
int RSA_public_encrypt(int flen, const(ubyte)* from,
|
||||
ubyte* to, RSA* rsa,int padding);
|
||||
int RSA_private_encrypt(int flen, const(ubyte)* from,
|
||||
ubyte* to, RSA* rsa,int padding);
|
||||
int RSA_public_decrypt(int flen, const(ubyte)* from,
|
||||
ubyte* to, RSA* rsa,int padding);
|
||||
int RSA_private_decrypt(int flen, const(ubyte)* from,
|
||||
ubyte* to, RSA* rsa,int padding);
|
||||
void RSA_free (RSA* r);
|
||||
/* "up" the RSA object's reference count */
|
||||
int RSA_up_ref(RSA* r);
|
||||
|
||||
int RSA_flags(const(RSA)* r);
|
||||
|
||||
void RSA_set_default_method(const(RSA_METHOD)* meth);
|
||||
const(RSA_METHOD)* RSA_get_default_method();
|
||||
const(RSA_METHOD)* RSA_get_method(const(RSA)* rsa);
|
||||
int RSA_set_method(RSA* rsa, const(RSA_METHOD)* meth);
|
||||
|
||||
/* This function needs the memory locking malloc callbacks to be installed */
|
||||
int RSA_memory_lock(RSA* r);
|
||||
|
||||
/* these are the actual SSLeay RSA functions */
|
||||
const(RSA_METHOD)* RSA_PKCS1_SSLeay();
|
||||
|
||||
const(RSA_METHOD)* RSA_null_method();
|
||||
|
||||
mixin(DECLARE_ASN1_ENCODE_FUNCTIONS_const!("RSA", "RSAPublicKey"));
|
||||
mixin(DECLARE_ASN1_ENCODE_FUNCTIONS_const!("RSA", "RSAPrivateKey"));
|
||||
|
||||
struct rsa_pss_params_st
|
||||
{
|
||||
X509_ALGOR *hashAlgorithm;
|
||||
X509_ALGOR *maskGenAlgorithm;
|
||||
ASN1_INTEGER *saltLength;
|
||||
ASN1_INTEGER *trailerField;
|
||||
}
|
||||
alias rsa_pss_params_st RSA_PSS_PARAMS;
|
||||
|
||||
mixin(DECLARE_ASN1_FUNCTIONS!"RSA_PSS_PARAMS");
|
||||
|
||||
version(OPENSSL_NO_FP_API) {} else {
|
||||
int RSA_print_fp(FILE* fp, const(RSA)* r,int offset);
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
int RSA_print(BIO* bp, const(RSA)* r,int offset);
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_RC4) {} else {
|
||||
int i2d_RSA_NET(const(RSA)* a, ubyte** pp,
|
||||
ExternC!(int function(char* buf, int len, const(char)* prompt, int verify)) cb,
|
||||
int sgckey);
|
||||
RSA* d2i_RSA_NET(RSA** a, const(ubyte)** pp, c_long length,
|
||||
ExternC!(int function(char* buf, int len, const(char)* prompt, int verify)) cb,
|
||||
int sgckey);
|
||||
|
||||
int i2d_Netscape_RSA(const(RSA)* a, ubyte** pp,
|
||||
ExternC!(int function(char* buf, int len, const(char)* prompt,
|
||||
int verify)) cb);
|
||||
RSA* d2i_Netscape_RSA(RSA** a, const(ubyte)** pp, c_long length,
|
||||
ExternC!(int function(char* buf, int len, const(char)* prompt,
|
||||
int verify)) cb);
|
||||
}
|
||||
|
||||
/* The following 2 functions sign and verify a X509_SIG ASN1 object
|
||||
* inside PKCS#1 padded RSA encryption */
|
||||
int RSA_sign(int type, const(ubyte)* m, uint m_length,
|
||||
ubyte* sigret, uint* siglen, RSA* rsa);
|
||||
int RSA_verify(int type, const(ubyte)* m, uint m_length,
|
||||
const(ubyte)* sigbuf, uint siglen, RSA* rsa);
|
||||
|
||||
/* The following 2 function sign and verify a ASN1_OCTET_STRING
|
||||
* object inside PKCS#1 padded RSA encryption */
|
||||
int RSA_sign_ASN1_OCTET_STRING(int type,
|
||||
const(ubyte)* m, uint m_length,
|
||||
ubyte* sigret, uint* siglen, RSA* rsa);
|
||||
int RSA_verify_ASN1_OCTET_STRING(int type,
|
||||
const(ubyte)* m, uint m_length,
|
||||
ubyte* sigbuf, uint siglen, RSA* rsa);
|
||||
|
||||
int RSA_blinding_on(RSA* rsa, BN_CTX* ctx);
|
||||
void RSA_blinding_off(RSA* rsa);
|
||||
BN_BLINDING* RSA_setup_blinding(RSA* rsa, BN_CTX* ctx);
|
||||
|
||||
int RSA_padding_add_PKCS1_type_1(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl);
|
||||
int RSA_padding_check_PKCS1_type_1(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,int rsa_len);
|
||||
int RSA_padding_add_PKCS1_type_2(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl);
|
||||
int RSA_padding_check_PKCS1_type_2(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,int rsa_len);
|
||||
int PKCS1_MGF1(ubyte* mask, c_long len,
|
||||
const(ubyte)* seed, c_long seedlen, const(EVP_MD)* dgst);
|
||||
int RSA_padding_add_PKCS1_OAEP(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,
|
||||
const(ubyte)* p,int pl);
|
||||
int RSA_padding_check_PKCS1_OAEP(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,int rsa_len,
|
||||
const(ubyte)* p,int pl);
|
||||
int RSA_padding_add_SSLv23(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl);
|
||||
int RSA_padding_check_SSLv23(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,int rsa_len);
|
||||
int RSA_padding_add_none(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl);
|
||||
int RSA_padding_check_none(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,int rsa_len);
|
||||
int RSA_padding_add_X931(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl);
|
||||
int RSA_padding_check_X931(ubyte* to,int tlen,
|
||||
const(ubyte)* f,int fl,int rsa_len);
|
||||
int RSA_X931_hash_id(int nid);
|
||||
|
||||
int RSA_verify_PKCS1_PSS(RSA* rsa, const(ubyte)* mHash,
|
||||
const(EVP_MD)* Hash, const(ubyte)* EM, int sLen);
|
||||
int RSA_padding_add_PKCS1_PSS(RSA* rsa, ubyte* EM,
|
||||
const(ubyte)* mHash,
|
||||
const(EVP_MD)* Hash, int sLen);
|
||||
|
||||
int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const(ubyte)* mHash,
|
||||
const(EVP_MD)* Hash, const(EVP_MD)* mgf1Hash,
|
||||
const(ubyte)* EM, int sLen);
|
||||
|
||||
int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, ubyte* EM,
|
||||
const(ubyte)* mHash,
|
||||
const(EVP_MD)* Hash, const(EVP_MD)* mgf1Hash, int sLen);
|
||||
|
||||
int RSA_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int RSA_set_ex_data(RSA* r,int idx,void* arg);
|
||||
void* RSA_get_ex_data(const(RSA)* r, int idx);
|
||||
|
||||
RSA* RSAPublicKey_dup(RSA* rsa);
|
||||
RSA* RSAPrivateKey_dup(RSA* rsa);
|
||||
|
||||
/* If this flag is set the RSA method is FIPS compliant and can be used
|
||||
* in FIPS mode. This is set in the validated module method. If an
|
||||
* application sets this flag in its own methods it is its responsibility
|
||||
* to ensure the result is compliant.
|
||||
*/
|
||||
|
||||
enum RSA_FLAG_FIPS_METHOD = 0x0400;
|
||||
|
||||
/* If this flag is set the operations normally disabled in FIPS mode are
|
||||
* permitted it is then the applications responsibility to ensure that the
|
||||
* usage is compliant.
|
||||
*/
|
||||
|
||||
enum RSA_FLAG_NON_FIPS_ALLOW = 0x0400;
|
||||
/* Application has decided PRNG is good enough to generate a key: don't
|
||||
* check.
|
||||
*/
|
||||
enum RSA_FLAG_CHECKED = 0x0800;
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_RSA_strings();
|
||||
|
||||
/* Error codes for the RSA functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum RSA_F_CHECK_PADDING_MD = 140;
|
||||
enum RSA_F_DO_RSA_PRINT = 146;
|
||||
enum RSA_F_INT_RSA_VERIFY = 145;
|
||||
enum RSA_F_MEMORY_LOCK = 100;
|
||||
enum RSA_F_OLD_RSA_PRIV_DECODE = 147;
|
||||
enum RSA_F_PKEY_RSA_CTRL = 143;
|
||||
enum RSA_F_PKEY_RSA_CTRL_STR = 144;
|
||||
enum RSA_F_PKEY_RSA_SIGN = 142;
|
||||
enum RSA_F_PKEY_RSA_VERIFY = 154;
|
||||
enum RSA_F_PKEY_RSA_VERIFYRECOVER = 141;
|
||||
enum RSA_F_RSA_BUILTIN_KEYGEN = 129;
|
||||
enum RSA_F_RSA_CHECK_KEY = 123;
|
||||
enum RSA_F_RSA_EAY_PRIVATE_DECRYPT = 101;
|
||||
enum RSA_F_RSA_EAY_PRIVATE_ENCRYPT = 102;
|
||||
enum RSA_F_RSA_EAY_PUBLIC_DECRYPT = 103;
|
||||
enum RSA_F_RSA_EAY_PUBLIC_ENCRYPT = 104;
|
||||
enum RSA_F_RSA_GENERATE_KEY = 105;
|
||||
enum RSA_F_RSA_GENERATE_KEY_EX = 155;
|
||||
enum RSA_F_RSA_ITEM_VERIFY = 156;
|
||||
enum RSA_F_RSA_MEMORY_LOCK = 130;
|
||||
enum RSA_F_RSA_NEW_METHOD = 106;
|
||||
enum RSA_F_RSA_NULL = 124;
|
||||
enum RSA_F_RSA_NULL_MOD_EXP = 131;
|
||||
enum RSA_F_RSA_NULL_PRIVATE_DECRYPT = 132;
|
||||
enum RSA_F_RSA_NULL_PRIVATE_ENCRYPT = 133;
|
||||
enum RSA_F_RSA_NULL_PUBLIC_DECRYPT = 134;
|
||||
enum RSA_F_RSA_NULL_PUBLIC_ENCRYPT = 135;
|
||||
enum RSA_F_RSA_PADDING_ADD_NONE = 107;
|
||||
enum RSA_F_RSA_PADDING_ADD_PKCS1_OAEP = 121;
|
||||
enum RSA_F_RSA_PADDING_ADD_PKCS1_PSS = 125;
|
||||
enum RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 = 148;
|
||||
enum RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 = 108;
|
||||
enum RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 = 109;
|
||||
enum RSA_F_RSA_PADDING_ADD_SSLV23 = 110;
|
||||
enum RSA_F_RSA_PADDING_ADD_X931 = 127;
|
||||
enum RSA_F_RSA_PADDING_CHECK_NONE = 111;
|
||||
enum RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP = 122;
|
||||
enum RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 = 112;
|
||||
enum RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 = 113;
|
||||
enum RSA_F_RSA_PADDING_CHECK_SSLV23 = 114;
|
||||
enum RSA_F_RSA_PADDING_CHECK_X931 = 128;
|
||||
enum RSA_F_RSA_PRINT = 115;
|
||||
enum RSA_F_RSA_PRINT_FP = 116;
|
||||
enum RSA_F_RSA_PRIVATE_DECRYPT = 150;
|
||||
enum RSA_F_RSA_PRIVATE_ENCRYPT = 151;
|
||||
enum RSA_F_RSA_PRIV_DECODE = 137;
|
||||
enum RSA_F_RSA_PRIV_ENCODE = 138;
|
||||
enum RSA_F_RSA_PUBLIC_DECRYPT = 152;
|
||||
enum RSA_F_RSA_PUBLIC_ENCRYPT = 153;
|
||||
enum RSA_F_RSA_PUB_DECODE = 139;
|
||||
enum RSA_F_RSA_SETUP_BLINDING = 136;
|
||||
enum RSA_F_RSA_SIGN = 117;
|
||||
enum RSA_F_RSA_SIGN_ASN1_OCTET_STRING = 118;
|
||||
enum RSA_F_RSA_VERIFY = 119;
|
||||
enum RSA_F_RSA_VERIFY_ASN1_OCTET_STRING = 120;
|
||||
enum RSA_F_RSA_VERIFY_PKCS1_PSS = 126;
|
||||
enum RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 = 149
|
||||
;
|
||||
/* Reason codes. */
|
||||
enum RSA_R_ALGORITHM_MISMATCH = 100;
|
||||
enum RSA_R_BAD_E_VALUE = 101;
|
||||
enum RSA_R_BAD_FIXED_HEADER_DECRYPT = 102;
|
||||
enum RSA_R_BAD_PAD_BYTE_COUNT = 103;
|
||||
enum RSA_R_BAD_SIGNATURE = 104;
|
||||
enum RSA_R_BLOCK_TYPE_IS_NOT_01 = 106;
|
||||
enum RSA_R_BLOCK_TYPE_IS_NOT_02 = 107;
|
||||
enum RSA_R_DATA_GREATER_THAN_MOD_LEN = 108;
|
||||
enum RSA_R_DATA_TOO_LARGE = 109;
|
||||
enum RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE = 110;
|
||||
enum RSA_R_DATA_TOO_LARGE_FOR_MODULUS = 132;
|
||||
enum RSA_R_DATA_TOO_SMALL = 111;
|
||||
enum RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE = 122;
|
||||
enum RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY = 112;
|
||||
enum RSA_R_DMP1_NOT_CONGRUENT_TO_D = 124;
|
||||
enum RSA_R_DMQ1_NOT_CONGRUENT_TO_D = 125;
|
||||
enum RSA_R_D_E_NOT_CONGRUENT_TO_1 = 123;
|
||||
enum RSA_R_FIRST_OCTET_INVALID = 133;
|
||||
enum RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE = 144;
|
||||
enum RSA_R_INVALID_DIGEST_LENGTH = 143;
|
||||
enum RSA_R_INVALID_HEADER = 137;
|
||||
enum RSA_R_INVALID_KEYBITS = 145;
|
||||
enum RSA_R_INVALID_MESSAGE_LENGTH = 131;
|
||||
enum RSA_R_INVALID_MGF1_MD = 156;
|
||||
enum RSA_R_INVALID_PADDING = 138;
|
||||
enum RSA_R_INVALID_PADDING_MODE = 141;
|
||||
enum RSA_R_INVALID_PSS_PARAMETERS = 149;
|
||||
enum RSA_R_INVALID_PSS_SALTLEN = 146;
|
||||
enum RSA_R_INVALID_SALT_LENGTH = 150;
|
||||
enum RSA_R_INVALID_TRAILER = 139;
|
||||
enum RSA_R_INVALID_X931_DIGEST = 142;
|
||||
enum RSA_R_IQMP_NOT_INVERSE_OF_Q = 126;
|
||||
enum RSA_R_KEY_SIZE_TOO_SMALL = 120;
|
||||
enum RSA_R_LAST_OCTET_INVALID = 134;
|
||||
enum RSA_R_MODULUS_TOO_LARGE = 105;
|
||||
enum RSA_R_NON_FIPS_RSA_METHOD = 157;
|
||||
enum RSA_R_NO_PUBLIC_EXPONENT = 140;
|
||||
enum RSA_R_NULL_BEFORE_BLOCK_MISSING = 113;
|
||||
enum RSA_R_N_DOES_NOT_EQUAL_P_Q = 127;
|
||||
enum RSA_R_OAEP_DECODING_ERROR = 121;
|
||||
enum RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE = 158;
|
||||
enum RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE = 148;
|
||||
enum RSA_R_PADDING_CHECK_FAILED = 114;
|
||||
enum RSA_R_P_NOT_PRIME = 128;
|
||||
enum RSA_R_Q_NOT_PRIME = 129;
|
||||
enum RSA_R_RSA_OPERATIONS_NOT_SUPPORTED = 130;
|
||||
enum RSA_R_SLEN_CHECK_FAILED = 136;
|
||||
enum RSA_R_SLEN_RECOVERY_FAILED = 135;
|
||||
enum RSA_R_SSLV3_ROLLBACK_ATTACK = 115;
|
||||
enum RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD = 116;
|
||||
enum RSA_R_UNKNOWN_ALGORITHM_TYPE = 117;
|
||||
enum RSA_R_UNKNOWN_MASK_DIGEST = 151;
|
||||
enum RSA_R_UNKNOWN_PADDING_TYPE = 118;
|
||||
enum RSA_R_UNKNOWN_PSS_DIGEST = 152;
|
||||
enum RSA_R_UNSUPPORTED_MASK_ALGORITHM = 153;
|
||||
enum RSA_R_UNSUPPORTED_MASK_PARAMETER = 154;
|
||||
enum RSA_R_UNSUPPORTED_SIGNATURE_TYPE = 155;
|
||||
enum RSA_R_VALUE_MISSING = 147;
|
||||
enum RSA_R_WRONG_SIGNATURE_LENGTH = 119;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,134 @@
|
|||
/*
|
||||
* Copyright (c) 2007 KISA(Korea Information Security Agency). 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. Neither the name of author nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2007 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
module deimos.openssl.seed;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
public import deimos.openssl.e_os2;
|
||||
public import deimos.openssl.crypto;
|
||||
|
||||
version (OPENSSL_NO_SEED) {
|
||||
static assert(false, "SEED is disabled.");
|
||||
}
|
||||
|
||||
// #ifdef AES_LONG /* look whether we need 'long' to get 32 bits */
|
||||
// # ifndef SEED_LONG
|
||||
// # define SEED_LONG 1
|
||||
// # endif
|
||||
// #endif
|
||||
|
||||
// #if !defined(NO_SYS_TYPES_H)
|
||||
// # include <sys/types.h>
|
||||
// #endif
|
||||
|
||||
enum SEED_BLOCK_SIZE = 16;
|
||||
enum SEED_KEY_LENGTH = 16;
|
||||
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
|
||||
struct seed_key_st {
|
||||
// #ifdef SEED_LONG
|
||||
// c_ulong data[32];
|
||||
// #else
|
||||
uint[32] data;
|
||||
// #endif
|
||||
}
|
||||
alias seed_key_st SEED_KEY_SCHEDULE;
|
||||
|
||||
version(OPENSSL_FIPS) {
|
||||
void private_SEED_set_key(const(ubyte[SEED_KEY_LENGTH])* rawkey, SEED_KEY_SCHEDULE* ks);
|
||||
}
|
||||
void SEED_set_key(const(ubyte[SEED_KEY_LENGTH])* rawkey, SEED_KEY_SCHEDULE* ks);
|
||||
|
||||
void SEED_encrypt(const(ubyte[SEED_BLOCK_SIZE])* s, ubyte[SEED_BLOCK_SIZE]* d, const(SEED_KEY_SCHEDULE)* ks);
|
||||
void SEED_decrypt(const(ubyte[SEED_BLOCK_SIZE])* s, ubyte[SEED_BLOCK_SIZE]* d, const(SEED_KEY_SCHEDULE)* ks);
|
||||
|
||||
void SEED_ecb_encrypt(const(ubyte)* in_, ubyte* out_, const(SEED_KEY_SCHEDULE)* ks, int enc);
|
||||
void SEED_cbc_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(SEED_KEY_SCHEDULE)* ks, ubyte[SEED_BLOCK_SIZE]* ivec, int enc);
|
||||
void SEED_cfb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(SEED_KEY_SCHEDULE)* ks, ubyte[SEED_BLOCK_SIZE]* ivec, int* num, int enc);
|
||||
void SEED_ofb128_encrypt(const(ubyte)* in_, ubyte* out_,
|
||||
size_t len, const(SEED_KEY_SCHEDULE)* ks, ubyte[SEED_BLOCK_SIZE]* ivec, int* num);
|
|
@ -0,0 +1,219 @@
|
|||
/* crypto/sha/sha.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.sha;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
import core.stdc.config;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (OPENSSL_NO_SHA) {
|
||||
static assert(false, "SHA is disabled.");
|
||||
}
|
||||
|
||||
version (OPENSSL_NO_SHA0) {
|
||||
version (OPENSSL_NO_SHA1) {
|
||||
static assert(false, "SHA is disabled.");
|
||||
}
|
||||
}
|
||||
|
||||
version (OPENSSL_FIPS) {
|
||||
alias size_t FIPS_SHA_SIZE_T;
|
||||
}
|
||||
|
||||
/*
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
* ! SHA_LONG has to be at least 32 bits wide. If it's wider, then !
|
||||
* ! SHA_LONG_LOG2 has to be defined along. !
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
*/
|
||||
|
||||
//#if defined(__LP32__)
|
||||
//alias c_ulong SHA_LONG;
|
||||
//#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
|
||||
//alias c_ulong SHA_LONG;
|
||||
//enum SHA_LONG_LOG2 = 3;
|
||||
//#else
|
||||
//alias uint SHA_LONG;
|
||||
//#endif
|
||||
alias uint SHA_LONG;
|
||||
|
||||
enum SHA_LBLOCK = 16;
|
||||
enum SHA_CBLOCK = (SHA_LBLOCK*4); /* SHA treats input data as a
|
||||
* contiguous array of 32 bit
|
||||
* wide big-endian values. */
|
||||
enum SHA_LAST_BLOCK = (SHA_CBLOCK-8);
|
||||
enum SHA_DIGEST_LENGTH = 20;
|
||||
|
||||
struct SHAstate_st
|
||||
{
|
||||
SHA_LONG h0,h1,h2,h3,h4;
|
||||
SHA_LONG Nl,Nh;
|
||||
SHA_LONG[SHA_LBLOCK] data;
|
||||
uint num;
|
||||
}
|
||||
alias SHAstate_st SHA_CTX;
|
||||
|
||||
version(OPENSSL_NO_SHA0) {} else {
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_SHA_Init(SHA_CTX* c);
|
||||
}
|
||||
int SHA_Init(SHA_CTX* c);
|
||||
int SHA_Update(SHA_CTX* c, const(void)* data, size_t len);
|
||||
int SHA_Final(ubyte* md, SHA_CTX* c);
|
||||
ubyte* SHA(const(ubyte)* d, size_t n, ubyte* md);
|
||||
void SHA_Transform(SHA_CTX* c, const(ubyte)* data);
|
||||
}
|
||||
version(OPENSSL_NO_SHA1) {} else {
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_SHA1_Init(SHA_CTX* c);
|
||||
}
|
||||
int SHA1_Init(SHA_CTX* c);
|
||||
int SHA1_Update(SHA_CTX* c, const(void)* data, size_t len);
|
||||
int SHA1_Final(ubyte* md, SHA_CTX* c);
|
||||
ubyte* SHA1(const(ubyte)* d, size_t n, ubyte* md);
|
||||
void SHA1_Transform(SHA_CTX* c, const(ubyte)* data);
|
||||
}
|
||||
|
||||
enum SHA256_CBLOCK = (SHA_LBLOCK*4); /* SHA-256 treats input data as a
|
||||
* contiguous array of 32 bit
|
||||
* wide big-endian values. */
|
||||
enum SHA224_DIGEST_LENGTH = 28;
|
||||
enum SHA256_DIGEST_LENGTH = 32;
|
||||
|
||||
struct SHA256state_st {
|
||||
SHA_LONG[8] h;
|
||||
SHA_LONG Nl,Nh;
|
||||
SHA_LONG[SHA_LBLOCK] data;
|
||||
uint num,md_len;
|
||||
}
|
||||
alias SHA256state_st SHA256_CTX;
|
||||
|
||||
version(OPENSSL_NO_SHA256) {} else {
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_SHA224_Init(SHA256_CTX *c);
|
||||
int private_SHA256_Init(SHA256_CTX *c);
|
||||
}
|
||||
int SHA224_Init(SHA256_CTX* c);
|
||||
int SHA224_Update(SHA256_CTX* c, const(void)* data, size_t len);
|
||||
int SHA224_Final(ubyte* md, SHA256_CTX* c);
|
||||
ubyte* SHA224(const(ubyte)* d, size_t n,ubyte* md);
|
||||
int SHA256_Init(SHA256_CTX* c);
|
||||
int SHA256_Update(SHA256_CTX* c, const(void)* data, size_t len);
|
||||
int SHA256_Final(ubyte* md, SHA256_CTX* c);
|
||||
ubyte* SHA256(const(ubyte)* d, size_t n,ubyte* md);
|
||||
void SHA256_Transform(SHA256_CTX* c, const(ubyte)* data);
|
||||
}
|
||||
|
||||
enum SHA384_DIGEST_LENGTH = 48;
|
||||
enum SHA512_DIGEST_LENGTH = 64;
|
||||
|
||||
version (OPENSSL_NO_SHA512) {} else {
|
||||
/*
|
||||
* Unlike 32-bit digest algorithms, SHA-512* relies* on SHA_LONG64
|
||||
* being exactly 64-bit wide. See Implementation Notes in sha512.c
|
||||
* for further details.
|
||||
*/
|
||||
enum SHA512_CBLOCK = (SHA_LBLOCK*8); /* SHA-512 treats input data as a
|
||||
* contiguous array of 64 bit
|
||||
* wide big-endian values. */
|
||||
//#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)
|
||||
//alias unsigned SHA_LONG64; __int64
|
||||
//#define U64(C) C##UI64
|
||||
//#elif defined(__arch64__)
|
||||
//alias c_ulong SHA_LONG64;
|
||||
//#define U64(C) C##UL
|
||||
//#else
|
||||
//alias c_ulong SHA_LONG64; c_long
|
||||
//#define U64(C) C##ULL
|
||||
//#endif
|
||||
alias ulong SHA_LONG64;
|
||||
|
||||
struct SHA512state_st
|
||||
{
|
||||
SHA_LONG64[8] h;
|
||||
SHA_LONG64 Nl,Nh;
|
||||
union u_ {
|
||||
SHA_LONG64[SHA_LBLOCK] d;
|
||||
ubyte[SHA512_CBLOCK] p;
|
||||
}
|
||||
u_ u;
|
||||
uint num,md_len;
|
||||
}
|
||||
alias SHA512state_st SHA512_CTX;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_SHA512) {} else {
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_SHA384_Init(SHA512_CTX* c);
|
||||
int private_SHA512_Init(SHA512_CTX* c);
|
||||
}
|
||||
int SHA384_Init(SHA512_CTX* c);
|
||||
int SHA384_Update(SHA512_CTX* c, const(void)* data, size_t len);
|
||||
int SHA384_Final(ubyte* md, SHA512_CTX* c);
|
||||
ubyte* SHA384(const(ubyte)* d, size_t n,ubyte* md);
|
||||
int SHA512_Init(SHA512_CTX* c);
|
||||
int SHA512_Update(SHA512_CTX* c, const(void)* data, size_t len);
|
||||
int SHA512_Final(ubyte* md, SHA512_CTX* c);
|
||||
ubyte* SHA512(const(ubyte)* d, size_t n,ubyte* md);
|
||||
void SHA512_Transform(SHA512_CTX* c, const(ubyte)* data);
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
/* crypto/srp/srp.h */
|
||||
/* Written by Christophe Renou (christophe.renou@edelweb.fr) with
|
||||
* the precious help of Peter Sylvester (peter.sylvester@edelweb.fr)
|
||||
* for the EdelKey project and contributed to the OpenSSL project 2004.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2004 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).
|
||||
*
|
||||
*/
|
||||
module deimos.openssl.srp;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
extern(C):
|
||||
nothrow:
|
||||
|
||||
version(OPENSSL_NO_SRP) {} else {
|
||||
|
||||
import core.stdc.stdio;
|
||||
import core.stdc.string;
|
||||
|
||||
public import deimos.openssl.safestack;
|
||||
public import deimos.openssl.bn;
|
||||
public import deimos.openssl.crypto;
|
||||
|
||||
struct SRP_gN_cache_st
|
||||
{
|
||||
char *b64_bn;
|
||||
BIGNUM *bn;
|
||||
}
|
||||
alias SRP_gN_cache = SRP_gN_cache_st;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(SRP_gN_cache);+/
|
||||
|
||||
struct SRP_user_pwd_st
|
||||
{
|
||||
char *id;
|
||||
BIGNUM *s;
|
||||
BIGNUM *v;
|
||||
const BIGNUM *g;
|
||||
const BIGNUM *N;
|
||||
char *info;
|
||||
}
|
||||
alias SRP_user_pwd = SRP_user_pwd_st;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(SRP_user_pwd);+/
|
||||
|
||||
struct SRP_VBASE_st
|
||||
{
|
||||
STACK_OF!SRP_user_pwd *users_pwd;
|
||||
STACK_OF!SRP_gN_cache *gN_cache;
|
||||
/* to simulate a user */
|
||||
char *seed_key;
|
||||
BIGNUM *default_g;
|
||||
BIGNUM *default_N;
|
||||
}
|
||||
alias SRP_VBASE = SRP_VBASE_st;
|
||||
|
||||
/*Structure interne pour retenir les couples N et g*/
|
||||
struct SRP_gN_st
|
||||
{
|
||||
char *id;
|
||||
BIGNUM *g;
|
||||
BIGNUM *N;
|
||||
}
|
||||
alias SRP_gN = SRP_gN_st;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(SRP_gN);+/
|
||||
|
||||
SRP_VBASE *SRP_VBASE_new(char *seed_key);
|
||||
int SRP_VBASE_free(SRP_VBASE *vb);
|
||||
int SRP_VBASE_init(SRP_VBASE *vb, char * verifier_file);
|
||||
SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username);
|
||||
char *SRP_create_verifier(const char *user, const char *pass, char **salt,
|
||||
char **verifier, const char *N, const char *g);
|
||||
int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g);
|
||||
|
||||
|
||||
enum SRP_NO_ERROR = 0;
|
||||
enum SRP_ERR_VBASE_INCOMPLETE_FILE = 1;
|
||||
enum SRP_ERR_VBASE_BN_LIB = 2;
|
||||
enum SRP_ERR_OPEN_FILE = 3;
|
||||
enum SRP_ERR_MEMORY = 4;
|
||||
|
||||
enum DB_srptype = 0;
|
||||
enum DB_srpverifier = 1;
|
||||
enum DB_srpsalt = 2;
|
||||
enum DB_srpid = 3;
|
||||
enum DB_srpgN = 4;
|
||||
enum DB_srpinfo = 5;
|
||||
// #undef DB_NUMBER
|
||||
enum DB_NUMBER = 6;
|
||||
|
||||
enum DB_SRP_INDEX = 'I';
|
||||
enum DB_SRP_VALID = 'V';
|
||||
enum DB_SRP_REVOKED = 'R';
|
||||
enum DB_SRP_MODIF = 'v';
|
||||
|
||||
/* see srp.c */
|
||||
char * SRP_check_known_gN_param(BIGNUM* g, BIGNUM* N);
|
||||
SRP_gN *SRP_get_default_gN(const char * id) ;
|
||||
|
||||
/* server side .... */
|
||||
BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, BIGNUM *N);
|
||||
BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v);
|
||||
int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N);
|
||||
BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N) ;
|
||||
|
||||
|
||||
|
||||
/* client side .... */
|
||||
BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass);
|
||||
BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g);
|
||||
BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, BIGNUM *a, BIGNUM *u);
|
||||
int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N);
|
||||
|
||||
enum SRP_MINIMAL_N = 1024;
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
/* ssl/tls1.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2006 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
/*
|
||||
DTLS code by Eric Rescorla <ekr@rtfm.com>
|
||||
|
||||
Copyright (C) 2006, Network Resonance, Inc.
|
||||
Copyright (C) 2011, RTFM, Inc.
|
||||
*/
|
||||
module deimos.openssl.srtp;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
import deimos.openssl.ssl : SSL, SSL_CTX, SRTP_PROTECTION_PROFILE;
|
||||
import deimos.openssl.safestack : STACK_OF;
|
||||
|
||||
extern(C):
|
||||
nothrow:
|
||||
|
||||
enum SRTP_AES128_CM_SHA1_80 = 0x0001;
|
||||
enum SRTP_AES128_CM_SHA1_32 = 0x0002;
|
||||
enum SRTP_AES128_F8_SHA1_80 = 0x0003;
|
||||
enum SRTP_AES128_F8_SHA1_32 = 0x0004;
|
||||
enum SRTP_NULL_SHA1_80 = 0x0005;
|
||||
enum SRTP_NULL_SHA1_32 = 0x0006;
|
||||
|
||||
int SSL_CTX_set_tlsext_use_srtp(SSL_CTX* ctx, const(char)* profiles);
|
||||
int SSL_set_tlsext_use_srtp(SSL* ctx, const(char)* profiles);
|
||||
SRTP_PROTECTION_PROFILE* SSL_get_selected_srtp_profile(SSL* s);
|
||||
|
||||
STACK_OF!SRTP_PROTECTION_PROFILE* SSL_get_srtp_profiles(SSL* ssl);
|
||||
SRTP_PROTECTION_PROFILE* SSL_get_selected_srtp_profile(SSL* s);
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,270 @@
|
|||
/* ssl/ssl2.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.ssl2;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.ssl; // Needed for SSL_ST_CONNECT, etc.
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Protocol Version Codes */
|
||||
enum SSL2_VERSION = 0x0002;
|
||||
enum SSL2_VERSION_MAJOR = 0x00;
|
||||
enum SSL2_VERSION_MINOR = 0x02;
|
||||
/* enum SSL2_CLIENT_VERSION = 0x0002; */
|
||||
/* enum SSL2_SERVER_VERSION = 0x0002; */
|
||||
|
||||
/* Protocol Message Codes */
|
||||
enum SSL2_MT_ERROR = 0;
|
||||
enum SSL2_MT_CLIENT_HELLO = 1;
|
||||
enum SSL2_MT_CLIENT_MASTER_KEY = 2;
|
||||
enum SSL2_MT_CLIENT_FINISHED = 3;
|
||||
enum SSL2_MT_SERVER_HELLO = 4;
|
||||
enum SSL2_MT_SERVER_VERIFY = 5;
|
||||
enum SSL2_MT_SERVER_FINISHED = 6;
|
||||
enum SSL2_MT_REQUEST_CERTIFICATE = 7;
|
||||
enum SSL2_MT_CLIENT_CERTIFICATE = 8;
|
||||
|
||||
/* Error Message Codes */
|
||||
enum SSL2_PE_UNDEFINED_ERROR = 0x0000;
|
||||
enum SSL2_PE_NO_CIPHER = 0x0001;
|
||||
enum SSL2_PE_NO_CERTIFICATE = 0x0002;
|
||||
enum SSL2_PE_BAD_CERTIFICATE = 0x0004;
|
||||
enum SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE = 0x0006;
|
||||
|
||||
/* Cipher Kind Values */
|
||||
enum SSL2_CK_NULL_WITH_MD5 = 0x02000000; /* v3 */
|
||||
enum SSL2_CK_RC4_128_WITH_MD5 = 0x02010080;
|
||||
enum SSL2_CK_RC4_128_EXPORT40_WITH_MD5 = 0x02020080;
|
||||
enum SSL2_CK_RC2_128_CBC_WITH_MD5 = 0x02030080;
|
||||
enum SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5 = 0x02040080;
|
||||
enum SSL2_CK_IDEA_128_CBC_WITH_MD5 = 0x02050080;
|
||||
enum SSL2_CK_DES_64_CBC_WITH_MD5 = 0x02060040;
|
||||
enum SSL2_CK_DES_64_CBC_WITH_SHA = 0x02060140; /* v3 */
|
||||
enum SSL2_CK_DES_192_EDE3_CBC_WITH_MD5 = 0x020700c0;
|
||||
enum SSL2_CK_DES_192_EDE3_CBC_WITH_SHA = 0x020701c0; /* v3 */
|
||||
enum SSL2_CK_RC4_64_WITH_MD5 = 0x02080080; /* MS hack */
|
||||
|
||||
enum SSL2_CK_DES_64_CFB64_WITH_MD5_1 = 0x02ff0800; /* SSLeay */
|
||||
enum SSL2_CK_NULL = 0x02ff0810; /* SSLeay */
|
||||
|
||||
enum SSL2_TXT_DES_64_CFB64_WITH_MD5_1 = "DES-CFB-M1";
|
||||
enum SSL2_TXT_NULL_WITH_MD5 = "NULL-MD5";
|
||||
enum SSL2_TXT_RC4_128_WITH_MD5 = "RC4-MD5";
|
||||
enum SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 = "EXP-RC4-MD5";
|
||||
enum SSL2_TXT_RC2_128_CBC_WITH_MD5 = "RC2-CBC-MD5";
|
||||
enum SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 = "EXP-RC2-CBC-MD5";
|
||||
enum SSL2_TXT_IDEA_128_CBC_WITH_MD5 = "IDEA-CBC-MD5";
|
||||
enum SSL2_TXT_DES_64_CBC_WITH_MD5 = "DES-CBC-MD5";
|
||||
enum SSL2_TXT_DES_64_CBC_WITH_SHA = "DES-CBC-SHA";
|
||||
enum SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5 = "DES-CBC3-MD5";
|
||||
enum SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA = "DES-CBC3-SHA";
|
||||
enum SSL2_TXT_RC4_64_WITH_MD5 = "RC4-64-MD5";
|
||||
|
||||
enum SSL2_TXT_NULL = "NULL";
|
||||
|
||||
/* Flags for the SSL_CIPHER.algorithm2 field */
|
||||
enum SSL2_CF_5_BYTE_ENC = 0x01;
|
||||
enum SSL2_CF_8_BYTE_ENC = 0x02;
|
||||
|
||||
/* Certificate Type Codes */
|
||||
enum SSL2_CT_X509_CERTIFICATE = 0x01;
|
||||
|
||||
/* Authentication Type Code */
|
||||
enum SSL2_AT_MD5_WITH_RSA_ENCRYPTION = 0x01;
|
||||
|
||||
enum SSL2_MAX_SSL_SESSION_ID_LENGTH = 32;
|
||||
|
||||
/* Upper/Lower Bounds */
|
||||
enum SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS = 256;
|
||||
version (OPENSSL_SYS_MPE) {
|
||||
enum SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER = 29998u;
|
||||
} else {
|
||||
enum SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER = 32767u; /* 2^15-1 */
|
||||
}
|
||||
enum SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER = 16383; /* 2^14-1 */
|
||||
|
||||
enum SSL2_CHALLENGE_LENGTH = 16;
|
||||
/*enum SSL2_CHALLENGE_LENGTH = 32; */
|
||||
enum SSL2_MIN_CHALLENGE_LENGTH = 16;
|
||||
enum SSL2_MAX_CHALLENGE_LENGTH = 32;
|
||||
enum SSL2_CONNECTION_ID_LENGTH = 16;
|
||||
enum SSL2_MAX_CONNECTION_ID_LENGTH = 16;
|
||||
enum SSL2_SSL_SESSION_ID_LENGTH = 16;
|
||||
enum SSL2_MAX_CERT_CHALLENGE_LENGTH = 32;
|
||||
enum SSL2_MIN_CERT_CHALLENGE_LENGTH = 16;
|
||||
enum SSL2_MAX_KEY_MATERIAL_LENGTH = 24;
|
||||
|
||||
// #ifndef HEADER_SSL_LOCL_H
|
||||
alias char CERT;
|
||||
// #endif
|
||||
|
||||
version(OPENSSL_NO_SSL_INTERN) {} else {
|
||||
|
||||
struct ssl2_state_st
|
||||
{
|
||||
int three_byte_header;
|
||||
int clear_text; /* clear text */
|
||||
int escape; /* not used in SSLv2 */
|
||||
int ssl2_rollback; /* used if SSLv23 rolled back to SSLv2 */
|
||||
|
||||
/* non-blocking io info, used to make sure the same
|
||||
* args were passwd */
|
||||
uint wnum; /* number of bytes sent so far */
|
||||
int wpend_tot;
|
||||
const(ubyte)* wpend_buf;
|
||||
|
||||
int wpend_off; /* offset to data to write */
|
||||
int wpend_len; /* number of bytes passwd to write */
|
||||
int wpend_ret; /* number of bytes to return to caller */
|
||||
|
||||
/* buffer raw data */
|
||||
int rbuf_left;
|
||||
int rbuf_offs;
|
||||
ubyte* rbuf;
|
||||
ubyte* wbuf;
|
||||
|
||||
ubyte* write_ptr;/* used to point to the start due to
|
||||
* 2/3 byte header. */
|
||||
|
||||
uint padding;
|
||||
uint rlength; /* passed to ssl2_enc */
|
||||
int ract_data_length; /* Set when things are encrypted. */
|
||||
uint wlength; /* passed to ssl2_enc */
|
||||
int wact_data_length; /* Set when things are decrypted. */
|
||||
ubyte* ract_data;
|
||||
ubyte* wact_data;
|
||||
ubyte* mac_data;
|
||||
|
||||
ubyte* read_key;
|
||||
ubyte* write_key;
|
||||
|
||||
/* Stuff specifically to do with this SSL session */
|
||||
uint challenge_length;
|
||||
ubyte[SSL2_MAX_CHALLENGE_LENGTH] challenge;
|
||||
uint conn_id_length;
|
||||
ubyte[SSL2_MAX_CONNECTION_ID_LENGTH] conn_id;
|
||||
uint key_material_length;
|
||||
ubyte[SSL2_MAX_KEY_MATERIAL_LENGTH*2] key_material;
|
||||
|
||||
c_ulong read_sequence;
|
||||
c_ulong write_sequence;
|
||||
|
||||
struct tmp_{
|
||||
uint conn_id_length;
|
||||
uint cert_type;
|
||||
uint cert_length;
|
||||
uint csl;
|
||||
uint clear;
|
||||
uint enc;
|
||||
ubyte[SSL2_MAX_CERT_CHALLENGE_LENGTH] ccl;
|
||||
uint cipher_spec_length;
|
||||
uint session_id_length;
|
||||
uint clen;
|
||||
uint rlen;
|
||||
}
|
||||
tmp_ tmp;
|
||||
}
|
||||
alias ssl2_state_st SSL2_STATE;
|
||||
|
||||
}
|
||||
|
||||
/* SSLv2 */
|
||||
/* client */
|
||||
enum SSL2_ST_SEND_CLIENT_HELLO_A = (0x10|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_HELLO_B = (0x11|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_GET_SERVER_HELLO_A = (0x20|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_GET_SERVER_HELLO_B = (0x21|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_MASTER_KEY_A = (0x30|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_MASTER_KEY_B = (0x31|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_FINISHED_A = (0x40|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_FINISHED_B = (0x41|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_CERTIFICATE_A = (0x50|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_CERTIFICATE_B = (0x51|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_CERTIFICATE_C = (0x52|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_SEND_CLIENT_CERTIFICATE_D = (0x53|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_GET_SERVER_VERIFY_A = (0x60|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_GET_SERVER_VERIFY_B = (0x61|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_GET_SERVER_FINISHED_A = (0x70|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_GET_SERVER_FINISHED_B = (0x71|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_CLIENT_START_ENCRYPTION = (0x80|SSL_ST_CONNECT);
|
||||
enum SSL2_ST_X509_GET_CLIENT_CERTIFICATE = (0x90|SSL_ST_CONNECT);
|
||||
/* server */
|
||||
enum SSL2_ST_GET_CLIENT_HELLO_A = (0x10|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_GET_CLIENT_HELLO_B = (0x11|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_GET_CLIENT_HELLO_C = (0x12|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_HELLO_A = (0x20|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_HELLO_B = (0x21|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_GET_CLIENT_MASTER_KEY_A = (0x30|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_GET_CLIENT_MASTER_KEY_B = (0x31|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_VERIFY_A = (0x40|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_VERIFY_B = (0x41|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_VERIFY_C = (0x42|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_GET_CLIENT_FINISHED_A = (0x50|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_GET_CLIENT_FINISHED_B = (0x51|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_FINISHED_A = (0x60|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_SERVER_FINISHED_B = (0x61|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_REQUEST_CERTIFICATE_A = (0x70|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_REQUEST_CERTIFICATE_B = (0x71|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_REQUEST_CERTIFICATE_C = (0x72|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SEND_REQUEST_CERTIFICATE_D = (0x73|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_SERVER_START_ENCRYPTION = (0x80|SSL_ST_ACCEPT);
|
||||
enum SSL2_ST_X509_GET_SERVER_CERTIFICATE = (0x90|SSL_ST_ACCEPT);
|
|
@ -0,0 +1,79 @@
|
|||
/* ssl/ssl23.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.ssl23;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.ssl;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/*client */
|
||||
/* write to server */
|
||||
enum SSL23_ST_CW_CLNT_HELLO_A = (0x210|SSL_ST_CONNECT);
|
||||
enum SSL23_ST_CW_CLNT_HELLO_B = (0x211|SSL_ST_CONNECT);
|
||||
/* read from server */
|
||||
enum SSL23_ST_CR_SRVR_HELLO_A = (0x220|SSL_ST_CONNECT);
|
||||
enum SSL23_ST_CR_SRVR_HELLO_B = (0x221|SSL_ST_CONNECT);
|
||||
|
||||
/* server */
|
||||
/* read from client */
|
||||
enum SSL23_ST_SR_CLNT_HELLO_A = (0x210|SSL_ST_ACCEPT);
|
||||
enum SSL23_ST_SR_CLNT_HELLO_B = (0x211|SSL_ST_ACCEPT);
|
|
@ -0,0 +1,690 @@
|
|||
/* ssl/ssl3.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2002 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
* ECC cipher suite support in OpenSSL originally developed by
|
||||
* SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
|
||||
*/
|
||||
|
||||
module deimos.openssl.ssl3;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
version(OPENSSL_NO_COMP) {} else {
|
||||
public import deimos.openssl.comp;
|
||||
}
|
||||
public import deimos.openssl.buffer;
|
||||
public import deimos.openssl.evp;
|
||||
public import deimos.openssl.ssl;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Signalling cipher suite value: from draft-ietf-tls-renegotiation-03.txt */
|
||||
enum SSL3_CK_SCSV = 0x030000FF;
|
||||
|
||||
enum SSL3_CK_RSA_NULL_MD5 = 0x03000001;
|
||||
enum SSL3_CK_RSA_NULL_SHA = 0x03000002;
|
||||
enum SSL3_CK_RSA_RC4_40_MD5 = 0x03000003;
|
||||
enum SSL3_CK_RSA_RC4_128_MD5 = 0x03000004;
|
||||
enum SSL3_CK_RSA_RC4_128_SHA = 0x03000005;
|
||||
enum SSL3_CK_RSA_RC2_40_MD5 = 0x03000006;
|
||||
enum SSL3_CK_RSA_IDEA_128_SHA = 0x03000007;
|
||||
enum SSL3_CK_RSA_DES_40_CBC_SHA = 0x03000008;
|
||||
enum SSL3_CK_RSA_DES_64_CBC_SHA = 0x03000009;
|
||||
enum SSL3_CK_RSA_DES_192_CBC3_SHA = 0x0300000A;
|
||||
|
||||
enum SSL3_CK_DH_DSS_DES_40_CBC_SHA = 0x0300000B;
|
||||
enum SSL3_CK_DH_DSS_DES_64_CBC_SHA = 0x0300000C;
|
||||
enum SSL3_CK_DH_DSS_DES_192_CBC3_SHA = 0x0300000D;
|
||||
enum SSL3_CK_DH_RSA_DES_40_CBC_SHA = 0x0300000E;
|
||||
enum SSL3_CK_DH_RSA_DES_64_CBC_SHA = 0x0300000F;
|
||||
enum SSL3_CK_DH_RSA_DES_192_CBC3_SHA = 0x03000010;
|
||||
|
||||
enum SSL3_CK_EDH_DSS_DES_40_CBC_SHA = 0x03000011;
|
||||
enum SSL3_CK_EDH_DSS_DES_64_CBC_SHA = 0x03000012;
|
||||
enum SSL3_CK_EDH_DSS_DES_192_CBC3_SHA = 0x03000013;
|
||||
enum SSL3_CK_EDH_RSA_DES_40_CBC_SHA = 0x03000014;
|
||||
enum SSL3_CK_EDH_RSA_DES_64_CBC_SHA = 0x03000015;
|
||||
enum SSL3_CK_EDH_RSA_DES_192_CBC3_SHA = 0x03000016;
|
||||
|
||||
enum SSL3_CK_ADH_RC4_40_MD5 = 0x03000017;
|
||||
enum SSL3_CK_ADH_RC4_128_MD5 = 0x03000018;
|
||||
enum SSL3_CK_ADH_DES_40_CBC_SHA = 0x03000019;
|
||||
enum SSL3_CK_ADH_DES_64_CBC_SHA = 0x0300001A;
|
||||
enum SSL3_CK_ADH_DES_192_CBC_SHA = 0x0300001B;
|
||||
|
||||
version (none) {
|
||||
enum SSL3_CK_FZA_DMS_NULL_SHA = 0x0300001C;
|
||||
enum SSL3_CK_FZA_DMS_FZA_SHA = 0x0300001D;
|
||||
version (none) { /* Because it clashes with KRB5, is never used any more, and is safe
|
||||
to remove according to David Hopwood <david.hopwood@zetnet.co.uk>
|
||||
of the ietf-tls list */
|
||||
enum SSL3_CK_FZA_DMS_RC4_SHA = 0x0300001E;
|
||||
}
|
||||
}
|
||||
|
||||
/* VRS Additional Kerberos5 entries
|
||||
*/
|
||||
enum SSL3_CK_KRB5_DES_64_CBC_SHA = 0x0300001E;
|
||||
enum SSL3_CK_KRB5_DES_192_CBC3_SHA = 0x0300001F;
|
||||
enum SSL3_CK_KRB5_RC4_128_SHA = 0x03000020;
|
||||
enum SSL3_CK_KRB5_IDEA_128_CBC_SHA = 0x03000021;
|
||||
enum SSL3_CK_KRB5_DES_64_CBC_MD5 = 0x03000022;
|
||||
enum SSL3_CK_KRB5_DES_192_CBC3_MD5 = 0x03000023;
|
||||
enum SSL3_CK_KRB5_RC4_128_MD5 = 0x03000024;
|
||||
enum SSL3_CK_KRB5_IDEA_128_CBC_MD5 = 0x03000025;
|
||||
|
||||
enum SSL3_CK_KRB5_DES_40_CBC_SHA = 0x03000026;
|
||||
enum SSL3_CK_KRB5_RC2_40_CBC_SHA = 0x03000027;
|
||||
enum SSL3_CK_KRB5_RC4_40_SHA = 0x03000028;
|
||||
enum SSL3_CK_KRB5_DES_40_CBC_MD5 = 0x03000029;
|
||||
enum SSL3_CK_KRB5_RC2_40_CBC_MD5 = 0x0300002A;
|
||||
enum SSL3_CK_KRB5_RC4_40_MD5 = 0x0300002B;
|
||||
|
||||
enum SSL3_TXT_RSA_NULL_MD5 = "NULL-MD5";
|
||||
enum SSL3_TXT_RSA_NULL_SHA = "NULL-SHA";
|
||||
enum SSL3_TXT_RSA_RC4_40_MD5 = "EXP-RC4-MD5";
|
||||
enum SSL3_TXT_RSA_RC4_128_MD5 = "RC4-MD5";
|
||||
enum SSL3_TXT_RSA_RC4_128_SHA = "RC4-SHA";
|
||||
enum SSL3_TXT_RSA_RC2_40_MD5 = "EXP-RC2-CBC-MD5";
|
||||
enum SSL3_TXT_RSA_IDEA_128_SHA = "IDEA-CBC-SHA";
|
||||
enum SSL3_TXT_RSA_DES_40_CBC_SHA = "EXP-DES-CBC-SHA";
|
||||
enum SSL3_TXT_RSA_DES_64_CBC_SHA = "DES-CBC-SHA";
|
||||
enum SSL3_TXT_RSA_DES_192_CBC3_SHA = "DES-CBC3-SHA";
|
||||
|
||||
enum SSL3_TXT_DH_DSS_DES_40_CBC_SHA = "EXP-DH-DSS-DES-CBC-SHA";
|
||||
enum SSL3_TXT_DH_DSS_DES_64_CBC_SHA = "DH-DSS-DES-CBC-SHA";
|
||||
enum SSL3_TXT_DH_DSS_DES_192_CBC3_SHA = "DH-DSS-DES-CBC3-SHA";
|
||||
enum SSL3_TXT_DH_RSA_DES_40_CBC_SHA = "EXP-DH-RSA-DES-CBC-SHA";
|
||||
enum SSL3_TXT_DH_RSA_DES_64_CBC_SHA = "DH-RSA-DES-CBC-SHA";
|
||||
enum SSL3_TXT_DH_RSA_DES_192_CBC3_SHA = "DH-RSA-DES-CBC3-SHA";
|
||||
|
||||
enum SSL3_TXT_EDH_DSS_DES_40_CBC_SHA = "EXP-EDH-DSS-DES-CBC-SHA";
|
||||
enum SSL3_TXT_EDH_DSS_DES_64_CBC_SHA = "EDH-DSS-DES-CBC-SHA";
|
||||
enum SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA = "EDH-DSS-DES-CBC3-SHA";
|
||||
enum SSL3_TXT_EDH_RSA_DES_40_CBC_SHA = "EXP-EDH-RSA-DES-CBC-SHA";
|
||||
enum SSL3_TXT_EDH_RSA_DES_64_CBC_SHA = "EDH-RSA-DES-CBC-SHA";
|
||||
enum SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA = "EDH-RSA-DES-CBC3-SHA";
|
||||
|
||||
enum SSL3_TXT_ADH_RC4_40_MD5 = "EXP-ADH-RC4-MD5";
|
||||
enum SSL3_TXT_ADH_RC4_128_MD5 = "ADH-RC4-MD5";
|
||||
enum SSL3_TXT_ADH_DES_40_CBC_SHA = "EXP-ADH-DES-CBC-SHA";
|
||||
enum SSL3_TXT_ADH_DES_64_CBC_SHA = "ADH-DES-CBC-SHA";
|
||||
enum SSL3_TXT_ADH_DES_192_CBC_SHA = "ADH-DES-CBC3-SHA";
|
||||
|
||||
version (none) {
|
||||
enum SSL3_TXT_FZA_DMS_NULL_SHA = "FZA-NULL-SHA";
|
||||
enum SSL3_TXT_FZA_DMS_FZA_SHA = "FZA-FZA-CBC-SHA";
|
||||
enum SSL3_TXT_FZA_DMS_RC4_SHA = "FZA-RC4-SHA";
|
||||
}
|
||||
|
||||
enum SSL3_TXT_KRB5_DES_64_CBC_SHA = "KRB5-DES-CBC-SHA";
|
||||
enum SSL3_TXT_KRB5_DES_192_CBC3_SHA = "KRB5-DES-CBC3-SHA";
|
||||
enum SSL3_TXT_KRB5_RC4_128_SHA = "KRB5-RC4-SHA";
|
||||
enum SSL3_TXT_KRB5_IDEA_128_CBC_SHA = "KRB5-IDEA-CBC-SHA";
|
||||
enum SSL3_TXT_KRB5_DES_64_CBC_MD5 = "KRB5-DES-CBC-MD5";
|
||||
enum SSL3_TXT_KRB5_DES_192_CBC3_MD5 = "KRB5-DES-CBC3-MD5";
|
||||
enum SSL3_TXT_KRB5_RC4_128_MD5 = "KRB5-RC4-MD5";
|
||||
enum SSL3_TXT_KRB5_IDEA_128_CBC_MD5 = "KRB5-IDEA-CBC-MD5";
|
||||
|
||||
enum SSL3_TXT_KRB5_DES_40_CBC_SHA = "EXP-KRB5-DES-CBC-SHA";
|
||||
enum SSL3_TXT_KRB5_RC2_40_CBC_SHA = "EXP-KRB5-RC2-CBC-SHA";
|
||||
enum SSL3_TXT_KRB5_RC4_40_SHA = "EXP-KRB5-RC4-SHA";
|
||||
enum SSL3_TXT_KRB5_DES_40_CBC_MD5 = "EXP-KRB5-DES-CBC-MD5";
|
||||
enum SSL3_TXT_KRB5_RC2_40_CBC_MD5 = "EXP-KRB5-RC2-CBC-MD5";
|
||||
enum SSL3_TXT_KRB5_RC4_40_MD5 = "EXP-KRB5-RC4-MD5";
|
||||
|
||||
enum SSL3_SSL_SESSION_ID_LENGTH = 32;
|
||||
enum SSL3_MAX_SSL_SESSION_ID_LENGTH = 32;
|
||||
|
||||
enum SSL3_MASTER_SECRET_SIZE = 48;
|
||||
enum SSL3_RANDOM_SIZE = 32;
|
||||
enum SSL3_SESSION_ID_SIZE = 32;
|
||||
enum SSL3_RT_HEADER_LENGTH = 5;
|
||||
|
||||
/+
|
||||
version(SSL3_ALIGN_PAYLOAD) {} else {
|
||||
/* Some will argue that this increases memory footprint, but it's
|
||||
* not actually true. Point is that malloc has to return at least
|
||||
* 64-bit aligned pointers, meaning that allocating 5 bytes wastes
|
||||
* 3 bytes in either case. Suggested pre-gaping simply moves these
|
||||
* wasted bytes from the end of allocated region to its front,
|
||||
* but makes data payload aligned, which improves performance:-) */
|
||||
# define SSL3_ALIGN_PAYLOAD 8
|
||||
#else
|
||||
# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0
|
||||
# error "insane SSL3_ALIGN_PAYLOAD"
|
||||
# undef SSL3_ALIGN_PAYLOAD
|
||||
# endif
|
||||
#endif+/
|
||||
|
||||
/* This is the maximum MAC (digest) size used by the SSL library.
|
||||
* Currently maximum of 20 is used by SHA1, but we reserve for
|
||||
* future extension for 512-bit hashes.
|
||||
*/
|
||||
|
||||
enum SSL3_RT_MAX_MD_SIZE = 64;
|
||||
|
||||
/* Maximum block size used in all ciphersuites. Currently 16 for AES.
|
||||
*/
|
||||
|
||||
enum SSL_RT_MAX_CIPHER_BLOCK_SIZE = 16;
|
||||
|
||||
enum SSL3_RT_MAX_EXTRA = (16384);
|
||||
|
||||
/* Maximum plaintext length: defined by SSL/TLS standards */
|
||||
enum SSL3_RT_MAX_PLAIN_LENGTH = 16384;
|
||||
/* Maximum compression overhead: defined by SSL/TLS standards */
|
||||
enum SSL3_RT_MAX_COMPRESSED_OVERHEAD = 1024;
|
||||
|
||||
/* The standards give a maximum encryption overhead of 1024 bytes.
|
||||
* In practice the value is lower than this. The overhead is the maximum
|
||||
* number of padding bytes (256) plus the mac size.
|
||||
*/
|
||||
enum SSL3_RT_MAX_ENCRYPTED_OVERHEAD = (256 + SSL3_RT_MAX_MD_SIZE);
|
||||
|
||||
/* OpenSSL currently only uses a padding length of at most one block so
|
||||
* the send overhead is smaller.
|
||||
*/
|
||||
|
||||
enum SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD =
|
||||
(SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE);
|
||||
|
||||
/* If compression isn't used don't include the compression overhead */
|
||||
|
||||
version (OPENSSL_NO_COMP) {
|
||||
enum SSL3_RT_MAX_COMPRESSED_LENGTH = SSL3_RT_MAX_PLAIN_LENGTH;
|
||||
} else {
|
||||
enum SSL3_RT_MAX_COMPRESSED_LENGTH =
|
||||
(SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD);
|
||||
}
|
||||
enum SSL3_RT_MAX_ENCRYPTED_LENGTH =
|
||||
(SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH);
|
||||
enum SSL3_RT_MAX_PACKET_SIZE =
|
||||
(SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH);
|
||||
|
||||
enum SSL3_MD_CLIENT_FINISHED_CONST = "\x43\x4C\x4E\x54";
|
||||
enum SSL3_MD_SERVER_FINISHED_CONST = "\x53\x52\x56\x52";
|
||||
|
||||
enum SSL3_VERSION = 0x0300;
|
||||
enum SSL3_VERSION_MAJOR = 0x03;
|
||||
enum SSL3_VERSION_MINOR = 0x00;
|
||||
|
||||
enum SSL3_RT_CHANGE_CIPHER_SPEC = 20;
|
||||
enum SSL3_RT_ALERT = 21;
|
||||
enum SSL3_RT_HANDSHAKE = 22;
|
||||
enum SSL3_RT_APPLICATION_DATA = 23;
|
||||
enum TLS1_RT_HEARTBEAT = 24;
|
||||
|
||||
enum SSL3_AL_WARNING = 1;
|
||||
enum SSL3_AL_FATAL = 2;
|
||||
|
||||
enum SSL3_AD_CLOSE_NOTIFY = 0;
|
||||
enum SSL3_AD_UNEXPECTED_MESSAGE = 10; /* fatal */
|
||||
enum SSL3_AD_BAD_RECORD_MAC = 20; /* fatal */
|
||||
enum SSL3_AD_DECOMPRESSION_FAILURE = 30; /* fatal */
|
||||
enum SSL3_AD_HANDSHAKE_FAILURE = 40; /* fatal */
|
||||
enum SSL3_AD_NO_CERTIFICATE = 41;
|
||||
enum SSL3_AD_BAD_CERTIFICATE = 42;
|
||||
enum SSL3_AD_UNSUPPORTED_CERTIFICATE = 43;
|
||||
enum SSL3_AD_CERTIFICATE_REVOKED = 44;
|
||||
enum SSL3_AD_CERTIFICATE_EXPIRED = 45;
|
||||
enum SSL3_AD_CERTIFICATE_UNKNOWN = 46;
|
||||
enum SSL3_AD_ILLEGAL_PARAMETER = 47; /* fatal */
|
||||
|
||||
enum TLS1_HB_REQUEST = 1;
|
||||
enum TLS1_HB_RESPONSE = 2;
|
||||
|
||||
version(OPENSSL_NO_SSL_INTERN) {} else {
|
||||
|
||||
struct ssl3_record_st {
|
||||
/*r */ int type; /* type of record */
|
||||
/*rw*/ uint length; /* How many bytes available */
|
||||
/*r */ uint off; /* read/write offset into 'buf' */
|
||||
/*rw*/ ubyte* data; /* pointer to the record data */
|
||||
/*rw*/ ubyte* input; /* where the decode bytes are */
|
||||
/*r */ ubyte* comp; /* only used with decompression - malloc()ed */
|
||||
/*r */ c_ulong epoch; /* epoch number, needed by DTLS1 */
|
||||
/*r */ ubyte[8] seq_num; /* sequence number, needed by DTLS1 */
|
||||
}
|
||||
alias ssl3_record_st SSL3_RECORD;
|
||||
|
||||
struct ssl3_buffer_st {
|
||||
ubyte* buf; /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
|
||||
* see ssl3_setup_buffers() */
|
||||
size_t len; /* buffer size */
|
||||
int offset; /* where to 'copy from' */
|
||||
int left; /* how many bytes left */
|
||||
}
|
||||
alias ssl3_buffer_st SSL3_BUFFER;
|
||||
|
||||
}
|
||||
|
||||
enum SSL3_CT_RSA_SIGN = 1;
|
||||
enum SSL3_CT_DSS_SIGN = 2;
|
||||
enum SSL3_CT_RSA_FIXED_DH = 3;
|
||||
enum SSL3_CT_DSS_FIXED_DH = 4;
|
||||
enum SSL3_CT_RSA_EPHEMERAL_DH = 5;
|
||||
enum SSL3_CT_DSS_EPHEMERAL_DH = 6;
|
||||
enum SSL3_CT_FORTEZZA_DMS = 20;
|
||||
/* SSL3_CT_NUMBER is used to size arrays and it must be large
|
||||
* enough to contain all of the cert types defined either for
|
||||
* SSLv3 and TLSv1.
|
||||
*/
|
||||
enum SSL3_CT_NUMBER = 9;
|
||||
|
||||
|
||||
enum SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS = 0x0001;
|
||||
enum SSL3_FLAGS_DELAY_CLIENT_FINISHED = 0x0002;
|
||||
enum SSL3_FLAGS_POP_BUFFER = 0x0004;
|
||||
enum TLS1_FLAGS_TLS_PADDING_BUG = 0x0008;
|
||||
enum TLS1_FLAGS_SKIP_CERT_VERIFY = 0x0010;
|
||||
enum TLS1_FLAGS_KEEP_HANDSHAKE = 0x0020;
|
||||
|
||||
/* SSL3_FLAGS_SGC_RESTART_DONE is set when we
|
||||
* restart a handshake because of MS SGC and so prevents us
|
||||
* from restarting the handshake in a loop. It's reset on a
|
||||
* renegotiation, so effectively limits the client to one restart
|
||||
* per negotiation. This limits the possibility of a DDoS
|
||||
* attack where the client handshakes in a loop using SGC to
|
||||
* restart. Servers which permit renegotiation can still be
|
||||
* effected, but we can't prevent that.
|
||||
*/
|
||||
enum SSL3_FLAGS_SGC_RESTART_DONE = 0x0040;
|
||||
|
||||
version(OPENSSL_NO_SSL_INTERN) {} else {
|
||||
|
||||
struct ssl3_state_st
|
||||
{
|
||||
c_long flags;
|
||||
int delay_buf_pop_ret;
|
||||
|
||||
ubyte[8] read_sequence;
|
||||
int read_mac_secret_size;
|
||||
ubyte[EVP_MAX_MD_SIZE] read_mac_secret;
|
||||
ubyte[8] write_sequence;
|
||||
int write_mac_secret_size;
|
||||
ubyte[EVP_MAX_MD_SIZE] write_mac_secret;
|
||||
|
||||
ubyte[SSL3_RANDOM_SIZE] server_random;
|
||||
ubyte[SSL3_RANDOM_SIZE] client_random;
|
||||
|
||||
/* flags for countermeasure against known-IV weakness */
|
||||
int need_empty_fragments;
|
||||
int empty_fragment_done;
|
||||
|
||||
/* The value of 'extra' when the buffers were initialized */
|
||||
int init_extra;
|
||||
|
||||
SSL3_BUFFER rbuf; /* read IO goes into here */
|
||||
SSL3_BUFFER wbuf; /* write IO goes into here */
|
||||
|
||||
SSL3_RECORD rrec; /* each decoded record goes in here */
|
||||
SSL3_RECORD wrec; /* goes out from here */
|
||||
|
||||
/* storage for Alert/Handshake protocol data received but not
|
||||
* yet processed by ssl3_read_bytes: */
|
||||
ubyte[2] alert_fragment;
|
||||
uint alert_fragment_len;
|
||||
ubyte[4] handshake_fragment;
|
||||
uint handshake_fragment_len;
|
||||
|
||||
/* partial write - check the numbers match */
|
||||
uint wnum; /* number of bytes sent so far */
|
||||
int wpend_tot; /* number bytes written */
|
||||
int wpend_type;
|
||||
int wpend_ret; /* number of bytes submitted */
|
||||
const(ubyte)* wpend_buf;
|
||||
|
||||
/* used during startup, digest all incoming/outgoing packets */
|
||||
BIO* handshake_buffer;
|
||||
/* When set of handshake digests is determined, buffer is hashed
|
||||
* and freed and MD_CTX-es for all required digests are stored in
|
||||
* this array */
|
||||
EVP_MD_CTX** handshake_dgst;
|
||||
/* this is set whenerver we see a change_cipher_spec message
|
||||
* come in when we are not looking for one */
|
||||
int change_cipher_spec;
|
||||
|
||||
int warn_alert;
|
||||
int fatal_alert;
|
||||
/* we allow one fatal and one warning alert to be outstanding,
|
||||
* send close alert via the warning alert */
|
||||
int alert_dispatch;
|
||||
ubyte[2] send_alert;
|
||||
|
||||
/* This flag is set when we should renegotiate ASAP, basically when
|
||||
* there is no more data in the read or write buffers */
|
||||
int renegotiate;
|
||||
int total_renegotiations;
|
||||
int num_renegotiations;
|
||||
|
||||
int in_read_app_data;
|
||||
|
||||
/* Opaque PRF input as used for the current handshake.
|
||||
* These fields are used only if TLSEXT_TYPE_opaque_prf_input is defined
|
||||
* (otherwise, they are merely present to improve binary compatibility) */
|
||||
void* client_opaque_prf_input;
|
||||
size_t client_opaque_prf_input_len;
|
||||
void* server_opaque_prf_input;
|
||||
size_t server_opaque_prf_input_len;
|
||||
|
||||
struct tmp_ {
|
||||
/* actually only needs to be 16+20 */
|
||||
ubyte[EVP_MAX_MD_SIZE*2] cert_verify_md;
|
||||
|
||||
/* actually only need to be 16+20 for SSLv3 and 12 for TLS */
|
||||
ubyte[EVP_MAX_MD_SIZE*2] finish_md;
|
||||
int finish_md_len;
|
||||
ubyte[EVP_MAX_MD_SIZE*2] peer_finish_md;
|
||||
int peer_finish_md_len;
|
||||
|
||||
c_ulong message_size;
|
||||
int message_type;
|
||||
|
||||
/* used to hold the new cipher we are going to use */
|
||||
const(SSL_CIPHER)* new_cipher;
|
||||
version(OPENSSL_NO_DH) {} else {
|
||||
DH* dh;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_ECDH) {} else {
|
||||
EC_KEY* ecdh; /* holds short lived ECDH key */
|
||||
}
|
||||
|
||||
/* used when SSL_ST_FLUSH_DATA is entered */
|
||||
int next_state;
|
||||
|
||||
int reuse_message;
|
||||
|
||||
/* used for certificate requests */
|
||||
int cert_req;
|
||||
int ctype_num;
|
||||
char[SSL3_CT_NUMBER] ctype;
|
||||
STACK_OF!(X509_NAME) *ca_names;
|
||||
|
||||
int use_rsa_tmp;
|
||||
|
||||
int key_block_length;
|
||||
ubyte* key_block;
|
||||
|
||||
const(EVP_CIPHER)* new_sym_enc;
|
||||
const(EVP_MD)* new_hash;
|
||||
int new_mac_pkey_type;
|
||||
int new_mac_secret_size;
|
||||
version(OPENSSL_NO_COMP) {
|
||||
char* new_compression;
|
||||
} else {
|
||||
const(SSL_COMP)* new_compression;
|
||||
}
|
||||
int cert_request;
|
||||
}
|
||||
tmp_ tmp;
|
||||
|
||||
/* Connection binding to prevent renegotiation attacks */
|
||||
ubyte[EVP_MAX_MD_SIZE] previous_client_finished;
|
||||
ubyte previous_client_finished_len;
|
||||
ubyte[EVP_MAX_MD_SIZE] previous_server_finished;
|
||||
ubyte previous_server_finished_len;
|
||||
int send_connection_binding; /* TODOEKR */
|
||||
|
||||
version(OPENSSL_NO_NEXTPROTONEG) {} else {
|
||||
/* Set if we saw the Next Protocol Negotiation extension from our peer. */
|
||||
int next_proto_neg_seen;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_TLSEXT) {} else {
|
||||
version(OPENSSL_NO_EC) {} else {
|
||||
/* This is set to true if we believe that this is a version of Safari
|
||||
* running on OS X 10.6 or newer. We wish to know this because Safari
|
||||
* on 10.8 .. 10.8.3 has broken ECDHE-ECDSA support. */
|
||||
char is_probably_safari;
|
||||
} /* !OPENSSL_NO_EC */
|
||||
} /* !OPENSSL_NO_TLSEXT */
|
||||
}
|
||||
alias ssl3_state_st SSL3_STATE;
|
||||
|
||||
}
|
||||
|
||||
/* SSLv3 */
|
||||
/*client */
|
||||
/* extra state */
|
||||
enum SSL3_ST_CW_FLUSH = (0x100|SSL_ST_CONNECT);
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
enum DTLS1_SCTP_ST_CW_WRITE_SOCK = (0x310|SSL_ST_CONNECT);
|
||||
enum DTLS1_SCTP_ST_CR_READ_SOCK = (0x320|SSL_ST_CONNECT);
|
||||
}
|
||||
/* write to server */
|
||||
enum SSL3_ST_CW_CLNT_HELLO_A = (0x110|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CLNT_HELLO_B = (0x111|SSL_ST_CONNECT);
|
||||
/* read from server */
|
||||
enum SSL3_ST_CR_SRVR_HELLO_A = (0x120|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_SRVR_HELLO_B = (0x121|SSL_ST_CONNECT);
|
||||
enum DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A = (0x126|SSL_ST_CONNECT);
|
||||
enum DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B = (0x127|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CERT_A = (0x130|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CERT_B = (0x131|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_KEY_EXCH_A = (0x140|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_KEY_EXCH_B = (0x141|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CERT_REQ_A = (0x150|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CERT_REQ_B = (0x151|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_SRVR_DONE_A = (0x160|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_SRVR_DONE_B = (0x161|SSL_ST_CONNECT);
|
||||
/* write to server */
|
||||
enum SSL3_ST_CW_CERT_A = (0x170|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CERT_B = (0x171|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CERT_C = (0x172|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CERT_D = (0x173|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_KEY_EXCH_A = (0x180|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_KEY_EXCH_B = (0x181|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CERT_VRFY_A = (0x190|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CERT_VRFY_B = (0x191|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CHANGE_A = (0x1A0|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_CHANGE_B = (0x1A1|SSL_ST_CONNECT);
|
||||
version(OPENSSL_NO_NEXTPROTONEG) {} else {
|
||||
enum SSL3_ST_CW_NEXT_PROTO_A = (0x200|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_NEXT_PROTO_B = (0x201|SSL_ST_CONNECT);
|
||||
}
|
||||
enum SSL3_ST_CW_FINISHED_A = (0x1B0|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CW_FINISHED_B = (0x1B1|SSL_ST_CONNECT);
|
||||
/* read from server */
|
||||
enum SSL3_ST_CR_CHANGE_A = (0x1C0|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CHANGE_B = (0x1C1|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_FINISHED_A = (0x1D0|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_FINISHED_B = (0x1D1|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_SESSION_TICKET_A = (0x1E0|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_SESSION_TICKET_B = (0x1E1|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CERT_STATUS_A = (0x1F0|SSL_ST_CONNECT);
|
||||
enum SSL3_ST_CR_CERT_STATUS_B = (0x1F1|SSL_ST_CONNECT);
|
||||
|
||||
/* server */
|
||||
/* extra state */
|
||||
enum SSL3_ST_SW_FLUSH = (0x100|SSL_ST_ACCEPT);
|
||||
version(OPENSSL_NO_SCTP) {} else {
|
||||
enum DTLS1_SCTP_ST_SW_WRITE_SOCK = (0x310|SSL_ST_ACCEPT);
|
||||
enum DTLS1_SCTP_ST_SR_READ_SOCK = (0x320|SSL_ST_ACCEPT);
|
||||
}
|
||||
/* read from client */
|
||||
/* Do not change the number values, they do matter */
|
||||
enum SSL3_ST_SR_CLNT_HELLO_A = (0x110|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CLNT_HELLO_B = (0x111|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CLNT_HELLO_C = (0x112|SSL_ST_ACCEPT);
|
||||
/* write to client */
|
||||
enum DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A = (0x113|SSL_ST_ACCEPT);
|
||||
enum DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B = (0x114|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_HELLO_REQ_A = (0x120|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_HELLO_REQ_B = (0x121|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_HELLO_REQ_C = (0x122|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_SRVR_HELLO_A = (0x130|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_SRVR_HELLO_B = (0x131|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CERT_A = (0x140|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CERT_B = (0x141|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_KEY_EXCH_A = (0x150|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_KEY_EXCH_B = (0x151|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CERT_REQ_A = (0x160|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CERT_REQ_B = (0x161|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_SRVR_DONE_A = (0x170|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_SRVR_DONE_B = (0x171|SSL_ST_ACCEPT);
|
||||
/* read from client */
|
||||
enum SSL3_ST_SR_CERT_A = (0x180|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CERT_B = (0x181|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_KEY_EXCH_A = (0x190|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_KEY_EXCH_B = (0x191|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CERT_VRFY_A = (0x1A0|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CERT_VRFY_B = (0x1A1|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CHANGE_A = (0x1B0|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_CHANGE_B = (0x1B1|SSL_ST_ACCEPT);
|
||||
version(OPENSSL_NO_NEXTPROTONEG) {} else {
|
||||
enum SSL3_ST_SR_NEXT_PROTO_A = (0x210|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_NEXT_PROTO_B = (0x211|SSL_ST_ACCEPT);
|
||||
}
|
||||
enum SSL3_ST_SR_FINISHED_A = (0x1C0|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SR_FINISHED_B = (0x1C1|SSL_ST_ACCEPT);
|
||||
/* write to client */
|
||||
enum SSL3_ST_SW_CHANGE_A = (0x1D0|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CHANGE_B = (0x1D1|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_FINISHED_A = (0x1E0|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_FINISHED_B = (0x1E1|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_SESSION_TICKET_A = (0x1F0|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_SESSION_TICKET_B = (0x1F1|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CERT_STATUS_A = (0x200|SSL_ST_ACCEPT);
|
||||
enum SSL3_ST_SW_CERT_STATUS_B = (0x201|SSL_ST_ACCEPT);
|
||||
|
||||
enum SSL3_MT_HELLO_REQUEST = 0;
|
||||
enum SSL3_MT_CLIENT_HELLO = 1;
|
||||
enum SSL3_MT_SERVER_HELLO = 2;
|
||||
enum SSL3_MT_NEWSESSION_TICKET = 4;
|
||||
enum SSL3_MT_CERTIFICATE = 11;
|
||||
enum SSL3_MT_SERVER_KEY_EXCHANGE = 12;
|
||||
enum SSL3_MT_CERTIFICATE_REQUEST = 13;
|
||||
enum SSL3_MT_SERVER_DONE = 14;
|
||||
enum SSL3_MT_CERTIFICATE_VERIFY = 15;
|
||||
enum SSL3_MT_CLIENT_KEY_EXCHANGE = 16;
|
||||
enum SSL3_MT_FINISHED = 20;
|
||||
enum SSL3_MT_CERTIFICATE_STATUS = 22;
|
||||
version(OPENSSL_NO_NEXTPROTONEG) {} else {
|
||||
enum SSL3_MT_NEXT_PROTO = 67;
|
||||
}
|
||||
enum DTLS1_MT_HELLO_VERIFY_REQUEST = 3;
|
||||
|
||||
|
||||
enum SSL3_MT_CCS = 1;
|
||||
|
||||
/* These are used when changing over to a new cipher */
|
||||
enum SSL3_CC_READ = 0x01;
|
||||
enum SSL3_CC_WRITE = 0x02;
|
||||
enum SSL3_CC_CLIENT = 0x10;
|
||||
enum SSL3_CC_SERVER = 0x20;
|
||||
enum SSL3_CHANGE_CIPHER_CLIENT_WRITE = (SSL3_CC_CLIENT|SSL3_CC_WRITE);
|
||||
enum SSL3_CHANGE_CIPHER_SERVER_READ = (SSL3_CC_SERVER|SSL3_CC_READ);
|
||||
enum SSL3_CHANGE_CIPHER_CLIENT_READ = (SSL3_CC_CLIENT|SSL3_CC_READ);
|
||||
enum SSL3_CHANGE_CIPHER_SERVER_WRITE = (SSL3_CC_SERVER|SSL3_CC_WRITE);
|
|
@ -0,0 +1,168 @@
|
|||
/* crypto/stack/stack.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.stack;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
import deimos.openssl.opensslv;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
struct stack_st {
|
||||
int num;
|
||||
char** data;
|
||||
int sorted;
|
||||
|
||||
int num_alloc;
|
||||
ExternC!(int function(const(void)*, const(void)*)) comp;
|
||||
}
|
||||
alias stack_st _STACK; /* Use STACK_OF(...) instead */
|
||||
|
||||
int M_sk_num()(_STACK* sk) { return (sk ? sk.num : -1); }
|
||||
char* M_sk_value()(_STACK* sk, size_t n) { return (sk ? sk.data[n] : null); }
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
Starting from OpenSSL v1.1.0, the `sk_*` functions are prefixed with
|
||||
`OPENSSL_`, so e.g. `sk_num` becomes `OPENSSL_sk_num`.
|
||||
|
||||
To cope with that and provide downstream with an easier interface to deal
|
||||
with, we always provide the `OPENSSL_` methods, as they are just `extern(C)`
|
||||
anyway, and we either provide `sk_*` as `alias`es or `extern (C)`.
|
||||
|
||||
The need for aliases comes from users of those binding, e.g. `safestack`.
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
static if (OPENSSL_VERSION_AT_LEAST(1, 1))
|
||||
{
|
||||
int OPENSSL_sk_num(const(_STACK)*);
|
||||
void* OPENSSL_sk_value(const(_STACK)*, int);
|
||||
|
||||
void* OPENSSL_sk_set(_STACK*, int, void*);
|
||||
|
||||
_STACK* OPENSSL_sk_new(ExternC!(int function(const(void)*, const(void)*)) cmp);
|
||||
_STACK* OPENSSL_sk_new_null();
|
||||
void OPENSSL_sk_free(_STACK*);
|
||||
void OPENSSL_sk_pop_free(_STACK* st, ExternC!(void function(void*)) func);
|
||||
int OPENSSL_sk_insert(_STACK* sk, void* data, int where);
|
||||
void* OPENSSL_sk_delete(_STACK* st, int loc);
|
||||
void* OPENSSL_sk_delete_ptr(_STACK* st, void* p);
|
||||
int OPENSSL_sk_find(_STACK* st, void* data);
|
||||
int OPENSSL_sk_find_ex(_STACK* st, void* data);
|
||||
int OPENSSL_sk_push(_STACK* st, void* data);
|
||||
int OPENSSL_sk_unshift(_STACK* st, void* data);
|
||||
void* OPENSSL_sk_shift(_STACK* st);
|
||||
void* OPENSSL_sk_pop(_STACK* st);
|
||||
void OPENSSL_sk_zero(_STACK* st);
|
||||
int function(const(void)*, const(void)*) OPENSSL_sk_set_cmp_func(_STACK* sk, ExternC!(int function(const(void)*, const(void)*)) c);
|
||||
_STACK* OPENSSL_sk_dup(_STACK* st);
|
||||
void OPENSSL_sk_sort(_STACK* st);
|
||||
int OPENSSL_sk_is_sorted(const(_STACK)* st);
|
||||
|
||||
alias sk_num = OPENSSL_sk_num;
|
||||
alias sk_value = OPENSSL_sk_value;
|
||||
alias sk_set = OPENSSL_sk_set;
|
||||
|
||||
alias sk_new = OPENSSL_sk_new;
|
||||
alias sk_new_null = OPENSSL_sk_new_null;
|
||||
alias sk_free = OPENSSL_sk_free;
|
||||
alias sk_pop_free = OPENSSL_sk_pop_free;
|
||||
alias sk_insert = OPENSSL_sk_insert;
|
||||
alias sk_delete = OPENSSL_sk_delete;
|
||||
alias sk_delete_ptr = OPENSSL_sk_delete_ptr;
|
||||
alias sk_find = OPENSSL_sk_find;
|
||||
alias sk_find_ex = OPENSSL_sk_find_ex;
|
||||
|
||||
alias sk_push = OPENSSL_sk_push;
|
||||
alias sk_unshift = OPENSSL_sk_unshift;
|
||||
alias sk_shift = OPENSSL_sk_shift;
|
||||
alias sk_pop = OPENSSL_sk_pop;
|
||||
alias sk_zero = OPENSSL_sk_zero;
|
||||
alias sk_set_cmp_func = OPENSSL_sk_set_cmp_func;
|
||||
alias sk_dup = OPENSSL_sk_dup;
|
||||
alias sk_sort = OPENSSL_sk_sort;
|
||||
alias sk_is_sorted = OPENSSL_sk_is_sorted;
|
||||
}
|
||||
else
|
||||
{
|
||||
int sk_num(const(_STACK)*);
|
||||
void* sk_value(const(_STACK)*, int);
|
||||
|
||||
void* sk_set(_STACK*, int, void*);
|
||||
|
||||
_STACK* sk_new(ExternC!(int function(const(void)*, const(void)*)) cmp);
|
||||
_STACK* sk_new_null();
|
||||
void sk_free(_STACK*);
|
||||
void sk_pop_free(_STACK* st, ExternC!(void function(void*)) func);
|
||||
int sk_insert(_STACK* sk, void* data, int where);
|
||||
void* sk_delete(_STACK* st, int loc);
|
||||
void* sk_delete_ptr(_STACK* st, void* p);
|
||||
int sk_find(_STACK* st, void* data);
|
||||
int sk_find_ex(_STACK* st, void* data);
|
||||
int sk_push(_STACK* st, void* data);
|
||||
int sk_unshift(_STACK* st, void* data);
|
||||
void* sk_shift(_STACK* st);
|
||||
void* sk_pop(_STACK* st);
|
||||
void sk_zero(_STACK* st);
|
||||
int function(const(void)*, const(void)*) sk_set_cmp_func(_STACK* sk, ExternC!(int function(const(void)*, const(void)*)) c);
|
||||
_STACK* sk_dup(_STACK* st);
|
||||
void sk_sort(_STACK* st);
|
||||
int sk_is_sorted(const(_STACK)* st);
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/* ====================================================================
|
||||
* Copyright (c) 1999 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.symhacks;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
|
||||
/*
|
||||
* The hacks for certain linkers being incapable of dealing with longer
|
||||
* symbol names do not apply to D, as it doesn't run on Win16, VMS, or OS/2.
|
||||
*/
|
|
@ -0,0 +1,763 @@
|
|||
/* ssl/tls1.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2006 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
|
||||
*
|
||||
* Portions of the attached software ("Contribution") are developed by
|
||||
* SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
|
||||
*
|
||||
* The Contribution is licensed pursuant to the OpenSSL open source
|
||||
* license provided above.
|
||||
*
|
||||
* ECC cipher suite support in OpenSSL originally written by
|
||||
* Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
|
||||
*
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright 2005 Nokia. All rights reserved.
|
||||
*
|
||||
* The portions of the attached software ("Contribution") is developed by
|
||||
* Nokia Corporation and is licensed pursuant to the OpenSSL open source
|
||||
* license.
|
||||
*
|
||||
* The Contribution, originally written by Mika Kousa and Pasi Eronen of
|
||||
* Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
|
||||
* support (see RFC 4279) to OpenSSL.
|
||||
*
|
||||
* No patent licenses or other rights except those expressly stated in
|
||||
* the OpenSSL open source license shall be deemed granted or received
|
||||
* expressly, by implication, estoppel, or otherwise.
|
||||
*
|
||||
* No assurances are provided by Nokia that the Contribution does not
|
||||
* infringe the patent or other intellectual property rights of any third
|
||||
* party or that the license provides you with all the necessary rights
|
||||
* to make use of the Contribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
|
||||
* ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
|
||||
* SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
|
||||
* OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
|
||||
* OTHERWISE.
|
||||
*/
|
||||
|
||||
module deimos.openssl.tls1;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import deimos.openssl.ssl; // Needed for SSL_CTX_*.
|
||||
public import deimos.openssl.buffer;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
enum TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES = 0;
|
||||
|
||||
enum TLS1_2_VERSION = 0x0303;
|
||||
enum TLS1_2_VERSION_MAJOR = 0x03;
|
||||
enum TLS1_2_VERSION_MINOR = 0x03;
|
||||
|
||||
enum TLS1_1_VERSION = 0x0302;
|
||||
enum TLS1_1_VERSION_MAJOR = 0x03;
|
||||
enum TLS1_1_VERSION_MINOR = 0x02;
|
||||
|
||||
enum TLS1_VERSION = 0x0301;
|
||||
enum TLS1_VERSION_MAJOR = 0x03;
|
||||
enum TLS1_VERSION_MINOR = 0x01;
|
||||
|
||||
auto TLS1_get_version()(const(SSL)* s) {
|
||||
return (s.version_ >> 8) == TLS1_VERSION_MAJOR ? s.version_ : 0;
|
||||
}
|
||||
|
||||
auto TLS1_get_client_version()(const(SSL)* s) {
|
||||
return (s.version_ >> 8) == TLS1_VERSION_MAJOR ? s.client_version : 0;
|
||||
}
|
||||
|
||||
enum TLS1_AD_DECRYPTION_FAILED = 21;
|
||||
enum TLS1_AD_RECORD_OVERFLOW = 22;
|
||||
enum TLS1_AD_UNKNOWN_CA = 48; /* fatal */
|
||||
enum TLS1_AD_ACCESS_DENIED = 49; /* fatal */
|
||||
enum TLS1_AD_DECODE_ERROR = 50; /* fatal */
|
||||
enum TLS1_AD_DECRYPT_ERROR = 51;
|
||||
enum TLS1_AD_EXPORT_RESTRICTION = 60; /* fatal */
|
||||
enum TLS1_AD_PROTOCOL_VERSION = 70; /* fatal */
|
||||
enum TLS1_AD_INSUFFICIENT_SECURITY = 71; /* fatal */
|
||||
enum TLS1_AD_INTERNAL_ERROR = 80; /* fatal */
|
||||
enum TLS1_AD_USER_CANCELLED = 90;
|
||||
enum TLS1_AD_NO_RENEGOTIATION = 100;
|
||||
/* codes 110-114 are from RFC3546 */
|
||||
enum TLS1_AD_UNSUPPORTED_EXTENSION = 110;
|
||||
enum TLS1_AD_CERTIFICATE_UNOBTAINABLE = 111;
|
||||
enum TLS1_AD_UNRECOGNIZED_NAME = 112;
|
||||
enum TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE = 113;
|
||||
enum TLS1_AD_BAD_CERTIFICATE_HASH_VALUE = 114;
|
||||
enum TLS1_AD_UNKNOWN_PSK_IDENTITY = 115; /* fatal */
|
||||
|
||||
/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */
|
||||
enum TLSEXT_TYPE_server_name = 0;
|
||||
enum TLSEXT_TYPE_max_fragment_length = 1;
|
||||
enum TLSEXT_TYPE_client_certificate_url = 2;
|
||||
enum TLSEXT_TYPE_trusted_ca_keys = 3;
|
||||
enum TLSEXT_TYPE_truncated_hmac = 4;
|
||||
enum TLSEXT_TYPE_status_request = 5;
|
||||
/* ExtensionType values from RFC4681 */
|
||||
enum TLSEXT_TYPE_user_mapping = 6;
|
||||
|
||||
/* ExtensionType values from RFC5878 */
|
||||
enum TLSEXT_TYPE_client_authz = 7;
|
||||
enum TLSEXT_TYPE_server_authz = 8;
|
||||
|
||||
/* ExtensionType values from RFC6091 */
|
||||
enum TLSEXT_TYPE_cert_type = 9;
|
||||
|
||||
/* ExtensionType values from RFC4492 */
|
||||
enum TLSEXT_TYPE_elliptic_curves = 10;
|
||||
enum TLSEXT_TYPE_ec_point_formats = 11;
|
||||
|
||||
/* ExtensionType value from RFC5054 */
|
||||
enum TLSEXT_TYPE_srp = 12;
|
||||
|
||||
/* ExtensionType values from RFC5246 */
|
||||
enum TLSEXT_TYPE_signature_algorithms = 13;
|
||||
|
||||
/* ExtensionType value from RFC5764 */
|
||||
enum TLSEXT_TYPE_use_srtp = 14;
|
||||
|
||||
/* ExtensionType value from RFC5620 */
|
||||
enum TLSEXT_TYPE_heartbeat = 15;
|
||||
|
||||
/* ExtensionType value for TLS padding extension.
|
||||
* http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml
|
||||
* http://tools.ietf.org/html/draft-agl-tls-padding-03
|
||||
*/
|
||||
enum TLSEXT_TYPE_padding = 21;
|
||||
|
||||
/* ExtensionType value from RFC4507 */
|
||||
enum TLSEXT_TYPE_session_ticket = 35;
|
||||
/* ExtensionType value from draft-rescorla-tls-opaque-prf-input-00.txt */
|
||||
/+#if 0 /* will have to be provided externally for now ,
|
||||
* i.e. build with -DTLSEXT_TYPE_opaque_prf_input=38183
|
||||
* using whatever extension number you'd like to try */
|
||||
# define TLSEXT_TYPE_opaque_prf_input ?? */
|
||||
#endif+/
|
||||
|
||||
/* Temporary extension type */
|
||||
enum TLSEXT_TYPE_renegotiate = 0xff01;
|
||||
|
||||
version(OPENSSL_NO_NEXTPROTONEG) {} else {
|
||||
/* This is not an IANA defined extension number */
|
||||
enum TLSEXT_TYPE_next_proto_neg = 13172;
|
||||
}
|
||||
|
||||
/* NameType value from RFC 3546 */
|
||||
enum TLSEXT_NAMETYPE_host_name = 0;
|
||||
/* status request value from RFC 3546 */
|
||||
enum TLSEXT_STATUSTYPE_ocsp = 1;
|
||||
|
||||
/* ECPointFormat values from draft-ietf-tls-ecc-12 */
|
||||
enum TLSEXT_ECPOINTFORMAT_first = 0;
|
||||
enum TLSEXT_ECPOINTFORMAT_uncompressed = 0;
|
||||
enum TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime = 1;
|
||||
enum TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 = 2;
|
||||
enum TLSEXT_ECPOINTFORMAT_last = 2;
|
||||
|
||||
/* Signature and hash algorithms from RFC 5246 */
|
||||
|
||||
enum TLSEXT_signature_anonymous = 0;
|
||||
enum TLSEXT_signature_rsa = 1;
|
||||
enum TLSEXT_signature_dsa = 2;
|
||||
enum TLSEXT_signature_ecdsa = 3;
|
||||
|
||||
enum TLSEXT_hash_none = 0;
|
||||
enum TLSEXT_hash_md5 = 1;
|
||||
enum TLSEXT_hash_sha1 = 2;
|
||||
enum TLSEXT_hash_sha224 = 3;
|
||||
enum TLSEXT_hash_sha256 = 4;
|
||||
enum TLSEXT_hash_sha384 = 5;
|
||||
enum TLSEXT_hash_sha512 = 6;
|
||||
|
||||
version (OPENSSL_NO_TLSEXT) {} else {
|
||||
|
||||
enum TLSEXT_MAXLEN_host_name = 255;
|
||||
|
||||
const(char)* SSL_get_servername(const(SSL)* s, const int type);
|
||||
int SSL_get_servername_type(const(SSL)* s);
|
||||
/* SSL_export_keying_material exports a value derived from the master secret,
|
||||
* as specified in RFC 5705. It writes |olen| bytes to |out| given a label and
|
||||
* optional context. (Since a zero length context is allowed, the |use_context|
|
||||
* flag controls whether a context is included.)
|
||||
*
|
||||
* It returns 1 on success and zero otherwise.
|
||||
*/
|
||||
int SSL_export_keying_material(SSL *s, ubyte* out_, size_t olen,
|
||||
const char *label, size_t llen, const(ubyte)* p, size_t plen,
|
||||
int use_context);
|
||||
|
||||
auto SSL_set_tlsext_host_name()(SSL* s,char* name) {
|
||||
return SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,name);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_debug_callback()(SSL* ssl, ExternC!(void function()) cb) {
|
||||
return SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,cb);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_debug_arg()(SSL* ssl, void* arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, arg);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_status_type()(SSL* ssl, type) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, null);
|
||||
}
|
||||
|
||||
auto SSL_get_tlsext_status_exts()(SSL* ssl, void* arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, arg);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_status_exts()(SSL* ssl, void* arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, arg);
|
||||
}
|
||||
|
||||
auto SSL_get_tlsext_status_ids()(SSL* ssl, void* arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, arg);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_status_ids()(SSL* ssl, void* arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, arg);
|
||||
}
|
||||
|
||||
auto SSL_get_tlsext_status_ocsp_resp()(SSL* ssl, void* arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, arg);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_status_ocsp_resp()(SSL* ssl, void* arg, void* arglen) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, arg);
|
||||
}
|
||||
|
||||
auto SSL_CTX_set_tlsext_servername_callback(SSL_CTX* ctx, ExternC!(void function()) cb) {
|
||||
return SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,cb);
|
||||
}
|
||||
|
||||
enum SSL_TLSEXT_ERR_OK = 0;
|
||||
enum SSL_TLSEXT_ERR_ALERT_WARNING = 1;
|
||||
enum SSL_TLSEXT_ERR_ALERT_FATAL = 2;
|
||||
enum SSL_TLSEXT_ERR_NOACK = 3;
|
||||
|
||||
auto SSL_CTX_set_tlsext_servername_arg(SSL_CTX* ctx, void* arg) {
|
||||
return SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0,arg);
|
||||
}
|
||||
|
||||
auto SSL_CTX_get_tlsext_ticket_keys(SSL_CTX* ctx, c_long keylen, void* keys) {
|
||||
return SSL_CTX_ctrl(ctx,SSL_CTRL_GET_TLSEXT_TICKET_KEYS,keylen,keys);
|
||||
}
|
||||
auto SSL_CTX_set_tlsext_ticket_keys(SSL_CTX* ctx, c_long keylen, void* keys) {
|
||||
return SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_TICKET_KEYS,keylen,keys);
|
||||
}
|
||||
|
||||
auto SSL_CTX_set_tlsext_status_cb(SSL_CTX* ctx, ExternC!(void function()) cb) {
|
||||
return SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,cb);
|
||||
}
|
||||
|
||||
auto SSL_CTX_set_tlsext_status_arg(SSL_CTX* ctx, void* arg) {
|
||||
return SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0,arg);
|
||||
}
|
||||
|
||||
auto SSL_set_tlsext_opaque_prf_input(SSL* s, void* src, c_long len) {
|
||||
return SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT, len, src);
|
||||
}
|
||||
|
||||
auto SSL_CTX_set_tlsext_opaque_prf_input_callback(SSL_CTX* ctx, ExternC!(void function()) cb) {
|
||||
return SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB, cb);
|
||||
}
|
||||
auto SSL_CTX_set_tlsext_opaque_prf_input_callback_arg(SSL_CTX* ctx, void* arg) {
|
||||
return SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG, 0, arg);
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_HEARTBEATS) {} else {
|
||||
enum SSL_TLSEXT_HB_ENABLED = 0x01;
|
||||
enum SSL_TLSEXT_HB_DONT_SEND_REQUESTS = 0x02;
|
||||
enum SSL_TLSEXT_HB_DONT_RECV_REQUESTS = 0x04;
|
||||
|
||||
auto SSL_get_tlsext_heartbeat_pending()(SSL* ssl) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_GET_TLS_EXT_HEARTBEAT_PENDING,0,null);
|
||||
}
|
||||
auto SSL_set_tlsext_heartbeat_no_requests()(SSL* ssl, c_long arg) {
|
||||
return SSL_ctrl(ssl,SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS,arg,null);
|
||||
}
|
||||
}
|
||||
|
||||
auto SSL_CTX_set_tlsext_ticket_key_cb()(ssl, ExternC!(void function()) cb) {
|
||||
return SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,cb);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* PSK ciphersuites from 4279 */
|
||||
enum TLS1_CK_PSK_WITH_RC4_128_SHA = 0x0300008A;
|
||||
enum TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA = 0x0300008B;
|
||||
enum TLS1_CK_PSK_WITH_AES_128_CBC_SHA = 0x0300008C;
|
||||
enum TLS1_CK_PSK_WITH_AES_256_CBC_SHA = 0x0300008D;
|
||||
|
||||
/* Additional TLS ciphersuites from expired Internet Draft
|
||||
* draft-ietf-tls-56-bit-ciphersuites-01.txt
|
||||
* (available if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see
|
||||
* s3_lib.c). We actually treat them like SSL 3.0 ciphers, which we probably
|
||||
* shouldn't. Note that the first two are actually not in the IDs. */
|
||||
enum TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5 = 0x03000060; /* not in ID */
|
||||
enum TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 = 0x03000061; /* not in ID */
|
||||
enum TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA = 0x03000062;
|
||||
enum TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA = 0x03000063;
|
||||
enum TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA = 0x03000064;
|
||||
enum TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA = 0x03000065;
|
||||
enum TLS1_CK_DHE_DSS_WITH_RC4_128_SHA = 0x03000066;
|
||||
|
||||
/* AES ciphersuites from RFC3268 */
|
||||
|
||||
enum TLS1_CK_RSA_WITH_AES_128_SHA = 0x0300002F;
|
||||
enum TLS1_CK_DH_DSS_WITH_AES_128_SHA = 0x03000030;
|
||||
enum TLS1_CK_DH_RSA_WITH_AES_128_SHA = 0x03000031;
|
||||
enum TLS1_CK_DHE_DSS_WITH_AES_128_SHA = 0x03000032;
|
||||
enum TLS1_CK_DHE_RSA_WITH_AES_128_SHA = 0x03000033;
|
||||
enum TLS1_CK_ADH_WITH_AES_128_SHA = 0x03000034;
|
||||
|
||||
enum TLS1_CK_RSA_WITH_AES_256_SHA = 0x03000035;
|
||||
enum TLS1_CK_DH_DSS_WITH_AES_256_SHA = 0x03000036;
|
||||
enum TLS1_CK_DH_RSA_WITH_AES_256_SHA = 0x03000037;
|
||||
enum TLS1_CK_DHE_DSS_WITH_AES_256_SHA = 0x03000038;
|
||||
enum TLS1_CK_DHE_RSA_WITH_AES_256_SHA = 0x03000039;
|
||||
enum TLS1_CK_ADH_WITH_AES_256_SHA = 0x0300003A;
|
||||
|
||||
/* TLS v1.2 ciphersuites */
|
||||
enum TLS1_CK_RSA_WITH_NULL_SHA256 = 0x0300003B;
|
||||
enum TLS1_CK_RSA_WITH_AES_128_SHA256 = 0x0300003C;
|
||||
enum TLS1_CK_RSA_WITH_AES_256_SHA256 = 0x0300003D;
|
||||
enum TLS1_CK_DH_DSS_WITH_AES_128_SHA256 = 0x0300003E;
|
||||
enum TLS1_CK_DH_RSA_WITH_AES_128_SHA256 = 0x0300003F;
|
||||
enum TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 = 0x03000040;
|
||||
|
||||
/* Camellia ciphersuites from RFC4132 */
|
||||
enum TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x03000041;
|
||||
enum TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA = 0x03000042;
|
||||
enum TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x03000043;
|
||||
enum TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA = 0x03000044;
|
||||
enum TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x03000045;
|
||||
enum TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA = 0x03000046;
|
||||
|
||||
/* TLS v1.2 ciphersuites */
|
||||
enum TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 = 0x03000067;
|
||||
enum TLS1_CK_DH_DSS_WITH_AES_256_SHA256 = 0x03000068;
|
||||
enum TLS1_CK_DH_RSA_WITH_AES_256_SHA256 = 0x03000069;
|
||||
enum TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 = 0x0300006A;
|
||||
enum TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 = 0x0300006B;
|
||||
enum TLS1_CK_ADH_WITH_AES_128_SHA256 = 0x0300006C;
|
||||
enum TLS1_CK_ADH_WITH_AES_256_SHA256 = 0x0300006D;
|
||||
|
||||
/* Camellia ciphersuites from RFC4132 */
|
||||
enum TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x03000084;
|
||||
enum TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA = 0x03000085;
|
||||
enum TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x03000086;
|
||||
enum TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA = 0x03000087;
|
||||
enum TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x03000088;
|
||||
enum TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA = 0x03000089;
|
||||
|
||||
/* SEED ciphersuites from RFC4162 */
|
||||
enum TLS1_CK_RSA_WITH_SEED_SHA = 0x03000096;
|
||||
enum TLS1_CK_DH_DSS_WITH_SEED_SHA = 0x03000097;
|
||||
enum TLS1_CK_DH_RSA_WITH_SEED_SHA = 0x03000098;
|
||||
enum TLS1_CK_DHE_DSS_WITH_SEED_SHA = 0x03000099;
|
||||
enum TLS1_CK_DHE_RSA_WITH_SEED_SHA = 0x0300009A;
|
||||
enum TLS1_CK_ADH_WITH_SEED_SHA = 0x0300009B;
|
||||
|
||||
/* TLS v1.2 GCM ciphersuites from RFC5288 */
|
||||
enum TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 = 0x0300009C;
|
||||
enum TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 = 0x0300009D;
|
||||
enum TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x0300009E;
|
||||
enum TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x0300009F;
|
||||
enum TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 = 0x030000A0;
|
||||
enum TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 = 0x030000A1;
|
||||
enum TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x030000A2;
|
||||
enum TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x030000A3;
|
||||
enum TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 = 0x030000A4;
|
||||
enum TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 = 0x030000A5;
|
||||
enum TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 = 0x030000A6;
|
||||
enum TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 = 0x030000A7;
|
||||
|
||||
/* ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in draft 13 */
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA = 0x0300C001;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA = 0x0300C002;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA = 0x0300C003;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA = 0x0300C004;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA = 0x0300C005;
|
||||
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA = 0x0300C006;
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA = 0x0300C007;
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA = 0x0300C008;
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0x0300C009;
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0x0300C00A;
|
||||
|
||||
enum TLS1_CK_ECDH_RSA_WITH_NULL_SHA = 0x0300C00B;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA = 0x0300C00C;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA = 0x0300C00D;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA = 0x0300C00E;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA = 0x0300C00F;
|
||||
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_NULL_SHA = 0x0300C010;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA = 0x0300C011;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA = 0x0300C012;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0x0300C013;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0x0300C014;
|
||||
|
||||
enum TLS1_CK_ECDH_anon_WITH_NULL_SHA = 0x0300C015;
|
||||
enum TLS1_CK_ECDH_anon_WITH_RC4_128_SHA = 0x0300C016;
|
||||
enum TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA = 0x0300C017;
|
||||
enum TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA = 0x0300C018;
|
||||
enum TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA = 0x0300C019;
|
||||
|
||||
/* SRP ciphersuites from RFC 5054 */
|
||||
enum TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA = 0x0300C01A;
|
||||
enum TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0x0300C01B;
|
||||
enum TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA = 0x0300C01C;
|
||||
enum TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA = 0x0300C01D;
|
||||
enum TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0x0300C01E;
|
||||
enum TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA = 0x0300C01F;
|
||||
enum TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA = 0x0300C020;
|
||||
enum TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0x0300C021;
|
||||
enum TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA = 0x0300C022;
|
||||
|
||||
/* ECDH HMAC based ciphersuites from RFC5289 */
|
||||
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 = 0x0300C023;
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 = 0x0300C024;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 = 0x0300C025;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 = 0x0300C026;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 = 0x0300C027;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 = 0x0300C028;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 = 0x0300C029;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 = 0x0300C02A;
|
||||
|
||||
/* ECDH GCM based ciphersuites from RFC5289 */
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0x0300C02B;
|
||||
enum TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0x0300C02C;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = 0x0300C02D;
|
||||
enum TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = 0x0300C02E;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0x0300C02F;
|
||||
enum TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0x0300C030;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0x0300C031;
|
||||
enum TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0x0300C032;
|
||||
|
||||
/* XXX
|
||||
* Inconsistency alert:
|
||||
* The OpenSSL names of ciphers with ephemeral DH here include the string
|
||||
* "DHE", while elsewhere it has always been "EDH".
|
||||
* (The alias for the list of all such ciphers also is "EDH".)
|
||||
* The specifications speak of "EDH"; maybe we should allow both forms
|
||||
* for everything. */
|
||||
enum TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 = "EXP1024-RC4-MD5";
|
||||
enum TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 = "EXP1024-RC2-CBC-MD5";
|
||||
enum TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA = "EXP1024-DES-CBC-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA = "EXP1024-DHE-DSS-DES-CBC-SHA";
|
||||
enum TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA = "EXP1024-RC4-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA = "EXP1024-DHE-DSS-RC4-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA = "DHE-DSS-RC4-SHA";
|
||||
|
||||
/* AES ciphersuites from RFC3268 */
|
||||
enum TLS1_TXT_RSA_WITH_AES_128_SHA = "AES128-SHA";
|
||||
enum TLS1_TXT_DH_DSS_WITH_AES_128_SHA = "DH-DSS-AES128-SHA";
|
||||
enum TLS1_TXT_DH_RSA_WITH_AES_128_SHA = "DH-RSA-AES128-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_AES_128_SHA = "DHE-DSS-AES128-SHA";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_AES_128_SHA = "DHE-RSA-AES128-SHA";
|
||||
enum TLS1_TXT_ADH_WITH_AES_128_SHA = "ADH-AES128-SHA";
|
||||
|
||||
enum TLS1_TXT_RSA_WITH_AES_256_SHA = "AES256-SHA";
|
||||
enum TLS1_TXT_DH_DSS_WITH_AES_256_SHA = "DH-DSS-AES256-SHA";
|
||||
enum TLS1_TXT_DH_RSA_WITH_AES_256_SHA = "DH-RSA-AES256-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_AES_256_SHA = "DHE-DSS-AES256-SHA";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_AES_256_SHA = "DHE-RSA-AES256-SHA";
|
||||
enum TLS1_TXT_ADH_WITH_AES_256_SHA = "ADH-AES256-SHA";
|
||||
|
||||
/* ECC ciphersuites from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) */
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA = "ECDH-ECDSA-NULL-SHA";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA = "ECDH-ECDSA-RC4-SHA";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA = "ECDH-ECDSA-DES-CBC3-SHA";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA = "ECDH-ECDSA-AES128-SHA";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA = "ECDH-ECDSA-AES256-SHA";
|
||||
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA = "ECDHE-ECDSA-NULL-SHA";
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA = "ECDHE-ECDSA-RC4-SHA";
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA = "ECDHE-ECDSA-DES-CBC3-SHA";
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = "ECDHE-ECDSA-AES128-SHA";
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = "ECDHE-ECDSA-AES256-SHA";
|
||||
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_NULL_SHA = "ECDH-RSA-NULL-SHA";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA = "ECDH-RSA-RC4-SHA";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA = "ECDH-RSA-DES-CBC3-SHA";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA = "ECDH-RSA-AES128-SHA";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA = "ECDH-RSA-AES256-SHA";
|
||||
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA = "ECDHE-RSA-NULL-SHA";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA = "ECDHE-RSA-RC4-SHA";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA = "ECDHE-RSA-DES-CBC3-SHA";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA = "ECDHE-RSA-AES128-SHA";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA = "ECDHE-RSA-AES256-SHA";
|
||||
|
||||
enum TLS1_TXT_ECDH_anon_WITH_NULL_SHA = "AECDH-NULL-SHA";
|
||||
enum TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA = "AECDH-RC4-SHA";
|
||||
enum TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA = "AECDH-DES-CBC3-SHA";
|
||||
enum TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA = "AECDH-AES128-SHA";
|
||||
enum TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA = "AECDH-AES256-SHA";
|
||||
|
||||
/* PSK ciphersuites from RFC 4279 */
|
||||
enum TLS1_TXT_PSK_WITH_RC4_128_SHA = "PSK-RC4-SHA";
|
||||
enum TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA = "PSK-3DES-EDE-CBC-SHA";
|
||||
enum TLS1_TXT_PSK_WITH_AES_128_CBC_SHA = "PSK-AES128-CBC-SHA";
|
||||
enum TLS1_TXT_PSK_WITH_AES_256_CBC_SHA = "PSK-AES256-CBC-SHA";
|
||||
|
||||
/* SRP ciphersuite from RFC 5054 */
|
||||
enum TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA = "SRP-3DES-EDE-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = "SRP-RSA-3DES-EDE-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA = "SRP-DSS-3DES-EDE-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA = "SRP-AES-128-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = "SRP-RSA-AES-128-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA = "SRP-DSS-AES-128-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA = "SRP-AES-256-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = "SRP-RSA-AES-256-CBC-SHA";
|
||||
enum TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA = "SRP-DSS-AES-256-CBC-SHA";
|
||||
|
||||
/* Camellia ciphersuites from RFC4132 */
|
||||
enum TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA = "CAMELLIA128-SHA";
|
||||
enum TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA = "DH-DSS-CAMELLIA128-SHA";
|
||||
enum TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA = "DH-RSA-CAMELLIA128-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA = "DHE-DSS-CAMELLIA128-SHA";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA = "DHE-RSA-CAMELLIA128-SHA";
|
||||
enum TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA = "ADH-CAMELLIA128-SHA";
|
||||
|
||||
enum TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA = "CAMELLIA256-SHA";
|
||||
enum TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA = "DH-DSS-CAMELLIA256-SHA";
|
||||
enum TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA = "DH-RSA-CAMELLIA256-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA = "DHE-DSS-CAMELLIA256-SHA";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA = "DHE-RSA-CAMELLIA256-SHA";
|
||||
enum TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA = "ADH-CAMELLIA256-SHA";
|
||||
|
||||
/* SEED ciphersuites from RFC4162 */
|
||||
enum TLS1_TXT_RSA_WITH_SEED_SHA = "SEED-SHA";
|
||||
enum TLS1_TXT_DH_DSS_WITH_SEED_SHA = "DH-DSS-SEED-SHA";
|
||||
enum TLS1_TXT_DH_RSA_WITH_SEED_SHA = "DH-RSA-SEED-SHA";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_SEED_SHA = "DHE-DSS-SEED-SHA";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_SEED_SHA = "DHE-RSA-SEED-SHA";
|
||||
enum TLS1_TXT_ADH_WITH_SEED_SHA = "ADH-SEED-SHA";
|
||||
|
||||
/* TLS v1.2 ciphersuites */
|
||||
enum TLS1_TXT_RSA_WITH_NULL_SHA256 = "NULL-SHA256";
|
||||
enum TLS1_TXT_RSA_WITH_AES_128_SHA256 = "AES128-SHA256";
|
||||
enum TLS1_TXT_RSA_WITH_AES_256_SHA256 = "AES256-SHA256";
|
||||
enum TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 = "DH-DSS-AES128-SHA256";
|
||||
enum TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 = "DH-RSA-AES128-SHA256";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 = "DHE-DSS-AES128-SHA256";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 = "DHE-RSA-AES128-SHA256";
|
||||
enum TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 = "DH-DSS-AES256-SHA256";
|
||||
enum TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 = "DH-RSA-AES256-SHA256";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 = "DHE-DSS-AES256-SHA256";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 = "DHE-RSA-AES256-SHA256";
|
||||
enum TLS1_TXT_ADH_WITH_AES_128_SHA256 = "ADH-AES128-SHA256";
|
||||
enum TLS1_TXT_ADH_WITH_AES_256_SHA256 = "ADH-AES256-SHA256";
|
||||
|
||||
/* TLS v1.2 GCM ciphersuites from RFC5288 */
|
||||
enum TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 = "AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 = "AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 = "DHE-RSA-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 = "DHE-RSA-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 = "DH-RSA-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 = "DH-RSA-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 = "DHE-DSS-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 = "DHE-DSS-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 = "DH-DSS-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 = "DH-DSS-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 = "ADH-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 = "ADH-AES256-GCM-SHA384";
|
||||
|
||||
/* ECDH HMAC based ciphersuites from RFC5289 */
|
||||
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 = "ECDHE-ECDSA-AES128-SHA256";
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 = "ECDHE-ECDSA-AES256-SHA384";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 = "ECDH-ECDSA-AES128-SHA256";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 = "ECDH-ECDSA-AES256-SHA384";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 = "ECDHE-RSA-AES128-SHA256";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 = "ECDHE-RSA-AES256-SHA384";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 = "ECDH-RSA-AES128-SHA256";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 = "ECDH-RSA-AES256-SHA384";
|
||||
|
||||
/* ECDH GCM based ciphersuites from RFC5289 */
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = "ECDHE-ECDSA-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = "ECDHE-ECDSA-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = "ECDH-ECDSA-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = "ECDH-ECDSA-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = "ECDHE-RSA-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = "ECDHE-RSA-AES256-GCM-SHA384";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 = "ECDH-RSA-AES128-GCM-SHA256";
|
||||
enum TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 = "ECDH-RSA-AES256-GCM-SHA384";
|
||||
|
||||
enum TLS_CT_RSA_SIGN = 1;
|
||||
enum TLS_CT_DSS_SIGN = 2;
|
||||
enum TLS_CT_RSA_FIXED_DH = 3;
|
||||
enum TLS_CT_DSS_FIXED_DH = 4;
|
||||
enum TLS_CT_ECDSA_SIGN = 64;
|
||||
enum TLS_CT_RSA_FIXED_ECDH = 65;
|
||||
enum TLS_CT_ECDSA_FIXED_ECDH = 66;
|
||||
enum TLS_CT_GOST94_SIGN = 21;
|
||||
enum TLS_CT_GOST01_SIGN = 22;
|
||||
/* when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see
|
||||
* comment there) */
|
||||
enum TLS_CT_NUMBER = 9;
|
||||
|
||||
enum TLS1_FINISH_MAC_LENGTH = 12;
|
||||
|
||||
enum TLS_MD_MAX_CONST_SIZE = 20;
|
||||
enum TLS_MD_CLIENT_FINISH_CONST = "client finished";
|
||||
enum TLS_MD_CLIENT_FINISH_CONST_SIZE = 15;
|
||||
enum TLS_MD_SERVER_FINISH_CONST = "server finished";
|
||||
enum TLS_MD_SERVER_FINISH_CONST_SIZE = 15;
|
||||
enum TLS_MD_SERVER_WRITE_KEY_CONST = "server write key";
|
||||
enum TLS_MD_SERVER_WRITE_KEY_CONST_SIZE = 16;
|
||||
enum TLS_MD_KEY_EXPANSION_CONST = "key expansion";
|
||||
enum TLS_MD_KEY_EXPANSION_CONST_SIZE = 13;
|
||||
enum TLS_MD_CLIENT_WRITE_KEY_CONST = "client write key";
|
||||
enum TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE = 16;
|
||||
// Oversight in original headers: Already defined above.
|
||||
// enum TLS_MD_SERVER_WRITE_KEY_CONST = "server write key";
|
||||
// enum TLS_MD_SERVER_WRITE_KEY_CONST_SIZE = 16;
|
||||
enum TLS_MD_IV_BLOCK_CONST = "IV block";
|
||||
enum TLS_MD_IV_BLOCK_CONST_SIZE = 8;
|
||||
enum TLS_MD_MASTER_SECRET_CONST = "master secret";
|
||||
enum TLS_MD_MASTER_SECRET_CONST_SIZE = 13;
|
||||
|
||||
/+#ifdef CHARSET_EBCDIC
|
||||
#undef TLS_MD_CLIENT_FINISH_CONST
|
||||
enum TLS_MD_CLIENT_FINISH_CONST = "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64"; /*client finished*/
|
||||
#undef TLS_MD_SERVER_FINISH_CONST
|
||||
enum TLS_MD_SERVER_FINISH_CONST = "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64"; /*server finished*/
|
||||
#undef TLS_MD_SERVER_WRITE_KEY_CONST
|
||||
enum TLS_MD_SERVER_WRITE_KEY_CONST = "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79"; /*server write key*/
|
||||
#undef TLS_MD_KEY_EXPANSION_CONST
|
||||
enum TLS_MD_KEY_EXPANSION_CONST = "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e"; /*key expansion*/
|
||||
#undef TLS_MD_CLIENT_WRITE_KEY_CONST
|
||||
enum TLS_MD_CLIENT_WRITE_KEY_CONST = "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79"; /*client write key*/
|
||||
#undef TLS_MD_SERVER_WRITE_KEY_CONST
|
||||
enum TLS_MD_SERVER_WRITE_KEY_CONST = "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79"; /*server write key*/
|
||||
#undef TLS_MD_IV_BLOCK_CONST
|
||||
enum TLS_MD_IV_BLOCK_CONST = "\x49\x56\x20\x62\x6c\x6f\x63\x6b"; /*IV block*/
|
||||
#undef TLS_MD_MASTER_SECRET_CONST
|
||||
enum TLS_MD_MASTER_SECRET_CONST = "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74"; /*master secret*/
|
||||
#endif+/
|
||||
|
||||
/* TLS Session Ticket extension struct */
|
||||
struct tls_session_ticket_ext_st
|
||||
{
|
||||
ushort length;
|
||||
void* data;
|
||||
};
|
|
@ -0,0 +1,854 @@
|
|||
/* crypto/ts/ts.h */
|
||||
/* Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL
|
||||
* project 2002, 2003, 2004.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2006 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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.ts;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
public import deimos.openssl.symhacks;
|
||||
version(OPENSSL_NO_BUFFER) {} else {
|
||||
public import deimos.openssl.buffer;
|
||||
}
|
||||
version(OPENSSL_NO_EVP) {} else {
|
||||
public import deimos.openssl.evp;
|
||||
}
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
public import deimos.openssl.stack;
|
||||
public import deimos.openssl.asn1;
|
||||
public import deimos.openssl.safestack;
|
||||
public import deimos.openssl.pkcs7;
|
||||
|
||||
version(OPENSSL_NO_RSA) {} else {
|
||||
public import deimos.openssl.rsa;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_DSA) {} else {
|
||||
public import deimos.openssl.dsa;
|
||||
}
|
||||
|
||||
version(OPENSSL_NO_DH) {} else {
|
||||
public import deimos.openssl.dh;
|
||||
}
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
// #ifdef WIN32
|
||||
// /* Under Win32 this is defined in wincrypt.h */
|
||||
// #undef X509_NAME
|
||||
// #endif
|
||||
|
||||
public import deimos.openssl.x509;
|
||||
public import deimos.openssl.x509v3;
|
||||
|
||||
/*
|
||||
MessageImprint ::= SEQUENCE {
|
||||
hashAlgorithm AlgorithmIdentifier,
|
||||
hashedMessage OCTET STRING }
|
||||
*/
|
||||
|
||||
struct TS_msg_imprint_st {
|
||||
X509_ALGOR* hash_algo;
|
||||
ASN1_OCTET_STRING* hashed_msg;
|
||||
}
|
||||
alias TS_msg_imprint_st TS_MSG_IMPRINT;
|
||||
|
||||
/*
|
||||
TimeStampReq ::= SEQUENCE {
|
||||
version INTEGER { v1(1) },
|
||||
messageImprint MessageImprint,
|
||||
--a hash algorithm OID and the hash value of the data to be
|
||||
--time-stamped
|
||||
reqPolicy TSAPolicyId OPTIONAL,
|
||||
nonce INTEGER OPTIONAL,
|
||||
certReq BOOLEAN DEFAULT FALSE,
|
||||
extensions [0] IMPLICIT Extensions OPTIONAL }
|
||||
*/
|
||||
|
||||
struct TS_req_st {
|
||||
ASN1_INTEGER* version_;
|
||||
TS_MSG_IMPRINT* msg_imprint;
|
||||
ASN1_OBJECT* policy_id; /* OPTIONAL */
|
||||
ASN1_INTEGER* nonce; /* OPTIONAL */
|
||||
ASN1_BOOLEAN cert_req; /* DEFAULT FALSE */
|
||||
STACK_OF!(X509_EXTENSION) *extensions; /* [0] OPTIONAL */
|
||||
}
|
||||
alias TS_req_st TS_REQ;
|
||||
|
||||
/*
|
||||
Accuracy ::= SEQUENCE {
|
||||
seconds INTEGER OPTIONAL,
|
||||
millis [0] INTEGER (1..999) OPTIONAL,
|
||||
micros [1] INTEGER (1..999) OPTIONAL }
|
||||
*/
|
||||
|
||||
struct TS_accuracy_st {
|
||||
ASN1_INTEGER* seconds;
|
||||
ASN1_INTEGER* millis;
|
||||
ASN1_INTEGER* micros;
|
||||
}
|
||||
alias TS_accuracy_st TS_ACCURACY;
|
||||
|
||||
/*
|
||||
TSTInfo ::= SEQUENCE {
|
||||
version INTEGER { v1(1) },
|
||||
policy TSAPolicyId,
|
||||
messageImprint MessageImprint,
|
||||
-- MUST have the same value as the similar field in
|
||||
-- TimeStampReq
|
||||
serialNumber INTEGER,
|
||||
-- Time-Stamping users MUST be ready to accommodate integers
|
||||
-- up to 160 bits.
|
||||
genTime GeneralizedTime,
|
||||
accuracy Accuracy OPTIONAL,
|
||||
ordering BOOLEAN DEFAULT FALSE,
|
||||
nonce INTEGER OPTIONAL,
|
||||
-- MUST be present if the similar field was present
|
||||
-- in TimeStampReq. In that case it MUST have the same value.
|
||||
tsa [0] GeneralName OPTIONAL,
|
||||
extensions [1] IMPLICIT Extensions OPTIONAL }
|
||||
*/
|
||||
|
||||
struct TS_tst_info_st {
|
||||
ASN1_INTEGER* version_;
|
||||
ASN1_OBJECT* policy_id;
|
||||
TS_MSG_IMPRINT* msg_imprint;
|
||||
ASN1_INTEGER* serial;
|
||||
ASN1_GENERALIZEDTIME* time;
|
||||
TS_ACCURACY* accuracy;
|
||||
ASN1_BOOLEAN ordering;
|
||||
ASN1_INTEGER* nonce;
|
||||
GENERAL_NAME* tsa;
|
||||
STACK_OF!(X509_EXTENSION) *extensions;
|
||||
}
|
||||
alias TS_tst_info_st TS_TST_INFO;
|
||||
|
||||
/*
|
||||
PKIStatusInfo ::= SEQUENCE {
|
||||
status PKIStatus,
|
||||
statusString PKIFreeText OPTIONAL,
|
||||
failInfo PKIFailureInfo OPTIONAL }
|
||||
|
||||
From RFC 1510 - section 3.1.1:
|
||||
PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String
|
||||
-- text encoded as UTF-8 String (note: each UTF8String SHOULD
|
||||
-- include an RFC 1766 language tag to indicate the language
|
||||
-- of the contained text)
|
||||
*/
|
||||
|
||||
/* Possible values for status. See ts_resp_print.c && ts_resp_verify.c. */
|
||||
|
||||
enum TS_STATUS_GRANTED = 0;
|
||||
enum TS_STATUS_GRANTED_WITH_MODS = 1;
|
||||
enum TS_STATUS_REJECTION = 2;
|
||||
enum TS_STATUS_WAITING = 3;
|
||||
enum TS_STATUS_REVOCATION_WARNING = 4;
|
||||
enum TS_STATUS_REVOCATION_NOTIFICATION = 5;
|
||||
|
||||
/* Possible values for failure_info. See ts_resp_print.c && ts_resp_verify.c */
|
||||
|
||||
enum TS_INFO_BAD_ALG = 0;
|
||||
enum TS_INFO_BAD_REQUEST = 2;
|
||||
enum TS_INFO_BAD_DATA_FORMAT = 5;
|
||||
enum TS_INFO_TIME_NOT_AVAILABLE = 14;
|
||||
enum TS_INFO_UNACCEPTED_POLICY = 15;
|
||||
enum TS_INFO_UNACCEPTED_EXTENSION = 16;
|
||||
enum TS_INFO_ADD_INFO_NOT_AVAILABLE = 17;
|
||||
enum TS_INFO_SYSTEM_FAILURE = 25;
|
||||
|
||||
struct TS_status_info_st {
|
||||
ASN1_INTEGER* status;
|
||||
STACK_OF!(ASN1_UTF8STRING) *text;
|
||||
ASN1_BIT_STRING* failure_info;
|
||||
}
|
||||
alias TS_status_info_st TS_STATUS_INFO;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(ASN1_UTF8STRING);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(ASN1_UTF8STRING);
|
||||
|
||||
/*
|
||||
TimeStampResp ::= SEQUENCE {
|
||||
status PKIStatusInfo,
|
||||
timeStampToken TimeStampToken OPTIONAL }
|
||||
*/
|
||||
|
||||
struct TS_resp_st {
|
||||
TS_STATUS_INFO* status_info;
|
||||
PKCS7* token;
|
||||
TS_TST_INFO* tst_info;
|
||||
}
|
||||
alias TS_resp_st TS_RESP;
|
||||
|
||||
/* The structure below would belong to the ESS component. */
|
||||
|
||||
/*
|
||||
IssuerSerial ::= SEQUENCE {
|
||||
issuer GeneralNames,
|
||||
serialNumber CertificateSerialNumber
|
||||
}
|
||||
*/
|
||||
|
||||
struct ESS_issuer_serial {
|
||||
STACK_OF!(GENERAL_NAME) *issuer;
|
||||
ASN1_INTEGER* serial;
|
||||
}
|
||||
alias ESS_issuer_serial ESS_ISSUER_SERIAL;
|
||||
|
||||
/*
|
||||
ESSCertID ::= SEQUENCE {
|
||||
certHash Hash,
|
||||
issuerSerial IssuerSerial OPTIONAL
|
||||
}
|
||||
*/
|
||||
|
||||
struct ESS_cert_id {
|
||||
ASN1_OCTET_STRING* hash; /* Always SHA-1 digest. */
|
||||
ESS_ISSUER_SERIAL* issuer_serial;
|
||||
}
|
||||
alias ESS_cert_id ESS_CERT_ID;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(ESS_CERT_ID);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(ESS_CERT_ID);
|
||||
|
||||
/*
|
||||
SigningCertificate ::= SEQUENCE {
|
||||
certs SEQUENCE OF ESSCertID,
|
||||
policies SEQUENCE OF PolicyInformation OPTIONAL
|
||||
}
|
||||
*/
|
||||
|
||||
struct ESS_signing_cert {
|
||||
STACK_OF!(ESS_CERT_ID) *cert_ids;
|
||||
STACK_OF!(POLICYINFO) *policy_info;
|
||||
}
|
||||
alias ESS_signing_cert ESS_SIGNING_CERT;
|
||||
|
||||
|
||||
TS_REQ* TS_REQ_new();
|
||||
void TS_REQ_free(TS_REQ* a);
|
||||
int i2d_TS_REQ(const(TS_REQ)* a, ubyte** pp);
|
||||
TS_REQ* d2i_TS_REQ(TS_REQ** a, const(ubyte)** pp, c_long length);
|
||||
|
||||
TS_REQ* TS_REQ_dup(TS_REQ* a);
|
||||
|
||||
TS_REQ* d2i_TS_REQ_fp(FILE* fp, TS_REQ** a);
|
||||
int i2d_TS_REQ_fp(FILE* fp, TS_REQ* a);
|
||||
TS_REQ* d2i_TS_REQ_bio(BIO* fp, TS_REQ** a);
|
||||
int i2d_TS_REQ_bio(BIO* fp, TS_REQ* a);
|
||||
|
||||
TS_MSG_IMPRINT* TS_MSG_IMPRINT_new();
|
||||
void TS_MSG_IMPRINT_free(TS_MSG_IMPRINT* a);
|
||||
int i2d_TS_MSG_IMPRINT(const(TS_MSG_IMPRINT)* a, ubyte** pp);
|
||||
TS_MSG_IMPRINT* d2i_TS_MSG_IMPRINT(TS_MSG_IMPRINT** a,
|
||||
const(ubyte)** pp, c_long length);
|
||||
|
||||
TS_MSG_IMPRINT* TS_MSG_IMPRINT_dup(TS_MSG_IMPRINT* a);
|
||||
|
||||
TS_MSG_IMPRINT* d2i_TS_MSG_IMPRINT_fp(FILE* fp, TS_MSG_IMPRINT** a);
|
||||
int i2d_TS_MSG_IMPRINT_fp(FILE* fp, TS_MSG_IMPRINT* a);
|
||||
TS_MSG_IMPRINT* d2i_TS_MSG_IMPRINT_bio(BIO* fp, TS_MSG_IMPRINT** a);
|
||||
int i2d_TS_MSG_IMPRINT_bio(BIO* fp, TS_MSG_IMPRINT* a);
|
||||
|
||||
TS_RESP* TS_RESP_new();
|
||||
void TS_RESP_free(TS_RESP* a);
|
||||
int i2d_TS_RESP(const(TS_RESP)* a, ubyte** pp);
|
||||
TS_RESP* d2i_TS_RESP(TS_RESP** a, const(ubyte)** pp, c_long length);
|
||||
TS_TST_INFO* PKCS7_to_TS_TST_INFO(PKCS7* token);
|
||||
TS_RESP* TS_RESP_dup(TS_RESP* a);
|
||||
|
||||
TS_RESP* d2i_TS_RESP_fp(FILE* fp, TS_RESP** a);
|
||||
int i2d_TS_RESP_fp(FILE* fp, TS_RESP* a);
|
||||
TS_RESP* d2i_TS_RESP_bio(BIO* fp, TS_RESP** a);
|
||||
int i2d_TS_RESP_bio(BIO* fp, TS_RESP* a);
|
||||
|
||||
TS_STATUS_INFO* TS_STATUS_INFO_new();
|
||||
void TS_STATUS_INFO_free(TS_STATUS_INFO* a);
|
||||
int i2d_TS_STATUS_INFO(const(TS_STATUS_INFO)* a, ubyte** pp);
|
||||
TS_STATUS_INFO* d2i_TS_STATUS_INFO(TS_STATUS_INFO** a,
|
||||
const(ubyte)** pp, c_long length);
|
||||
TS_STATUS_INFO* TS_STATUS_INFO_dup(TS_STATUS_INFO* a);
|
||||
|
||||
TS_TST_INFO* TS_TST_INFO_new();
|
||||
void TS_TST_INFO_free(TS_TST_INFO* a);
|
||||
int i2d_TS_TST_INFO(const(TS_TST_INFO)* a, ubyte** pp);
|
||||
TS_TST_INFO* d2i_TS_TST_INFO(TS_TST_INFO** a, const(ubyte)** pp,
|
||||
c_long length);
|
||||
TS_TST_INFO* TS_TST_INFO_dup(TS_TST_INFO* a);
|
||||
|
||||
TS_TST_INFO* d2i_TS_TST_INFO_fp(FILE* fp, TS_TST_INFO** a);
|
||||
int i2d_TS_TST_INFO_fp(FILE* fp, TS_TST_INFO* a);
|
||||
TS_TST_INFO* d2i_TS_TST_INFO_bio(BIO* fp, TS_TST_INFO** a);
|
||||
int i2d_TS_TST_INFO_bio(BIO* fp, TS_TST_INFO* a);
|
||||
|
||||
TS_ACCURACY* TS_ACCURACY_new();
|
||||
void TS_ACCURACY_free(TS_ACCURACY* a);
|
||||
int i2d_TS_ACCURACY(const(TS_ACCURACY)* a, ubyte** pp);
|
||||
TS_ACCURACY* d2i_TS_ACCURACY(TS_ACCURACY** a, const(ubyte)** pp,
|
||||
c_long length);
|
||||
TS_ACCURACY* TS_ACCURACY_dup(TS_ACCURACY* a);
|
||||
|
||||
ESS_ISSUER_SERIAL* ESS_ISSUER_SERIAL_new();
|
||||
void ESS_ISSUER_SERIAL_free(ESS_ISSUER_SERIAL* a);
|
||||
int i2d_ESS_ISSUER_SERIAL(const(ESS_ISSUER_SERIAL)* a,
|
||||
ubyte** pp);
|
||||
ESS_ISSUER_SERIAL* d2i_ESS_ISSUER_SERIAL(ESS_ISSUER_SERIAL** a,
|
||||
const(ubyte)** pp, c_long length);
|
||||
ESS_ISSUER_SERIAL* ESS_ISSUER_SERIAL_dup(ESS_ISSUER_SERIAL* a);
|
||||
|
||||
ESS_CERT_ID* ESS_CERT_ID_new();
|
||||
void ESS_CERT_ID_free(ESS_CERT_ID* a);
|
||||
int i2d_ESS_CERT_ID(const(ESS_CERT_ID)* a, ubyte** pp);
|
||||
ESS_CERT_ID* d2i_ESS_CERT_ID(ESS_CERT_ID** a, const(ubyte)** pp,
|
||||
c_long length);
|
||||
ESS_CERT_ID* ESS_CERT_ID_dup(ESS_CERT_ID* a);
|
||||
|
||||
ESS_SIGNING_CERT* ESS_SIGNING_CERT_new();
|
||||
void ESS_SIGNING_CERT_free(ESS_SIGNING_CERT* a);
|
||||
int i2d_ESS_SIGNING_CERT(const(ESS_SIGNING_CERT)* a,
|
||||
ubyte** pp);
|
||||
ESS_SIGNING_CERT* d2i_ESS_SIGNING_CERT(ESS_SIGNING_CERT** a,
|
||||
const(ubyte)** pp, c_long length);
|
||||
ESS_SIGNING_CERT* ESS_SIGNING_CERT_dup(ESS_SIGNING_CERT* a);
|
||||
|
||||
void ERR_load_TS_strings();
|
||||
|
||||
int TS_REQ_set_version(TS_REQ* a, c_long version_);
|
||||
c_long TS_REQ_get_version(const(TS_REQ)* a);
|
||||
|
||||
int TS_REQ_set_msg_imprint(TS_REQ* a, TS_MSG_IMPRINT* msg_imprint);
|
||||
TS_MSG_IMPRINT* TS_REQ_get_msg_imprint(TS_REQ* a);
|
||||
|
||||
int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT* a, X509_ALGOR* alg);
|
||||
X509_ALGOR* TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT* a);
|
||||
|
||||
int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT* a, ubyte* d, int len);
|
||||
ASN1_OCTET_STRING* TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT* a);
|
||||
|
||||
int TS_REQ_set_policy_id(TS_REQ* a, ASN1_OBJECT* policy);
|
||||
ASN1_OBJECT* TS_REQ_get_policy_id(TS_REQ* a);
|
||||
|
||||
int TS_REQ_set_nonce(TS_REQ* a, const(ASN1_INTEGER)* nonce);
|
||||
const(ASN1_INTEGER)* TS_REQ_get_nonce(const(TS_REQ)* a);
|
||||
|
||||
int TS_REQ_set_cert_req(TS_REQ* a, int cert_req);
|
||||
int TS_REQ_get_cert_req(const(TS_REQ)* a);
|
||||
|
||||
STACK_OF!(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ* a);
|
||||
void TS_REQ_ext_free(TS_REQ* a);
|
||||
int TS_REQ_get_ext_count(TS_REQ* a);
|
||||
int TS_REQ_get_ext_by_NID(TS_REQ* a, int nid, int lastpos);
|
||||
int TS_REQ_get_ext_by_OBJ(TS_REQ* a, ASN1_OBJECT* obj, int lastpos);
|
||||
int TS_REQ_get_ext_by_critical(TS_REQ* a, int crit, int lastpos);
|
||||
X509_EXTENSION* TS_REQ_get_ext(TS_REQ* a, int loc);
|
||||
X509_EXTENSION* TS_REQ_delete_ext(TS_REQ* a, int loc);
|
||||
int TS_REQ_add_ext(TS_REQ* a, X509_EXTENSION* ex, int loc);
|
||||
void* TS_REQ_get_ext_d2i(TS_REQ* a, int nid, int* crit, int* idx);
|
||||
|
||||
/* Function declarations for TS_REQ defined in ts/ts_req_print.c */
|
||||
|
||||
int TS_REQ_print_bio(BIO* bio, TS_REQ* a);
|
||||
|
||||
/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */
|
||||
|
||||
int TS_RESP_set_status_info(TS_RESP* a, TS_STATUS_INFO* info);
|
||||
TS_STATUS_INFO* TS_RESP_get_status_info(TS_RESP* a);
|
||||
|
||||
/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */
|
||||
void TS_RESP_set_tst_info(TS_RESP* a, PKCS7* p7, TS_TST_INFO* tst_info);
|
||||
PKCS7* TS_RESP_get_token(TS_RESP* a);
|
||||
TS_TST_INFO* TS_RESP_get_tst_info(TS_RESP* a);
|
||||
|
||||
int TS_TST_INFO_set_version(TS_TST_INFO* a, c_long version_);
|
||||
c_long TS_TST_INFO_get_version(const(TS_TST_INFO)* a);
|
||||
|
||||
int TS_TST_INFO_set_policy_id(TS_TST_INFO* a, ASN1_OBJECT* policy_id);
|
||||
ASN1_OBJECT* TS_TST_INFO_get_policy_id(TS_TST_INFO* a);
|
||||
|
||||
int TS_TST_INFO_set_msg_imprint(TS_TST_INFO* a, TS_MSG_IMPRINT* msg_imprint);
|
||||
TS_MSG_IMPRINT* TS_TST_INFO_get_msg_imprint(TS_TST_INFO* a);
|
||||
|
||||
int TS_TST_INFO_set_serial(TS_TST_INFO* a, const(ASN1_INTEGER)* serial);
|
||||
const(ASN1_INTEGER)* TS_TST_INFO_get_serial(const(TS_TST_INFO)* a);
|
||||
|
||||
int TS_TST_INFO_set_time(TS_TST_INFO* a, const(ASN1_GENERALIZEDTIME)* gtime);
|
||||
const(ASN1_GENERALIZEDTIME)* TS_TST_INFO_get_time(const(TS_TST_INFO)* a);
|
||||
|
||||
int TS_TST_INFO_set_accuracy(TS_TST_INFO* a, TS_ACCURACY* accuracy);
|
||||
TS_ACCURACY* TS_TST_INFO_get_accuracy(TS_TST_INFO* a);
|
||||
|
||||
int TS_ACCURACY_set_seconds(TS_ACCURACY* a, const(ASN1_INTEGER)* seconds);
|
||||
const(ASN1_INTEGER)* TS_ACCURACY_get_seconds(const(TS_ACCURACY)* a);
|
||||
|
||||
int TS_ACCURACY_set_millis(TS_ACCURACY* a, const(ASN1_INTEGER)* millis);
|
||||
const(ASN1_INTEGER)* TS_ACCURACY_get_millis(const(TS_ACCURACY)* a);
|
||||
|
||||
int TS_ACCURACY_set_micros(TS_ACCURACY* a, const(ASN1_INTEGER)* micros);
|
||||
const(ASN1_INTEGER)* TS_ACCURACY_get_micros(const(TS_ACCURACY)* a);
|
||||
|
||||
int TS_TST_INFO_set_ordering(TS_TST_INFO* a, int ordering);
|
||||
int TS_TST_INFO_get_ordering(const(TS_TST_INFO)* a);
|
||||
|
||||
int TS_TST_INFO_set_nonce(TS_TST_INFO* a, const(ASN1_INTEGER)* nonce);
|
||||
const(ASN1_INTEGER)* TS_TST_INFO_get_nonce(const(TS_TST_INFO)* a);
|
||||
|
||||
int TS_TST_INFO_set_tsa(TS_TST_INFO* a, GENERAL_NAME* tsa);
|
||||
GENERAL_NAME* TS_TST_INFO_get_tsa(TS_TST_INFO* a);
|
||||
|
||||
STACK_OF!(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO* a);
|
||||
void TS_TST_INFO_ext_free(TS_TST_INFO* a);
|
||||
int TS_TST_INFO_get_ext_count(TS_TST_INFO* a);
|
||||
int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO* a, int nid, int lastpos);
|
||||
int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO* a, ASN1_OBJECT* obj, int lastpos);
|
||||
int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO* a, int crit, int lastpos);
|
||||
X509_EXTENSION* TS_TST_INFO_get_ext(TS_TST_INFO* a, int loc);
|
||||
X509_EXTENSION* TS_TST_INFO_delete_ext(TS_TST_INFO* a, int loc);
|
||||
int TS_TST_INFO_add_ext(TS_TST_INFO* a, X509_EXTENSION* ex, int loc);
|
||||
void* TS_TST_INFO_get_ext_d2i(TS_TST_INFO* a, int nid, int* crit, int* idx);
|
||||
|
||||
/* Declarations related to response generation, defined in ts/ts_resp_sign.c. */
|
||||
|
||||
/* Optional flags for response generation. */
|
||||
|
||||
/* Don't include the TSA name in response. */
|
||||
enum TS_TSA_NAME = 0x01;
|
||||
|
||||
/* Set ordering to true in response. */
|
||||
enum TS_ORDERING = 0x02;
|
||||
|
||||
/*
|
||||
* Include the signer certificate and the other specified certificates in
|
||||
* the ESS signing certificate attribute beside the PKCS7 signed data.
|
||||
* Only the signer certificates is included by default.
|
||||
*/
|
||||
enum TS_ESS_CERT_ID_CHAIN = 0x04;
|
||||
|
||||
// /* Forward declaration. */
|
||||
// struct TS_resp_ctx;
|
||||
|
||||
/* This must return a unique number less than 160 bits long. */
|
||||
alias ExternC!(ASN1_INTEGER* function(TS_resp_ctx*, void*)) TS_serial_cb;
|
||||
|
||||
/* This must return the seconds and microseconds since Jan 1, 1970 in
|
||||
the sec and usec variables allocated by the caller.
|
||||
Return non-zero for success and zero for failure. */
|
||||
alias ExternC!(int function(TS_resp_ctx*, void*, c_long* sec, c_long* usec)) TS_time_cb;
|
||||
|
||||
/* This must process the given extension.
|
||||
* It can modify the TS_TST_INFO object of the context.
|
||||
* Return values: !0 (processed), 0 (error, it must set the
|
||||
* status info/failure info of the response).
|
||||
*/
|
||||
alias ExternC!(int function(TS_resp_ctx*, X509_EXTENSION*, void*)) TS_extension_cb;
|
||||
|
||||
struct TS_resp_ctx {
|
||||
X509* signer_cert;
|
||||
EVP_PKEY* signer_key;
|
||||
STACK_OF!(X509) *certs; /* Certs to include in signed data. */
|
||||
STACK_OF!(ASN1_OBJECT) *policies; /* Acceptable policies. */
|
||||
ASN1_OBJECT* default_policy; /* It may appear in policies, too. */
|
||||
STACK_OF!(EVP_MD) *mds; /* Acceptable message digests. */
|
||||
ASN1_INTEGER* seconds; /* accuracy, 0 means not specified. */
|
||||
ASN1_INTEGER* millis; /* accuracy, 0 means not specified. */
|
||||
ASN1_INTEGER* micros; /* accuracy, 0 means not specified. */
|
||||
uint clock_precision_digits; /* fraction of seconds in
|
||||
time stamp token. */
|
||||
uint flags; /* Optional info, see values above. */
|
||||
|
||||
/* Callback functions. */
|
||||
TS_serial_cb serial_cb;
|
||||
void* serial_cb_data; /* User data for serial_cb. */
|
||||
|
||||
TS_time_cb time_cb;
|
||||
void* time_cb_data; /* User data for time_cb. */
|
||||
|
||||
TS_extension_cb extension_cb;
|
||||
void* extension_cb_data; /* User data for extension_cb. */
|
||||
|
||||
/* These members are used only while creating the response. */
|
||||
TS_REQ* request;
|
||||
TS_RESP* response;
|
||||
TS_TST_INFO* tst_info;
|
||||
}
|
||||
alias TS_resp_ctx TS_RESP_CTX;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(EVP_MD);+/
|
||||
mixin DECLARE_ASN1_SET_OF!(EVP_MD);
|
||||
|
||||
/* Creates a response context that can be used for generating responses. */
|
||||
TS_RESP_CTX* TS_RESP_CTX_new();
|
||||
void TS_RESP_CTX_free(TS_RESP_CTX* ctx);
|
||||
|
||||
/* This parameter must be set. */
|
||||
int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX* ctx, X509* signer);
|
||||
|
||||
/* This parameter must be set. */
|
||||
int TS_RESP_CTX_set_signer_key(TS_RESP_CTX* ctx, EVP_PKEY* key);
|
||||
|
||||
/* This parameter must be set. */
|
||||
int TS_RESP_CTX_set_def_policy(TS_RESP_CTX* ctx, ASN1_OBJECT* def_policy);
|
||||
|
||||
/* No additional certs are included in the response by default. */
|
||||
int TS_RESP_CTX_set_certs(TS_RESP_CTX* ctx, STACK_OF!(X509) *certs);
|
||||
|
||||
/* Adds a new acceptable policy, only the default policy
|
||||
is accepted by default. */
|
||||
int TS_RESP_CTX_add_policy(TS_RESP_CTX* ctx, ASN1_OBJECT* policy);
|
||||
|
||||
/* Adds a new acceptable message digest. Note that no message digests
|
||||
are accepted by default. The md argument is shared with the caller. */
|
||||
int TS_RESP_CTX_add_md(TS_RESP_CTX* ctx, const(EVP_MD)* md);
|
||||
|
||||
/* Accuracy is not included by default. */
|
||||
int TS_RESP_CTX_set_accuracy(TS_RESP_CTX* ctx,
|
||||
int secs, int millis, int micros);
|
||||
|
||||
/* Clock precision digits, i.e. the number of decimal digits:
|
||||
'0' means sec, '3' msec, '6' usec, and so on. Default is 0. */
|
||||
int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX* ctx,
|
||||
uint clock_precision_digits);
|
||||
/* At most we accept usec precision. */
|
||||
enum TS_MAX_CLOCK_PRECISION_DIGITS = 6;
|
||||
|
||||
/* No flags are set by default. */
|
||||
void TS_RESP_CTX_add_flags(TS_RESP_CTX* ctx, int flags);
|
||||
|
||||
/* Default callback always returns a constant. */
|
||||
void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX* ctx, TS_serial_cb cb, void* data);
|
||||
|
||||
/* Default callback uses the gettimeofday() and gmtime() system calls. */
|
||||
void TS_RESP_CTX_set_time_cb(TS_RESP_CTX* ctx, TS_time_cb cb, void* data);
|
||||
|
||||
/* Default callback rejects all extensions. The extension callback is called
|
||||
* when the TS_TST_INFO object is already set up and not signed yet. */
|
||||
/* FIXME: extension handling is not tested yet. */
|
||||
void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX* ctx,
|
||||
TS_extension_cb cb, void* data);
|
||||
|
||||
/* The following methods can be used in the callbacks. */
|
||||
int TS_RESP_CTX_set_status_info(TS_RESP_CTX* ctx,
|
||||
int status, const(char)* text);
|
||||
|
||||
/* Sets the status info only if it is still TS_STATUS_GRANTED. */
|
||||
int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX* ctx,
|
||||
int status, const(char)* text);
|
||||
|
||||
int TS_RESP_CTX_add_failure_info(TS_RESP_CTX* ctx, int failure);
|
||||
|
||||
/* The get methods below can be used in the extension callback. */
|
||||
TS_REQ* TS_RESP_CTX_get_request(TS_RESP_CTX* ctx);
|
||||
|
||||
TS_TST_INFO* TS_RESP_CTX_get_tst_info(TS_RESP_CTX* ctx);
|
||||
|
||||
/*
|
||||
* Creates the signed TS_TST_INFO and puts it in TS_RESP.
|
||||
* In case of errors it sets the status info properly.
|
||||
* Returns NULL only in case of memory allocation/fatal error.
|
||||
*/
|
||||
TS_RESP* TS_RESP_create_response(TS_RESP_CTX* ctx, BIO* req_bio);
|
||||
|
||||
/*
|
||||
* Declarations related to response verification,
|
||||
* they are defined in ts/ts_resp_verify.c.
|
||||
*/
|
||||
|
||||
int TS_RESP_verify_signature(PKCS7* token, STACK_OF!(X509) *certs,
|
||||
X509_STORE* store, X509** signer_out);
|
||||
|
||||
/* Context structure for the generic verify method. */
|
||||
|
||||
/* Verify the signer's certificate and the signature of the response. */
|
||||
enum TS_VFY_SIGNATURE = (1u << 0);
|
||||
/* Verify the version number of the response. */
|
||||
enum TS_VFY_VERSION = (1u << 1);
|
||||
/* Verify if the policy supplied by the user matches the policy of the TSA. */
|
||||
enum TS_VFY_POLICY = (1u << 2);
|
||||
/* Verify the message imprint provided by the user. This flag should not be
|
||||
specified with TS_VFY_DATA. */
|
||||
enum TS_VFY_IMPRINT = (1u << 3);
|
||||
/* Verify the message imprint computed by the verify method from the user
|
||||
provided data and the MD algorithm of the response. This flag should not be
|
||||
specified with TS_VFY_IMPRINT. */
|
||||
enum TS_VFY_DATA = (1u << 4);
|
||||
/* Verify the nonce value. */
|
||||
enum TS_VFY_NONCE = (1u << 5);
|
||||
/* Verify if the TSA name field matches the signer certificate. */
|
||||
enum TS_VFY_SIGNER = (1u << 6);
|
||||
/* Verify if the TSA name field equals to the user provided name. */
|
||||
enum TS_VFY_TSA_NAME = (1u << 7);
|
||||
|
||||
/* You can use the following convenience constants. */
|
||||
enum TS_VFY_ALL_IMPRINT = (TS_VFY_SIGNATURE
|
||||
| TS_VFY_VERSION
|
||||
| TS_VFY_POLICY
|
||||
| TS_VFY_IMPRINT
|
||||
| TS_VFY_NONCE
|
||||
| TS_VFY_SIGNER
|
||||
| TS_VFY_TSA_NAME);
|
||||
enum TS_VFY_ALL_DATA = (TS_VFY_SIGNATURE
|
||||
| TS_VFY_VERSION
|
||||
| TS_VFY_POLICY
|
||||
| TS_VFY_DATA
|
||||
| TS_VFY_NONCE
|
||||
| TS_VFY_SIGNER
|
||||
| TS_VFY_TSA_NAME);
|
||||
|
||||
struct TS_verify_ctx {
|
||||
/* Set this to the union of TS_VFY_... flags you want to carry out. */
|
||||
uint flags;
|
||||
|
||||
/* Must be set only with TS_VFY_SIGNATURE. certs is optional. */
|
||||
X509_STORE* store;
|
||||
STACK_OF!(X509) *certs;
|
||||
|
||||
/* Must be set only with TS_VFY_POLICY. */
|
||||
ASN1_OBJECT* policy;
|
||||
|
||||
/* Must be set only with TS_VFY_IMPRINT. If md_alg is NULL,
|
||||
the algorithm from the response is used. */
|
||||
X509_ALGOR* md_alg;
|
||||
ubyte* imprint;
|
||||
uint imprint_len;
|
||||
|
||||
/* Must be set only with TS_VFY_DATA. */
|
||||
BIO* data;
|
||||
|
||||
/* Must be set only with TS_VFY_TSA_NAME. */
|
||||
ASN1_INTEGER* nonce;
|
||||
|
||||
/* Must be set only with TS_VFY_TSA_NAME. */
|
||||
GENERAL_NAME* tsa_name;
|
||||
}
|
||||
alias TS_verify_ctx TS_VERIFY_CTX;
|
||||
|
||||
int TS_RESP_verify_response(TS_VERIFY_CTX* ctx, TS_RESP* response);
|
||||
int TS_RESP_verify_token(TS_VERIFY_CTX* ctx, PKCS7* token);
|
||||
|
||||
/*
|
||||
* Declarations related to response verification context,
|
||||
* they are defined in ts/ts_verify_ctx.c.
|
||||
*/
|
||||
|
||||
/* Set all fields to zero. */
|
||||
TS_VERIFY_CTX* TS_VERIFY_CTX_new();
|
||||
void TS_VERIFY_CTX_init(TS_VERIFY_CTX* ctx);
|
||||
void TS_VERIFY_CTX_free(TS_VERIFY_CTX* ctx);
|
||||
void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX* ctx);
|
||||
|
||||
/*
|
||||
* If ctx is NULL, it allocates and returns a new object, otherwise
|
||||
* it returns ctx. It initialises all the members as follows:
|
||||
* flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE)
|
||||
* certs = NULL
|
||||
* store = NULL
|
||||
* policy = policy from the request or NULL if absent (in this case
|
||||
* TS_VFY_POLICY is cleared from flags as well)
|
||||
* md_alg = MD algorithm from request
|
||||
* imprint, imprint_len = imprint from request
|
||||
* data = NULL
|
||||
* nonce, nonce_len = nonce from the request or NULL if absent (in this case
|
||||
* TS_VFY_NONCE is cleared from flags as well)
|
||||
* tsa_name = NULL
|
||||
* Important: after calling this method TS_VFY_SIGNATURE should be added!
|
||||
*/
|
||||
TS_VERIFY_CTX* TS_REQ_to_TS_VERIFY_CTX(TS_REQ* req, TS_VERIFY_CTX* ctx);
|
||||
|
||||
/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */
|
||||
|
||||
int TS_RESP_print_bio(BIO* bio, TS_RESP* a);
|
||||
int TS_STATUS_INFO_print_bio(BIO* bio, TS_STATUS_INFO* a);
|
||||
int TS_TST_INFO_print_bio(BIO* bio, TS_TST_INFO* a);
|
||||
|
||||
/* Common utility functions defined in ts/ts_lib.c */
|
||||
|
||||
int TS_ASN1_INTEGER_print_bio(BIO* bio, const(ASN1_INTEGER)* num);
|
||||
int TS_OBJ_print_bio(BIO* bio, const(ASN1_OBJECT)* obj);
|
||||
int TS_ext_print_bio(BIO* bio, const STACK_OF!(X509_EXTENSION) *extensions);
|
||||
int TS_X509_ALGOR_print_bio(BIO* bio, const(X509_ALGOR)* alg);
|
||||
int TS_MSG_IMPRINT_print_bio(BIO* bio, TS_MSG_IMPRINT* msg);
|
||||
|
||||
/* Function declarations for handling configuration options,
|
||||
defined in ts/ts_conf.c */
|
||||
|
||||
X509* TS_CONF_load_cert(const(char)* file);
|
||||
STACK_OF!(X509) *TS_CONF_load_certs(const(char)* file);
|
||||
EVP_PKEY* TS_CONF_load_key(const(char)* file, const(char)* pass);
|
||||
const(char)* TS_CONF_get_tsa_section(CONF* conf, const(char)* section);
|
||||
int TS_CONF_set_serial(CONF* conf, const(char)* section, TS_serial_cb cb,
|
||||
TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_crypto_device(CONF* conf, const(char)* section,
|
||||
const(char)* device);
|
||||
int TS_CONF_set_default_engine(const(char)* name);
|
||||
int TS_CONF_set_signer_cert(CONF* conf, const(char)* section,
|
||||
const(char)* cert, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_certs(CONF* conf, const(char)* section, const(char)* certs,
|
||||
TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_signer_key(CONF* conf, const(char)* section,
|
||||
const(char)* key, const(char)* pass, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_def_policy(CONF* conf, const(char)* section,
|
||||
const(char)* policy, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_policies(CONF* conf, const(char)* section, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_digests(CONF* conf, const(char)* section, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_accuracy(CONF* conf, const(char)* section, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_clock_precision_digits(CONF* conf, const(char)* section,
|
||||
TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_ordering(CONF* conf, const(char)* section, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_tsa_name(CONF* conf, const(char)* section, TS_RESP_CTX* ctx);
|
||||
int TS_CONF_set_ess_cert_id_chain(CONF* conf, const(char)* section,
|
||||
TS_RESP_CTX* ctx);
|
||||
|
||||
/* -------------------------------------------------- */
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_TS_strings();
|
||||
|
||||
/* Error codes for the TS functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum TS_F_D2I_TS_RESP = 147;
|
||||
enum TS_F_DEF_SERIAL_CB = 110;
|
||||
enum TS_F_DEF_TIME_CB = 111;
|
||||
enum TS_F_ESS_ADD_SIGNING_CERT = 112;
|
||||
enum TS_F_ESS_CERT_ID_NEW_INIT = 113;
|
||||
enum TS_F_ESS_SIGNING_CERT_NEW_INIT = 114;
|
||||
enum TS_F_INT_TS_RESP_VERIFY_TOKEN = 149;
|
||||
enum TS_F_PKCS7_TO_TS_TST_INFO = 148;
|
||||
enum TS_F_TS_ACCURACY_SET_MICROS = 115;
|
||||
enum TS_F_TS_ACCURACY_SET_MILLIS = 116;
|
||||
enum TS_F_TS_ACCURACY_SET_SECONDS = 117;
|
||||
enum TS_F_TS_CHECK_IMPRINTS = 100;
|
||||
enum TS_F_TS_CHECK_NONCES = 101;
|
||||
enum TS_F_TS_CHECK_POLICY = 102;
|
||||
enum TS_F_TS_CHECK_SIGNING_CERTS = 103;
|
||||
enum TS_F_TS_CHECK_STATUS_INFO = 104;
|
||||
enum TS_F_TS_COMPUTE_IMPRINT = 145;
|
||||
enum TS_F_TS_CONF_SET_DEFAULT_ENGINE = 146;
|
||||
enum TS_F_TS_GET_STATUS_TEXT = 105;
|
||||
enum TS_F_TS_MSG_IMPRINT_SET_ALGO = 118;
|
||||
enum TS_F_TS_REQ_SET_MSG_IMPRINT = 119;
|
||||
enum TS_F_TS_REQ_SET_NONCE = 120;
|
||||
enum TS_F_TS_REQ_SET_POLICY_ID = 121;
|
||||
enum TS_F_TS_RESP_CREATE_RESPONSE = 122;
|
||||
enum TS_F_TS_RESP_CREATE_TST_INFO = 123;
|
||||
enum TS_F_TS_RESP_CTX_ADD_FAILURE_INFO = 124;
|
||||
enum TS_F_TS_RESP_CTX_ADD_MD = 125;
|
||||
enum TS_F_TS_RESP_CTX_ADD_POLICY = 126;
|
||||
enum TS_F_TS_RESP_CTX_NEW = 127;
|
||||
enum TS_F_TS_RESP_CTX_SET_ACCURACY = 128;
|
||||
enum TS_F_TS_RESP_CTX_SET_CERTS = 129;
|
||||
enum TS_F_TS_RESP_CTX_SET_DEF_POLICY = 130;
|
||||
enum TS_F_TS_RESP_CTX_SET_SIGNER_CERT = 131;
|
||||
enum TS_F_TS_RESP_CTX_SET_STATUS_INFO = 132;
|
||||
enum TS_F_TS_RESP_GET_POLICY = 133;
|
||||
enum TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION = 134;
|
||||
enum TS_F_TS_RESP_SET_STATUS_INFO = 135;
|
||||
enum TS_F_TS_RESP_SET_TST_INFO = 150;
|
||||
enum TS_F_TS_RESP_SIGN = 136;
|
||||
enum TS_F_TS_RESP_VERIFY_SIGNATURE = 106;
|
||||
enum TS_F_TS_RESP_VERIFY_TOKEN = 107;
|
||||
enum TS_F_TS_TST_INFO_SET_ACCURACY = 137;
|
||||
enum TS_F_TS_TST_INFO_SET_MSG_IMPRINT = 138;
|
||||
enum TS_F_TS_TST_INFO_SET_NONCE = 139;
|
||||
enum TS_F_TS_TST_INFO_SET_POLICY_ID = 140;
|
||||
enum TS_F_TS_TST_INFO_SET_SERIAL = 141;
|
||||
enum TS_F_TS_TST_INFO_SET_TIME = 142;
|
||||
enum TS_F_TS_TST_INFO_SET_TSA = 143;
|
||||
enum TS_F_TS_VERIFY = 108;
|
||||
enum TS_F_TS_VERIFY_CERT = 109;
|
||||
enum TS_F_TS_VERIFY_CTX_NEW = 144;
|
||||
|
||||
/* Reason codes. */
|
||||
enum TS_R_BAD_PKCS7_TYPE = 132;
|
||||
enum TS_R_BAD_TYPE = 133;
|
||||
enum TS_R_CERTIFICATE_VERIFY_ERROR = 100;
|
||||
enum TS_R_COULD_NOT_SET_ENGINE = 127;
|
||||
enum TS_R_COULD_NOT_SET_TIME = 115;
|
||||
enum TS_R_D2I_TS_RESP_INT_FAILED = 128;
|
||||
enum TS_R_DETACHED_CONTENT = 134;
|
||||
enum TS_R_ESS_ADD_SIGNING_CERT_ERROR = 116;
|
||||
enum TS_R_ESS_SIGNING_CERTIFICATE_ERROR = 101;
|
||||
enum TS_R_INVALID_NULL_POINTER = 102;
|
||||
enum TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE = 117;
|
||||
enum TS_R_MESSAGE_IMPRINT_MISMATCH = 103;
|
||||
enum TS_R_NONCE_MISMATCH = 104;
|
||||
enum TS_R_NONCE_NOT_RETURNED = 105;
|
||||
enum TS_R_NO_CONTENT = 106;
|
||||
enum TS_R_NO_TIME_STAMP_TOKEN = 107;
|
||||
enum TS_R_PKCS7_ADD_SIGNATURE_ERROR = 118;
|
||||
enum TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR = 119;
|
||||
enum TS_R_PKCS7_TO_TS_TST_INFO_FAILED = 129;
|
||||
enum TS_R_POLICY_MISMATCH = 108;
|
||||
enum TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE = 120;
|
||||
enum TS_R_RESPONSE_SETUP_ERROR = 121;
|
||||
enum TS_R_SIGNATURE_FAILURE = 109;
|
||||
enum TS_R_THERE_MUST_BE_ONE_SIGNER = 110;
|
||||
enum TS_R_TIME_SYSCALL_ERROR = 122;
|
||||
enum TS_R_TOKEN_NOT_PRESENT = 130;
|
||||
enum TS_R_TOKEN_PRESENT = 131;
|
||||
enum TS_R_TSA_NAME_MISMATCH = 111;
|
||||
enum TS_R_TSA_UNTRUSTED = 112;
|
||||
enum TS_R_TST_INFO_SETUP_ERROR = 123;
|
||||
enum TS_R_TS_DATASIGN = 124;
|
||||
enum TS_R_UNACCEPTABLE_POLICY = 125;
|
||||
enum TS_R_UNSUPPORTED_MD_ALGORITHM = 126;
|
||||
enum TS_R_UNSUPPORTED_VERSION = 113;
|
||||
enum TS_R_WRONG_CONTENT_TYPE = 114;
|
|
@ -0,0 +1,105 @@
|
|||
/* crypto/txt_db/txt_db.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
module deimos.openssl.txt_db;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
version(OPENSSL_NO_BIO) {} else {
|
||||
public import deimos.openssl.bio;
|
||||
}
|
||||
public import deimos.openssl.stack;
|
||||
public import deimos.openssl.lhash;
|
||||
|
||||
enum DB_ERROR_OK = 0;
|
||||
enum DB_ERROR_MALLOC = 1;
|
||||
enum DB_ERROR_INDEX_CLASH = 2;
|
||||
enum DB_ERROR_INDEX_OUT_OF_RANGE = 3;
|
||||
enum DB_ERROR_NO_INDEX = 4;
|
||||
enum DB_ERROR_INSERT_INDEX_CLASH = 5;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
alias OPENSSL_STRING* OPENSSL_PSTRING;
|
||||
mixin DECLARE_SPECIAL_STACK_OF!(OPENSSL_PSTRING, OPENSSL_STRING);
|
||||
struct txt_db_st {
|
||||
int num_fields;
|
||||
STACK_OF!(OPENSSL_PSTRING) *data;
|
||||
LHASH_OF!(OPENSSL_STRING) **index;
|
||||
ExternC!(int function(OPENSSL_STRING*))* qual;
|
||||
c_long error;
|
||||
c_long arg1;
|
||||
c_long arg2;
|
||||
OPENSSL_STRING* arg_row;
|
||||
}
|
||||
alias txt_db_st TXT_DB;
|
||||
|
||||
version(OPENSSL_NO_BIO) {
|
||||
TXT_DB* TXT_DB_read(char* in_, int num);
|
||||
c_long TXT_DB_write(char* out_, TXT_DB* db);
|
||||
} else {
|
||||
TXT_DB* TXT_DB_read(BIO* in_, int num);
|
||||
c_long TXT_DB_write(BIO* out_, TXT_DB* db);
|
||||
}
|
||||
int TXT_DB_create_index(TXT_DB* db,int field,ExternC!(int function(OPENSSL_STRING*)) qual,
|
||||
LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp);
|
||||
void TXT_DB_free(TXT_DB* db);
|
||||
OPENSSL_STRING* TXT_DB_get_by_index(TXT_DB* db, int idx, OPENSSL_STRING* value);
|
||||
int TXT_DB_insert(TXT_DB* db, OPENSSL_STRING* value);
|
|
@ -0,0 +1,379 @@
|
|||
/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
|
||||
* project 2001.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2001 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.ui;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
version(OPENSSL_NO_DEPRECATED) {} else {
|
||||
public import deimos.openssl.crypto;
|
||||
}
|
||||
public import deimos.openssl.safestack;
|
||||
public import deimos.openssl.ossl_typ;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* Declared already in ossl_typ.h */
|
||||
/* typedef ui_st UI; */
|
||||
/* typedef ui_method_st UI_METHOD; */
|
||||
|
||||
|
||||
/* All the following functions return -1 or NULL on error and in some cases
|
||||
(UI_process()) -2 if interrupted or in some other way cancelled.
|
||||
When everything is fine, they return 0, a positive value or a non-NULL
|
||||
pointer, all depending on their purpose. */
|
||||
|
||||
/* Creators and destructor. */
|
||||
UI* UI_new();
|
||||
UI* UI_new_method(const(UI_METHOD)* method);
|
||||
void UI_free(UI* ui);
|
||||
|
||||
/* The following functions are used to add strings to be printed and prompt
|
||||
strings to prompt for data. The names are UI_{add,dup}_<function>_string
|
||||
and UI_{add,dup}_input_boolean.
|
||||
|
||||
UI_{add,dup}_<function>_string have the following meanings:
|
||||
add add a text or prompt string. The pointers given to these
|
||||
functions are used verbatim, no copying is done.
|
||||
dup make a copy of the text or prompt string, then add the copy
|
||||
to the collection of strings in the user interface.
|
||||
<function>
|
||||
The function is a name for the functionality that the given
|
||||
string shall be used for. It can be one of:
|
||||
input use the string as data prompt.
|
||||
verify use the string as verification prompt. This
|
||||
is used to verify a previous input.
|
||||
info use the string for informational output.
|
||||
error use the string for error output.
|
||||
Honestly, there's currently no difference between info and error for the
|
||||
moment.
|
||||
|
||||
UI_{add,dup}_input_boolean have the same semantics for "add" and "dup",
|
||||
and are typically used when one wants to prompt for a yes/no response.
|
||||
|
||||
|
||||
All of the functions in this group take a UI and a prompt string.
|
||||
The string input and verify addition functions also take a flag argument,
|
||||
a buffer for the result to end up with, a minimum input size and a maximum
|
||||
input size (the result buffer MUST be large enough to be able to contain
|
||||
the maximum number of characters). Additionally, the verify addition
|
||||
functions takes another buffer to compare the result against.
|
||||
The boolean input functions take an action description string (which should
|
||||
be safe to ignore if the expected user action is obvious, for example with
|
||||
a dialog box with an OK button and a Cancel button), a string of acceptable
|
||||
characters to mean OK and to mean Cancel. The two last strings are checked
|
||||
to make sure they don't have common characters. Additionally, the same
|
||||
flag argument as for the string input is taken, as well as a result buffer.
|
||||
The result buffer is required to be at least one byte long. Depending on
|
||||
the answer, the first character from the OK or the Cancel character strings
|
||||
will be stored in the first byte of the result buffer. No NUL will be
|
||||
added, so the result is* not* a string.
|
||||
|
||||
On success, the all return an index of the added information. That index
|
||||
is usefull when retrieving results with UI_get0_result(). */
|
||||
int UI_add_input_string(UI* ui, const(char)* prompt, int flags,
|
||||
char* result_buf, int minsize, int maxsize);
|
||||
int UI_dup_input_string(UI* ui, const(char)* prompt, int flags,
|
||||
char* result_buf, int minsize, int maxsize);
|
||||
int UI_add_verify_string(UI* ui, const(char)* prompt, int flags,
|
||||
char* result_buf, int minsize, int maxsize, const(char)* test_buf);
|
||||
int UI_dup_verify_string(UI* ui, const(char)* prompt, int flags,
|
||||
char* result_buf, int minsize, int maxsize, const(char)* test_buf);
|
||||
int UI_add_input_boolean(UI* ui, const(char)* prompt, const(char)* action_desc,
|
||||
const(char)* ok_chars, const(char)* cancel_chars,
|
||||
int flags, char* result_buf);
|
||||
int UI_dup_input_boolean(UI* ui, const(char)* prompt, const(char)* action_desc,
|
||||
const(char)* ok_chars, const(char)* cancel_chars,
|
||||
int flags, char* result_buf);
|
||||
int UI_add_info_string(UI* ui, const(char)* text);
|
||||
int UI_dup_info_string(UI* ui, const(char)* text);
|
||||
int UI_add_error_string(UI* ui, const(char)* text);
|
||||
int UI_dup_error_string(UI* ui, const(char)* text);
|
||||
|
||||
/* These are the possible flags. They can be or'ed together. */
|
||||
/* Use to have echoing of input */
|
||||
enum UI_INPUT_FLAG_ECHO = 0x01;
|
||||
/* Use a default password. Where that password is found is completely
|
||||
up to the application, it might for example be in the user data set
|
||||
with UI_add_user_data(). It is not recommended to have more than
|
||||
one input in each UI being marked with this flag, or the application
|
||||
might get confused. */
|
||||
enum UI_INPUT_FLAG_DEFAULT_PWD = 0x02;
|
||||
|
||||
/* The user of these routines may want to define flags of their own. The core
|
||||
UI won't look at those, but will pass them on to the method routines. They
|
||||
must use higher bits so they don't get confused with the UI bits above.
|
||||
UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good
|
||||
example of use is this:
|
||||
|
||||
enum MY_UI_FLAG1 = (0x01 << UI_INPUT_FLAG_USER_BASE);
|
||||
|
||||
*/
|
||||
enum UI_INPUT_FLAG_USER_BASE = 16;
|
||||
|
||||
|
||||
/* The following function helps cona prompt. object_desc is a
|
||||
textual short description of the object, for example "pass phrase",
|
||||
and object_name is the name of the object (might be a card name or
|
||||
a file name.
|
||||
The returned string shall always be allocated on the heap with
|
||||
OPENSSL_malloc(), and need to be free'd with OPENSSL_free().
|
||||
|
||||
If the ui_method doesn't contain a pointer to a user-defined prompt
|
||||
constructor, a default string is built, looking like this:
|
||||
|
||||
"Enter {object_desc} for {object_name}:"
|
||||
|
||||
So, if object_desc has the value "pass phrase" and object_name has
|
||||
the value "foo.key", the resulting string is:
|
||||
|
||||
"Enter pass phrase for foo.key:"
|
||||
*/
|
||||
char* UI_construct_prompt(UI* ui_method,
|
||||
const(char)* object_desc, const(char)* object_name);
|
||||
|
||||
|
||||
/* The following function is used to store a pointer to user-specific data.
|
||||
Any previous such pointer will be returned and replaced.
|
||||
|
||||
For callback purposes, this function makes a lot more sense than using
|
||||
ex_data, since the latter requires that different parts of OpenSSL or
|
||||
applications share the same ex_data index.
|
||||
|
||||
Note that the UI_OpenSSL() method completely ignores the user data.
|
||||
Other methods may not, however. */
|
||||
void* UI_add_user_data(UI* ui, void* user_data);
|
||||
/* We need a user data retrieving function as well. */
|
||||
void* UI_get0_user_data(UI* ui);
|
||||
|
||||
/* Return the result associated with a prompt given with the index i. */
|
||||
const(char)* UI_get0_result(UI* ui, int i);
|
||||
|
||||
/* When all strings have been added, process the whole thing. */
|
||||
int UI_process(UI* ui);
|
||||
|
||||
/* Give a user interface parametrised control commands. This can be used to
|
||||
send down an integer, a data pointer or a function pointer, as well as
|
||||
be used to get information from a UI. */
|
||||
int UI_ctrl(UI* ui, int cmd, c_long i, void* p, ExternC!(void function()) f);
|
||||
|
||||
/* The commands */
|
||||
/* Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the
|
||||
OpenSSL error stack before printing any info or added error messages and
|
||||
before any prompting. */
|
||||
enum UI_CTRL_PRINT_ERRORS = 1;
|
||||
/* Check if a UI_process() is possible to do again with the same instance of
|
||||
a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0
|
||||
if not. */
|
||||
enum UI_CTRL_IS_REDOABLE = 2;
|
||||
|
||||
|
||||
/* Some methods may use extra data */
|
||||
auto UI_set_app_data()(UI* s,void* arg) { return UI_set_ex_data(s,0,arg); }
|
||||
auto UI_get_app_data()(UI* s) { return UI_get_ex_data(s,0); }
|
||||
int UI_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int UI_set_ex_data(UI* r,int idx,void* arg);
|
||||
void* UI_get_ex_data(UI* r, int idx);
|
||||
|
||||
/* Use specific methods instead of the built-in one */
|
||||
void UI_set_default_method(const(UI_METHOD)* meth);
|
||||
const(UI_METHOD)* UI_get_default_method();
|
||||
const(UI_METHOD)* UI_get_method(UI* ui);
|
||||
const(UI_METHOD)* UI_set_method(UI* ui, const(UI_METHOD)* meth);
|
||||
|
||||
/* The method with all the built-in thingies */
|
||||
UI_METHOD* UI_OpenSSL();
|
||||
|
||||
|
||||
/* ---------- For method writers ---------- */
|
||||
/* A method contains a number of functions that implement the low level
|
||||
of the User Interface. The functions are:
|
||||
|
||||
an opener This function starts a session, maybe by opening
|
||||
a channel to a tty, or by opening a window.
|
||||
a writer This function is called to write a given string,
|
||||
maybe to the tty, maybe as a field label in a
|
||||
window.
|
||||
a flusher This function is called to flush everything that
|
||||
has been output so far. It can be used to actually
|
||||
display a dialog box after it has been built.
|
||||
a reader This function is called to read a given prompt,
|
||||
maybe from the tty, maybe from a field in a
|
||||
window. Note that it's called wth all string
|
||||
structures, not only the prompt ones, so it must
|
||||
check such things itself.
|
||||
a closer This function closes the session, maybe by closing
|
||||
the channel to the tty, or closing the window.
|
||||
|
||||
All these functions are expected to return:
|
||||
|
||||
0 on error.
|
||||
1 on success.
|
||||
-1 on out-of-band events, for example if some prompting has
|
||||
been canceled (by pressing Ctrl-C, for example). This is
|
||||
only checked when returned by the flusher or the reader.
|
||||
|
||||
The way this is used, the opener is first called, then the writer for all
|
||||
strings, then the flusher, then the reader for all strings and finally the
|
||||
closer. Note that if you want to prompt from a terminal or other command
|
||||
line interface, the best is to have the reader also write the prompts
|
||||
instead of having the writer do it. If you want to prompt from a dialog
|
||||
box, the writer can be used to build up the contents of the box, and the
|
||||
flusher to actually display the box and run the event loop until all data
|
||||
has been given, after which the reader only grabs the given data and puts
|
||||
them back into the UI strings.
|
||||
|
||||
All method functions take a UI as argument. Additionally, the writer and
|
||||
the reader take a UI_STRING.
|
||||
*/
|
||||
|
||||
/* The UI_STRING type is the data structure that contains all the needed info
|
||||
about a string or a prompt, including test data for a verification prompt.
|
||||
*/
|
||||
struct ui_string_st;
|
||||
alias ui_string_st UI_STRING;
|
||||
/+mixin DECLARE_STACK_OF!(UI_STRING);+/
|
||||
|
||||
/* The different types of strings that are currently supported.
|
||||
This is only needed by method authors. */
|
||||
enum UI_string_types
|
||||
{
|
||||
UIT_NONE=0,
|
||||
UIT_PROMPT, /* Prompt for a string */
|
||||
UIT_VERIFY, /* Prompt for a string and verify */
|
||||
UIT_BOOLEAN, /* Prompt for a yes/no response */
|
||||
UIT_INFO, /* Send info to the user */
|
||||
UIT_ERROR /* Send an error message to the user */
|
||||
};
|
||||
|
||||
/* Create and manipulate methods */
|
||||
UI_METHOD* UI_create_method(char* name);
|
||||
void UI_destroy_method(UI_METHOD* ui_method);
|
||||
int UI_method_set_opener(UI_METHOD* method, ExternC!(int function(UI* ui)) opener);
|
||||
int UI_method_set_writer(UI_METHOD* method, ExternC!(int function(UI* ui, UI_STRING* uis)) writer);
|
||||
int UI_method_set_flusher(UI_METHOD* method, ExternC!(int function(UI* ui)) flusher);
|
||||
int UI_method_set_reader(UI_METHOD* method, ExternC!(int function(UI* ui, UI_STRING* uis)) reader);
|
||||
int UI_method_set_closer(UI_METHOD* method, ExternC!(int function(UI* ui)) closer);
|
||||
int UI_method_set_prompt_constructor(UI_METHOD* method, ExternC!(char* function(UI* ui, const(char)* object_desc, const(char)* object_name)) prompt_constructor);
|
||||
ExternC!(int function(UI*)) UI_method_get_opener(UI_METHOD* method);
|
||||
ExternC!(int function(UI*,UI_STRING*)) UI_method_get_writer(UI_METHOD* method);
|
||||
ExternC!(int function(UI*)) UI_method_get_flusher(UI_METHOD* method);
|
||||
ExternC!(int function(UI*,UI_STRING*)) UI_method_get_reader(UI_METHOD* method);
|
||||
ExternC!(int function(UI*)) UI_method_get_closer(UI_METHOD* method);
|
||||
ExternC!(char* function(UI*, const(char)*, const(char)*)) UI_method_get_prompt_constructor(UI_METHOD* method);
|
||||
|
||||
/* The following functions are helpers for method writers to access relevant
|
||||
data from a UI_STRING. */
|
||||
|
||||
/* Return type of the UI_STRING */
|
||||
UI_string_types UI_get_string_type(UI_STRING* uis);
|
||||
/* Return input flags of the UI_STRING */
|
||||
int UI_get_input_flags(UI_STRING* uis);
|
||||
/* Return the actual string to output (the prompt, info or error) */
|
||||
const(char)* UI_get0_output_string(UI_STRING* uis);
|
||||
/* Return the optional action string to output (the boolean promtp instruction) */
|
||||
const(char)* UI_get0_action_string(UI_STRING* uis);
|
||||
/* Return the result of a prompt */
|
||||
const(char)* UI_get0_result_string(UI_STRING* uis);
|
||||
/* Return the string to test the result against. Only useful with verifies. */
|
||||
const(char)* UI_get0_test_string(UI_STRING* uis);
|
||||
/* Return the required minimum size of the result */
|
||||
int UI_get_result_minsize(UI_STRING* uis);
|
||||
/* Return the required maximum size of the result */
|
||||
int UI_get_result_maxsize(UI_STRING* uis);
|
||||
/* Set the result of a UI_STRING. */
|
||||
int UI_set_result(UI* ui, UI_STRING* uis, const(char)* result);
|
||||
|
||||
|
||||
/* A couple of popular utility functions */
|
||||
int UI_UTIL_read_pw_string(char* buf,int length,const(char)* prompt,int verify);
|
||||
int UI_UTIL_read_pw(char* buf,char* buff,int size,const(char)* prompt,int verify);
|
||||
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
void ERR_load_UI_strings();
|
||||
|
||||
/* Error codes for the UI functions. */
|
||||
|
||||
/* Function codes. */
|
||||
enum UI_F_GENERAL_ALLOCATE_BOOLEAN = 108;
|
||||
enum UI_F_GENERAL_ALLOCATE_PROMPT = 109;
|
||||
enum UI_F_GENERAL_ALLOCATE_STRING = 100;
|
||||
enum UI_F_UI_CTRL = 111;
|
||||
enum UI_F_UI_DUP_ERROR_STRING = 101;
|
||||
enum UI_F_UI_DUP_INFO_STRING = 102;
|
||||
enum UI_F_UI_DUP_INPUT_BOOLEAN = 110;
|
||||
enum UI_F_UI_DUP_INPUT_STRING = 103;
|
||||
enum UI_F_UI_DUP_VERIFY_STRING = 106;
|
||||
enum UI_F_UI_GET0_RESULT = 107;
|
||||
enum UI_F_UI_NEW_METHOD = 104;
|
||||
enum UI_F_UI_SET_RESULT = 105;
|
||||
|
||||
/* Reason codes. */
|
||||
enum UI_R_COMMON_OK_AND_CANCEL_CHARACTERS = 104;
|
||||
enum UI_R_INDEX_TOO_LARGE = 102;
|
||||
enum UI_R_INDEX_TOO_SMALL = 103;
|
||||
enum UI_R_NO_RESULT_BUFFER = 105;
|
||||
enum UI_R_RESULT_TOO_LARGE = 100;
|
||||
enum UI_R_RESULT_TOO_SMALL = 101;
|
||||
enum UI_R_UNKNOWN_CONTROL_COMMAND = 106;
|
|
@ -0,0 +1,76 @@
|
|||
/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
|
||||
* project 2001.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2001 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
module deimos.openssl.ui_compat;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
public import deimos.openssl.ui;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
/* The following functions were previously part of the DES section,
|
||||
and are provided here for backward compatibility reasons. */
|
||||
|
||||
alias _ossl_old_des_read_pw_string des_read_pw_string;
|
||||
alias _ossl_old_des_read_pw des_read_pw;
|
||||
|
||||
int _ossl_old_des_read_pw_string(char* buf,int length,const(char)* prompt,int verify);
|
||||
int _ossl_old_des_read_pw(char* buf,char* buff,int size,const(char)* prompt,int verify);
|
|
@ -0,0 +1,36 @@
|
|||
module deimos.openssl.whrlpool;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
public import deimos.openssl.e_os2;
|
||||
import core.stdc.config;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
enum WHIRLPOOL_DIGEST_LENGTH = (512/8);
|
||||
enum WHIRLPOOL_BBLOCK = 512;
|
||||
enum WHIRLPOOL_COUNTER = (256/8);
|
||||
|
||||
struct WHIRLPOOL_CTX {
|
||||
union H_ {
|
||||
ubyte[WHIRLPOOL_DIGEST_LENGTH] c;
|
||||
/* double q is here to ensure 64-bit alignment */
|
||||
double[WHIRLPOOL_DIGEST_LENGTH/double.sizeof] q;
|
||||
}
|
||||
H_ H;
|
||||
ubyte[WHIRLPOOL_BBLOCK/8] data;
|
||||
uint bitoff;
|
||||
size_t[WHIRLPOOL_COUNTER/size_t.sizeof] bitlen;
|
||||
};
|
||||
|
||||
version(OPENSSL_NO_WHIRLPOOL) {} else {
|
||||
version(OPENSSL_FIPS) {
|
||||
int private_WHIRLPOOL_Init(WHIRLPOOL_CTX* c);
|
||||
}
|
||||
int WHIRLPOOL_Init (WHIRLPOOL_CTX* c);
|
||||
int WHIRLPOOL_Update (WHIRLPOOL_CTX* c,const(void)* inp,size_t bytes);
|
||||
void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX* c,const(void)* inp,size_t bits);
|
||||
int WHIRLPOOL_Final (ubyte* md,WHIRLPOOL_CTX* c);
|
||||
ubyte* WHIRLPOOL(const(void)* inp,size_t bytes,ubyte* md);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,573 @@
|
|||
/* crypto/x509/x509_vfy.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
// #ifndef HEADER_X509_H
|
||||
// public import deimos.openssl.x509;
|
||||
// /* openssl/x509.h ends up #include-ing this file at about the only
|
||||
// * appropriate moment. */
|
||||
// #endif
|
||||
|
||||
module deimos.openssl.x509_vfy;
|
||||
|
||||
import deimos.openssl._d_util;
|
||||
|
||||
import core.stdc.time;
|
||||
import deimos.openssl.asn1; // Needed for ASN1_OBJECT.
|
||||
import deimos.openssl.x509v3; // Needed for POLICYQUALINFO.
|
||||
|
||||
public import deimos.openssl.opensslconf;
|
||||
version(OPENSSL_NO_LHASH) {} else {
|
||||
public import deimos.openssl.lhash;
|
||||
}
|
||||
public import deimos.openssl.bio;
|
||||
public import deimos.openssl.crypto;
|
||||
public import deimos.openssl.symhacks;
|
||||
|
||||
extern (C):
|
||||
nothrow:
|
||||
|
||||
version (none) {
|
||||
/* Outer object */
|
||||
struct x509_hash_dir_st {
|
||||
int num_dirs;
|
||||
char** dirs;
|
||||
int* dirs_type;
|
||||
int num_dirs_alloced;
|
||||
}
|
||||
alias x509_hash_dir_st X509_HASH_DIR_CTX;
|
||||
}
|
||||
|
||||
struct x509_file_st {
|
||||
int num_paths; /* number of paths to files or directories */
|
||||
int num_alloced;
|
||||
char** paths; /* the list of paths or directories */
|
||||
int* path_type;
|
||||
}
|
||||
alias x509_file_st X509_CERT_FILE_CTX;
|
||||
|
||||
/*******************************/
|
||||
/*
|
||||
SSL_CTX -> X509_STORE
|
||||
-> X509_LOOKUP
|
||||
->X509_LOOKUP_METHOD
|
||||
-> X509_LOOKUP
|
||||
->X509_LOOKUP_METHOD
|
||||
|
||||
SSL -> X509_STORE_CTX
|
||||
->X509_STORE
|
||||
|
||||
The X509_STORE holds the tables etc for verification stuff.
|
||||
A X509_STORE_CTX is used while validating a single certificate.
|
||||
The X509_STORE has X509_LOOKUPs for looking up certs.
|
||||
The X509_STORE then calls a function to actually verify the
|
||||
certificate chain.
|
||||
*/
|
||||
|
||||
enum X509_LU_RETRY = -1;
|
||||
enum X509_LU_FAIL = 0;
|
||||
enum X509_LU_X509 = 1;
|
||||
enum X509_LU_CRL = 2;
|
||||
enum X509_LU_PKEY = 3;
|
||||
|
||||
struct x509_object_st
|
||||
{
|
||||
/* one of the above types */
|
||||
int type;
|
||||
union data_ {
|
||||
char* ptr;
|
||||
X509* x509;
|
||||
X509_CRL* crl;
|
||||
EVP_PKEY* pkey;
|
||||
}
|
||||
data_ data;
|
||||
}
|
||||
alias x509_object_st X509_OBJECT;
|
||||
|
||||
alias x509_lookup_st X509_LOOKUP;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(X509_LOOKUP);+/
|
||||
/+mixin DECLARE_STACK_OF!(X509_OBJECT);+/
|
||||
|
||||
/* This is a static that defines the function interface */
|
||||
struct x509_lookup_method_st {
|
||||
const(char)* name;
|
||||
ExternC!(int function(X509_LOOKUP* ctx)) new_item;
|
||||
ExternC!(void function(X509_LOOKUP* ctx)) free;
|
||||
ExternC!(int function(X509_LOOKUP* ctx)) init_;
|
||||
ExternC!(int function(X509_LOOKUP* ctx)) shutdown;
|
||||
ExternC!(int function(X509_LOOKUP* ctx,int cmd,const(char)* argc,c_long argl,
|
||||
char** ret)) ctrl;
|
||||
ExternC!(int function(X509_LOOKUP* ctx,int type,X509_NAME* name,
|
||||
X509_OBJECT* ret)) get_by_subject;
|
||||
ExternC!(int function(X509_LOOKUP* ctx,int type,X509_NAME* name,
|
||||
ASN1_INTEGER* serial,X509_OBJECT* ret)) get_by_issuer_serial;
|
||||
ExternC!(int function(X509_LOOKUP* ctx,int type,
|
||||
ubyte* bytes,int len,
|
||||
X509_OBJECT* ret)) get_by_fingerprint;
|
||||
ExternC!(int function(X509_LOOKUP* ctx,int type,char* str,int len,
|
||||
X509_OBJECT* ret)) get_by_alias;
|
||||
}
|
||||
alias x509_lookup_method_st X509_LOOKUP_METHOD;
|
||||
|
||||
/* This structure hold all parameters associated with a verify operation
|
||||
* by including an X509_VERIFY_PARAM structure in related structures the
|
||||
* parameters used can be customized
|
||||
*/
|
||||
|
||||
struct X509_VERIFY_PARAM_st {
|
||||
char* name;
|
||||
time_t check_time; /* Time to use */
|
||||
c_ulong inh_flags; /* Inheritance flags */
|
||||
c_ulong flags; /* Various verify flags */
|
||||
int purpose; /* purpose to check untrusted certificates */
|
||||
int trust; /* trust setting to check */
|
||||
int depth; /* Verify depth */
|
||||
STACK_OF!(ASN1_OBJECT) *policies; /* Permissible policies */
|
||||
}
|
||||
alias X509_VERIFY_PARAM_st X509_VERIFY_PARAM;
|
||||
|
||||
/+mixin DECLARE_STACK_OF!(X509_VERIFY_PARAM);+/
|
||||
|
||||
/* This is used to hold everything. It is used for all certificate
|
||||
* validation. Once we have a certificate chain, the 'verify'
|
||||
* function is then called to actually check the cert chain. */
|
||||
struct x509_store_st
|
||||
{
|
||||
/* The following is a cache of trusted certs */
|
||||
int cache; /* if true, stash any hits */
|
||||
STACK_OF!(X509_OBJECT) *objs; /* Cache of all objects */
|
||||
|
||||
/* These are external lookup methods */
|
||||
STACK_OF!(X509_LOOKUP) *get_cert_methods;
|
||||
|
||||
X509_VERIFY_PARAM* param;
|
||||
|
||||
/* Callbacks for various operations */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) verify; /* called to verify a certificate */
|
||||
ExternC!(int function(int ok,X509_STORE_CTX* ctx)) verify_cb; /* error callback */
|
||||
ExternC!(int function(X509** issuer, X509_STORE_CTX* ctx, X509* x)) get_issuer; /* get issuers cert from ctx */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509* x, X509* issuer)) check_issued; /* check issued */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) check_revocation; /* Check revocation status of chain */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509_CRL** crl, X509* x)) get_crl; /* retrieve CRL */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509_CRL* crl)) check_crl; /* Check CRL validity */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509_CRL* crl, X509* x)) cert_crl; /* Check certificate against CRL */
|
||||
ExternC!(STACK_OF!(X509)* function(X509_STORE_CTX* ctx, X509_NAME* nm)) lookup_certs;
|
||||
ExternC!(STACK_OF!(X509_CRL)* function(X509_STORE_CTX* ctx, X509_NAME* nm)) lookup_crls;
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) cleanup;
|
||||
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
int references;
|
||||
} /* X509_STORE */;
|
||||
|
||||
int X509_STORE_set_depth(X509_STORE* store, int depth);
|
||||
|
||||
auto X509_STORE_set_verify_cb_func()(X509_STORE_CTX* ctx, typeof(X509_STORE_CTX.init.verify_cb) func) { ctx.verify_cb = func; }
|
||||
auto X509_STORE_set_verify_func()(X509_STORE_CTX* ctx, typeof(X509_STORE_CTX.init.verify) func) { ctx.verify = func; }
|
||||
|
||||
/* This is the functions plus an instance of the local variables. */
|
||||
struct x509_lookup_st
|
||||
{
|
||||
int init_; /* have we been started */
|
||||
int skip; /* don't use us. */
|
||||
X509_LOOKUP_METHOD* method; /* the functions */
|
||||
char* method_data; /* method data */
|
||||
|
||||
X509_STORE* store_ctx; /* who owns us */
|
||||
} /* X509_LOOKUP */;
|
||||
|
||||
/* This is a used when verifying cert chains. Since the
|
||||
* gathering of the cert chain can take some time (and have to be
|
||||
* 'retried', this needs to be kept and passed around. */
|
||||
struct x509_store_ctx_st
|
||||
{
|
||||
X509_STORE* ctx;
|
||||
int current_method; /* used when looking up certs */
|
||||
|
||||
/* The following are set by the caller */
|
||||
X509* cert; /* The cert to check */
|
||||
STACK_OF!(X509) *untrusted; /* chain of X509s - untrusted - passed in */
|
||||
STACK_OF!(X509_CRL) *crls; /* set of CRLs passed in */
|
||||
|
||||
X509_VERIFY_PARAM* param;
|
||||
void* other_ctx; /* Other info for use with get_issuer() */
|
||||
|
||||
/* Callbacks for various operations */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) verify; /* called to verify a certificate */
|
||||
ExternC!(int function(int ok,X509_STORE_CTX* ctx)) verify_cb; /* error callback */
|
||||
ExternC!(int function(X509** issuer, X509_STORE_CTX* ctx, X509* x)) get_issuer; /* get issuers cert from ctx */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509* x, X509* issuer)) check_issued; /* check issued */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) check_revocation; /* Check revocation status of chain */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509_CRL** crl, X509* x)) get_crl; /* retrieve CRL */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509_CRL* crl)) check_crl; /* Check CRL validity */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx, X509_CRL* crl, X509* x)) cert_crl; /* Check certificate against CRL */
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) check_policy;
|
||||
ExternC!(STACK_OF!(X509)* function(X509_STORE_CTX* ctx, X509_NAME* nm)) lookup_certs;
|
||||
ExternC!(STACK_OF!(X509_CRL)* function(X509_STORE_CTX* ctx, X509_NAME* nm)) lookup_crls;
|
||||
ExternC!(int function(X509_STORE_CTX* ctx)) cleanup;
|
||||
|
||||
/* The following is built up */
|
||||
int valid; /* if 0, rebuild chain */
|
||||
int last_untrusted; /* index of last untrusted cert */
|
||||
STACK_OF!(X509) *chain; /* chain of X509s - built up and trusted */
|
||||
X509_POLICY_TREE* tree; /* Valid policy tree */
|
||||
|
||||
int explicit_policy; /* Require explicit policy value */
|
||||
|
||||
/* When something goes wrong, this is why */
|
||||
int error_depth;
|
||||
int error;
|
||||
X509* current_cert;
|
||||
X509* current_issuer; /* cert currently being tested as valid issuer */
|
||||
X509_CRL* current_crl; /* current CRL */
|
||||
|
||||
int current_crl_score; /* score of current CRL */
|
||||
uint current_reasons; /* Reason mask */
|
||||
|
||||
X509_STORE_CTX* parent; /* For CRL path validation: parent context */
|
||||
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
} /* X509_STORE_CTX */;
|
||||
|
||||
void X509_STORE_CTX_set_depth(X509_STORE_CTX* ctx, int depth);
|
||||
|
||||
auto X509_STORE_CTX_set_app_data()(X509_STORE_CTX* ctx, void* data) {
|
||||
return X509_STORE_CTX_set_ex_data(ctx,0,data);
|
||||
}
|
||||
|
||||
auto X509_STORE_CTX_get_app_data()(X509_STORE_CTX* ctx) {
|
||||
return X509_STORE_CTX_get_ex_data(ctx,0);
|
||||
}
|
||||
|
||||
enum X509_L_FILE_LOAD = 1;
|
||||
enum X509_L_ADD_DIR = 2;
|
||||
|
||||
auto X509_LOOKUP_load_file()(X509_LOOKUP* x,const(char)* name, c_long type) {
|
||||
return X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(type),null);
|
||||
}
|
||||
|
||||
|
||||
auto X509_LOOKUP_add_dir()(X509_LOOKUP* x,const(char)* name, c_long type) {
|
||||
return X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(type),null);
|
||||
}
|
||||
|
||||
enum X509_V_OK = 0;
|
||||
/* illegal error (for uninitialized values, to avoid X509_V_OK): 1 */
|
||||
|
||||
enum X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT = 2;
|
||||
enum X509_V_ERR_UNABLE_TO_GET_CRL = 3;
|
||||
enum X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE = 4;
|
||||
enum X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE = 5;
|
||||
enum X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY = 6;
|
||||
enum X509_V_ERR_CERT_SIGNATURE_FAILURE = 7;
|
||||
enum X509_V_ERR_CRL_SIGNATURE_FAILURE = 8;
|
||||
enum X509_V_ERR_CERT_NOT_YET_VALID = 9;
|
||||
enum X509_V_ERR_CERT_HAS_EXPIRED = 10;
|
||||
enum X509_V_ERR_CRL_NOT_YET_VALID = 11;
|
||||
enum X509_V_ERR_CRL_HAS_EXPIRED = 12;
|
||||
enum X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD = 13;
|
||||
enum X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD = 14;
|
||||
enum X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD = 15;
|
||||
enum X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD = 16;
|
||||
enum X509_V_ERR_OUT_OF_MEM = 17;
|
||||
enum X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT = 18;
|
||||
enum X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN = 19;
|
||||
enum X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY = 20;
|
||||
enum X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE = 21;
|
||||
enum X509_V_ERR_CERT_CHAIN_TOO_LONG = 22;
|
||||
enum X509_V_ERR_CERT_REVOKED = 23;
|
||||
enum X509_V_ERR_INVALID_CA = 24;
|
||||
enum X509_V_ERR_PATH_LENGTH_EXCEEDED = 25;
|
||||
enum X509_V_ERR_INVALID_PURPOSE = 26;
|
||||
enum X509_V_ERR_CERT_UNTRUSTED = 27;
|
||||
enum X509_V_ERR_CERT_REJECTED = 28;
|
||||
/* These are 'informational' when looking for issuer cert */
|
||||
enum X509_V_ERR_SUBJECT_ISSUER_MISMATCH = 29;
|
||||
enum X509_V_ERR_AKID_SKID_MISMATCH = 30;
|
||||
enum X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH = 31;
|
||||
enum X509_V_ERR_KEYUSAGE_NO_CERTSIGN = 32;
|
||||
|
||||
enum X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER = 33;
|
||||
enum X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION = 34;
|
||||
enum X509_V_ERR_KEYUSAGE_NO_CRL_SIGN = 35;
|
||||
enum X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION = 36;
|
||||
enum X509_V_ERR_INVALID_NON_CA = 37;
|
||||
enum X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED = 38;
|
||||
enum X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE = 39;
|
||||
enum X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED = 40;
|
||||
|
||||
enum X509_V_ERR_INVALID_EXTENSION = 41;
|
||||
enum X509_V_ERR_INVALID_POLICY_EXTENSION = 42;
|
||||
enum X509_V_ERR_NO_EXPLICIT_POLICY = 43;
|
||||
enum X509_V_ERR_DIFFERENT_CRL_SCOPE = 44;
|
||||
enum X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE = 45;
|
||||
|
||||
enum X509_V_ERR_UNNESTED_RESOURCE = 46;
|
||||
|
||||
enum X509_V_ERR_PERMITTED_VIOLATION = 47;
|
||||
enum X509_V_ERR_EXCLUDED_VIOLATION = 48;
|
||||
enum X509_V_ERR_SUBTREE_MINMAX = 49;
|
||||
enum X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE = 51;
|
||||
enum X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX = 52;
|
||||
enum X509_V_ERR_UNSUPPORTED_NAME_SYNTAX = 53;
|
||||
enum X509_V_ERR_CRL_PATH_VALIDATION_ERROR = 54;
|
||||
|
||||
/* The application is not happy */
|
||||
enum X509_V_ERR_APPLICATION_VERIFICATION = 50;
|
||||
|
||||
/* Certificate verify flags */
|
||||
|
||||
/* Send issuer+subject checks to verify_cb */
|
||||
enum X509_V_FLAG_CB_ISSUER_CHECK = 0x1;
|
||||
/* Use check time instead of current time */
|
||||
enum X509_V_FLAG_USE_CHECK_TIME = 0x2;
|
||||
/* Lookup CRLs */
|
||||
enum X509_V_FLAG_CRL_CHECK = 0x4;
|
||||
/* Lookup CRLs for whole chain */
|
||||
enum X509_V_FLAG_CRL_CHECK_ALL = 0x8;
|
||||
/* Ignore unhandled critical extensions */
|
||||
enum X509_V_FLAG_IGNORE_CRITICAL = 0x10;
|
||||
/* Disable workarounds for broken certificates */
|
||||
enum X509_V_FLAG_X509_STRICT = 0x20;
|
||||
/* Enable proxy certificate validation */
|
||||
enum X509_V_FLAG_ALLOW_PROXY_CERTS = 0x40;
|
||||
/* Enable policy checking */
|
||||
enum X509_V_FLAG_POLICY_CHECK = 0x80;
|
||||
/* Policy variable require-explicit-policy */
|
||||
enum X509_V_FLAG_EXPLICIT_POLICY = 0x100;
|
||||
/* Policy variable inhibit-any-policy */
|
||||
enum X509_V_FLAG_INHIBIT_ANY = 0x200;
|
||||
/* Policy variable inhibit-policy-mapping */
|
||||
enum X509_V_FLAG_INHIBIT_MAP = 0x400;
|
||||
/* Notify callback that policy is OK */
|
||||
enum X509_V_FLAG_NOTIFY_POLICY = 0x800;
|
||||
/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */
|
||||
enum X509_V_FLAG_EXTENDED_CRL_SUPPORT = 0x1000;
|
||||
/* Delta CRL support */
|
||||
enum X509_V_FLAG_USE_DELTAS = 0x2000;
|
||||
/* Check selfsigned CA signature */
|
||||
enum X509_V_FLAG_CHECK_SS_SIGNATURE = 0x4000;
|
||||
|
||||
|
||||
enum X509_VP_FLAG_DEFAULT = 0x1;
|
||||
enum X509_VP_FLAG_OVERWRITE = 0x2;
|
||||
enum X509_VP_FLAG_RESET_FLAGS = 0x4;
|
||||
enum X509_VP_FLAG_LOCKED = 0x8;
|
||||
enum X509_VP_FLAG_ONCE = 0x10;
|
||||
|
||||
/* Internal use: mask of policy related options */
|
||||
enum X509_V_FLAG_POLICY_MASK = (X509_V_FLAG_POLICY_CHECK
|
||||
| X509_V_FLAG_EXPLICIT_POLICY
|
||||
| X509_V_FLAG_INHIBIT_ANY
|
||||
| X509_V_FLAG_INHIBIT_MAP);
|
||||
|
||||
int X509_OBJECT_idx_by_subject(STACK_OF!(X509_OBJECT) *h, int type,
|
||||
X509_NAME* name);
|
||||
X509_OBJECT* X509_OBJECT_retrieve_by_subject(STACK_OF!(X509_OBJECT) *h,int type,X509_NAME* name);
|
||||
X509_OBJECT* X509_OBJECT_retrieve_match(STACK_OF!(X509_OBJECT) *h, X509_OBJECT* x);
|
||||
void X509_OBJECT_up_ref_count(X509_OBJECT* a);
|
||||
void X509_OBJECT_free_contents(X509_OBJECT* a);
|
||||
X509_STORE* X509_STORE_new();
|
||||
void X509_STORE_free(X509_STORE* v);
|
||||
|
||||
STACK_OF!(X509)* X509_STORE_get1_certs(X509_STORE_CTX* st, X509_NAME* nm);
|
||||
STACK_OF!(X509_CRL)* X509_STORE_get1_crls(X509_STORE_CTX* st, X509_NAME* nm);
|
||||
int X509_STORE_set_flags(X509_STORE* ctx, c_ulong flags);
|
||||
int X509_STORE_set_purpose(X509_STORE* ctx, int purpose);
|
||||
int X509_STORE_set_trust(X509_STORE* ctx, int trust);
|
||||
int X509_STORE_set1_param(X509_STORE* ctx, X509_VERIFY_PARAM* pm);
|
||||
|
||||
void X509_STORE_set_verify_cb(X509_STORE* ctx,
|
||||
ExternC!(int function(int, X509_STORE_CTX*)) verify_cb);
|
||||
|
||||
X509_STORE_CTX* X509_STORE_CTX_new();
|
||||
|
||||
int X509_STORE_CTX_get1_issuer(X509** issuer, X509_STORE_CTX* ctx, X509* x);
|
||||
|
||||
void X509_STORE_CTX_free(X509_STORE_CTX* ctx);
|
||||
int X509_STORE_CTX_init(X509_STORE_CTX* ctx, X509_STORE* store,
|
||||
X509* x509, STACK_OF!(X509) *chain);
|
||||
void X509_STORE_CTX_trusted_stack(X509_STORE_CTX* ctx, STACK_OF!(X509) *sk);
|
||||
void X509_STORE_CTX_cleanup(X509_STORE_CTX* ctx);
|
||||
|
||||
X509_LOOKUP* X509_STORE_add_lookup(X509_STORE* v, X509_LOOKUP_METHOD* m);
|
||||
|
||||
X509_LOOKUP_METHOD* X509_LOOKUP_hash_dir();
|
||||
X509_LOOKUP_METHOD* X509_LOOKUP_file();
|
||||
|
||||
int X509_STORE_add_cert(X509_STORE* ctx, X509* x);
|
||||
int X509_STORE_add_crl(X509_STORE* ctx, X509_CRL* x);
|
||||
|
||||
int X509_STORE_get_by_subject(X509_STORE_CTX* vs,int type,X509_NAME* name,
|
||||
X509_OBJECT* ret);
|
||||
|
||||
int X509_LOOKUP_ctrl(X509_LOOKUP* ctx, int cmd, const(char)* argc,
|
||||
c_long argl, char** ret);
|
||||
|
||||
version(OPENSSL_NO_STDIO) {} else {
|
||||
int X509_load_cert_file(X509_LOOKUP* ctx, const(char)* file, int type);
|
||||
int X509_load_crl_file(X509_LOOKUP* ctx, const(char)* file, int type);
|
||||
int X509_load_cert_crl_file(X509_LOOKUP* ctx, const(char)* file, int type);
|
||||
}
|
||||
|
||||
|
||||
X509_LOOKUP* X509_LOOKUP_new(X509_LOOKUP_METHOD* method);
|
||||
void X509_LOOKUP_free(X509_LOOKUP* ctx);
|
||||
int X509_LOOKUP_init(X509_LOOKUP* ctx);
|
||||
int X509_LOOKUP_by_subject(X509_LOOKUP* ctx, int type, X509_NAME* name,
|
||||
X509_OBJECT* ret);
|
||||
int X509_LOOKUP_by_issuer_serial(X509_LOOKUP* ctx, int type, X509_NAME* name,
|
||||
ASN1_INTEGER* serial, X509_OBJECT* ret);
|
||||
int X509_LOOKUP_by_fingerprint(X509_LOOKUP* ctx, int type,
|
||||
ubyte* bytes, int len, X509_OBJECT* ret);
|
||||
int X509_LOOKUP_by_alias(X509_LOOKUP* ctx, int type, char* str,
|
||||
int len, X509_OBJECT* ret);
|
||||
int X509_LOOKUP_shutdown(X509_LOOKUP* ctx);
|
||||
|
||||
version(OPENSSL_NO_STDIO) {} else {
|
||||
int X509_STORE_load_locations (X509_STORE* ctx,
|
||||
const(char)* file, const(char)* dir);
|
||||
int X509_STORE_set_default_paths(X509_STORE* ctx);
|
||||
}
|
||||
|
||||
int X509_STORE_CTX_get_ex_new_index(c_long argl, void* argp, CRYPTO_EX_new* new_func,
|
||||
CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func);
|
||||
int X509_STORE_CTX_set_ex_data(X509_STORE_CTX* ctx,int idx,void* data);
|
||||
void* X509_STORE_CTX_get_ex_data(X509_STORE_CTX* ctx,int idx);
|
||||
int X509_STORE_CTX_get_error(X509_STORE_CTX* ctx);
|
||||
void X509_STORE_CTX_set_error(X509_STORE_CTX* ctx,int s);
|
||||
int X509_STORE_CTX_get_error_depth(X509_STORE_CTX* ctx);
|
||||
X509* X509_STORE_CTX_get_current_cert(X509_STORE_CTX* ctx);
|
||||
X509* X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX* ctx);
|
||||
X509_CRL* X509_STORE_CTX_get0_current_crl(X509_STORE_CTX* ctx);
|
||||
X509_STORE_CTX* X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX* ctx);
|
||||
STACK_OF!(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX* ctx);
|
||||
STACK_OF!(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX* ctx);
|
||||
void X509_STORE_CTX_set_cert(X509_STORE_CTX* c,X509* x);
|
||||
void X509_STORE_CTX_set_chain(X509_STORE_CTX* c,STACK_OF!(X509) *sk);
|
||||
void X509_STORE_CTX_set0_crls(X509_STORE_CTX* c,STACK_OF!(X509_CRL) *sk);
|
||||
int X509_STORE_CTX_set_purpose(X509_STORE_CTX* ctx, int purpose);
|
||||
int X509_STORE_CTX_set_trust(X509_STORE_CTX* ctx, int trust);
|
||||
int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX* ctx, int def_purpose,
|
||||
int purpose, int trust);
|
||||
void X509_STORE_CTX_set_flags(X509_STORE_CTX* ctx, c_ulong flags);
|
||||
void X509_STORE_CTX_set_time(X509_STORE_CTX* ctx, c_ulong flags,
|
||||
time_t t);
|
||||
void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX* ctx,
|
||||
ExternC!(int function(int, X509_STORE_CTX*)) verify_cb);
|
||||
|
||||
X509_POLICY_TREE* X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX* ctx);
|
||||
int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX* ctx);
|
||||
|
||||
X509_VERIFY_PARAM* X509_STORE_CTX_get0_param(X509_STORE_CTX* ctx);
|
||||
void X509_STORE_CTX_set0_param(X509_STORE_CTX* ctx, X509_VERIFY_PARAM* param);
|
||||
int X509_STORE_CTX_set_default(X509_STORE_CTX* ctx, const(char)* name);
|
||||
|
||||
/* X509_VERIFY_PARAM functions */
|
||||
|
||||
X509_VERIFY_PARAM* X509_VERIFY_PARAM_new();
|
||||
void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM* param);
|
||||
int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM* to,
|
||||
const(X509_VERIFY_PARAM)* from);
|
||||
int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM* to,
|
||||
const(X509_VERIFY_PARAM)* from);
|
||||
int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM* param, const(char)* name);
|
||||
int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM* param, c_ulong flags);
|
||||
int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM* param,
|
||||
c_ulong flags);
|
||||
c_ulong X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM* param);
|
||||
int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM* param, int purpose);
|
||||
int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM* param, int trust);
|
||||
void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM* param, int depth);
|
||||
void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM* param, time_t t);
|
||||
int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM* param,
|
||||
ASN1_OBJECT* policy);
|
||||
int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM* param,
|
||||
STACK_OF!(ASN1_OBJECT) *policies);
|
||||
int X509_VERIFY_PARAM_get_depth(const(X509_VERIFY_PARAM)* param);
|
||||
|
||||
int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM* param);
|
||||
const(X509_VERIFY_PARAM)* X509_VERIFY_PARAM_lookup(const(char)* name);
|
||||
void X509_VERIFY_PARAM_table_cleanup();
|
||||
|
||||
int X509_policy_check(X509_POLICY_TREE** ptree, int* pexplicit_policy,
|
||||
STACK_OF!(X509) *certs,
|
||||
STACK_OF!(ASN1_OBJECT) *policy_oids,
|
||||
uint flags);
|
||||
|
||||
void X509_policy_tree_free(X509_POLICY_TREE* tree);
|
||||
|
||||
int X509_policy_tree_level_count(const(X509_POLICY_TREE)* tree);
|
||||
X509_POLICY_LEVEL*
|
||||
X509_policy_tree_get0_level(const(X509_POLICY_TREE)* tree, int i);
|
||||
|
||||
STACK_OF!(X509_POLICY_NODE) *
|
||||
X509_policy_tree_get0_policies(const(X509_POLICY_TREE)* tree);
|
||||
|
||||
STACK_OF!(X509_POLICY_NODE) *
|
||||
X509_policy_tree_get0_user_policies(const(X509_POLICY_TREE)* tree);
|
||||
|
||||
int X509_policy_level_node_count(X509_POLICY_LEVEL* level);
|
||||
|
||||
X509_POLICY_NODE* X509_policy_level_get0_node(X509_POLICY_LEVEL* level, int i);
|
||||
|
||||
const(ASN1_OBJECT)* X509_policy_node_get0_policy(const(X509_POLICY_NODE)* node);
|
||||
|
||||
STACK_OF!(POLICYQUALINFO) *
|
||||
X509_policy_node_get0_qualifiers(const(X509_POLICY_NODE)* node);
|
||||
const(X509_POLICY_NODE)*
|
||||
X509_policy_node_get0_parent(const(X509_POLICY_NODE)* node);
|
File diff suppressed because it is too large
Load Diff
6
dub.sdl
6
dub.sdl
|
@ -1,6 +0,0 @@
|
|||
name "ircbot"
|
||||
description "meme irc bot"
|
||||
authors "lesderid"
|
||||
copyright "No rights reserved."
|
||||
license "CC0"
|
||||
dependency "openssl" version="~>2.0.0"
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"fileVersion": 1,
|
||||
"versions": {
|
||||
"openssl": "2.0.0+1.1.0h"
|
||||
}
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
#!/usr/bin/env rdmd
|
||||
|
||||
/+
|
||||
Written in 2019 by Les De Ridder <ircbot@lesderid.net>
|
||||
|
||||
|
@ -23,7 +25,7 @@ import core.sys.posix.poll;
|
|||
import std.socket;
|
||||
import deimos.openssl.ssl;
|
||||
|
||||
extern(C): int SSL_has_pending(const(SSL)* s);
|
||||
pragma(lib, "ssl");
|
||||
|
||||
enum Server = "irc.soupwhale.com";
|
||||
enum Port = 6697;
|
Loading…
Reference in New Issue