📄 ssl.cpp
字号:
strncat(name, "/", 1);
strncat(name, entry->d_name, HALF_PATH);
if (stat(name, &buf) < 0) return SSL_BAD_STAT;
if (S_ISREG(buf.st_mode))
ret = read_file(ctx, name, SSL_FILETYPE_PEM, CA);
}
closedir(dir);
#endif
}
return ret;
}
int SSL_CTX_set_default_verify_paths(SSL_CTX* /*ctx*/)
{
// TODO: figure out way to set/store default path, then call load_verify
return SSL_NOT_IMPLEMENTED;
}
int SSL_CTX_set_session_id_context(SSL_CTX*, const unsigned char*,
unsigned int)
{
// No application specific context needed for yaSSL
return SSL_SUCCESS;
}
int SSL_CTX_check_private_key(SSL_CTX* /*ctx*/)
{
// TODO: check private against public for RSA match
return SSL_NOT_IMPLEMENTED;
}
// TODO: all session stats
long SSL_CTX_sess_accept(SSL_CTX* ctx)
{
return ctx->GetStats().accept_;
}
long SSL_CTX_sess_connect(SSL_CTX* ctx)
{
return ctx->GetStats().connect_;
}
long SSL_CTX_sess_accept_good(SSL_CTX* ctx)
{
return ctx->GetStats().acceptGood_;
}
long SSL_CTX_sess_connect_good(SSL_CTX* ctx)
{
return ctx->GetStats().connectGood_;
}
long SSL_CTX_sess_accept_renegotiate(SSL_CTX* ctx)
{
return ctx->GetStats().acceptRenegotiate_;
}
long SSL_CTX_sess_connect_renegotiate(SSL_CTX* ctx)
{
return ctx->GetStats().connectRenegotiate_;
}
long SSL_CTX_sess_hits(SSL_CTX* ctx)
{
return ctx->GetStats().hits_;
}
long SSL_CTX_sess_cb_hits(SSL_CTX* ctx)
{
return ctx->GetStats().cbHits_;
}
long SSL_CTX_sess_cache_full(SSL_CTX* ctx)
{
return ctx->GetStats().cacheFull_;
}
long SSL_CTX_sess_misses(SSL_CTX* ctx)
{
return ctx->GetStats().misses_;
}
long SSL_CTX_sess_timeouts(SSL_CTX* ctx)
{
return ctx->GetStats().timeouts_;
}
long SSL_CTX_sess_number(SSL_CTX* ctx)
{
return ctx->GetStats().number_;
}
long SSL_CTX_sess_get_cache_size(SSL_CTX* ctx)
{
return ctx->GetStats().getCacheSize_;
}
// end session stats TODO:
int SSL_CTX_get_verify_mode(SSL_CTX* ctx)
{
return ctx->GetStats().verifyMode_;
}
int SSL_get_verify_mode(SSL* ssl)
{
return ssl->getSecurity().GetContext()->GetStats().verifyMode_;
}
int SSL_CTX_get_verify_depth(SSL_CTX* ctx)
{
return ctx->GetStats().verifyDepth_;
}
int SSL_get_verify_depth(SSL* ssl)
{
return ssl->getSecurity().GetContext()->GetStats().verifyDepth_;
}
long SSL_CTX_set_options(SSL_CTX*, long)
{
// TDOD:
return SSL_SUCCESS;
}
void SSL_CTX_set_info_callback(SSL_CTX*, void (*)())
{
// TDOD:
}
void OpenSSL_add_all_algorithms() // compatibility only
{}
DH* DH_new(void)
{
DH* dh = NEW_YS DH;
if (dh)
dh->p = dh->g = 0;
return dh;
}
void DH_free(DH* dh)
{
ysDelete(dh->g);
ysDelete(dh->p);
ysDelete(dh);
}
// convert positive big-endian num of length sz into retVal, which may need to
// be created
BIGNUM* BN_bin2bn(const unsigned char* num, int sz, BIGNUM* retVal)
{
using mySTL::auto_ptr;
bool created = false;
auto_ptr<BIGNUM> bn(ysDelete);
if (!retVal) {
created = true;
bn.reset(NEW_YS BIGNUM);
retVal = bn.get();
}
retVal->assign(num, sz);
if (created)
return bn.release();
else
return retVal;
}
unsigned long ERR_get_error_line_data(const char**, int*, const char**, int *)
{
//return SSL_NOT_IMPLEMENTED;
return 0;
}
void ERR_print_errors_fp(FILE* /*fp*/)
{
// need ssl access to implement TODO:
//fprintf(fp, "%s", ssl.get_states().errorString_.c_str());
}
char* ERR_error_string(unsigned long errNumber, char* buffer)
{
static char* msg = "Please supply a buffer for error string";
if (buffer) {
SetErrorString(YasslError(errNumber), buffer);
return buffer;
}
return msg;
}
const char* X509_verify_cert_error_string(long /* error */)
{
// TODO:
static const char* msg = "Not Implemented";
return msg;
}
const EVP_MD* EVP_md5(void)
{
// TODO: FIX add to some list for destruction
return NEW_YS MD5;
}
const EVP_CIPHER* EVP_des_ede3_cbc(void)
{
// TODO: FIX add to some list for destruction
return NEW_YS DES_EDE;
}
int EVP_BytesToKey(const EVP_CIPHER* type, const EVP_MD* md, const byte* salt,
const byte* data, int sz, int count, byte* key, byte* iv)
{
EVP_MD* myMD = const_cast<EVP_MD*>(md);
uint digestSz = myMD->get_digestSize();
byte digest[SHA_LEN]; // max size
int keyLen = type->get_keySize();
int ivLen = type->get_ivSize();
int keyLeft = keyLen;
int ivLeft = ivLen;
int keyOutput = 0;
while (keyOutput < (keyLen + ivLen)) {
int digestLeft = digestSz;
// D_(i - 1)
if (keyOutput) // first time D_0 is empty
myMD->update(digest, digestSz);
// data
myMD->update(data, sz);
// salt
if (salt)
myMD->update(salt, EVP_SALT_SZ);
myMD->get_digest(digest);
// count
for (int j = 1; j < count; j++) {
myMD->update(digest, digestSz);
myMD->get_digest(digest);
}
if (keyLeft) {
int store = min(keyLeft, static_cast<int>(digestSz));
memcpy(&key[keyLen - keyLeft], digest, store);
keyOutput += store;
keyLeft -= store;
digestLeft -= store;
}
if (ivLeft && digestLeft) {
int store = min(ivLeft, digestLeft);
memcpy(&iv[ivLen - ivLeft], digest, store);
keyOutput += store;
ivLeft -= store;
}
}
assert(keyOutput == (keyLen + ivLen));
return keyOutput;
}
void DES_set_key_unchecked(const_DES_cblock* key, DES_key_schedule* schedule)
{
memcpy(schedule, key, sizeof(const_DES_cblock));
}
void DES_ede3_cbc_encrypt(const byte* input, byte* output, long sz,
DES_key_schedule* ks1, DES_key_schedule* ks2,
DES_key_schedule* ks3, DES_cblock* ivec, int enc)
{
DES_EDE des;
byte key[DES_EDE_KEY_SZ];
memcpy(key, *ks1, DES_BLOCK);
memcpy(&key[DES_BLOCK], *ks2, DES_BLOCK);
memcpy(&key[DES_BLOCK * 2], *ks3, DES_BLOCK);
if (enc) {
des.set_encryptKey(key, *ivec);
des.encrypt(output, input, sz);
}
else {
des.set_decryptKey(key, *ivec);
des.decrypt(output, input, sz);
}
}
// functions for stunnel
void RAND_screen()
{
// TODO:
}
const char* RAND_file_name(char*, size_t)
{
// TODO:
return 0;
}
int RAND_write_file(const char*)
{
// TODO:
return 0;
}
int RAND_load_file(const char*, long)
{
// TODO:
return 0;
}
void RSA_free(RSA*)
{
// TODO:
}
RSA* RSA_generate_key(int, unsigned long, void(*)(int, int, void*), void*)
{
// TODO:
return 0;
}
int X509_LOOKUP_add_dir(X509_LOOKUP*, const char*, long)
{
// TODO:
return SSL_SUCCESS;
}
int X509_LOOKUP_load_file(X509_LOOKUP*, const char*, long)
{
// TODO:
return SSL_SUCCESS;
}
X509_LOOKUP_METHOD* X509_LOOKUP_hash_dir(void)
{
// TODO:
return 0;
}
X509_LOOKUP_METHOD* X509_LOOKUP_file(void)
{
// TODO:
return 0;
}
X509_LOOKUP* X509_STORE_add_lookup(X509_STORE*, X509_LOOKUP_METHOD*)
{
// TODO:
return 0;
}
int X509_STORE_get_by_subject(X509_STORE_CTX*, int, X509_NAME*, X509_OBJECT*)
{
// TODO:
return SSL_SUCCESS;
}
X509_STORE* X509_STORE_new(void)
{
// TODO:
return 0;
}
char* SSL_alert_type_string_long(int)
{
// TODO:
return 0;
}
char* SSL_alert_desc_string_long(int)
{
// TODO:
return 0;
}
char* SSL_state_string_long(SSL*)
{
// TODO:
return 0;
}
void SSL_CTX_set_tmp_rsa_callback(SSL_CTX*, RSA*(*)(SSL*, int, int))
{
// TDOD:
}
long SSL_CTX_set_session_cache_mode(SSL_CTX*, long)
{
// TDOD:
return SSL_SUCCESS;
}
long SSL_CTX_set_timeout(SSL_CTX*, long)
{
// TDOD:
return SSL_SUCCESS;
}
int SSL_CTX_use_certificate_chain_file(SSL_CTX*, const char*)
{
// TDOD:
return SSL_SUCCESS;
}
void SSL_CTX_set_default_passwd_cb(SSL_CTX*, pem_password_cb)
{
// TDOD:
}
int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX*, const char*, int)
{
// TDOD:
return SSL_SUCCESS;
}
int SSL_set_rfd(SSL*, int)
{
return SSL_SUCCESS; // TODO:
}
int SSL_set_wfd(SSL*, int)
{
return SSL_SUCCESS; // TODO:
}
int SSL_pending(SSL*)
{
return SSL_SUCCESS; // TODO:
}
int SSL_want_read(SSL*)
{
return 0; // TODO:
}
int SSL_want_write(SSL*)
{
return 0; // TODO:
}
void SSL_set_shutdown(SSL*, int)
{
// TODO:
}
SSL_CIPHER* SSL_get_current_cipher(SSL*)
{
// TODO:
return 0;
}
char* SSL_CIPHER_description(SSL_CIPHER*, char*, int)
{
// TODO:
return 0;
}
void SSLeay_add_ssl_algorithms() // compatibility only
{}
void ERR_remove_state(unsigned long)
{
// TODO:
}
int ERR_GET_REASON(int l)
{
return l & 0xfff;
}
unsigned long ERR_peek_error()
{
return 0; // TODO:
}
unsigned long ERR_get_error()
{
return ERR_peek_error();
}
// end stunnel needs
} // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -