📄 ssl.cpp
字号:
{ // 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){ 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){ 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; // only support DES_EDE3_CBC for now if (strncmp(type, "DES_EDE3_CBC", 12)) return 0; yaSSL::MD5 myMD; uint digestSz = myMD.get_digestSize(); byte digest[SHA_LEN]; // max size yaSSL::DES_EDE cipher; int keyLen = cipher.get_keySize(); int ivLen = cipher.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 libcurlint RAND_status(){ return 1; /* TaoCrypt provides enough seed */}int DES_set_key(const_DES_cblock* key, DES_key_schedule* schedule){ memcpy(schedule, key, sizeof(const_DES_cblock)); return 1;}void DES_set_odd_parity(DES_cblock* key){ // not needed now for TaoCrypt}void DES_ecb_encrypt(DES_cblock* input, DES_cblock* output, DES_key_schedule* key, int enc){ DES des; if (enc) { des.set_encryptKey(*key, 0); des.encrypt(*output, *input, DES_BLOCK); } else { des.set_decryptKey(*key, 0); des.decrypt(*output, *input, DES_BLOCK); }}void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX*, void* userdata){ // yaSSL doesn't support yet, unencrypt your PEM file with userdata // before handing off to yaSSL}X509* SSL_get_certificate(SSL* ssl){ // only used to pass to get_privatekey which isn't used return 0;}EVP_PKEY* SSL_get_privatekey(SSL* ssl){ // only called, not used return 0;}void SSL_SESSION_free(SSL_SESSION* session){ // managed by singleton}EVP_PKEY* X509_get_pubkey(X509* x){ // called, not used though return 0;}int EVP_PKEY_copy_parameters(EVP_PKEY* to, const EVP_PKEY* from){ // called, not used though return 0;}void EVP_PKEY_free(EVP_PKEY* pkey){ // never allocated from above}void ERR_error_string_n(unsigned long e, char *buf, size_t len){ if (len) ERR_error_string(e, buf);}void ERR_free_strings(void){ // handled internally}void EVP_cleanup(void){ // nothing to do yet}ASN1_TIME* X509_get_notBefore(X509* x){ if (x) return x->GetBefore(); return 0;}ASN1_TIME* X509_get_notAfter(X509* x){ if (x) return x->GetAfter(); return 0;}SSL_METHOD* SSLv23_client_method(void) /* doesn't actually roll back */{ return SSLv3_client_method();}SSL_METHOD* SSLv2_client_method(void) /* will never work, no v 2 */{ return 0;}SSL_SESSION* SSL_get1_session(SSL* ssl) /* what's ref count */{ return SSL_get_session(ssl);}void GENERAL_NAMES_free(STACK_OF(GENERAL_NAME) *x){ // no extension names supported yet}int sk_GENERAL_NAME_num(STACK_OF(GENERAL_NAME) *x){ // no extension names supported yet return 0;}GENERAL_NAME* sk_GENERAL_NAME_value(STACK_OF(GENERAL_NAME) *x, int i){ // no extension names supported yet return 0;}unsigned char* ASN1_STRING_data(ASN1_STRING* x){ if (x) return x->data; return 0;}int ASN1_STRING_length(ASN1_STRING* x){ if (x) return x->length; return 0;}int ASN1_STRING_type(ASN1_STRING *x){ if (x) return x->type; return 0;}int X509_NAME_get_index_by_NID(X509_NAME* name,int nid, int lastpos){ int idx = -1; // not found const char* start = &name->GetName()[lastpos + 1]; switch (nid) { case NID_commonName: const char* found = strstr(start, "/CN="); if (found) { found += 4; // advance to str idx = found - start + lastpos + 1; } break; } return idx;}ASN1_STRING* X509_NAME_ENTRY_get_data(X509_NAME_ENTRY* ne){ // the same in yaSSL return ne;}X509_NAME_ENTRY* X509_NAME_get_entry(X509_NAME* name, int loc){ return name->GetEntry(loc);}// already formatted, caller responsible for freeing *outint ASN1_STRING_to_UTF8(unsigned char** out, ASN1_STRING* in){ if (!in) return 0; *out = (unsigned char*)malloc(in->length + 1); if (*out) { memcpy(*out, in->data, in->length); (*out)[in->length] = 0; } return in->length;}void* X509_get_ext_d2i(X509* x, int nid, int* crit, int* idx){ // no extensions supported yet return 0;}void MD4_Init(MD4_CTX* md4){ // make sure we have a big enough buffer typedef char ok[sizeof(md4->buffer) >= sizeof(TaoCrypt::MD4) ? 1 : -1]; (void) sizeof(ok); // using TaoCrypt since no dynamic memory allocated // and no destructor will be called new (reinterpret_cast<yassl_pointer>(md4->buffer)) TaoCrypt::MD4();}void MD4_Update(MD4_CTX* md4, const void* data, unsigned long sz){ reinterpret_cast<TaoCrypt::MD4*>(md4->buffer)->Update( static_cast<const byte*>(data), static_cast<unsigned int>(sz));}void MD4_Final(unsigned char* hash, MD4_CTX* md4){ reinterpret_cast<TaoCrypt::MD4*>(md4->buffer)->Final(hash);}void MD5_Init(MD5_CTX* md5){ // make sure we have a big enough buffer typedef char ok[sizeof(md5->buffer) >= sizeof(TaoCrypt::MD5) ? 1 : -1]; (void) sizeof(ok); // using TaoCrypt since no dynamic memory allocated // and no destructor will be called new (reinterpret_cast<yassl_pointer>(md5->buffer)) TaoCrypt::MD5();}void MD5_Update(MD5_CTX* md5, const void* data, unsigned long sz){ reinterpret_cast<TaoCrypt::MD5*>(md5->buffer)->Update( static_cast<const byte*>(data), static_cast<unsigned int>(sz));}void MD5_Final(unsigned char* hash, MD5_CTX* md5){ reinterpret_cast<TaoCrypt::MD5*>(md5->buffer)->Final(hash);} // 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; } int SSLeay_add_ssl_algorithms() // compatibility only { return 1; } 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} // extern "C"} // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -