commit 68afdd6cc8def5766c3c8660a78d0ddfb479264b
Author: Damian Johnson <atagar(a)torproject.org>
Date: Thu May 25 10:23:11 2017 -0700
Replace test consensus and cert with real copies
Our cached-consensus was a truncated version of the live network consensus but
naturally this invalidates its signatures. Replacing it was a consensus teor
graciously provided from Chutney with its authority certs.
This also expands our test coverage a little by adding an additional cert test.
I'm not sure why the previous metrics cert test lived with the bridge docs, but
the key cert unit tests now include a live and metrics descriptor test.
---
test/unit/descriptor/data/cached-certs | 92 +++++++++++
test/unit/descriptor/data/cached-consensus | 176 ++++++---------------
.../descriptor/networkstatus/bridge_document.py | 50 ------
test/unit/descriptor/networkstatus/document_v3.py | 110 ++++++-------
.../descriptor/networkstatus/key_certificate.py | 114 +++++++++++++
5 files changed, 307 insertions(+), 235 deletions(-)
diff --git a/test/unit/descriptor/data/cached-certs b/test/unit/descriptor/data/cached-certs
new file mode 100644
index 0000000..5e6025f
--- /dev/null
+++ b/test/unit/descriptor/data/cached-certs
@@ -0,0 +1,92 @@
+dir-key-certificate-version 3
+dir-address 127.0.0.1:7000
+fingerprint BCB380A633592C218757BEE11E630511A485658A
+dir-key-published 2017-05-25 04:45:52
+dir-key-expires 2018-05-25 04:45:52
+dir-identity-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEAxfTHG1b3Sxe8n3JQ/nIk4+1/chj7+jAyLLK+WrEBiP1vnDxTXMuo
+x26ntWEjOaxjtKB12k5wMQW94/KvE754Gn98uQRFBHqLkrS4hUnn4/MqiBQVd2y3
+UtE6KDSRhJZ5LfFH+dCKwu5+695PyJp/pfCUSOyPj0HQbFOnAOqdHPok8dtdfsy0
+LaI7ycpzqAalzgrlwFP5KwwLtL+VapUGN4QOZlIXgL4W5e7OAG42lZhHt0b7/zdt
+oIegZM1y8tK2l75ijqsvbetddQcFlnVaYzNwlQAUIZuxJOGfnPfTo+WrjCgrK2ur
+ed5NiQMrEbZn5uCUscs+xLlKl4uKW0XXo1EIL45yBrVbmlP6V3/9diTHk64W9+m8
+2G4ToDyH8J7LvnYPsmD0cCaQEceebxYVlmmwgqdORH/ixbeGF7JalTwtWBQYo2r0
+VZAqjRwxR9dri6m1MIpzmzWmrbXghZ1IzJEL1rpB0okA/bE8AUGRx61eKnbI415O
+PmO06JMpvkxxAgMBAAE=
+-----END RSA PUBLIC KEY-----
+dir-signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEAvzugxJl1gc7BgXarBO5IWejNZC30U1xVjZ/myQTzxtiKkPU0agQh
+sPqn4vVsaW6ZnWjJ2pSOq0/jg8WgFyGHGQ9cG8tv2TlpObeb/tI7iANxWx+MXJAh
+/CnFDBQ1ifKntJrs2IcRKMivfobqaHAL3Pz93noLWOTQunWjZ8D6kovYvUXe+yUQ
+tZEROrmXJx7ZIIJF6BNKYBTc+iEkYtkWlJVs0my7yP/bbS075QyBsr6CfT+O2yU4
+mgIg43QuqcFRbjyUvGI/gap06QNlB6yj8pqeE5rWo++5EpEvMK76fK6ymYuTN2SN
+Oil+Fo7qgG8UP/fv0GelSz6Tk7pBoeHJlQIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+Oz+rvXDzlxLgQSb3nS5/4hrHVWgGCy0OnuNmFsyw8bi2eBst5Yj79dQ+D25giZke
+81FRGIFU4eS6dshB+pJ+z0hc9ozlRTYh/qevY6l6o0amvuhHyk/cQXrh8oYU9Ihe
+XQ1yVItvxC24HENsoGIGbr5uxc85FOcNs+R9qTLYA/56TjvAU4WUje3nTZE1awml
+lj/Y6DM7ruMF6UoYJZPTklukZ+XHZg4Z2eE55e/oIaD7bfU/lFWU/alMyTV/J5oT
+sxaD2XBLBScYiKypUmgrZ50W4ZqsXaYk76ClrudZnDbce+FuugVxok+jKYGjMu75
+2es2ucuik7iuO7QPdPIXfg==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+I86FTQ5ZyCZUzm19HVAQWByrrRgUmddoRBfNiCj0iTGN3kdIq9OfuNLhWAqz71xP
+8Nn0Vun8Uj3/vBq/odIFpnngL3mKI6OEKcNDr0D5hEV9Yjrxe8msMoaUZT+LHzUW
+1q3pzxfMx6EmlSilMhuzSsa4YEbXMZzMqASKANSJHo2fzUkzQOpPw2SlWSTIgyqw
+wAOB6QOvFfP3c0NTwxXrYE/iT+r90wZBuzS+v7r9B94alNAkE1KZQKnq2QTTIznP
+iF9LWMsZcMHCjoTxszK4jF4MRMN/S4Xl8yQo0/z6FoqBz4RIXzFtJoG/rbXdKfkE
+nJK9iEhaZbS1IN0o+uIGtvOm2rQSu9gS8merurr5GDSK3szjesPVJuF00mCNgOx4
+hAYPN9N8HAL4zGE/l1UM7BGg3L84A0RMpDxnpXePd9mlHLhl4UV2lrkkf8S9Z6fX
+PPc3r7zKlL/jEGHwz+C7kE88HIvkVnKLLn//40b6HxitHSOCkZ1vtp8YyXae6xnU
+-----END SIGNATURE-----
+dir-key-certificate-version 3
+dir-address 127.0.0.1:7001
+fingerprint 596CD48D61FDA4E868F4AA10FF559917BE3B1A35
+dir-key-published 2017-05-25 04:45:58
+dir-key-expires 2018-05-25 04:45:58
+dir-identity-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEAu+wP/sAA3tcKI5ICHUTs4uwsqSPNcFDalL7VR9/N4dsgsNd5t+4Z
+4v1lc/RovxYC0ojLqe9WE+SsB0cpSRBGA4xSQMOKj3zR1gIO7LQmv2IxYruRlkNo
+CxJglbFQOF7gnOOAALygyPl7T5y6BfAeqI9Y51JeHqrgL+7pxAGJ1hNCux4bsAFx
+MwNxydBeGS3/yJFp+xJiZl6ocmi9oAmJ4OZmrwKCFTit2Yq5jgbHDkY0OZR6ul8b
+xCJRKBSl7jGUhLi1MlW0oGQauKnJ3C/N5rP1icvPJbgP5aZVLqSXFFEGTbjDyFiP
+AjlyCozL/A7evAwo1JtxbtBNVCmzUUItP5kd4+YQnYvmH8fRp17JMxLwWLNe0hSx
+suljZDdxgCWruTQz8EC73LcExkPQxTb+FUQ3EDm0uGi2A1PUR8+Xtc7fejwov6PN
+XtrB+VSn8ne1oA6nI2SS6aNpn1MgAdahvfkTn1c9h2UEhTAeGacvmPLS0YRDdGrs
+0ZvQF6Y6694tAgMBAAE=
+-----END RSA PUBLIC KEY-----
+dir-signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEA19hY+t1GAsR08rQeqMy8/0XkBx6Ho3WN1XAmHvwkWgnIzamgXJge
+THuTw/uDonGXn69NBpQWb9wVyCQ5gssjJCC4OX4EjeZaaxhtZCph3BxA0xHDMYzu
+0j/zlXEpQ3Y/05ZbXcJC/VO9QVywwg3QTiTVRjhyD514UeeOxHHJ8JAm5x3puabt
+FinwLi3pZBzGisTcfxfpTcZETG47mxzrRTk1KLOU0dvp0UZAdfYQfoecBrWpowCG
+dt+kuCK+aUVPi+VbJXK4DzhyaU1nFxHCEEDEfAI7jSt0bdvnTTkVZuoE6JvzIsPn
+18qLqG64dgiTs/zutg1Je+NRG3fw5bjg3QIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+A8uI+g1fqMDwfRe7mILD9uDZXgjWc2PaZHElp21wfC5z/fO7EZHf+oBpMfnFZlpW
+EgbdIWoxIWAeFiunpUEaGrNGztfXXzmCGJOCkYJS0z6QnbdTPxfARIcQL96NRJ5O
+xA0xjTzoR57LKnwHSAdq9ZIjMWyJM7yf/PnD4GCU+v+0O3DzhCPt2vE7QVx6h8oU
+Zkmx2GIoRv1K17B0mYJsMFnJse3aLkZdQoFRpicfWwKHtkpGB0dkuGw+OAdcx5vv
+Qwb05YiQeAJF3UtPNEcCDR4v5Keia+qQeuJcta9aK2Za/n8LCaB8JrOtDrkMH7EV
+DuuXUlxdZG65y9QR3jo5Ng==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+l9Wa0CUIndYdX3nvMEZPoQX8jWosfNo5lTvA1r1JndNBhpr4D6rR9MmpNiaOzuM/
+rcVCMwmekmPVVx2vU168PNX/1yhE0vGEfeRDpiYVXUvboPe2MC9XtUQtQEpmqPrh
+EnsfqOhUoxe6uemJszEtqUzHFvcSEUIJN+RX1YG/xGUYsNy5wBZpAMcKiEq0J3c/
+eCrmKs7o4HL/yPtPGdylsMiIhxLmzB1ZjSOq6OpaMPsiafIG+lu0w3G1JAZftCFQ
+x+SnFdaxBjeSPlXA8YpIf4SAOx0lSjlcGc+cVUtJcQ2pH01z5s8kMLd7Rei6/Sk7
+xWuiMAqmvG+McfG0C9jhkTp8r6O34zgRTq9sVeZNW/4bn/Nt8vPE8IX9StmGSOju
+XA1DuwMEqH1/b5RN5qxWZlvcguEF4CPOh2KNz4M7gsPyc/57eKuvLUSGDtryG0KQ
+0FgHa31RRfaO6rIKZ2z2ksHe+bHJi8SM6S9R1KFtudJX4drqTw+Q5q0JRPsKBcGu
+-----END SIGNATURE-----
diff --git a/test/unit/descriptor/data/cached-consensus b/test/unit/descriptor/data/cached-consensus
index adcf13b..4da44cc 100644
--- a/test/unit/descriptor/data/cached-consensus
+++ b/test/unit/descriptor/data/cached-consensus
@@ -1,130 +1,58 @@
network-status-version 3
vote-status consensus
-consensus-method 12
-valid-after 2012-07-12 10:00:00
-fresh-until 2012-07-12 11:00:00
-valid-until 2012-07-12 13:00:00
-voting-delay 300 300
-client-versions 0.2.2.35,0.2.2.36,0.2.2.37,0.2.3.10-alpha,0.2.3.11-alpha,0.2.3.12-alpha,0.2.3.13-alpha,0.2.3.14-alpha,0.2.3.15-alpha,0.2.3.16-alpha,0.2.3.17-beta,0.2.3.18-rc,0.2.3.19-rc
-server-versions 0.2.2.35,0.2.2.36,0.2.2.37,0.2.3.10-alpha,0.2.3.11-alpha,0.2.3.12-alpha,0.2.3.13-alpha,0.2.3.14-alpha,0.2.3.15-alpha,0.2.3.16-alpha,0.2.3.17-beta,0.2.3.18-rc,0.2.3.19-rc
-known-flags Authority BadExit Exit Fast Guard HSDir Named Running Stable Unnamed V2Dir Valid
-params CircuitPriorityHalflifeMsec=30000 bwauthpid=1
-dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443
-contact Peter Palfrader
-vote-digest 0B6D1E9A300B895AA2D0B427F92917B6995C3C1C
-dir-source turtles 27B6B5996C426270A5C95488AA5BCEB6BCC86956 76.73.17.194 76.73.17.194 9030 9090
-contact Mike Perry <mikeperryTAfsckedTODorg>
-vote-digest 904B1974B9879D02B4ADFB81D7E9B4E07D768A5A
-dir-source maatuska 49015F787433103580E3B66A1707A00E60F2D15B 171.25.193.9 171.25.193.9 443 80
-contact 4096R/23291265 Linus Nordberg <linus(a)nordberg.se>
-vote-digest A8839355BAC373320B8CEDD0A0A09DAAA1637E3A
-dir-source dannenberg 585769C78764D58426B8B52B6651A5A71137189A dannenberg.ccc.de 193.23.244.244 80 443
-contact Andreas Lehner <anonymizer(a)ccc.de>
-vote-digest 416B73C49E717B0A5D61A4F634DCCF94611802E7
-dir-source urras 80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 208.83.223.34 443 80
-contact 4096R/E012B42D Jacob Appelbaum <jacob(a)appelbaum.net>
-vote-digest 08B1F8E4910F136E7FB7DFD52ABB2A9EDE939F0B
-dir-source moria1 D586D18309DED4CD6D57C18FDB97EFA96D330566 128.31.0.34 128.31.0.34 9131 9101
-contact 1024D/28988BF5 arma mit edu
-vote-digest 5006931FB78F7AE42B602697591DBA82AACEF533
-dir-source dizum E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212 194.109.206.212 80 443
-contact 1024R/8D56913D Alex de Joode <adejoode(a)sabotage.org>
-vote-digest 3F1F1E071EC5F54115CB8EA9723E30A9386AB8CA
-dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 212.112.245.170 212.112.245.170 80 443
-contact 4096R/C5AA446D Sebastian Hahn <tor(a)sebastianhahn.net>
-vote-digest DF2EC9AD207831DED1D01BB889A9C4478DE2CFB9
-r sumkledi ABPSI4nNUNC3hKPkBhyzHozozrU 8mCr8Sl7RF4ENU4jb0FZFA/3do8 2012-07-12 04:01:55 178.218.213.229 80 0
-s Exit Fast Named Running Valid
-v Tor 0.2.2.35
-w Bandwidth=38
-p accept 80,443
-r Unnamed AEXri4INxBAZeyi0wvJZoC58nZs 9t4U465paxGASh0x5Tds8a8YiKo 2012-07-12 04:48:09 79.139.135.90 443 22
-s Fast HSDir Running V2Dir Valid
-v Tor 0.2.2.37
-w Bandwidth=35
+consensus-method 26
+valid-after 2017-05-25 04:46:30
+fresh-until 2017-05-25 04:46:40
+valid-until 2017-05-25 04:46:50
+voting-delay 2 2
+client-versions
+server-versions
+known-flags Authority Exit Fast Guard HSDir NoEdConsensus Running Stable V2Dir Valid
+recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2
+dir-source test001a 596CD48D61FDA4E868F4AA10FF559917BE3B1A35 127.0.0.1 127.0.0.1 7001 5001
+contact auth1(a)test.test
+vote-digest 2E7177224BBA39B505F7608FF376C07884CF926F
+dir-source test000a BCB380A633592C218757BEE11E630511A485658A 127.0.0.1 127.0.0.1 7000 5000
+contact auth0(a)test.test
+vote-digest 5DD41617166FFB82882A117EEFDA0353A2794DC5
+r test002r NIIl+DyFR5ay3WNk5lyxibM71pY UzQp+EE8G0YCKtNlZVy+3h5tv0Q 2017-05-25 04:46:11 127.0.0.1 5002 7002
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.0.7
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p accept 1-65535
+r test001a qgzRpIKSW809FnL4tntRtWgOiwo x8yR5mi/DBbLg46qwGQ96Dno+nc 2017-05-25 04:46:12 127.0.0.1 5001 7001
+s Authority Exit Fast Guard HSDir Running V2Dir Valid
+v Tor 0.3.0.7
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
p reject 1-65535
-r ANONIONROUTER AHhuQ8zFQJdT8l42Axxc6m6kNwI uI7+jQ/T3kFVnl7H7TYE/7WJxi4 2012-07-12 04:40:31 93.128.55.236 24051 24052
-s Fast Named Running V2Dir Valid
-v Tor 0.2.2.37
-w Bandwidth=108
-p reject 1-65535
-r ph3x AMLCoWrttR1eX7fWFo/GazQ9gi8 ZJJnmKK6+9B2KOUSIPV49+Vprxs 2012-07-11 19:44:22 86.59.119.83 443 80
-s Fast Guard HSDir Named Running Stable V2Dir Valid
-v Tor 0.2.3.18-rc
-w Bandwidth=55300
-p reject 1-65535
-r nargothrond ANi/r5RGhUxfZ3simlDXFrf2O68 DsP6REKOns/vAUYNp3rfkCOSJFM 2012-07-11 18:25:37 173.11.83.10 9001 0
-s Fast Guard Named Running Stable Valid
-v Tor 0.2.3.18-rc
-w Bandwidth=543
-p reject 1-65535
-r default AN1sc6ymJ4WcSJ95VITqL0B5wDQ I9HQ2zph5Nuvf4FKANoKDf5vPV8 2012-07-11 18:48:22 82.243.60.52 443 9030
-s Fast Running V2Dir Valid
-v Tor 0.2.2.35
-w Bandwidth=92
-p reject 1-65535
-r catfesh AOTNBUkB8Lob/wiz7h9gtuDoT2Q 0Ycp54MgG+Ns+oEd3BIubFJdGGw 2012-07-12 08:26:51 80.177.151.82 9001 9030
-s Fast HSDir Running V2Dir Valid
-v Tor 0.2.2.37
-w Bandwidth=61
-p reject 1-65535
-r 111111 AO70G2tKrAacjjIITtSmzAFrSs8 l/yzMBbM4crBHivPKh69pDXuTRM 2012-07-12 04:03:06 178.170.144.91 80 0
-s Exit Fast Named Running Valid
-v Tor 0.2.2.34
-w Bandwidth=29
-p accept 80,443
-r Unnamed AP1onm4+6g+gIQMs1u9r6CeLX80 HY8Ud5ffEX28pglH+Vqvfle1xDQ 2012-07-12 09:09:15 189.41.71.79 443 0
-s Running Valid
-v Tor 0.2.2.37
-w Bandwidth=0
+r test000a 3nJC+LvtNmx6kw23x1WE90pyIj4 Hg3NyPqDZoRQN8hVI5Vi6B+pofw 2017-05-25 04:46:12 127.0.0.1 5000 7000
+s Authority Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.0.7
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
p reject 1-65535
directory-footer
-bandwidth-weights Wbd=3335 Wbe=0 Wbg=3536 Wbm=10000 Wdb=10000 Web=10000 Wed=3329 Wee=10000 Weg=3329 Wem=10000 Wgb=10000 Wgd=3335 Wgg=6464 Wgm=6464 Wmb=10000 Wmd=3335 Wme=0 Wmg=3536 Wmm=10000
-directory-signature 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 BF112F1C6D5543CFD0A32215ACABD4197B5279AD
------BEGIN SIGNATURE-----
-HFXB4497LzESysYJ/4jJY83E5vLjhv+igIxD9LU6lf6ftkGeF+lNmIAIEKaMts8H
-mfWcW0b+jsrXcJoCxV5IrwCDF3u1aC3diwZY6yiG186pwWbOwE41188XI2DeYPwE
-I/TJmV928na7RLZe2mGHCAW3VQOvV+QkCfj05VZ8CsY=
------END SIGNATURE-----
-directory-signature 27B6B5996C426270A5C95488AA5BCEB6BCC86956 D5C30C15BB3F1DA27669C2D88439939E8F418FCF
------BEGIN SIGNATURE-----
-VAL+VWqcJiJtTZjFDz5/rS4WLfh8dOSnU2HYUb1ZgqM8PR1rFsoxpvaK9USrtkx9
-Byctu/flD3YOqGg+GpYQwU8w9tm7BGelD+dqg97DkJXmlPaXe/Z0nKW1UnCN9m93
-svyWCAqglEzxlK4H7ZfMlQbkMu7EFjXGzrn1gRVGOwg=
------END SIGNATURE-----
-directory-signature 49015F787433103580E3B66A1707A00E60F2D15B 1C915B9493589F97BAC764D1885A34BFC18C7E26
------BEGIN SIGNATURE-----
-fHAC5vdqotMtTVIxfqoNrlob2jAi3PP/urvsVA0xmaOzgYtJFIjY2iEWrrU4fRwe
-0M1vyCw+oztBrPKYukedkefE9ly/R30KVW2ezo5WpOO4y6oZpelb/jRKFoSRfbyB
-WdKsHSe2xlXPA0ySu1klpuMOZiQ8wgxh4x3oLGXnL5Q=
------END SIGNATURE-----
-directory-signature 585769C78764D58426B8B52B6651A5A71137189A 499D7CE5A1356045D629F43271EBF600D6F2CC9C
------BEGIN SIGNATURE-----
-IDOUDykw+tdCyyVmPSGUDahIeEEPMWxarEoH2gPuyExDqZkUc0ah6Eh736rVSD5Z
-R4nCjDNTQNr5byDfJk6cMDN9A/5P8uz421pnmLfs9SasLUjTdJt921jxJnSvSBeF
-hSZPNi5wl++Uw3j2zeclOXvAkkAEGi9Pi5Zf6QNlWFI=
------END SIGNATURE-----
-directory-signature 80550987E1D626E3EBA5E5E75A458DE0626D088C 2B9B419BB44728A5BE01651D6D1553FD14B6CFFB
------BEGIN SIGNATURE-----
-D2wVGni7cYHyXNqt9RvW/CUd8r7TgkfEp9OAJKojUyweiGMJOMEqDBE01e4Ov9Pd
-O9D46fjxWYGE9fN72xvD8CGoNcQgTtLpvypEfB96tKM3JYr5j4MCsdcOrQBkKGp7
-qf1Qfiw7aXahk8IfbgvmAvROlAMAxln7nVE0qenQWu4=
------END SIGNATURE-----
-directory-signature D586D18309DED4CD6D57C18FDB97EFA96D330566 8F0DEA35D1732D867FB94F5130364927DBCCBB8E
------BEGIN SIGNATURE-----
-cmrV1VUfCo9Smlc8BUblkBuSFqJdQkX/gd3ROOnpdRfogbsylq6xA7srCBGp1Z39
-To5Vk71AI0PIy031S6gKfOLgn9E5Bl0Agr60diFxjNn0ejR49MKJTjoDI+DmBlv4
-do+Bej+D8afl27LNH/QIYyzSkOl0eXSGtOEEuCQg/3A=
------END SIGNATURE-----
-directory-signature E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 9BE9A4CF520B6880EB42C5702BC521F03A6CF0FC
------BEGIN SIGNATURE-----
-UVXzEFkkjCpszLmoqQxAxSU83IS+fqrkIC4DCQZCEjRcXEvx3c56HUyTsew5WTFR
-XANCJn+V3DaxYLuL6L8xW7r9xOQNU970nGwocuJckxyDcLHloL8E226vIAn6mLmt
-a1Z6y8NzaQpv4fhdqhT7ETJo+chmf8bSX8qLLmaCIac=
------END SIGNATURE-----
-directory-signature ED03BB616EB2F60BEC80151114BB25CEF515B226 845CF1D0B370CA443A8579D18E7987E7E532F639
------BEGIN SIGNATURE-----
-DILsRCrtn6rDbNo3DF+L1/VVAd+V86PdZKg3Q9QooqVOGgU/7HrspV/K4lFbWcTT
-Zm+quRQfuKmB4xljwXpeRlABQR5eainlZBtrTFg056/dDrJqYXSwV/C391tAIDZs
-2TANs/4uLi94q6Ov+zE9zYUiF8jwnyXl/q/jKOYM8bE=
+bandwidth-weights Wbd=3333 Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=10000 Weg=3333 Wem=10000 Wgb=10000 Wgd=3333 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=3333 Wme=0 Wmg=0 Wmm=10000
+directory-signature 596CD48D61FDA4E868F4AA10FF559917BE3B1A35 9FBF54D6A62364320308A615BF4CF6B27B254FAD
+-----BEGIN SIGNATURE-----
+Ho0rLojfLHs9cSPFxe6znuGuFU8BvRr6gnH1gULTjUZO0NSQvo5N628KFeAsq+pT
+ElieQeV6UfwnYN1U2tomhBYv3+/p1xBxYS5oTDAITxLUYvH4pLYz09VutwFlFFtU
+r/satajuOMST0M3wCCBC4Ru5o5FSklwJTPJ/tWRXDCEHv/N5ZUUkpnNdn+7tFSZ9
+eFrPxPcQvB05BESo7C4/+ZnZVO/wduObSYu04eWwTEog2gkSWmsztKoXpx1QGrtG
+sNL22Ws9ySGDO/ykFFyxkcuyB5A8oPyedR7DrJUfCUYyB8o+XLNwODkCFxlmtFOj
+ci356fosgLiM1sVqCUkNdA==
+-----END SIGNATURE-----
+directory-signature BCB380A633592C218757BEE11E630511A485658A 9CA027E05B0CE1500D90DA13FFDA8EDDCD40A734
+-----BEGIN SIGNATURE-----
+uiAt8Ir27pYFX5fNKiVZDoa6ELVEtg/E3YeYHAnlSSRzpacLMMTN/HhF//Zvv8Zj
+FKT95v77xKvE6b8s7JjB3ep6coiW4tkLqjDiONG6iDRKBmy6D+RZgf1NMxl3gWaZ
+ShINORJMW9nglnBbysP7egPiX49w1igVZQLM1C2ppphK6uO5EGcK6nDJF4LVDJ7B
+Fvt2yhY+gsiG3oSrhsP0snQnFfvEeUFO/r2gRVJ1FoMXUttaOCtmj268xS08eZ0m
+MS+u6gHEM1dYkwpA+LzE9G4akPRhvRjMDaF0RMuLQ7pY5v44uE5OX5n/GKWRgzVZ
+DH+ubl6BuqpQxYQXaHZ5iw==
-----END SIGNATURE-----
diff --git a/test/unit/descriptor/networkstatus/bridge_document.py b/test/unit/descriptor/networkstatus/bridge_document.py
index 1ba53e7..d027c94 100644
--- a/test/unit/descriptor/networkstatus/bridge_document.py
+++ b/test/unit/descriptor/networkstatus/bridge_document.py
@@ -42,56 +42,6 @@ class TestBridgeNetworkStatusDocument(unittest.TestCase):
self.assertEqual(443, router.or_port)
self.assertEqual(None, router.dir_port)
- def test_metrics_cert(self):
- """
- Checks if consensus documents from Metrics are parsed properly.
- """
-
- expected_identity_key = """-----BEGIN RSA PUBLIC KEY-----
-MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
-R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
-0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
-1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
-O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
-+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
-bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
-pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
-lyS28jsPht9VAgMBAAE=
------END RSA PUBLIC KEY-----"""
-
- expected_signing_key = """-----BEGIN RSA PUBLIC KEY-----
-MIGJAoGBAOeE3Qr1Km97gTgiB3io0EU0fqHW2ESMXVHeQuNDtCWBa0XSCEG6gx4B
-ZkkHjfVWqGQ7TmmzjYP9L9uCgtoKfhSvJA2w9NUMtMl8sgZmF4lcGpXXvGY9a566
-Bn+3wP0lMhb/I8CPVPX+NWEjgl1noZxo1C59SO/iALGQOpxRYgmbAgMBAAE=
------END RSA PUBLIC KEY-----"""
-
- expected_key_cert = """-----BEGIN SIGNATURE-----
-asvWwaMq34OfHoWUhAwh4+JDOuEUZJVIHQnedOYfQH8asS2QvW3Ma93OhrwVOC6b
-FyKmTJmJsl0MJGiC7tcEOlL6knsKE4CsuIw/PEcu2Rnm+R9zWxQuMYiHvGQMoDxl
-giOhLLs4LlzAAJlbfbd3hjF4STVAtTwmxYuIjb1Mq/JfAsx/wH3TLXgVZwj32w9s
-zUd9KZwwLzFiiHpC+U7zh6+wRsZfo2tlpmcaP1dTSINgVbdzPJ/DOUlx9nwTCBsE
-AQpUx2DpAikwrpw0zDqpQvYulcQlNLWFN/y/PkmiK8mIJk0OBMiQA7JgqWamnnk4
-PwqaGv483LkBF+25JFGJmnUVve3RMc+s61+2kBcjfUMed4QaHkeCMHqlRqpfQVkk
-RY22NXCwrJvSMEwiy7acC8FGysqwHRyE356+Rw6TB43g3Tno9KaHEK7MHXjSHwNs
-GM9hAsAMRX9Ogqhq5UjDNqEsvDKuyVeyh7unSZEOip9Zr6K/+7VsVPNb8vfBRBjo
------END SIGNATURE-----"""
-
- cert_path = get_resource('metrics_cert')
-
- with open(cert_path, 'rb') as cert_file:
- cert = next(stem.descriptor.parse_file(cert_file))
- self.assertEqual(3, cert.version)
- self.assertEqual(None, cert.address)
- self.assertEqual(None, cert.dir_port)
- self.assertEqual('14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', cert.fingerprint)
- self.assertEqual(expected_identity_key, cert.identity_key)
- self.assertEqual(datetime.datetime(2008, 5, 9, 21, 13, 26), cert.published)
- self.assertEqual(datetime.datetime(2009, 5, 9, 21, 13, 26), cert.expires)
- self.assertEqual(expected_signing_key, cert.signing_key)
- self.assertEqual(None, cert.crosscert)
- self.assertEqual(expected_key_cert, cert.certification)
- self.assertEqual([], cert.get_unrecognized_lines())
-
def test_empty_document(self):
"""
Parse a document without any router status entries.
diff --git a/test/unit/descriptor/networkstatus/document_v3.py b/test/unit/descriptor/networkstatus/document_v3.py
index 4bfdc9e..76017fa 100644
--- a/test/unit/descriptor/networkstatus/document_v3.py
+++ b/test/unit/descriptor/networkstatus/document_v3.py
@@ -71,43 +71,31 @@ class TestNetworkStatusDocument(unittest.TestCase):
self.assertEqual(80, router.or_port)
self.assertEqual(None, router.dir_port)
- def test_consensus_v3(self):
- """
- Checks that version 3 consensus documents are properly parsed.
- """
-
- # the document's expected client and server versions are the same
- expected_versions = [stem.version.Version(v) for v in (
- '0.2.2.35',
- '0.2.2.36',
- '0.2.2.37',
- '0.2.3.10-alpha',
- '0.2.3.11-alpha',
- '0.2.3.12-alpha',
- '0.2.3.13-alpha',
- '0.2.3.14-alpha',
- '0.2.3.15-alpha',
- '0.2.3.16-alpha',
- '0.2.3.17-beta',
- '0.2.3.18-rc',
- '0.2.3.19-rc',
- )]
+ def test_real_consensus(self):
+ """
+ Checks that version 3 consensus documents from chutney can be properly
+ parsed.
+ """
expected_flags = set(
- ['Authority', 'BadExit', 'Exit', 'Fast', 'Guard', 'HSDir',
- 'Named', 'Running', 'Stable', 'Unnamed', 'V2Dir', 'Valid'])
+ ['Authority', 'Exit', 'Fast', 'Guard', 'HSDir',
+ 'Running', 'Stable', 'V2Dir', 'Valid', 'NoEdConsensus'])
expected_bandwidth_weights = {
- 'Wbd': 3335, 'Wbe': 0, 'Wbg': 3536, 'Wbm': 10000, 'Wdb': 10000,
- 'Web': 10000, 'Wed': 3329, 'Wee': 10000, 'Weg': 3329, 'Wem': 10000,
- 'Wgb': 10000, 'Wgd': 3335, 'Wgg': 6464, 'Wgm': 6464, 'Wmb': 10000,
- 'Wmd': 3335, 'Wme': 0, 'Wmg': 3536, 'Wmm': 10000
+ 'Web': 10000, 'Wdb': 10000, 'Weg': 3333, 'Wee': 10000, 'Wed': 3333,
+ 'Wgd': 3333, 'Wgb': 10000, 'Wgg': 10000, 'Wem': 10000, 'Wbg': 0,
+ 'Wbd': 3333, 'Wbe': 0, 'Wmm': 10000, 'Wmb': 10000, 'Wgm': 10000,
+ 'Wbm': 10000, 'Wmg': 0, 'Wme': 0, 'Wmd': 3333
}
- expected_signature = """-----BEGIN SIGNATURE-----
-HFXB4497LzESysYJ/4jJY83E5vLjhv+igIxD9LU6lf6ftkGeF+lNmIAIEKaMts8H
-mfWcW0b+jsrXcJoCxV5IrwCDF3u1aC3diwZY6yiG186pwWbOwE41188XI2DeYPwE
-I/TJmV928na7RLZe2mGHCAW3VQOvV+QkCfj05VZ8CsY=
+ expected_signature = """\
+-----BEGIN SIGNATURE-----
+Ho0rLojfLHs9cSPFxe6znuGuFU8BvRr6gnH1gULTjUZO0NSQvo5N628KFeAsq+pT
+ElieQeV6UfwnYN1U2tomhBYv3+/p1xBxYS5oTDAITxLUYvH4pLYz09VutwFlFFtU
+r/satajuOMST0M3wCCBC4Ru5o5FSklwJTPJ/tWRXDCEHv/N5ZUUkpnNdn+7tFSZ9
+eFrPxPcQvB05BESo7C4/+ZnZVO/wduObSYu04eWwTEog2gkSWmsztKoXpx1QGrtG
+sNL22Ws9ySGDO/ykFFyxkcuyB5A8oPyedR7DrJUfCUYyB8o+XLNwODkCFxlmtFOj
+ci356fosgLiM1sVqCUkNdA==
-----END SIGNATURE-----"""
with open(get_resource('cached-consensus'), 'rb') as descriptor_file:
@@ -118,51 +106,51 @@ I/TJmV928na7RLZe2mGHCAW3VQOvV+QkCfj05VZ8CsY=
self.assertEqual(True, document.is_consensus)
self.assertEqual(False, document.is_vote)
self.assertEqual(False, document.is_microdescriptor)
- self.assertEqual(datetime.datetime(2012, 7, 12, 10, 0, 0), document.valid_after)
- self.assertEqual(datetime.datetime(2012, 7, 12, 11, 0, 0), document.fresh_until)
- self.assertEqual(datetime.datetime(2012, 7, 12, 13, 0, 0), document.valid_until)
- self.assertEqual(300, document.vote_delay)
- self.assertEqual(300, document.dist_delay)
- self.assertEqual(expected_versions, document.client_versions)
- self.assertEqual(expected_versions, document.server_versions)
+ self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 30), document.valid_after)
+ self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 40), document.fresh_until)
+ self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 50), document.valid_until)
+ self.assertEqual(2, document.vote_delay)
+ self.assertEqual(2, document.dist_delay)
+ self.assertEqual([], document.client_versions)
+ self.assertEqual([], document.server_versions)
self.assertEqual(expected_flags, set(document.known_flags))
self.assertEqual([], document.packages)
- self.assertEqual({'CircuitPriorityHalflifeMsec': 30000, 'bwauthpid': 1}, document.params)
+ self.assertEqual({}, document.params)
- self.assertEqual(12, document.consensus_method)
+ self.assertEqual(26, document.consensus_method)
self.assertEqual(expected_bandwidth_weights, document.bandwidth_weights)
self.assertEqual([], document.consensus_methods)
self.assertEqual(None, document.published)
self.assertEqual([], document.get_unrecognized_lines())
- router = document.routers['0013D22389CD50D0B784A3E4061CB31E8CE8CEB5']
- self.assertEqual('sumkledi', router.nickname)
- self.assertEqual('0013D22389CD50D0B784A3E4061CB31E8CE8CEB5', router.fingerprint)
- self.assertEqual('F260ABF1297B445E04354E236F4159140FF7768F', router.digest)
- self.assertEqual(datetime.datetime(2012, 7, 12, 4, 1, 55), router.published)
- self.assertEqual('178.218.213.229', router.address)
- self.assertEqual(80, router.or_port)
- self.assertEqual(None, router.dir_port)
- self.assertEqual(set(['Exit', 'Fast', 'Named', 'Running', 'Valid']), set(router.flags))
+ router = document.routers['348225F83C854796B2DD6364E65CB189B33BD696']
+ self.assertEqual('test002r', router.nickname)
+ self.assertEqual('348225F83C854796B2DD6364E65CB189B33BD696', router.fingerprint)
+ self.assertEqual('533429F8413C1B46022AD365655CBEDE1E6DBF44', router.digest)
+ self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 11), router.published)
+ self.assertEqual('127.0.0.1', router.address)
+ self.assertEqual(5002, router.or_port)
+ self.assertEqual(7002, router.dir_port)
+ self.assertEqual(set(['Exit', 'Fast', 'Running', 'Valid', 'V2Dir', 'Guard', 'HSDir', 'Stable']), set(router.flags))
authority = document.directory_authorities[0]
- self.assertEqual(8, len(document.directory_authorities))
- self.assertEqual('tor26', authority.nickname)
- self.assertEqual('14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', authority.fingerprint)
- self.assertEqual('86.59.21.38', authority.hostname)
- self.assertEqual('86.59.21.38', authority.address)
- self.assertEqual(80, authority.dir_port)
- self.assertEqual(443, authority.or_port)
- self.assertEqual('Peter Palfrader', authority.contact)
- self.assertEqual('0B6D1E9A300B895AA2D0B427F92917B6995C3C1C', authority.vote_digest)
+ self.assertEqual(2, len(document.directory_authorities))
+ self.assertEqual('test001a', authority.nickname)
+ self.assertEqual('596CD48D61FDA4E868F4AA10FF559917BE3B1A35', authority.fingerprint)
+ self.assertEqual('127.0.0.1', authority.hostname)
+ self.assertEqual('127.0.0.1', authority.address)
+ self.assertEqual(7001, authority.dir_port)
+ self.assertEqual(5001, authority.or_port)
+ self.assertEqual('auth1(a)test.test', authority.contact)
+ self.assertEqual('2E7177224BBA39B505F7608FF376C07884CF926F', authority.vote_digest)
self.assertEqual(None, authority.legacy_dir_key)
self.assertEqual(None, authority.key_certificate)
signature = document.signatures[0]
- self.assertEqual(8, len(document.signatures))
+ self.assertEqual(2, len(document.signatures))
self.assertEqual('sha1', signature.method)
- self.assertEqual('14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', signature.identity)
- self.assertEqual('BF112F1C6D5543CFD0A32215ACABD4197B5279AD', signature.key_digest)
+ self.assertEqual('596CD48D61FDA4E868F4AA10FF559917BE3B1A35', signature.identity)
+ self.assertEqual('9FBF54D6A62364320308A615BF4CF6B27B254FAD', signature.key_digest)
self.assertEqual(expected_signature, signature.signature)
def test_metrics_vote(self):
diff --git a/test/unit/descriptor/networkstatus/key_certificate.py b/test/unit/descriptor/networkstatus/key_certificate.py
index a56c74a..4770517 100644
--- a/test/unit/descriptor/networkstatus/key_certificate.py
+++ b/test/unit/descriptor/networkstatus/key_certificate.py
@@ -13,6 +13,8 @@ from stem.descriptor.networkstatus import (
KeyCertificate,
)
+from test.unit.descriptor import get_resource
+
class TestKeyCertificate(unittest.TestCase):
def test_minimal(self):
@@ -34,6 +36,118 @@ class TestKeyCertificate(unittest.TestCase):
self.assertTrue(stem.descriptor.CRYPTO_BLOB in certificate.certification)
self.assertEqual([], certificate.get_unrecognized_lines())
+ def test_real_certificates(self):
+ """
+ Checks that key certificates from chutney can be properly parsed.
+ """
+
+ expected_identity_key = """\
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEAxfTHG1b3Sxe8n3JQ/nIk4+1/chj7+jAyLLK+WrEBiP1vnDxTXMuo
+x26ntWEjOaxjtKB12k5wMQW94/KvE754Gn98uQRFBHqLkrS4hUnn4/MqiBQVd2y3
+UtE6KDSRhJZ5LfFH+dCKwu5+695PyJp/pfCUSOyPj0HQbFOnAOqdHPok8dtdfsy0
+LaI7ycpzqAalzgrlwFP5KwwLtL+VapUGN4QOZlIXgL4W5e7OAG42lZhHt0b7/zdt
+oIegZM1y8tK2l75ijqsvbetddQcFlnVaYzNwlQAUIZuxJOGfnPfTo+WrjCgrK2ur
+ed5NiQMrEbZn5uCUscs+xLlKl4uKW0XXo1EIL45yBrVbmlP6V3/9diTHk64W9+m8
+2G4ToDyH8J7LvnYPsmD0cCaQEceebxYVlmmwgqdORH/ixbeGF7JalTwtWBQYo2r0
+VZAqjRwxR9dri6m1MIpzmzWmrbXghZ1IzJEL1rpB0okA/bE8AUGRx61eKnbI415O
+PmO06JMpvkxxAgMBAAE=
+-----END RSA PUBLIC KEY-----"""
+
+ expected_signing_key = """\
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEAvzugxJl1gc7BgXarBO5IWejNZC30U1xVjZ/myQTzxtiKkPU0agQh
+sPqn4vVsaW6ZnWjJ2pSOq0/jg8WgFyGHGQ9cG8tv2TlpObeb/tI7iANxWx+MXJAh
+/CnFDBQ1ifKntJrs2IcRKMivfobqaHAL3Pz93noLWOTQunWjZ8D6kovYvUXe+yUQ
+tZEROrmXJx7ZIIJF6BNKYBTc+iEkYtkWlJVs0my7yP/bbS075QyBsr6CfT+O2yU4
+mgIg43QuqcFRbjyUvGI/gap06QNlB6yj8pqeE5rWo++5EpEvMK76fK6ymYuTN2SN
+Oil+Fo7qgG8UP/fv0GelSz6Tk7pBoeHJlQIDAQAB
+-----END RSA PUBLIC KEY-----"""
+
+ expected_crosscert = """\
+-----BEGIN ID SIGNATURE-----
+Oz+rvXDzlxLgQSb3nS5/4hrHVWgGCy0OnuNmFsyw8bi2eBst5Yj79dQ+D25giZke
+81FRGIFU4eS6dshB+pJ+z0hc9ozlRTYh/qevY6l6o0amvuhHyk/cQXrh8oYU9Ihe
+XQ1yVItvxC24HENsoGIGbr5uxc85FOcNs+R9qTLYA/56TjvAU4WUje3nTZE1awml
+lj/Y6DM7ruMF6UoYJZPTklukZ+XHZg4Z2eE55e/oIaD7bfU/lFWU/alMyTV/J5oT
+sxaD2XBLBScYiKypUmgrZ50W4ZqsXaYk76ClrudZnDbce+FuugVxok+jKYGjMu75
+2es2ucuik7iuO7QPdPIXfg==
+-----END ID SIGNATURE-----"""
+
+ expected_key_cert = """\
+-----BEGIN SIGNATURE-----
+I86FTQ5ZyCZUzm19HVAQWByrrRgUmddoRBfNiCj0iTGN3kdIq9OfuNLhWAqz71xP
+8Nn0Vun8Uj3/vBq/odIFpnngL3mKI6OEKcNDr0D5hEV9Yjrxe8msMoaUZT+LHzUW
+1q3pzxfMx6EmlSilMhuzSsa4YEbXMZzMqASKANSJHo2fzUkzQOpPw2SlWSTIgyqw
+wAOB6QOvFfP3c0NTwxXrYE/iT+r90wZBuzS+v7r9B94alNAkE1KZQKnq2QTTIznP
+iF9LWMsZcMHCjoTxszK4jF4MRMN/S4Xl8yQo0/z6FoqBz4RIXzFtJoG/rbXdKfkE
+nJK9iEhaZbS1IN0o+uIGtvOm2rQSu9gS8merurr5GDSK3szjesPVJuF00mCNgOx4
+hAYPN9N8HAL4zGE/l1UM7BGg3L84A0RMpDxnpXePd9mlHLhl4UV2lrkkf8S9Z6fX
+PPc3r7zKlL/jEGHwz+C7kE88HIvkVnKLLn//40b6HxitHSOCkZ1vtp8YyXae6xnU
+-----END SIGNATURE-----"""
+
+ with open(get_resource('cached-certs'), 'rb') as cert_file:
+ cert = next(stem.descriptor.parse_file(cert_file, 'dir-key-certificate-3 1.0'))
+ self.assertEqual(3, cert.version)
+ self.assertEqual('127.0.0.1', cert.address)
+ self.assertEqual(7000, cert.dir_port)
+ self.assertEqual('BCB380A633592C218757BEE11E630511A485658A', cert.fingerprint)
+ self.assertEqual(expected_identity_key, cert.identity_key)
+ self.assertEqual(datetime.datetime(2017, 5, 25, 4, 45, 52), cert.published)
+ self.assertEqual(datetime.datetime(2018, 5, 25, 4, 45, 52), cert.expires)
+ self.assertEqual(expected_signing_key, cert.signing_key)
+ self.assertEqual(expected_crosscert, cert.crosscert)
+ self.assertEqual(expected_key_cert, cert.certification)
+ self.assertEqual([], cert.get_unrecognized_lines())
+
+ def test_metrics_certificate(self):
+ """
+ Checks if consensus documents from Metrics are parsed properly.
+ """
+
+ expected_identity_key = """-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
+R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
+0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
+1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
+O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
++fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
+bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
+pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
+lyS28jsPht9VAgMBAAE=
+-----END RSA PUBLIC KEY-----"""
+
+ expected_signing_key = """-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAOeE3Qr1Km97gTgiB3io0EU0fqHW2ESMXVHeQuNDtCWBa0XSCEG6gx4B
+ZkkHjfVWqGQ7TmmzjYP9L9uCgtoKfhSvJA2w9NUMtMl8sgZmF4lcGpXXvGY9a566
+Bn+3wP0lMhb/I8CPVPX+NWEjgl1noZxo1C59SO/iALGQOpxRYgmbAgMBAAE=
+-----END RSA PUBLIC KEY-----"""
+
+ expected_key_cert = """-----BEGIN SIGNATURE-----
+asvWwaMq34OfHoWUhAwh4+JDOuEUZJVIHQnedOYfQH8asS2QvW3Ma93OhrwVOC6b
+FyKmTJmJsl0MJGiC7tcEOlL6knsKE4CsuIw/PEcu2Rnm+R9zWxQuMYiHvGQMoDxl
+giOhLLs4LlzAAJlbfbd3hjF4STVAtTwmxYuIjb1Mq/JfAsx/wH3TLXgVZwj32w9s
+zUd9KZwwLzFiiHpC+U7zh6+wRsZfo2tlpmcaP1dTSINgVbdzPJ/DOUlx9nwTCBsE
+AQpUx2DpAikwrpw0zDqpQvYulcQlNLWFN/y/PkmiK8mIJk0OBMiQA7JgqWamnnk4
+PwqaGv483LkBF+25JFGJmnUVve3RMc+s61+2kBcjfUMed4QaHkeCMHqlRqpfQVkk
+RY22NXCwrJvSMEwiy7acC8FGysqwHRyE356+Rw6TB43g3Tno9KaHEK7MHXjSHwNs
+GM9hAsAMRX9Ogqhq5UjDNqEsvDKuyVeyh7unSZEOip9Zr6K/+7VsVPNb8vfBRBjo
+-----END SIGNATURE-----"""
+
+ with open(get_resource('metrics_cert'), 'rb') as cert_file:
+ cert = next(stem.descriptor.parse_file(cert_file))
+ self.assertEqual(3, cert.version)
+ self.assertEqual(None, cert.address)
+ self.assertEqual(None, cert.dir_port)
+ self.assertEqual('14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', cert.fingerprint)
+ self.assertEqual(expected_identity_key, cert.identity_key)
+ self.assertEqual(datetime.datetime(2008, 5, 9, 21, 13, 26), cert.published)
+ self.assertEqual(datetime.datetime(2009, 5, 9, 21, 13, 26), cert.expires)
+ self.assertEqual(expected_signing_key, cert.signing_key)
+ self.assertEqual(None, cert.crosscert)
+ self.assertEqual(expected_key_cert, cert.certification)
+ self.assertEqual([], cert.get_unrecognized_lines())
+
def test_unrecognized_line(self):
"""
Includes unrecognized content in the descriptor.