From ae2c1351bcd8089c4b213c3281a7329c3a505cf7 Mon Sep 17 00:00:00 2001 From: David Keeler Date: Thu, 30 Jul 2015 10:20:52 -0700 Subject: [PATCH] bug 1189427 - convert test_ocsp_fetch_method.js to generate certificates at build time r=mgoodwin --- security/manager/ssl/tests/unit/moz.build | 1 + .../ssl/tests/unit/test_ocsp_fetch_method.js | 17 ++-------- .../tests/unit/test_ocsp_fetch_method/a.der | Bin 898 -> 0 bytes .../test_ocsp_fetch_method/a.pem.certspec | 3 ++ .../tests/unit/test_ocsp_fetch_method/b.der | Bin 899 -> 0 bytes .../tests/unit/test_ocsp_fetch_method/ca.der | Bin 845 -> 0 bytes .../test_ocsp_fetch_method/ca.pem.certspec | 4 +++ .../unit/test_ocsp_fetch_method/cert9.db | Bin 17408 -> 0 bytes .../unit/test_ocsp_fetch_method/generate.py | 29 ---------------- .../tests/unit/test_ocsp_fetch_method/int.der | Bin 845 -> 0 bytes .../test_ocsp_fetch_method/int.key.keyspec | 0 .../test_ocsp_fetch_method/int.pem.certspec | 4 +++ .../tests/unit/test_ocsp_fetch_method/key4.db | Bin 29696 -> 0 bytes .../unit/test_ocsp_fetch_method/moz.build | 31 ++++++++++++++++++ .../unit/test_ocsp_fetch_method/pkcs11.txt | 5 --- 15 files changed, 46 insertions(+), 48 deletions(-) delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/a.der create mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/a.pem.certspec delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/b.der delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.der create mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.pem.certspec delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/cert9.db delete mode 100755 security/manager/ssl/tests/unit/test_ocsp_fetch_method/generate.py delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/int.der create mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/int.key.keyspec create mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/int.pem.certspec delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/key4.db create mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/moz.build delete mode 100644 security/manager/ssl/tests/unit/test_ocsp_fetch_method/pkcs11.txt diff --git a/security/manager/ssl/tests/unit/moz.build b/security/manager/ssl/tests/unit/moz.build index badb85ec67e6..47e97e7e966f 100644 --- a/security/manager/ssl/tests/unit/moz.build +++ b/security/manager/ssl/tests/unit/moz.build @@ -15,6 +15,7 @@ TEST_DIRS += [ 'test_intermediate_basic_usage_constraints', 'test_keysize_ev', 'test_pinning_dynamic', + 'test_ocsp_fetch_method', 'test_ocsp_url', 'test_validity', ] diff --git a/security/manager/ssl/tests/unit/test_ocsp_fetch_method.js b/security/manager/ssl/tests/unit/test_ocsp_fetch_method.js index 19e63e0a1e5e..f1653224d8d4 100644 --- a/security/manager/ssl/tests/unit/test_ocsp_fetch_method.js +++ b/security/manager/ssl/tests/unit/test_ocsp_fetch_method.js @@ -23,14 +23,14 @@ function start_ocsp_responder(expectedCertNames, expectedPaths, } function check_cert_err(cert_name, expected_error) { - let cert = constructCertFromFile("test_ocsp_fetch_method/" + cert_name + ".der"); + let cert = constructCertFromFile("test_ocsp_fetch_method/" + cert_name + ".pem"); return checkCertErrorGeneric(certdb, cert, expected_error, certificateUsageSSLServer); } function run_test() { - addCertFromFile(certdb, "test_ocsp_fetch_method/ca.der", 'CTu,CTu,CTu'); - addCertFromFile(certdb, "test_ocsp_fetch_method/int.der", ',,'); + addCertFromFile(certdb, "test_ocsp_fetch_method/ca.pem", 'CTu,CTu,CTu'); + addCertFromFile(certdb, "test_ocsp_fetch_method/int.pem", ',,'); // Enabled so that we can force ocsp failure responses. Services.prefs.setBoolPref("security.OCSP.require", true); @@ -55,16 +55,5 @@ function run_test() { ocspResponder.stop(run_next_test); }); - // GET does fallback on bad entry - add_test(function() { - clearOCSPCache(); - Services.prefs.setBoolPref("security.OCSP.GET.enabled", true); - // Bug 1016681 mozilla::pkix does not support fallback yet. - // let ocspResponder = start_ocsp_responder(["b", "a"], [], ["GET", "POST"]); - // check_cert_err("a", PRErrorCodeSuccess); - // ocspResponder.stop(run_next_test); - run_next_test(); - }); - run_next_test(); } diff --git a/security/manager/ssl/tests/unit/test_ocsp_fetch_method/a.der b/security/manager/ssl/tests/unit/test_ocsp_fetch_method/a.der deleted file mode 100644 index 48b71256a6befd2675b22410362d6bc5d6160464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmXqLVy-i2VoF=U%*4pV#LOMB!GM>IQ>)FR?K>|cBR4C9L7XAC0Vf-CC<~h~Q)sZE zuz?_m!y(M&oS2iDmS2>YnP@0xAOaF(7v}ZNFU>1S%*;~=%SqW@L)@FDX9h9au#qa^Mf=$^(aZV}7)rCs5C9nXhT z%dLvuKY6+5ZQ)a~g2LX3`!5Kc_-Ik{WkcHKg{9kKZ=QP*dcoyk$DGufV3o2*^Rif< z>ppF1T;yoceg1^f(|JtaZRUpl%6C3?zGPo;RL033UBSiY_Qa}Aezxkk!;A1|yN(22 zd44y1^2*AlD6eZ5Rvwl9*8F%;pRh=8f|hsN_uY>KZQe^yotw6M_B6Re97}q3F|h9w zKAd(GB7T7H*htuVB^qcV`ODz zXJlm2G0-y5fbk6&+hj6IN(!v>^~=l4^-?Pma|?1(^^)^*tt@~*ADnt*g;|&k7?6V+ zn6`jH&B(BJ`R+Y}QEYKXyesy~sLolJ%VMCVEED$9r~SUR{!gFe6S2;hn!P96sLyqs zP$|fL?2_TfuNJ>OtnNPY{-zrKxxcb>%GNWlg=bVoC4Jd*QIkL5^S`W@dGVW?O>Um7 z;?MrSSkRk$o|vA<@l9Gs4HAoz^%UIh%gsrx2%DR=(ZqZu(*-*g@AS(2`gz5d0(PHW zK7-+j%!%Btjhm0>#(O^&O7&jtXPi~cDe!5F(uLoV!pb6gVPPwmINj3~DPFg4@8)|( z7UJ>pJ#0JjoLSFIp0I4ecf~W`bN4r1x6WYwo}6V=ak%q2*O?XJ8}@w^i2XXhRG@wt Ud#AN85K^Mn-N{27@?5ZUas>=1>+kVW!Yv zLtz6!5QjsU%Q-P8GcCU;FEi0l%s>Pr$S%z5n_rq&l9-vN5SE!*ZYW|P1QO>G<_-w< zRR~EfF3HSGH{>zk0*NvUGiT z#w3F#MkQnqGqN%;H!<=v0L8hOniv@wPIA66cJi53DSOXGuksJWopn9W&*a@Sc~fv} zqnL1+!htnK(;g&DQ#IJVjAtXyHTk^o2GNXrUwbF0J~%Z&K1&O;1-x<`s`XKn5Eo;H{D(*!GSK60H%>Vr^ zGP3LWY^R>76`xj~J-m0%35D}D;-a3?4-02~Qh1PfXzixn>rKrE)lxdQ*d#1Hlh<-C zw?yZJ$0oU4t(2n)pU#%&g=D`K>szQ}*BN@j&#cDwK!Rtiz z^5Q^-=G_PFt%`Wp8@Nx9npZtpDdE^H?FaMtguk5$m*`|-W@KPo>~7#{V8OFt*8Ll#~=$>Fbx5m+PfgB<2?6r0ON-=UQ0+fj&6($O^MC889FR zH85=fgPM^cekq&#kLcU?g6!Lt1Doqz+Z#cfBH%(|%i!zDuK>6-I3 zbC%xoDtCP?ys~g_+l;uB-7hnfYisn5tqV4a>ze0LG;8^zt;w;H!u3%VPxnT19W|?I zoDgwmz7*@*o`x;`$8KvqYSdJi*VFOHVNJ+NB`tH432O5TKdZ;evO8~T9X+Ds$noz|8vT+$lkf&*XXSjhHxH;u|idwC+8`D;73$V}7J< VdF8H%Wg!~98~@}wod16AEC98yOFjSq diff --git a/security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.der b/security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.der deleted file mode 100644 index 20e8db54b0893a46b85356ab5c59bdd83cdd4e9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmXqLV)is>VlrI7%*4pV#LBRc>vMnsFB_*;n@8JsUPeZ4RtAGuLv903Hs(+kHesgF zU_)U8K@f*Sn9DgaCo?U-C@(Y7P|QFCB*-qz>ziMiSCW{Srx2EzT5c#}AOsTU66OvF z_EiW;EiTE-ONW`qEXu|M}5^Ag!6V*grDxOC$t zi6@MEp3gjej^jC>!df4RkKU|rIRlato!K7N&fr-apzug6(m6;zZgs3Kr{}vndH+rM z-luuZEmO}}BR+p73rqMLxmQ=pB_CW0`}V@AnaOEge8&RbxObDy<3282{dLxsO{w|; z0uhS;ne)25o&Ji}-}_wQbY+8DdBp0T7mBy8|1RaO4l$2k=3W_Qx}#0^PIphtysKPu z4^8iMOG-@MxBmU|LkS(Ll>df2vT`$A;JN777W1|n=Tdv5R!+L`k?ZrF$9}b(v;K#= zZE@YrxRv#qjoLq(xM_cW=6*U$YBOdB)~9Z zWLVqy%UY^qHcuk&fyqoi-%Z!LviWCVh`~)`oei>=)3)&U8a;_#%OAY$+$?Lki&26h zrk8B&i))-SUJ2d5di(IK6waAW9Z_qidev+-{>iY#aO32t=nv)HD|0;$8{JVmq}=a6 zX%4H-hP2{d!#Rg}i}j_7bZ#3>b+z{nyYxivq;p7g z;)qF)^=fpztG3QuV}ICZ4o~FuF8PewD4n$Vm+imyJr0<;#q&bhzv;FgG@qH=&}S4s zyYX&Jy32cqd-=zhS)Qg9wyc^JB62r+@1&p^ns>9eYDwgB@=lZ}dva@1?1lS>Ia20X QZT&cF?a^)j_a%G-03@h9&;S4c diff --git a/security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.pem.certspec b/security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.pem.certspec new file mode 100644 index 000000000000..6660f5d4783c --- /dev/null +++ b/security/manager/ssl/tests/unit/test_ocsp_fetch_method/ca.pem.certspec @@ -0,0 +1,4 @@ +issuer:ca +subject:ca +extension:basicConstraints:cA, +extension:keyUsage:cRLSign,keyCertSign diff --git a/security/manager/ssl/tests/unit/test_ocsp_fetch_method/cert9.db b/security/manager/ssl/tests/unit/test_ocsp_fetch_method/cert9.db deleted file mode 100644 index e54db78087a5091c79ff2756a5bbabbbb2577001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 LFK!fP@u~e6