📄 ssltest.c
字号:
through `letters' and keep the elements having the value 2 as set, and clear all the others. */ fprintf(stderr, " Certificate proxy rights = %*.*s", i, i, s); while(i-- > 0) { int c = *s++; if (isascii(c) && isalpha(c)) { if (islower(c)) c = toupper(c); letters[c - 'A']++; } } for (i = 0; i < 26; i++) if (letters[i] < 2) letters[i] = 0; else letters[i] = 1; } found_any = 0; fprintf(stderr, ", resulting proxy rights = "); for(i = 0; i < 26; i++) if (letters[i]) { fprintf(stderr, "%c", i + 'A'); found_any = 1; } if (!found_any) fprintf(stderr, "none"); fprintf(stderr, "\n"); PROXY_CERT_INFO_EXTENSION_free(pci); } } } return(ok); }static void process_proxy_debug(int indent, const char *format, ...) { static const char indentation[] = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; /* That's 80 > */ char my_format[256]; va_list args; BIO_snprintf(my_format, sizeof(my_format), "%*.*s %s", indent, indent, indentation, format); va_start(args, format); vfprintf(stderr, my_format, args); va_end(args); }/* Priority levels: 0 [!]var, () 1 & ^ 2 |*/static int process_proxy_cond_adders(unsigned int letters[26], const char *cond, const char **cond_end, int *pos, int indent);static int process_proxy_cond_val(unsigned int letters[26], const char *cond, const char **cond_end, int *pos, int indent) { int c; int ok = 1; int negate = 0; while(isspace((int)*cond)) { cond++; (*pos)++; } c = *cond; if (debug) process_proxy_debug(indent, "Start process_proxy_cond_val at position %d: %s\n", *pos, cond); while(c == '!') { negate = !negate; cond++; (*pos)++; while(isspace((int)*cond)) { cond++; (*pos)++; } c = *cond; } if (c == '(') { cond++; (*pos)++; ok = process_proxy_cond_adders(letters, cond, cond_end, pos, indent + 1); cond = *cond_end; if (ok < 0) goto end; while(isspace((int)*cond)) { cond++; (*pos)++; } c = *cond; if (c != ')') { fprintf(stderr, "Weird condition character in position %d: " "%c\n", *pos, c); ok = -1; goto end; } cond++; (*pos)++; } else if (isascii(c) && isalpha(c)) { if (islower(c)) c = toupper(c); ok = letters[c - 'A']; cond++; (*pos)++; } else { fprintf(stderr, "Weird condition character in position %d: " "%c\n", *pos, c); ok = -1; goto end; } end: *cond_end = cond; if (ok >= 0 && negate) ok = !ok; if (debug) process_proxy_debug(indent, "End process_proxy_cond_val at position %d: %s, returning %d\n", *pos, cond, ok); return ok; }static int process_proxy_cond_multipliers(unsigned int letters[26], const char *cond, const char **cond_end, int *pos, int indent) { int ok; char c; if (debug) process_proxy_debug(indent, "Start process_proxy_cond_multipliers at position %d: %s\n", *pos, cond); ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1); cond = *cond_end; if (ok < 0) goto end; while(ok >= 0) { while(isspace((int)*cond)) { cond++; (*pos)++; } c = *cond; switch(c) { case '&': case '^': { int save_ok = ok; cond++; (*pos)++; ok = process_proxy_cond_val(letters, cond, cond_end, pos, indent + 1); cond = *cond_end; if (ok < 0) break; switch(c) { case '&': ok &= save_ok; break; case '^': ok ^= save_ok; break; default: fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!" " STOPPING\n"); EXIT(1); } } break; default: goto end; } } end: if (debug) process_proxy_debug(indent, "End process_proxy_cond_multipliers at position %d: %s, returning %d\n", *pos, cond, ok); *cond_end = cond; return ok; }static int process_proxy_cond_adders(unsigned int letters[26], const char *cond, const char **cond_end, int *pos, int indent) { int ok; char c; if (debug) process_proxy_debug(indent, "Start process_proxy_cond_adders at position %d: %s\n", *pos, cond); ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos, indent + 1); cond = *cond_end; if (ok < 0) goto end; while(ok >= 0) { while(isspace((int)*cond)) { cond++; (*pos)++; } c = *cond; switch(c) { case '|': { int save_ok = ok; cond++; (*pos)++; ok = process_proxy_cond_multipliers(letters, cond, cond_end, pos, indent + 1); cond = *cond_end; if (ok < 0) break; switch(c) { case '|': ok |= save_ok; break; default: fprintf(stderr, "SOMETHING IS SERIOUSLY WRONG!" " STOPPING\n"); EXIT(1); } } break; default: goto end; } } end: if (debug) process_proxy_debug(indent, "End process_proxy_cond_adders at position %d: %s, returning %d\n", *pos, cond, ok); *cond_end = cond; return ok; }static int process_proxy_cond(unsigned int letters[26], const char *cond, const char **cond_end) { int pos = 1; return process_proxy_cond_adders(letters, cond, cond_end, &pos, 1); }static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg) { int ok=1; struct app_verify_arg *cb_arg = arg; unsigned int letters[26]; /* only used with proxy_auth */ if (cb_arg->app_verify) { char *s = NULL,buf[256]; fprintf(stderr, "In app_verify_callback, allowing cert. "); fprintf(stderr, "Arg is: %s\n", cb_arg->string); fprintf(stderr, "Finished printing do we have a context? 0x%p a cert? 0x%p\n", (void *)ctx, (void *)ctx->cert); if (ctx->cert) s=X509_NAME_oneline(X509_get_subject_name(ctx->cert),buf,256); if (s != NULL) { fprintf(stderr,"cert depth=%d %s\n",ctx->error_depth,buf); } return(1); } if (cb_arg->proxy_auth) { int found_any = 0, i; char *sp; for(i = 0; i < 26; i++) letters[i] = 0; for(sp = cb_arg->proxy_auth; *sp; sp++) { int c = *sp; if (isascii(c) && isalpha(c)) { if (islower(c)) c = toupper(c); letters[c - 'A'] = 1; } } fprintf(stderr, " Initial proxy rights = "); for(i = 0; i < 26; i++) if (letters[i]) { fprintf(stderr, "%c", i + 'A'); found_any = 1; } if (!found_any) fprintf(stderr, "none"); fprintf(stderr, "\n"); X509_STORE_CTX_set_ex_data(ctx, get_proxy_auth_ex_data_idx(),letters); } if (cb_arg->allow_proxy_certs) { X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_ALLOW_PROXY_CERTS); }#ifndef OPENSSL_NO_X509_VERIFY# ifdef OPENSSL_FIPS if(s->version == TLS1_VERSION) FIPS_allow_md5(1);# endif ok = X509_verify_cert(ctx);# ifdef OPENSSL_FIPS if(s->version == TLS1_VERSION) FIPS_allow_md5(0);# endif#endif if (cb_arg->proxy_auth) { if (ok) { const char *cond_end = NULL; ok = process_proxy_cond(letters, cb_arg->proxy_cond, &cond_end); if (ok < 0) EXIT(3); if (*cond_end) { fprintf(stderr, "Stopped processing condition before it's end.\n"); ok = 0; } if (!ok) fprintf(stderr, "Proxy rights check with condition '%s' proved invalid\n", cb_arg->proxy_cond); else fprintf(stderr, "Proxy rights check with condition '%s' proved valid\n", cb_arg->proxy_cond); } } return(ok); }#ifndef OPENSSL_NO_RSAstatic RSA *rsa_tmp=NULL;static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength) { BIGNUM *bn = NULL; if (rsa_tmp == NULL) { bn = BN_new(); rsa_tmp = RSA_new(); if(!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4)) { BIO_printf(bio_err, "Memory error..."); goto end; } BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength); (void)BIO_flush(bio_err); if(!RSA_generate_key_ex(rsa_tmp,keylength,bn,NULL)) { BIO_printf(bio_err, "Error generating key."); RSA_free(rsa_tmp); rsa_tmp = NULL; }end: BIO_printf(bio_err,"\n"); (void)BIO_flush(bio_err); } if(bn) BN_free(bn); return(rsa_tmp); }static void free_tmp_rsa(void) { if (rsa_tmp != NULL) { RSA_free(rsa_tmp); rsa_tmp = NULL; } }#endif#ifndef OPENSSL_NO_DH/* These DH parameters have been generated as follows: * $ openssl dhparam -C -noout 512 * $ openssl dhparam -C -noout 1024 * $ openssl dhparam -C -noout -dsaparam 1024 * (The third function has been renamed to avoid name conflicts.) */static DH *get_dh512() { static unsigned char dh512_p[]={ 0xCB,0xC8,0xE1,0x86,0xD0,0x1F,0x94,0x17,0xA6,0x99,0xF0,0xC6, 0x1F,0x0D,0xAC,0xB6,0x25,0x3E,0x06,0x39,0xCA,0x72,0x04,0xB0, 0x6E,0xDA,0xC0,0x61,0xE6,0x7A,0x77,0x25,0xE8,0x3B,0xB9,0x5F, 0x9A,0xB6,0xB5,0xFE,0x99,0x0B,0xA1,0x93,0x4E,0x35,0x33,0xB8, 0xE1,0xF1,0x13,0x4F,0x59,0x1A,0xD2,0x57,0xC0,0x26,0x21,0x33, 0x02,0xC5,0xAE,0x23, }; static unsigned char dh512_g[]={ 0x02, }; DH *dh; if ((dh=DH_new()) == NULL) return(NULL); dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL); dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL); if ((dh->p == NULL) || (dh->g == NULL)) { DH_free(dh); return(NULL); } return(dh); }static DH *get_dh1024() { static unsigned char dh1024_p[]={ 0xF8,0x81,0x89,0x7D,0x14,0x24,0xC5,0xD1,0xE6,0xF7,0xBF,0x3A, 0xE4,0x90,0xF4,0xFC,0x73,0xFB,0x34,0xB5,0xFA,0x4C,0x56,0xA2, 0xEA,0xA7,0xE9,0xC0,0xC0,0xCE,0x89,0xE1,0xFA,0x63,0x3F,0xB0, 0x6B,0x32,0x66,0xF1,0xD1,0x7B,0xB0,0x00,0x8F,0xCA,0x87,0xC2, 0xAE,0x98,0x89,0x26,0x17,0xC2,0x05,0xD2,0xEC,0x08,0xD0,0x8C, 0xFF,0x17,0x52,0x8C,0xC5,0x07,0x93,0x03,0xB1,0xF6,0x2F,0xB8, 0x1C,0x52,0x47,0x27,0x1B,0xDB,0xD1,0x8D,0x9D,0x69,0x1D,0x52, 0x4B,0x32,0x81,0xAA,0x7F,0x00,0xC8,0xDC,0xE6,0xD9,0xCC,0xC1, 0x11,0x2D,0x37,0x34,0x6C,0xEA,0x02,0x97,0x4B,0x0E,0xBB,0xB1, 0x71,0x33,0x09,0x15,0xFD,0xDD,0x23,0x87,0x07,0x5E,0x89,0xAB, 0x6B,0x7C,0x5F,0xEC,0xA6,0x24,0xDC,0x53, }; static unsigned char dh1024_g[]={ 0x02, }; DH *dh; if ((dh=DH_new()) == NULL) return(NULL); dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); if ((dh->p == NULL) || (dh->g == NULL)) { DH_free(dh); return(NULL); } return(dh); }static DH *get_dh1024dsa() { static unsigned char dh1024_p[]={ 0xC8,0x00,0xF7,0x08,0x07,0x89,0x4D,0x90,0x53,0xF3,0xD5,0x00, 0x21,0x1B,0xF7,0x31,0xA6,0xA2,0xDA,0x23,0x9A,0xC7,0x87,0x19, 0x3B,0x47,0xB6,0x8C,0x04,0x6F,0xFF,0xC6,0x9B,0xB8,0x65,0xD2, 0xC2,0x5F,0x31,0x83,0x4A,0xA7,0x5F,0x2F,0x88,0x38,0xB6,0x55, 0xCF,0xD9,0x87,0x6D,0x6F,0x9F,0xDA,0xAC,0xA6,0x48,0xAF,0xFC, 0x33,0x84,0x37,0x5B,0x82,0x4A,0x31,0x5D,0xE7,0xBD,0x52,0x97, 0xA1,0x77,0xBF,0x10,0x9E,0x37,0xEA,0x64,0xFA,0xCA,0x28,0x8D, 0x9D,0x3B,0xD2,0x6E,0x09,0x5C,0x68,0xC7,0x45,0x90,0xFD,0xBB, 0x70,0xC9,0x3A,0xBB,0xDF,0xD4,0x21,0x0F,0xC4,0x6A,0x3C,0xF6, 0x61,0xCF,0x3F,0xD6,0x13,0xF1,0x5F,0xBC,0xCF,0xBC,0x26,0x9E, 0xBC,0x0B,0xBD,0xAB,0x5D,0xC9,0x54,0x39, }; static unsigned char dh1024_g[]={ 0x3B,0x40,0x86,0xE7,0xF3,0x6C,0xDE,0x67,0x1C,0xCC,0x80,0x05, 0x5A,0xDF,0xFE,0xBD,0x20,0x27,0x74,0x6C,0x24,0xC9,0x03,0xF3, 0xE1,0x8D,0xC3,0x7D,0x98,0x27,0x40,0x08,0xB8,0x8C,0x6A,0xE9, 0xBB,0x1A,0x3A,0xD6,0x86,0x83,0x5E,0x72,0x41,0xCE,0x85,0x3C, 0xD2,0xB3,0xFC,0x13,0xCE,0x37,0x81,0x9E,0x4C,0x1C,0x7B,0x65, 0xD3,0xE6,0xA6,0x00,0xF5,0x5A,0x95,0x43,0x5E,0x81,0xCF,0x60, 0xA2,0x23,0xFC,0x36,0xA7,0x5D,0x7A,0x4C,0x06,0x91,0x6E,0xF6, 0x57,0xEE,0x36,0xCB,0x06,0xEA,0xF5,0x3D,0x95,0x49,0xCB,0xA7, 0xDD,0x81,0xDF,0x80,0x09,0x4A,0x97,0x4D,0xA8,0x22,0x72,0xA1, 0x7F,0xC4,0x70,0x56,0x70,0xE8,0x20,0x10,0x18,0x8F,0x2E,0x60, 0x07,0xE7,0x68,0x1A,0x82,0x5D,0x32,0xA2, }; DH *dh; if ((dh=DH_new()) == NULL) return(NULL); dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); if ((dh->p == NULL) || (dh->g == NULL)) { DH_free(dh); return(NULL); } dh->length = 160; return(dh); }static int do_test_cipherlist(void) { int i = 0; const SSL_METHOD *meth; SSL_CIPHER *ci, *tci = NULL; fprintf(stderr, "testing SSLv2 cipher list order: "); meth = SSLv2_method(); while ((ci = meth->get_cipher(i++)) != NULL) { if (tci != NULL) if (ci->id >= tci->id) { fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id); return 0; } tci = ci; } fprintf(stderr, "ok\n"); fprintf(stderr, "testing SSLv3 cipher list order: "); meth = SSLv3_method(); tci = NULL; while ((ci = meth->get_cipher(i++)) != NULL) { if (tci != NULL) if (ci->id >= tci->id) { fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id); return 0; } tci = ci; } fprintf(stderr, "ok\n"); fprintf(stderr, "testing TLSv1 cipher list order: "); meth = TLSv1_method(); tci = NULL; while ((ci = meth->get_cipher(i++)) != NULL) { if (tci != NULL) if (ci->id >= tci->id) { fprintf(stderr, "failed %lx vs. %lx\n", ci->id, tci->id); return 0; } tci = ci; } fprintf(stderr, "ok\n"); return 1; }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -