xref: /aosp_15_r20/external/scapy/test/cert.uts (revision 7dc08ffc4802948ccbc861daaf1e81c405c2c4bd)
1*7dc08ffcSJunyu Lai# Cert extension - Regression Test Campaign
2*7dc08ffcSJunyu Lai
3*7dc08ffcSJunyu Lai# Try me with:
4*7dc08ffcSJunyu Lai# bash test/run_tests -t test/cert.uts -F
5*7dc08ffcSJunyu Lai
6*7dc08ffcSJunyu Lai~ crypto
7*7dc08ffcSJunyu Lai
8*7dc08ffcSJunyu Lai########### PKCS helpers ###############################################
9*7dc08ffcSJunyu Lai
10*7dc08ffcSJunyu Lai+ PKCS helpers tests
11*7dc08ffcSJunyu Lai
12*7dc08ffcSJunyu Lai= PKCS os2ip basic tests
13*7dc08ffcSJunyu Laipkcs_os2ip(b'\x00\x00\xff\xff') == 0xffff and pkcs_os2ip(b'\xff\xff\xff\xff\xff') == 0xffffffffff
14*7dc08ffcSJunyu Lai
15*7dc08ffcSJunyu Lai= PKCS i2osp basic tests
16*7dc08ffcSJunyu Laipkcs_i2osp(0xffff, 4) == b'\x00\x00\xff\xff' and pkcs_i2osp(0xffff, 2) == b'\xff\xff' and pkcs_i2osp(0xffffeeee, 3) == b'\xff\xff\xee\xee'
17*7dc08ffcSJunyu Lai
18*7dc08ffcSJunyu Lai
19*7dc08ffcSJunyu Lai########### PubKey class ###############################################
20*7dc08ffcSJunyu Lai
21*7dc08ffcSJunyu Lai+ PubKey class tests
22*7dc08ffcSJunyu Lai
23*7dc08ffcSJunyu Lai= PubKey class : Importing PEM-encoded RSA public key
24*7dc08ffcSJunyu Laix = PubKey("""
25*7dc08ffcSJunyu Lai-----BEGIN PUBLIC KEY-----
26*7dc08ffcSJunyu LaiMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmFdqP+nTEZukS0lLP+yj
27*7dc08ffcSJunyu Lai1gNImsEIf7P2ySTunceYxwkm4VE5QReDbb2L5/HLA9pPmIeQLSq/BgO1meOcbOSJ
28*7dc08ffcSJunyu Lai2YVHQ28MQ56+8Crb6n28iycX4hp0H3AxRAjh0edX+q3yilvYJ4W9/NnIb/wAZwS0
29*7dc08ffcSJunyu LaioJif/tTkVF77HybAfJde5Eqbp+bCKIvMWnambh9DRUyjrBBZo5dA1o32zpuFBrJd
30*7dc08ffcSJunyu LaiI8dmUpw9gtf0F0Ba8lGZm8Uqc0GyXeXOJUE2u7CiMu3M77BM6ZLLTcow5+bQImkm
31*7dc08ffcSJunyu LaiTL1SGhzwfinME1e6p3Hm//pDjuJvFaY22k05LgLuyqc59vFiB3Toldz8+AbMNjvz
32*7dc08ffcSJunyu LaiAwIDAQAB
33*7dc08ffcSJunyu Lai-----END PUBLIC KEY-----
34*7dc08ffcSJunyu Lai""")
35*7dc08ffcSJunyu Laix_pubNum = x.pubkey.public_numbers()
36*7dc08ffcSJunyu Laitype(x) is PubKeyRSA
37*7dc08ffcSJunyu Lai
38*7dc08ffcSJunyu Lai= PubKey class : Verifying PEM key format
39*7dc08ffcSJunyu Laix.frmt == "PEM"
40*7dc08ffcSJunyu Lai
41*7dc08ffcSJunyu Lai= PubKey class : Importing DER-encoded RSA Key
42*7dc08ffcSJunyu Laiy = PubKey(b'0\x82\x01\"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\x98Wj?\xe9\xd3\x11\x9b\xa4KIK?\xec\xa3\xd6\x03H\x9a\xc1\x08\x7f\xb3\xf6\xc9$\xee\x9d\xc7\x98\xc7\t&\xe1Q9A\x17\x83m\xbd\x8b\xe7\xf1\xcb\x03\xdaO\x98\x87\x90-*\xbf\x06\x03\xb5\x99\xe3\x9cl\xe4\x89\xd9\x85GCo\x0cC\x9e\xbe\xf0*\xdb\xea}\xbc\x8b\'\x17\xe2\x1at\x1fp1D\x08\xe1\xd1\xe7W\xfa\xad\xf2\x8a[\xd8\'\x85\xbd\xfc\xd9\xc8o\xfc\x00g\x04\xb4\xa0\x98\x9f\xfe\xd4\xe4T^\xfb\x1f&\xc0|\x97^\xe4J\x9b\xa7\xe6\xc2(\x8b\xccZv\xa6n\x1fCEL\xa3\xac\x10Y\xa3\x97@\xd6\x8d\xf6\xce\x9b\x85\x06\xb2]#\xc7fR\x9c=\x82\xd7\xf4\x17@Z\xf2Q\x99\x9b\xc5*sA\xb2]\xe5\xce%A6\xbb\xb0\xa22\xed\xcc\xef\xb0L\xe9\x92\xcbM\xca0\xe7\xe6\xd0\"i&L\xbdR\x1a\x1c\xf0~)\xcc\x13W\xba\xa7q\xe6\xff\xfaC\x8e\xe2o\x15\xa66\xdaM9.\x02\xee\xca\xa79\xf6\xf1b\x07t\xe8\x95\xdc\xfc\xf8\x06\xcc6;\xf3\x03\x02\x03\x01\x00\x01')
43*7dc08ffcSJunyu Laiy_pubNum = y.pubkey.public_numbers()
44*7dc08ffcSJunyu Laitype(y) is PubKeyRSA
45*7dc08ffcSJunyu Lai
46*7dc08ffcSJunyu Lai= PubKey class : Verifying DER key format
47*7dc08ffcSJunyu Laiy.frmt == "DER"
48*7dc08ffcSJunyu Lai
49*7dc08ffcSJunyu Lai= PubKey class : Checking modulus value
50*7dc08ffcSJunyu Laix_pubNum.n == y_pubNum.n and x_pubNum.n == 19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163
51*7dc08ffcSJunyu Lai
52*7dc08ffcSJunyu Lai= PubKey class : Checking public exponent value
53*7dc08ffcSJunyu Laix_pubNum.e == y_pubNum.e and x_pubNum.e == 65537
54*7dc08ffcSJunyu Lai
55*7dc08ffcSJunyu Lai= PubKey class : Importing PEM-encoded ECDSA public key
56*7dc08ffcSJunyu Laiz = PubKey("""
57*7dc08ffcSJunyu Lai-----BEGIN PUBLIC KEY-----
58*7dc08ffcSJunyu LaiMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE55WjbZjS/88K1kYagsO9wtKifw0IKLp4
59*7dc08ffcSJunyu LaiJd5qtmDF2Zu+xrwrBRT0HBnPweDU+RsFxcyU/QxD9WYORzYarqxbcA==
60*7dc08ffcSJunyu Lai-----END PUBLIC KEY-----
61*7dc08ffcSJunyu Lai""")
62*7dc08ffcSJunyu Laitype(z) is PubKeyECDSA
63*7dc08ffcSJunyu Lai
64*7dc08ffcSJunyu Lai= PubKey class : Checking curve
65*7dc08ffcSJunyu Laiz.pubkey.curve.name == "secp256k1"
66*7dc08ffcSJunyu Lai
67*7dc08ffcSJunyu Lai= PubKey class : Checking point value
68*7dc08ffcSJunyu Laiz.pubkey.public_numbers().x == 104748656174769496952370005421566518252704263000192720134585149244759951661467
69*7dc08ffcSJunyu Lai
70*7dc08ffcSJunyu Lai
71*7dc08ffcSJunyu Lai########### PrivKey class ###############################################
72*7dc08ffcSJunyu Lai
73*7dc08ffcSJunyu Lai+ PrivKey class tests
74*7dc08ffcSJunyu Lai
75*7dc08ffcSJunyu Lai= PrivKey class : Importing PEM-encoded RSA private key
76*7dc08ffcSJunyu Laix = PrivKey("""
77*7dc08ffcSJunyu Lai-----BEGIN RSA PRIVATE KEY-----
78*7dc08ffcSJunyu LaiMIIEowIBAAKCAQEAmFdqP+nTEZukS0lLP+yj1gNImsEIf7P2ySTunceYxwkm4VE5
79*7dc08ffcSJunyu LaiQReDbb2L5/HLA9pPmIeQLSq/BgO1meOcbOSJ2YVHQ28MQ56+8Crb6n28iycX4hp0
80*7dc08ffcSJunyu LaiH3AxRAjh0edX+q3yilvYJ4W9/NnIb/wAZwS0oJif/tTkVF77HybAfJde5Eqbp+bC
81*7dc08ffcSJunyu LaiKIvMWnambh9DRUyjrBBZo5dA1o32zpuFBrJdI8dmUpw9gtf0F0Ba8lGZm8Uqc0Gy
82*7dc08ffcSJunyu LaiXeXOJUE2u7CiMu3M77BM6ZLLTcow5+bQImkmTL1SGhzwfinME1e6p3Hm//pDjuJv
83*7dc08ffcSJunyu LaiFaY22k05LgLuyqc59vFiB3Toldz8+AbMNjvzAwIDAQABAoIBAH3KeJZL2hhI/1GX
84*7dc08ffcSJunyu LaiNMaU/PfDgFkgmYbxMA8JKusnm/SFjxAwBGnGI6UjBXpBgpQs2Nqm3ZseF9u8hmCK
85*7dc08ffcSJunyu LaivGiCEX2GesCo2mSfmSQxD6RBrMTuQ99UXpxzBIscFnM/Zrs8lPBARGzmF2nI3qPx
86*7dc08ffcSJunyu LaiXtex4ABX5o0Cd4NfZlZjpj96skUoO8+bd3I4OPUFYFFFuv81LoSQ6Hew0a8xtJXt
87*7dc08ffcSJunyu LaiKkDp9h1jTGGUOc189WACNoBLH0MGeVoSUfc1++RcC3cypUZ8fNP1OO6GBfv06f5o
88*7dc08ffcSJunyu LaiXES4ZbxGYpa+nCfNwb6V2gWbkvaYm7aFn0KWGNZXS1P3OcWv6IWdOmg2CI7MMBLJ
89*7dc08ffcSJunyu Lai0LyWVCECgYEAyMJYw195mvHl8VyxJ3HkxeQaaozWL4qhNQ0Kaw+mzD+jYdkbHb3a
90*7dc08ffcSJunyu LaiBYghsgEDZjnyOVblC7I+4smvAZJLWJaf6sZ5HAw3zmj1ibCkXx7deoRc/QVcOikl
91*7dc08ffcSJunyu Lai3dE/ymO0KGJNiGzJZmxbRS3hTokmVPuxSWW4p5oSiMupFHKa18Uv8DECgYEAwkJ7
92*7dc08ffcSJunyu LaiiTOUL6b4e3lQuHQnJbsiQpd+P/bsIPP7kaaHObewfHpfOOtIdtN4asxVFf/PgW5u
93*7dc08ffcSJunyu LaiWmBllqAHZYR14DEYIdL+hdLrdvk5nYQ3YfhOnp+haHUPCdEiXrRZuGXjmMA4V0hL
94*7dc08ffcSJunyu Lai3HPF5ZM8H80fLnN8Pgn2rIC7CZQ46y4PnoV1nXMCgYBBwCUCF8rkDEWa/ximKo8a
95*7dc08ffcSJunyu LaioNJmAypC98xEa7j1x3KBgnYoHcrbusok9ajTe7F5UZEbZnItmnsuG4/Nm/RBV1OY
96*7dc08ffcSJunyu LaiuNgBb573YzjHl6q93IX9EkzCMXc7NS7JrzaNOopOj6OFAtwTR3m89oHMDu8W9jfi
97*7dc08ffcSJunyu LaiKgaIHdXkJ4+AuugrstE4gQKBgFK0d1/8g7SeA+Cdz84YNaqMt5NeaDPXbsTA23Qx
98*7dc08ffcSJunyu LaiUBU0rYDxoKTdFybv9a6SfA83sCLM31K/A8FTNJL2CDGA9WNBL3fOSs2GYg88AVBG
99*7dc08ffcSJunyu LaipUJHeDK+0748OcPUSPaG+pVIETSn5RRgffq16r0nWYUvSdAn8cuTqw3y+yC1pZS6
100*7dc08ffcSJunyu LaiAU8dAoGBAL5QCi0dTWKN3kf3cXaCAnYiWe4Qg2S+SgLE+F1U4Xws2rqAuSvIiuT5
101*7dc08ffcSJunyu Laii5+Mqk9ZCGdoReVbAovJFoRqe7Fj9yWM+b1awGjL0bOTtnqx0iljob6uFyhpl1xg
102*7dc08ffcSJunyu LaiW3a3ICJ/ZYLvkgb4IBEteOwWpp37fX57vzhW8EmUV2UX7ve1uNRI
103*7dc08ffcSJunyu Lai-----END RSA PRIVATE KEY-----
104*7dc08ffcSJunyu Lai""")
105*7dc08ffcSJunyu Laix_privNum = x.key.private_numbers()
106*7dc08ffcSJunyu Laix_pubNum = x.pubkey.public_numbers()
107*7dc08ffcSJunyu Laitype(x) is PrivKeyRSA
108*7dc08ffcSJunyu Lai
109*7dc08ffcSJunyu Lai= PrivKey class : Checking public attributes
110*7dc08ffcSJunyu Laiassert(x_pubNum.n == 19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163)
111*7dc08ffcSJunyu Laix_pubNum.e == 65537
112*7dc08ffcSJunyu Lai
113*7dc08ffcSJunyu Lai= PrivKey class : Checking private attributes
114*7dc08ffcSJunyu Laiassert(x_privNum.p == 140977881300857803928857666115326329496639762170623218602431133528876162476487960230341078724702018316260690172014674492782486113504117653531825010840338251572887403113276393351318549036549656895326851872473595350667293402676143426484331639796163189182788306480699144107905869179435145810212051656274284113969)
115*7dc08ffcSJunyu Laiassert(x_privNum.q == 136413798668820291889092636919077529673097927884427227010121877374504825870002258140616512268521246045642663981036167305976907058413796938050224182519965099316625879807962173794483933183111515251808827349718943344770056106787713032506379905031673992574818291891535689493330517205396872699985860522390496583027)
116*7dc08ffcSJunyu Laiassert(x_privNum.dmp1 == 46171616708754015342920807261537213121074749458020000367465429453038710215532257783908950878847126373502288079285334594398328912526548076894076506899568491565992572446455658740752572386903609191774044411412991906964352741123956581870694330173563737928488765282233340389888026245745090096745219902501964298369)
117*7dc08ffcSJunyu Laiassert(x_privNum.dmq1 == 58077388505079936284685944662039782610415160654764308528562806086690474868010482729442634318267235411531220690585030443434512729356878742778542733733189895801341155353491318998637269079682889033003797865508917973141494201620317820971253064836562060222814287812344611566640341960495346782352037479526674026269)
118*7dc08ffcSJunyu Laix_privNum.d == 15879630313397508329451198152673380989865598204237760057319927734227125481903063742175442230739018051313441697936698689753842471306305671266572085925009572141819112648211571007521954312641597446020984266846581125287547514750428503480880603089110687015181510081018160579576523796170439894692640171752302225125980423560965987469457505107324833137678663960560798216976668670722016960863268272661588745006387723814962668678285659376534048525020951633874488845649968990679414325096323920666486328886913648207836459784281744709948801682209478580185160477801656666089536527545026197569990716720623647770979759861119273292833
119*7dc08ffcSJunyu Lai
120*7dc08ffcSJunyu Lai= PrivKey class : Importing PEM-encoded ECDSA private key
121*7dc08ffcSJunyu Laiy = PrivKey("""
122*7dc08ffcSJunyu Lai-----BEGIN EC PRIVATE KEY-----
123*7dc08ffcSJunyu LaiMHQCAQEEIMiRlFoy6046m1NXu911ukXyjDLVgmOXWCKWdQMd8gCRoAcGBSuBBAAK
124*7dc08ffcSJunyu LaioUQDQgAE55WjbZjS/88K1kYagsO9wtKifw0IKLp4Jd5qtmDF2Zu+xrwrBRT0HBnP
125*7dc08ffcSJunyu LaiweDU+RsFxcyU/QxD9WYORzYarqxbcA==
126*7dc08ffcSJunyu Lai-----END EC PRIVATE KEY-----
127*7dc08ffcSJunyu Lai""")
128*7dc08ffcSJunyu Laitype(y) is PrivKeyECDSA
129*7dc08ffcSJunyu Lai
130*7dc08ffcSJunyu Lai= PrivKey class : Checking public attributes
131*7dc08ffcSJunyu Laiassert(y.key.curve.name == "secp256k1")
132*7dc08ffcSJunyu Laiy.key.public_key().public_numbers().y == 86290575637772818452062569410092503179882738810918951913926481113065456425840
133*7dc08ffcSJunyu Lai
134*7dc08ffcSJunyu Lai= PrivKey class : Checking private attributes
135*7dc08ffcSJunyu Laiy.key.private_numbers().private_value == 90719786431263082134670936670180839782031078050773732489701961692235185651857
136*7dc08ffcSJunyu Lai
137*7dc08ffcSJunyu Lai
138*7dc08ffcSJunyu Lai########### Keys crypto tests #######################################
139*7dc08ffcSJunyu Lai
140*7dc08ffcSJunyu Lai+ PubKey/PrivKey classes crypto tests
141*7dc08ffcSJunyu Lai
142*7dc08ffcSJunyu Lai= PrivKey/PubKey classes : Signing/Verifying with MD5_SHA1 hash
143*7dc08ffcSJunyu Laim = "Testing our PKCS #1 legacy methods"    # ignore this string
144*7dc08ffcSJunyu Lais = x.sign(m, t="pkcs", h="md5-sha1")
145*7dc08ffcSJunyu Laiassert(s == b"\x0cm\x8a\x8f\xae`o\xcdC=\xfea\xf4\xff\xf0i\xfe\xa3!\xfd\xa5=*\x99?\x08!\x03A~\xa3-B\xe8\xca\xaf\xb4H|\xa3\x98\xe9\xd5U\xfdL\xb1\x9c\xd8\xb2{\xa1/\xfcr\x8c\xa7\xd3\xa9%\xde\x13\xa8\xf6\xc6<\xc7\xdb\xe3\xa62\xeb\xe9?\xe5by\xc2\x9e\xad\xec\x92:\x14\xd96\xa8\xc0+\xea8'{=\x91$\xdf\xed\xe1+eF8\x9fI\x1f\xa1\xcb4s\xd1#\xdf\xa11\x88o\x050i Hg\x0690\xe6\xe8?\\<:k\x94\x82\x91\x0f\x06\xc7>ZQ\xc2\xcdn\xdb\xf4\x9d\x7f!\xa9>\xe8\xea\xb3\xd83]\x8d\x90\xd4\xa0b\xe6\xe6$d[\xe4\xb4 |W\xb2t\x8c\xb2\xd5>>+\xf1\xa6W'\xaf\xc2CU\x82\x13\xc4\x0b\xc4vD*\xc3\xef\xa6s\nQ\xe6\rS@B\xd2\xa4V\xdc\xd1D\x7f\x00\xaa\xac\xac\x96i\xf1kg*\xe9*\x90a@\xc8uDy\x16\xe2\x03\xd1\x9fa\xe2s\xdb\xees\xa4\x8cna\xba\xdaE\x006&\xa4")
146*7dc08ffcSJunyu Laix_pub = PubKey((x._pubExp, x._modulus, x._modulusLen))
147*7dc08ffcSJunyu Laix_pub.verify(m, s, t="pkcs", h="md5-sha1")
148*7dc08ffcSJunyu Lai
149*7dc08ffcSJunyu Lai= PrivKey/PubKey classes : Signing/Verifying with MD5_SHA1 hash with legacy support
150*7dc08ffcSJunyu Laim = "Testing our PKCS #1 legacy methods"
151*7dc08ffcSJunyu Lais = x._legacy_sign_md5_sha1(m)
152*7dc08ffcSJunyu Laiassert(s == b"\x0cm\x8a\x8f\xae`o\xcdC=\xfea\xf4\xff\xf0i\xfe\xa3!\xfd\xa5=*\x99?\x08!\x03A~\xa3-B\xe8\xca\xaf\xb4H|\xa3\x98\xe9\xd5U\xfdL\xb1\x9c\xd8\xb2{\xa1/\xfcr\x8c\xa7\xd3\xa9%\xde\x13\xa8\xf6\xc6<\xc7\xdb\xe3\xa62\xeb\xe9?\xe5by\xc2\x9e\xad\xec\x92:\x14\xd96\xa8\xc0+\xea8\'{=\x91$\xdf\xed\xe1+eF8\x9fI\x1f\xa1\xcb4s\xd1#\xdf\xa11\x88o\x050i Hg\x0690\xe6\xe8?\\<:k\x94\x82\x91\x0f\x06\xc7>ZQ\xc2\xcdn\xdb\xf4\x9d\x7f!\xa9>\xe8\xea\xb3\xd83]\x8d\x90\xd4\xa0b\xe6\xe6$d[\xe4\xb4 |W\xb2t\x8c\xb2\xd5>>+\xf1\xa6W\'\xaf\xc2CU\x82\x13\xc4\x0b\xc4vD*\xc3\xef\xa6s\nQ\xe6\rS@B\xd2\xa4V\xdc\xd1D\x7f\x00\xaa\xac\xac\x96i\xf1kg*\xe9*\x90a@\xc8uDy\x16\xe2\x03\xd1\x9fa\xe2s\xdb\xees\xa4\x8cna\xba\xdaE\x006&\xa4")
153*7dc08ffcSJunyu Laix_pub = PubKey((x._pubExp, x._modulus, x._modulusLen))
154*7dc08ffcSJunyu Laix_pub._legacy_verify_md5_sha1(m, s)
155*7dc08ffcSJunyu Lai
156*7dc08ffcSJunyu Lai
157*7dc08ffcSJunyu Lai########### Cert class ##############################################
158*7dc08ffcSJunyu Lai
159*7dc08ffcSJunyu Lai+ Cert class tests
160*7dc08ffcSJunyu Lai
161*7dc08ffcSJunyu Lai= Cert class : Importing PEM-encoded X.509 Certificate
162*7dc08ffcSJunyu Laix = Cert("""
163*7dc08ffcSJunyu Lai-----BEGIN CERTIFICATE-----
164*7dc08ffcSJunyu LaiMIIFEjCCA/qgAwIBAgIJALRecEPnCQtxMA0GCSqGSIb3DQEBBQUAMIG2MQswCQYD
165*7dc08ffcSJunyu LaiVQQGEwJGUjEOMAwGA1UECBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlzMRcwFQYDVQQK
166*7dc08ffcSJunyu LaiEw5NdXNocm9vbSBDb3JwLjEeMBwGA1UECxMVTXVzaHJvb20gVlBOIFNlcnZpY2Vz
167*7dc08ffcSJunyu LaiMSUwIwYDVQQDExxJS0V2MiBYLjUwOSBUZXN0IGNlcnRpZmljYXRlMScwJQYJKoZI
168*7dc08ffcSJunyu LaihvcNAQkBFhhpa2V2Mi10ZXN0QG11c2hyb29tLmNvcnAwHhcNMDYwNzEzMDczODU5
169*7dc08ffcSJunyu LaiWhcNMjYwMzMwMDczODU5WjCBtjELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlz
170*7dc08ffcSJunyu LaiMQ4wDAYDVQQHEwVQYXJpczEXMBUGA1UEChMOTXVzaHJvb20gQ29ycC4xHjAcBgNV
171*7dc08ffcSJunyu LaiBAsTFU11c2hyb29tIFZQTiBTZXJ2aWNlczElMCMGA1UEAxMcSUtFdjIgWC41MDkg
172*7dc08ffcSJunyu LaiVGVzdCBjZXJ0aWZpY2F0ZTEnMCUGCSqGSIb3DQEJARYYaWtldjItdGVzdEBtdXNo
173*7dc08ffcSJunyu Laicm9vbS5jb3JwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmFdqP+nT
174*7dc08ffcSJunyu LaiEZukS0lLP+yj1gNImsEIf7P2ySTunceYxwkm4VE5QReDbb2L5/HLA9pPmIeQLSq/
175*7dc08ffcSJunyu LaiBgO1meOcbOSJ2YVHQ28MQ56+8Crb6n28iycX4hp0H3AxRAjh0edX+q3yilvYJ4W9
176*7dc08ffcSJunyu Lai/NnIb/wAZwS0oJif/tTkVF77HybAfJde5Eqbp+bCKIvMWnambh9DRUyjrBBZo5dA
177*7dc08ffcSJunyu Lai1o32zpuFBrJdI8dmUpw9gtf0F0Ba8lGZm8Uqc0GyXeXOJUE2u7CiMu3M77BM6ZLL
178*7dc08ffcSJunyu LaiTcow5+bQImkmTL1SGhzwfinME1e6p3Hm//pDjuJvFaY22k05LgLuyqc59vFiB3To
179*7dc08ffcSJunyu Laildz8+AbMNjvzAwIDAQABo4IBHzCCARswHQYDVR0OBBYEFPPYTt6Q9+Zd0s4zzVxW
180*7dc08ffcSJunyu LaijG+XFDFLMIHrBgNVHSMEgeMwgeCAFPPYTt6Q9+Zd0s4zzVxWjG+XFDFLoYG8pIG5
181*7dc08ffcSJunyu LaiMIG2MQswCQYDVQQGEwJGUjEOMAwGA1UECBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlz
182*7dc08ffcSJunyu LaiMRcwFQYDVQQKEw5NdXNocm9vbSBDb3JwLjEeMBwGA1UECxMVTXVzaHJvb20gVlBO
183*7dc08ffcSJunyu LaiIFNlcnZpY2VzMSUwIwYDVQQDExxJS0V2MiBYLjUwOSBUZXN0IGNlcnRpZmljYXRl
184*7dc08ffcSJunyu LaiMScwJQYJKoZIhvcNAQkBFhhpa2V2Mi10ZXN0QG11c2hyb29tLmNvcnCCCQC0XnBD
185*7dc08ffcSJunyu Lai5wkLcTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQA2zt0BvXofiVvH
186*7dc08ffcSJunyu LaiMWlftZCstQaawej1SmxrAfDB4NUM24NsG+UZI88XA5XM6QolmfyKnNromMLC1+6C
187*7dc08ffcSJunyu LaiaFxjq3jC/qdS7ifalFLQVo7ik/te0z6Olo0RkBNgyagWPX2LR5kHe9RvSDuoPIsb
188*7dc08ffcSJunyu LaiSHMmJA98AZwatbvEhmzMINJNUoHVzhPeHZnIaBgUBg02XULk/ElidO51Rf3gh8dR
189*7dc08ffcSJunyu Lai/kgFQSQT687vs1x9TWD00z0Q2bs2UF3Ob3+NYkEGEo5F9RePQm0mY94CT2xs6WpH
190*7dc08ffcSJunyu Laio060Fo7fVpAFktMWx1vpu+wsEbQAhgGqV0fCR2QwKDIbTrPW/p9HJtJDYVjYdAFx
191*7dc08ffcSJunyu Lair3s7V77y
192*7dc08ffcSJunyu Lai-----END CERTIFICATE-----
193*7dc08ffcSJunyu Lai""")
194*7dc08ffcSJunyu Lai
195*7dc08ffcSJunyu Lai= Cert class : Checking version
196*7dc08ffcSJunyu Laix.version == 3
197*7dc08ffcSJunyu Lai
198*7dc08ffcSJunyu Lai= Cert class : Checking certificate serial number extraction
199*7dc08ffcSJunyu Laix.serial == 0xB45E7043E7090B71
200*7dc08ffcSJunyu Lai
201*7dc08ffcSJunyu Lai= Cert class : Checking signature algorithm
202*7dc08ffcSJunyu Laix.sigAlg == 'sha1_with_rsa_signature'
203*7dc08ffcSJunyu Lai
204*7dc08ffcSJunyu Lai= Cert class : Checking issuer extraction in basic format (/C=FR ...)
205*7dc08ffcSJunyu Laix.issuer_str == '/C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress[email protected]'
206*7dc08ffcSJunyu Lai
207*7dc08ffcSJunyu Lai= Cert class : Checking subject extraction in basic format (/C=FR ...)
208*7dc08ffcSJunyu Laix.subject_str == '/C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress[email protected]'
209*7dc08ffcSJunyu Lai
210*7dc08ffcSJunyu Lai= Cert class : Checking start date extraction in simple and tuple formats
211*7dc08ffcSJunyu Laiassert(x.notBefore_str_simple == '07/13/06')
212*7dc08ffcSJunyu Laix.notBefore == (2006, 7, 13, 7, 38, 59, 3, 194, -1)
213*7dc08ffcSJunyu Lai
214*7dc08ffcSJunyu Lai= Cert class : Checking end date extraction in simple and tuple formats
215*7dc08ffcSJunyu Laiassert(x.notAfter_str_simple == '03/30/26')
216*7dc08ffcSJunyu Laix.notAfter == (2026, 3, 30, 7, 38, 59, 0, 89, -1)
217*7dc08ffcSJunyu Lai
218*7dc08ffcSJunyu Lai= Cert class : Checking RSA public key
219*7dc08ffcSJunyu Laiassert(type(x.pubKey) is PubKeyRSA)
220*7dc08ffcSJunyu Laix_pubNum = x.pubKey.pubkey.public_numbers()
221*7dc08ffcSJunyu Laiassert(x_pubNum.n == 19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163)
222*7dc08ffcSJunyu Laix_pubNum.e == 0x10001
223*7dc08ffcSJunyu Lai
224*7dc08ffcSJunyu Lai= Cert class : Checking extensions
225*7dc08ffcSJunyu Laiassert(x.cA)
226*7dc08ffcSJunyu Laiassert(x.authorityKeyID == b'\xf3\xd8N\xde\x90\xf7\xe6]\xd2\xce3\xcd\\V\x8co\x97\x141K')
227*7dc08ffcSJunyu Lainot hasattr(x, "keyUsage")
228*7dc08ffcSJunyu Lai
229*7dc08ffcSJunyu Lai= Cert class : Importing another PEM-encoded X.509 Certificate
230*7dc08ffcSJunyu Laiy = Cert("""
231*7dc08ffcSJunyu Lai-----BEGIN CERTIFICATE-----
232*7dc08ffcSJunyu LaiMIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
233*7dc08ffcSJunyu LaiCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
234*7dc08ffcSJunyu LaiZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
235*7dc08ffcSJunyu LaiRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
236*7dc08ffcSJunyu LaiUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
237*7dc08ffcSJunyu LaiY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
238*7dc08ffcSJunyu LaihkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
239*7dc08ffcSJunyu LaiZn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
240*7dc08ffcSJunyu LaiRSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
241*7dc08ffcSJunyu LaiBAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
242*7dc08ffcSJunyu LaiAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
243*7dc08ffcSJunyu LaiJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
244*7dc08ffcSJunyu Lai6pZjamVFkpUBtA==
245*7dc08ffcSJunyu Lai-----END CERTIFICATE-----
246*7dc08ffcSJunyu Lai""")
247*7dc08ffcSJunyu Lai
248*7dc08ffcSJunyu Lai= Cert class : Checking ECDSA public key
249*7dc08ffcSJunyu Laiassert(type(y.pubKey) is PubKeyECDSA)
250*7dc08ffcSJunyu Laipubkey = y.pubKey.pubkey
251*7dc08ffcSJunyu Laiassert(pubkey.curve.name == 'secp384r1')
252*7dc08ffcSJunyu Laipubkey.public_numbers().x == 3987178688175281746349180015490646948656137448666005327832107126183726641822596270780616285891030558662603987311874
253*7dc08ffcSJunyu Lai
254*7dc08ffcSJunyu Lai= Cert class : Checking ECDSA signature
255*7dc08ffcSJunyu Laiy.signatureValue == b'0d\x020%\xa4\x81E\x02k\x12KutO\xc8#\xe3p\xf2ur\xde|\x89\xf0\xcf\x91ra\x9e^\x10\x92YV\xb9\x83\xc7\x10\xe78\xe9X&6}\xd5\xe44\x869\x020|6S\xf00\xe5bc:\x99\xe2\xb6\xa3;\x9b4\xfa\x1e\xda\x10\x92q^\x91\x13\xa7\xdd\xa4n\x92\xcc2\xd6\xf5!f\xc7/\xea\x96cjeE\x92\x95\x01\xb4'
256*7dc08ffcSJunyu Lai
257*7dc08ffcSJunyu Lai
258*7dc08ffcSJunyu Lai########### CRL class ###############################################
259*7dc08ffcSJunyu Lai
260*7dc08ffcSJunyu Lai+ CRL class tests
261*7dc08ffcSJunyu Lai
262*7dc08ffcSJunyu Lai= CRL class : Importing PEM-encoded CRL
263*7dc08ffcSJunyu Laix = CRL("""
264*7dc08ffcSJunyu Lai-----BEGIN X509 CRL-----
265*7dc08ffcSJunyu LaiMIICHjCCAYcwDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
266*7dc08ffcSJunyu LaiDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
267*7dc08ffcSJunyu LaiIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw0wNjExMDIwMDAwMDBaFw0wNzAyMTcy
268*7dc08ffcSJunyu LaiMzU5NTlaMIH2MCECECzSS2LEl6QXzW6jyJx6LcgXDTA0MDQwMTE3NTYxNVowIQIQ
269*7dc08ffcSJunyu LaiOkXeVssCzdzcTndjIhvU1RcNMDEwNTA4MTkyMjM0WjAhAhBBXYg2gRUg1YCDRqhZ
270*7dc08ffcSJunyu LaikngsFw0wMTA3MDYxNjU3MjNaMCECEEc5gf/9hIHxlfnrGMJ8DfEXDTAzMDEwOTE4
271*7dc08ffcSJunyu LaiMDYxMlowIQIQcFR+auK62HZ/R6mZEEFeZxcNMDIwOTIzMTcwMDA4WjAhAhB+C13e
272*7dc08ffcSJunyu LaiGPI5ZoKmj2UiOCPIFw0wMTA1MDgxOTA4MjFaMCICEQDQVEhgGGfTrTXKLw1KJ5Ve
273*7dc08ffcSJunyu LaiFw0wMTEyMTExODI2MjFaMA0GCSqGSIb3DQEBBQUAA4GBACLJ9rsdoaU9JMf/sCIR
274*7dc08ffcSJunyu Lais3AGW8VV3TN2oJgiCGNEac9PRyV3mRKE0hmuIJTKLFSaa4HSAzimWpWNKuJhztsZ
275*7dc08ffcSJunyu LaizXUnWSZ8VuHkgHEaSbKqzUlb2g+o/848CvzJrcbeyEBkDCYJI5C3nLlQA49LGJ+w
276*7dc08ffcSJunyu Lai4GUPYBwaZ+WFxCX1C8kzglLm
277*7dc08ffcSJunyu Lai-----END X509 CRL-----
278*7dc08ffcSJunyu Lai""")
279*7dc08ffcSJunyu Lai
280*7dc08ffcSJunyu Lai= CRL class : Checking version
281*7dc08ffcSJunyu Laix.version == 1
282*7dc08ffcSJunyu Lai
283*7dc08ffcSJunyu Lai= CRL class : Checking issuer extraction in basic format (/C=FR ...)
284*7dc08ffcSJunyu Laix.issuer_str == '/C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority'
285*7dc08ffcSJunyu Lai
286*7dc08ffcSJunyu Lai= CRL class : Checking lastUpdate date extraction in tuple format
287*7dc08ffcSJunyu Laix.lastUpdate == (2006, 11, 2, 0, 0, 0, 3, 306, -1)
288*7dc08ffcSJunyu Lai
289*7dc08ffcSJunyu Lai= CRL class : Checking nextUpdate date extraction in tuple format
290*7dc08ffcSJunyu Laix.nextUpdate == (2007, 2, 17, 23, 59, 59, 5, 48, -1)
291*7dc08ffcSJunyu Lai
292*7dc08ffcSJunyu Lai= CRL class : Checking number of revoked certificates
293*7dc08ffcSJunyu Lailen(x.revoked_cert_serials) == 7
294*7dc08ffcSJunyu Lai
295*7dc08ffcSJunyu Lai= CRL class : Checking presence of one revoked certificate
296*7dc08ffcSJunyu Lai(94673785334145723688625287778885438961, '030109180612') in x.revoked_cert_serials
297*7dc08ffcSJunyu Lai
298*7dc08ffcSJunyu Lai########### High-level methods ###############################################
299*7dc08ffcSJunyu Lai
300*7dc08ffcSJunyu Lai= Cert class : Checking isIssuerCert()
301*7dc08ffcSJunyu Laic0 = Cert("""
302*7dc08ffcSJunyu Lai-----BEGIN CERTIFICATE-----
303*7dc08ffcSJunyu LaiMIIFVjCCBD6gAwIBAgIJAJmDv7HOC+iUMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYD
304*7dc08ffcSJunyu LaiVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEl
305*7dc08ffcSJunyu LaiMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMq
306*7dc08ffcSJunyu LaiaHR0cDovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYD
307*7dc08ffcSJunyu LaiVQQDEytTdGFyZmllbGQgU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcy
308*7dc08ffcSJunyu LaiMB4XDTE1MTAxMzE2NDIzOFoXDTE2MTEzMDIzMzQxOVowPjEhMB8GA1UECxMYRG9t
309*7dc08ffcSJunyu LaiYWluIENvbnRyb2wgVmFsaWRhdGVkMRkwFwYDVQQDDBAqLnRvb2xzLmlldGYub3Jn
310*7dc08ffcSJunyu LaiMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseE36OuC1on62/XCS3fw
311*7dc08ffcSJunyu LaiLErecm4+E2DRqGYexK09MmDl8Jm19Hp6SFUh7g45EvnODcr1aWHHBO1uDx07HlCI
312*7dc08ffcSJunyu LaieToOMUEW8bECZGilzfVKCsqZljUIw34nXdCpz/PnKK832LZ73fN+rm6Xf/fKaU7M
313*7dc08ffcSJunyu Lai0AbfXSebOxLn5v4Ia1J7ghF8crNG68HoeLgPy+HrvQZEWNyDULKgYlvcgbg24558
314*7dc08ffcSJunyu LaiebKpU4rgC8lKKhM5MRO9LM+ocM+MjT0Bo4iuEgA2HR4kK9152FMBJu0oT8mGlINO
315*7dc08ffcSJunyu LaiyOEULoWzr9Ru3WlGr0ElDnqti/KSynnZezJP93fo+bRPI1zUXAOu2Ks6yhNfXV1d
316*7dc08ffcSJunyu LaioQIDAQABo4IBzDCCAcgwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcD
317*7dc08ffcSJunyu LaiAQYIKwYBBQUHAwIwDgYDVR0PAQH/BAQDAgWgMDwGA1UdHwQ1MDMwMaAvoC2GK2h0
318*7dc08ffcSJunyu LaidHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20vc2ZpZzJzMS0xNy5jcmwwWQYDVR0g
319*7dc08ffcSJunyu LaiBFIwUDBOBgtghkgBhv1uAQcXATA/MD0GCCsGAQUFBwIBFjFodHRwOi8vY2VydGlm
320*7dc08ffcSJunyu LaiaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMIGCBggrBgEFBQcB
321*7dc08ffcSJunyu LaiAQR2MHQwKgYIKwYBBQUHMAGGHmh0dHA6Ly9vY3NwLnN0YXJmaWVsZHRlY2guY29t
322*7dc08ffcSJunyu LaiLzBGBggrBgEFBQcwAoY6aHR0cDovL2NlcnRpZmljYXRlcy5zdGFyZmllbGR0ZWNo
323*7dc08ffcSJunyu LaiLmNvbS9yZXBvc2l0b3J5L3NmaWcyLmNydDAfBgNVHSMEGDAWgBQlRYFoUCY4PTst
324*7dc08ffcSJunyu LaiLL7Natm2PbNmYzArBgNVHREEJDAighAqLnRvb2xzLmlldGYub3Jngg50b29scy5p
325*7dc08ffcSJunyu LaiZXRmLm9yZzAdBgNVHQ4EFgQUrYq0HAdR15KJB7C3hGIvNlV6X00wDQYJKoZIhvcN
326*7dc08ffcSJunyu LaiAQELBQADggEBAAxfzShHiatHrWnTGuRX9BmFpHOFGmLs3PtRRPoOUEbZrcTbaJ+i
327*7dc08ffcSJunyu LaiEZpjj4R3eiLITgObcib8+NR1eZsN6VkswZ+rr54aeQ1WzWlsVwBP1t0h9lIbaonD
328*7dc08ffcSJunyu LaiwDV6ME3KzfFwwsZWqMBgLin8TcoMadAkXhdfcEKNndKSMsowgEjigP677l24nHf/
329*7dc08ffcSJunyu LaiOcnMftgErmTm+jEdW1wUooJoWgbt8TT2uWD8MC62sIIgSQ6miKtg7LhCC1ScyVuN
330*7dc08ffcSJunyu LaiErk3YzF8mPwouOcnNOKsUnkDXLA2REMedVp48c4ikjLClu6AcIg03ZU+o8fLNqcZ
331*7dc08ffcSJunyu Laizd1s7DbacrRSSQ+nXDTodqw1HB+77u0RFs0=
332*7dc08ffcSJunyu Lai-----END CERTIFICATE-----
333*7dc08ffcSJunyu Lai""")
334*7dc08ffcSJunyu Laic1 = Cert("""
335*7dc08ffcSJunyu Lai-----BEGIN CERTIFICATE-----
336*7dc08ffcSJunyu LaiMIIFADCCA+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
337*7dc08ffcSJunyu LaiEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
338*7dc08ffcSJunyu LaiHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
339*7dc08ffcSJunyu LaiZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAw
340*7dc08ffcSJunyu LaiMFoXDTMxMDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
341*7dc08ffcSJunyu Laib25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
342*7dc08ffcSJunyu LaiaG5vbG9naWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxk
343*7dc08ffcSJunyu LaidGVjaC5jb20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUg
344*7dc08ffcSJunyu LaiQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
345*7dc08ffcSJunyu LaiDwAwggEKAoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuF
346*7dc08ffcSJunyu LaipDS1FuXLzOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE
347*7dc08ffcSJunyu Lai3ZNWjKRMXpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlV
348*7dc08ffcSJunyu LaiBv8KJAV+L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+
349*7dc08ffcSJunyu LaiMB5FcSM1/5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYX
350*7dc08ffcSJunyu Laiv32JgIBEQ+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMB
351*7dc08ffcSJunyu LaiAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+
352*7dc08ffcSJunyu LaizWrZtj2zZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYB
353*7dc08ffcSJunyu LaiBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNo
354*7dc08ffcSJunyu LaiLmNvbS8wOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNo
355*7dc08ffcSJunyu LaiLmNvbS9zZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUF
356*7dc08ffcSJunyu LaiBwIBFitodHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkv
357*7dc08ffcSJunyu LaiMA0GCSqGSIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pN
358*7dc08ffcSJunyu LaiQdvBE+zcMQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0
359*7dc08ffcSJunyu Lairjpf5MqtJsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjO
360*7dc08ffcSJunyu LaieT2pkb9UGBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQ
361*7dc08ffcSJunyu LaisPTIFwwKlhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ
362*7dc08ffcSJunyu Lai7nIMpBKGgc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7
363*7dc08ffcSJunyu Lai-----END CERTIFICATE-----
364*7dc08ffcSJunyu Lai""")
365*7dc08ffcSJunyu Laic2 = Cert("""
366*7dc08ffcSJunyu Lai-----BEGIN CERTIFICATE-----
367*7dc08ffcSJunyu LaiMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
368*7dc08ffcSJunyu LaiEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
369*7dc08ffcSJunyu LaiHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
370*7dc08ffcSJunyu LaiZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
371*7dc08ffcSJunyu LaiMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
372*7dc08ffcSJunyu Laib25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
373*7dc08ffcSJunyu LaiaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
374*7dc08ffcSJunyu LaiY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
375*7dc08ffcSJunyu LaiggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
376*7dc08ffcSJunyu LainLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
377*7dc08ffcSJunyu LaiHOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
378*7dc08ffcSJunyu LaiHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
379*7dc08ffcSJunyu Laidloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
380*7dc08ffcSJunyu LaiHZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
381*7dc08ffcSJunyu LaiBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
382*7dc08ffcSJunyu LaiCSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
383*7dc08ffcSJunyu LaisHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
384*7dc08ffcSJunyu Lai4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
385*7dc08ffcSJunyu Lai8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
386*7dc08ffcSJunyu LaipL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
387*7dc08ffcSJunyu LaimMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
388*7dc08ffcSJunyu Lai-----END CERTIFICATE-----
389*7dc08ffcSJunyu Lai""")
390*7dc08ffcSJunyu Laic0.isIssuerCert(c1) and c1.isIssuerCert(c2) and not c0.isIssuerCert(c2)
391*7dc08ffcSJunyu Lai
392*7dc08ffcSJunyu Lai= Cert class : Checking isSelfSigned()
393*7dc08ffcSJunyu Laic2.isSelfSigned() and not c1.isSelfSigned() and not c0.isSelfSigned()
394*7dc08ffcSJunyu Lai
395*7dc08ffcSJunyu Lai= PubKey class : Checking verifyCert()
396*7dc08ffcSJunyu Laic2.pubKey.verifyCert(c2) and c1.pubKey.verifyCert(c0)
397*7dc08ffcSJunyu Lai
398*7dc08ffcSJunyu Lai= Chain class : Checking chain construction
399*7dc08ffcSJunyu Laiassert(len(Chain([c0, c1, c2])) == 3)
400*7dc08ffcSJunyu Laiassert(len(Chain([c0], c1)) == 2)
401*7dc08ffcSJunyu Lailen(Chain([c0], c2)) == 1
402*7dc08ffcSJunyu Lai
403*7dc08ffcSJunyu Lai= Chain class : Checking chain verification
404*7dc08ffcSJunyu Laiassert(Chain([], c0).verifyChain([c2], [c1]))
405*7dc08ffcSJunyu Lainot Chain([c1]).verifyChain([c0])
406*7dc08ffcSJunyu Lai
407