📄 ssl.cpp
字号:
int SSL_set_compression(SSL* ssl){ return ssl->SetCompression();}X509* SSL_get_peer_certificate(SSL* ssl){ return ssl->getCrypto().get_certManager().get_peerX509();}void X509_free(X509* /*x*/){ // peer cert set for deletion during destruction // no need to delete now}X509* X509_STORE_CTX_get_current_cert(X509_STORE_CTX* ctx){ return ctx->current_cert;}int X509_STORE_CTX_get_error(X509_STORE_CTX* ctx){ return ctx->error;}int X509_STORE_CTX_get_error_depth(X509_STORE_CTX* ctx){ return ctx->error_depth;}// copy name into buffer, at most sz bytes, if buffer is null// will malloc buffer, caller responsible for freeingchar* X509_NAME_oneline(X509_NAME* name, char* buffer, int sz){ if (!name->GetName()) return buffer; int len = strlen(name->GetName()) + 1; int copySz = min(len, sz); if (!buffer) { buffer = (char*)malloc(len); if (!buffer) return buffer; copySz = len; } if (copySz == 0) return buffer; memcpy(buffer, name->GetName(), copySz - 1); buffer[copySz - 1] = 0; return buffer;}X509_NAME* X509_get_issuer_name(X509* x){ return x->GetIssuer();}X509_NAME* X509_get_subject_name(X509* x){ return x->GetSubject();}void SSL_load_error_strings() // compatibility only {}void SSL_set_connect_state(SSL*){ // already a client by default}void SSL_set_accept_state(SSL* ssl){ ssl->useSecurity().use_parms().entity_ = server_end;}long SSL_get_verify_result(SSL*){ // won't get here if not OK return X509_V_OK;}long SSL_CTX_sess_set_cache_size(SSL_CTX* /*ctx*/, long /*sz*/){ // unlimited size, can't set for now return 0;}long SSL_CTX_get_session_cache_mode(SSL_CTX*){ // always 0, unlimited size for now return 0;}long SSL_CTX_set_tmp_dh(SSL_CTX* ctx, DH* dh){ if (ctx->SetDH(*dh)) return SSL_SUCCESS; else return SSL_FAILURE;}int SSL_CTX_use_certificate_file(SSL_CTX* ctx, const char* file, int format){ return read_file(ctx, file, format, Cert);}int SSL_CTX_use_PrivateKey_file(SSL_CTX* ctx, const char* file, int format){ return read_file(ctx, file, format, PrivateKey);}void SSL_CTX_set_verify(SSL_CTX* ctx, int mode, VerifyCallback /*vc*/){ if (mode & SSL_VERIFY_PEER) ctx->setVerifyPeer(); if (mode == SSL_VERIFY_NONE) ctx->setVerifyNone(); if (mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) ctx->setFailNoCert();}int SSL_CTX_load_verify_locations(SSL_CTX* ctx, const char* file, const char* path){ int ret = SSL_SUCCESS; const int HALF_PATH = 128; if (file) ret = read_file(ctx, file, SSL_FILETYPE_PEM, CA); if (ret == SSL_SUCCESS && path) { // call read_file for each reqular file in path#ifdef _WIN32 WIN32_FIND_DATA FindFileData; HANDLE hFind; char name[MAX_PATH + 1]; // directory specification strncpy(name, path, MAX_PATH - 3); strncat(name, "\\*", 3); hFind = FindFirstFile(name, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) return SSL_BAD_PATH; do { if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) { strncpy(name, path, MAX_PATH - 2 - HALF_PATH); strncat(name, "\\", 2); strncat(name, FindFileData.cFileName, HALF_PATH); ret = read_file(ctx, name, SSL_FILETYPE_PEM, CA); } } while (ret == SSL_SUCCESS && FindNextFile(hFind, &FindFileData)); FindClose(hFind);#else // _WIN32 const int MAX_PATH = 260; DIR* dir = opendir(path); if (!dir) return SSL_BAD_PATH; struct dirent* entry; struct stat buf; char name[MAX_PATH + 1]; while (ret == SSL_SUCCESS && (entry = readdir(dir))) { strncpy(name, path, MAX_PATH - 1 - HALF_PATH); 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 statslong 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{}int SSL_library_init() // compatiblity only{ return 1;}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 createdBIGNUM* BN_bin2bn(const unsigned char* num, int sz, BIGNUM* retVal){ bool created = false; mySTL::auto_ptr<BIGNUM> bn; 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 = (char*) "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){ static const char* type = "MD5"; return type;}const EVP_CIPHER* EVP_des_ede3_cbc(void){ static const char* type = "DES-EDE3-CBC"; return type;}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){ // only support MD5 for now if (strncmp(md, "MD5", 3)) return 0; int keyLen = 0; int ivLen = 0; // only support CBC DES and AES for now if (strncmp(type, "DES-CBC", 7) == 0) { keyLen = DES_KEY_SZ; ivLen = DES_IV_SZ; } else if (strncmp(type, "DES-EDE3-CBC", 12) == 0) { keyLen = DES_EDE_KEY_SZ; ivLen = DES_IV_SZ; } else if (strncmp(type, "AES-128-CBC", 11) == 0) { keyLen = AES_128_KEY_SZ; ivLen = AES_IV_SZ; } else if (strncmp(type, "AES-192-CBC", 11) == 0) { keyLen = AES_192_KEY_SZ; ivLen = AES_IV_SZ; } else if (strncmp(type, "AES-256-CBC", 11) == 0) { keyLen = AES_256_KEY_SZ; ivLen = AES_IV_SZ; } else return 0; yaSSL::MD5 myMD; uint digestSz = myMD.get_digestSize(); byte digest[SHA_LEN]; // max size 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[digestSz - digestLeft], 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -