From 4a442fb3e236bed47db51b6849cd63c1b061e93e Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Wed, 27 Sep 2023 03:03:35 +0200 Subject: [PATCH] updated documentation --- docs/.buildinfo | 2 +- docs/ACardEmulator/README.html | 67 +- docs/TCardEmulator/README.html | 29 +- ...5e17a8f890c78c473daa9db430b4cda74f6cb7.png | Bin 3685 -> 0 bytes ...a8f890c78c473daa9db430b4cda74f6cb7.png.map | 4 - ...27e1a05433ba14df2d516741c83a340d46b696.png | Bin 3123 -> 0 bytes ...a05433ba14df2d516741c83a340d46b696.png.map | 4 - ...600c60a9fcc658bb9a017dd609c3bff8e456b3.png | Bin 3514 -> 0 bytes ...60a9fcc658bb9a017dd609c3bff8e456b3.png.map | 4 - ...149f9804291dbbbe502519b9ab8d95f3e28f93.png | Bin 2824 -> 0 bytes ...9804291dbbbe502519b9ab8d95f3e28f93.png.map | 3 - ...2efbd974214a247217ba79cf0775fb65c344af.png | Bin 3495 -> 0 bytes ...d974214a247217ba79cf0775fb65c344af.png.map | 4 - ...5de3c82405e783e52102c0d9ccbc16f7e48d7c.png | Bin 3661 -> 0 bytes ...c82405e783e52102c0d9ccbc16f7e48d7c.png.map | 4 - ...1eb1f410a57b99d3b85ed60b3f73a1a03a39de.png | Bin 7364 -> 0 bytes ...f410a57b99d3b85ed60b3f73a1a03a39de.png.map | 6 - ...05e52eb98193c32482e91a30737e1e9684bad0.svg | 841 -- ...5ce7f91e19ed28b7af35a9f18aa096148209ea.svg | 406 - ...81452b980f69540bc7520179e10f3ccc59fe36.svg | 7897 ----------------- ...ebc244e414ed09dc8909102139ca8f37bae82b.svg | 271 - ...c9c7049675e5b06e8364c63b0718d51986e380.svg | 3670 -------- ...402031da401947efbeae7481d47bd35196791d.svg | 633 -- ...71605956d62bb837a2533794c8c50348b2f87c.svg | 2269 ----- ...1e764f23cec8b5d67952bc6d8bbe66280e80d1.svg | 2139 ----- ...a668553fb9bf21fb5abcc4cae46289d11490d1.svg | 427 - ...7c5ab6092153f7f845370e9964b266e5d97f55.svg | 2024 ----- ...23bba45f9fcaa801dd4f6284c7efa1f320c9b1.svg | 345 - ...55fa00e38973c00fdf255926bb46304226f2dc.svg | 2481 ------ ...75fc9e85a93771428d0790db395907b3f662fe.svg | 5005 ----------- ...010fa8209b3752026a52619d57bbebb8fa2bcd.svg | 2016 ----- docs/_sources/ACardEmulator/README.txt | 4 +- docs/_sources/ccid/README.txt | 14 +- docs/_sources/index.txt | 10 +- docs/_sources/pcsc-relay/README.txt | 30 +- docs/_sources/virtualsmartcard/README.txt | 68 +- .../virtualsmartcard.cards.HandlerTest.txt | 10 - .../api/virtualsmartcard.cards.Relay.txt | 10 - .../virtualsmartcard.cards.RelayMiddleman.txt | 10 - ...tualsmartcard.tests.CardGenerator_test.txt | 10 - ...irtualsmartcard.tests.CryptoUtils_test.txt | 10 - ...rtualsmartcard.tests.SmartcardSAM_test.txt | 10 - .../api/virtualsmartcard.tests.txt | 10 - .../api/virtualsmartcard.tests.utils_test.txt | 10 - .../img/glyphicons-halflings-white.png | Bin 8768 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 12764 -> 12799 bytes .../bootswatch-2.3.2/amelia/bootstrap.min.css | 1 + .../cerulean/bootstrap.min.css | 1 + .../bootswatch-2.3.2/cosmo/bootstrap.min.css | 1 + .../bootswatch-2.3.2/cyborg/bootstrap.min.css | 1 + .../bootswatch-2.3.2/flatly/bootstrap.min.css | 1 + .../img/glyphicons-halflings-white.png | Bin 8768 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 12764 -> 12799 bytes .../journal/bootstrap.min.css | 1 + .../readable/bootstrap.min.css | 1 + .../simplex/bootstrap.min.css | 1 + .../spacelab/bootstrap.min.css | 1 + .../bootswatch-2.3.2/spruce/bootstrap.min.css | 1 + .../superhero/bootstrap.min.css | 1 + .../bootswatch-2.3.2/united/bootstrap.min.css | 1 + .../bootswatch-3.3.7/cosmo/bootstrap.min.css | 1 + .../bootswatch-3.3.7/cyborg/bootstrap.min.css | 1 + .../bootswatch-3.3.7/darkly/bootstrap.min.css | 1 + .../bootswatch-3.3.7/flatly/bootstrap.min.css | 1 + .../journal/bootstrap.min.css | 1 + .../bootswatch-3.3.7/lumen/bootstrap.min.css | 1 + .../bootswatch-3.3.7/paper/bootstrap.min.css | 1 + .../readable/bootstrap.min.css | 1 + .../sandstone/bootstrap.min.css | 1 + .../simplex/bootstrap.min.css | 1 + .../bootswatch-3.3.7/solar/bootstrap.min.css | 1 + .../spacelab/bootstrap.min.css | 1 + .../superhero/bootstrap.min.css | 1 + .../bootswatch-3.3.7/united/bootstrap.min.css | 1 + .../bootswatch-3.3.7/yeti/bootstrap.min.css | 1 + docs/_static/documentation_options.js | 2 +- docs/ccid/README.html | 233 +- docs/index.html | 49 +- docs/objects.inv | Bin 7264 -> 4234 bytes docs/pcsc-relay/README.html | 161 +- docs/remote-reader/README.html | 62 +- docs/search.html | 24 +- docs/searchindex.js | 2 +- docs/virtualsmartcard/README.html | 161 +- docs/virtualsmartcard/api.html | 58 +- .../api/virtualsmartcard.CardGenerator.html | 14 +- .../virtualsmartcard.ConstantDefinitions.html | 14 +- .../api/virtualsmartcard.CryptoUtils.html | 14 +- .../api/virtualsmartcard.SEutils.html | 14 +- .../api/virtualsmartcard.SWutils.html | 14 +- .../virtualsmartcard.SmartcardFilesystem.html | 20 +- .../api/virtualsmartcard.SmartcardSAM.html | 14 +- .../api/virtualsmartcard.TLVutils.html | 14 +- .../virtualsmartcard.VirtualSmartcard.html | 16 +- .../virtualsmartcard.cards.HandlerTest.html | 202 - .../api/virtualsmartcard.cards.Relay.html | 204 - ...virtualsmartcard.cards.RelayMiddleman.html | 177 - .../virtualsmartcard.cards.cryptoflex.html | 14 +- .../api/virtualsmartcard.cards.ePass.html | 14 +- .../api/virtualsmartcard.cards.html | 17 +- .../api/virtualsmartcard.cards.nPA.html | 14 +- .../api/virtualsmartcard.html | 24 +- ...ualsmartcard.tests.CardGenerator_test.html | 2262 ----- ...rtualsmartcard.tests.CryptoUtils_test.html | 843 -- ...tualsmartcard.tests.SmartcardSAM_test.html | 863 -- .../api/virtualsmartcard.tests.html | 157 - .../virtualsmartcard.tests.utils_test.html | 848 -- .../api/virtualsmartcard.utils.html | 14 +- 108 files changed, 909 insertions(+), 36414 deletions(-) delete mode 100644 docs/_images/inheritance-285e17a8f890c78c473daa9db430b4cda74f6cb7.png delete mode 100644 docs/_images/inheritance-285e17a8f890c78c473daa9db430b4cda74f6cb7.png.map delete mode 100644 docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png delete mode 100644 docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png.map delete mode 100644 docs/_images/inheritance-5c600c60a9fcc658bb9a017dd609c3bff8e456b3.png delete mode 100644 docs/_images/inheritance-5c600c60a9fcc658bb9a017dd609c3bff8e456b3.png.map delete mode 100644 docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png delete mode 100644 docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png.map delete mode 100644 docs/_images/inheritance-c92efbd974214a247217ba79cf0775fb65c344af.png delete mode 100644 docs/_images/inheritance-c92efbd974214a247217ba79cf0775fb65c344af.png.map delete mode 100644 docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png delete mode 100644 docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png.map delete mode 100644 docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png delete mode 100644 docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png.map delete mode 100644 docs/_images/tikz-0405e52eb98193c32482e91a30737e1e9684bad0.svg delete mode 100644 docs/_images/tikz-115ce7f91e19ed28b7af35a9f18aa096148209ea.svg delete mode 100644 docs/_images/tikz-1281452b980f69540bc7520179e10f3ccc59fe36.svg delete mode 100644 docs/_images/tikz-2debc244e414ed09dc8909102139ca8f37bae82b.svg delete mode 100644 docs/_images/tikz-30c9c7049675e5b06e8364c63b0718d51986e380.svg delete mode 100644 docs/_images/tikz-5b402031da401947efbeae7481d47bd35196791d.svg delete mode 100644 docs/_images/tikz-6e71605956d62bb837a2533794c8c50348b2f87c.svg delete mode 100644 docs/_images/tikz-ae1e764f23cec8b5d67952bc6d8bbe66280e80d1.svg delete mode 100644 docs/_images/tikz-b5a668553fb9bf21fb5abcc4cae46289d11490d1.svg delete mode 100644 docs/_images/tikz-b87c5ab6092153f7f845370e9964b266e5d97f55.svg delete mode 100644 docs/_images/tikz-c523bba45f9fcaa801dd4f6284c7efa1f320c9b1.svg delete mode 100644 docs/_images/tikz-ce55fa00e38973c00fdf255926bb46304226f2dc.svg delete mode 100644 docs/_images/tikz-f675fc9e85a93771428d0790db395907b3f662fe.svg delete mode 100644 docs/_images/tikz-f7010fa8209b3752026a52619d57bbebb8fa2bcd.svg delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.cards.HandlerTest.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.cards.Relay.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.tests.txt delete mode 100644 docs/_sources/virtualsmartcard/api/virtualsmartcard.tests.utils_test.txt delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.cards.HandlerTest.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.cards.Relay.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.tests.html delete mode 100644 docs/virtualsmartcard/api/virtualsmartcard.tests.utils_test.html diff --git a/docs/.buildinfo b/docs/.buildinfo index 6f1ab4c..3adb779 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: b6c0a435aa7d2e7b87f7f3b438fbe297 +config: a3d188836219804b05091b34c89f1341 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/ACardEmulator/README.html b/docs/ACardEmulator/README.html index 4489c36..4f85803 100644 --- a/docs/ACardEmulator/README.html +++ b/docs/ACardEmulator/README.html @@ -4,7 +4,7 @@ - Android Smart Card Emulator — vsmartcard 2021-04-28 documentation + Android Smart Card Emulator — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -24,6 +20,10 @@ + + + + @@ -138,7 +138,7 @@
-
+

Android Smart Card Emulator

@@ -180,14 +180,51 @@ which allows emulating a contactless card from an existing contact-based card (by relaying the commands from PC/SC to the phone).

You may also attach your own simulation to the remote interface by implementing a simple interface through a socket communication.

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\node (reader) {\includegraphics[width=3cm]{$wd/bilder/my_cardreader.pdf}}; +\node [below=0cm of reader, kleiner] {Contact-less Reader}; +\node (phone) [right=1cm of reader] {\includegraphics[width=3cm]{$wd/bilder/smartphone.pdf}}; +\node (app) [at=(phone.center)] {\includegraphics[width=2.8cm, height=4.9cm]{$wd/bilder/ACardEmulator.png}}; + +\begin{pgfonlayer}{background} + \draw [rfid] (reader.center) -- (phone.west) ; +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

Simulate a contact-less Java Card with Android Smart Card Emulator

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\node (reader) {\includegraphics[width=3cm]{$wd/bilder/my_cardreader.pdf}}; +\node [below=0cm of reader, kleiner] {Contact-less Reader}; +\node (phone) [right=1cm of reader] {\includegraphics[width=3cm]{$wd/bilder/smartphone.pdf}}; +\node (app) [at=(phone.center)] {\includegraphics[width=2.8cm, height=4.9cm]{$wd/bilder/ACardEmulator.png}}; +\node (vicc) [aktivbox, right=2cm of phone, kleiner] {\texttt{vicc --reversed}}; + +\begin{pgfonlayer}{background} + \draw [rfid] (reader.center) -- (phone.west) ; + \path[linie] (phone) edge node {\includegraphics[width=1.5cm]{$wd/bilder/simplecloud.pdf}} (vicc) ; +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

Simulate a contact-less smart card with a remote virtual smart card

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\node (reader) {\includegraphics[width=3cm]{$wd/bilder/my_cardreader.pdf}}; +\node [below=0cm of reader, kleiner] {Contact-less Reader}; +\node (phone) [right=1cm of reader] {\includegraphics[width=3cm]{$wd/bilder/smartphone.pdf}}; +\node (app) [at=(phone.center)] {\includegraphics[width=2.8cm, height=4.9cm]{$wd/bilder/ACardEmulator.png}}; +\node (pcsc-relay) [aktivbox, right=2cm of phone, kleiner] {\texttt{pcsc-relay --emulator=vpcd}}; +\node (card) [below=.5cm of pcsc-relay)] {\includegraphics[width=0.8cm]{$wd/bilder/smartcard.pdf}}; +\node (reader2) [below=1cm of pcsc-relay] {\includegraphics[width=1.3cm]{$wd/bilder/my_cardreader.pdf}}; + +\begin{pgfonlayer}{background} + \draw [rfid] (reader.center) -- (phone.west) ; + \path[linie] (phone) edge node {\includegraphics[width=1.5cm]{$wd/bilder/simplecloud.pdf}} (pcsc-relay) ; + \path[linie] (pcsc-relay) edge (reader2) ; +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

Relaying a contact-based smart card with pcsc-relay

The Android Smart Card Emulator has the following dependencies:

We use Android Studio 8 to build and deploy the application. Use @@ -268,7 +303,7 @@ more than welcome! Please use our - Tizen Smart Card Emulator — vsmartcard 2021-04-28 documentation + Tizen Smart Card Emulator — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -24,6 +20,10 @@ + + + + @@ -138,7 +138,7 @@

-
+

Tizen Smart Card Emulator

@@ -161,8 +161,19 @@ sends responses back to the contact-less reader via the Tizen Smart Card Emulator.

You may also attach your own simulation by using the Samsung Accessory Protocol for communicating with the tizen service.

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\node (reader) {\includegraphics[width=3cm]{$wd/bilder/my_cardreader.pdf}}; +\node [below=0cm of reader, kleiner] {Contact-less Reader}; +\node (gears2) [right=1cm of reader] {\includegraphics[width=3cm]{$wd/bilder/gears2.jpg}}; +\node (phone) [right=-.5cm of gears2] {\includegraphics[width=3cm]{$wd/bilder/smartphone.pdf}}; +\node (app) [at=(phone.center)] {\includegraphics[width=2.8cm, height=4.9cm]{$wd/bilder/ACardEmulator.png}}; + +\begin{pgfonlayer}{background} + \draw [rfid] (reader.center) -- (gears2.west) ; +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

Simulate a contact-less smart card with Android Smart Card Emulator

Download and Install

@@ -222,7 +233,7 @@ more than welcome! Please use our - - - diff --git a/docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png b/docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png deleted file mode 100644 index 9d843ca79f64c9f9938c56bcd01aab6bdfe31123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3123 zcmZvfc{G&m8^;GpZ%QgzLs6;7Qg#|kWNV0~cqc=zJ?qbCEHi_I2$>Kvlcp$ZhLIs- zkFitMu{0w~RAU=s2!r3_{r%4S*L$9G?(4aqbMA9J*L8pI>-yYJZd#iiJ}7w*1Ogql zFgLLSfq40W_cI6f1EU1nq6#qkU98MZK)ZX->$?0j5J>Qcg^3X~^yLCQ^2Q)XR$y6y zZX-0T9qffbS_wg^d0^d36z_@RXy5l{5!@n+Xle)T4i)i`%azNu2st>KIl8a?i~ z^C`WKCPHv|{XsbiiGr|!n`dJ5mTPJ2*xId##pXHM_V2F(Y|hBYx1Kq0DQ#=Jo`%;V zY&G&EskMr`{@ZZ5|E*-cbvCMFA^1qXu0(6akDot(>Y&%=`L53$RUxXhzUb@C*2`qj z>DvLI@z@2A!f3kx`f|ubcxHBLw|Jthkx|qA+#vIPG%?q1ukosYwsQBba}^VAhRS>H z@G+sc8uvVdYA@UaK8$EQ4mcYnV4fw#)>%^`ui*UYDyu3 zf=DjZgC}(mXZnb$(&j_h=gjXLuL?RwJ~RCmjuD)hK}r&&Rj_l>@U3du8CXQ+PaOu# ze1~In@lPeuuPA28^?bGa8<_g`x$Nxh(BG4BeKeW?z9(bVVS9UfIaL3JK_pmGN-8BY zGcGEMXMT(OL4h>XCWqWjIf{_4ekd_C*7nGH$7WrW?FU!lzy=X-E@m~sD&a12FAIW-) zr_wr1JU_omFF9RJxsCTJq@?4wmPuRdOZj2!*%Z3J0=Dg1!|skAxvJ_`V4#}LNui61 zin+J)txbFL&(>!|wBBt)s3|+unp_+*C!$g@$s4gj2jae_F*9H z0fWQC*FzX#3MGGjcpPu8QEA73wd!(XEIoG7C{(-K<-YpxEs-GAoCz1L{=9G9Sy!HC zWL!7H$~?u@+#krZJth2%F49dfAdHQT71Y$=xe>cD8#}*>OQDh4=X=Q7#Qv{w*gZKE zlF8{2I~$%Wq54oeJL7c*S|xmUdp)JnOg0=k5Crit2nRcVMJkE84i(*oIyjgc?EIEr z7_Y(tQHp5sqe|gz$T`8b$u;XbAe|vLoQES4rM~Sq1dWtllVu&!^7?C zA@d_fKwbt`L#r!EBsJV+_k+@4jP^x>-*}~MLA6pkMIL zZ&%24ndfI2oSN(YqbV-F$bxtZg@tY7xB6RicyzZz7SFF(zB*fBkDO8cm zi4_#HgFqlN%ydQj{s9{Uh{khV@JBsL9E{^p_1+ zBWn)F8jDLwT{AM`5mj<{n3{S_2~H8gUR@IhcrPzUrL4&+Mc)oyM^EakD z*i>LP5Q8+@G>7KgHZmfP!{L@U<_L=5Sz^s%g8X+c%b-hn>g#qovCdbrwE~==cSGT2 zuoB!he1(>r}$thXbFYG4^J4bk+G3HA3=?JK;;pPHO2)vpt-Cz z)>NX(CnhJSp+VN;gG8d}B|A(~v)UxDsR((m%&4Vxyxqj4!T4r|`Ab+sn_1@4id13c z#!qU4a--y8_xa`uB8?P(wqCN1#(`3^b&(fA-%1;Hj6FO&-iCX59ni#IdLt#3ro+Hd z5n=3^j4z*aAfkz9 z5y!Kkhu$dK6K{HW!~sF(lWXyXM;dsMUt@^3=tK-H491BSJ!w z!vUoE`FUk--Gvw3vh?`+K(Bp`7eFG~r>0{EXW_rN zFoG*=D)Al4H)hq*#>~vD!|k%Im6g@tw5IQfVbE;%6K|{Up@KixR+@k^wAaUw%;8Bg z&8bM zYc3tBXTALVs5z#I&$62U!^Q0I z-8dF=@9$9dK#OvQWJ6#K}b zL+6t%8DzUq?SHXQSwkUTCWGd zsrg_%I)G3Wzy`z+MSy+}l=J6lY1ceHWP#c%{TQ`b2?+`99v^J)+!3V%DOv@7=?frZ z%M&L~JWo$Im5`8t!eEwgI2-_g>KNnG0KQb6S5d(#i3;juTf-V6!rd~{@p!A?nrwh9 zayQ?ft#o93V)Y@?EH7`_tgh1+0iHMqFvOkWbdTPb7G0St3Z=ASbOV{v=dXT7juOg} z1F#4O4%g+6ZZbzJHQbJ$yIbf#Gz&Xvc7JiYE=xP(x8-(HRq}Ti$B+Msl0p4A4ZzAC z%*aOke)9|B0W=)TwnVlqKBSPXc(tu!rufVdlM?E<3fq%rA%%kTZ`ck-XrEN~>^S57k;6> ScLi<%APZA#6Qc3GNB;$%|5x1r diff --git a/docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png.map b/docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png.map deleted file mode 100644 index e5e2cbd..0000000 --- a/docs/_images/inheritance-5827e1a05433ba14df2d516741c83a340d46b696.png.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/_images/inheritance-5c600c60a9fcc658bb9a017dd609c3bff8e456b3.png b/docs/_images/inheritance-5c600c60a9fcc658bb9a017dd609c3bff8e456b3.png deleted file mode 100644 index b6a07d7a1a8d27ae3b11e29fe21f8fa62d8e01fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3514 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 - - - diff --git a/docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png b/docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png deleted file mode 100644 index 53909d0fb156e6088fead179621861bf09d5c100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2824 zcmZ`*do+|=A0AGwC%0T1w?2^)Lb)@F5gHLm4&xR@lKV(*Lyi>2B=;sUD2ABhV5D)$ zbwWcE8jf4cxQ^>E84SL+@4xR`>sx!Tz4yEJ+Uxhe&-*;jexBd3vl0>n3xYr(AscI` zBM8Km53H5>d4aJWs=f|Pymw$$P|(q@R@_pa1p*1S*g&s1MZI2~MA{Cs6!|t54(RcZ z`8D6t4MLZ2m_LfORhTt%i+SW)y$N`P-qBLgM5Qi4%N3JG7=GT_z5LF$oPK6aO0+>n zT1tnn%i)?GoSrDgM_RPG7h5Krf6{!3#Yl$ zwR>cI{(HbkOE{wL)$Q&yH=7*6MV@N+jB6Y;c zYz;S%>r_CizIQj=vG7jUCWvnEcFOpupNmQYo^mB@roD`ejj=b*ZY&fb&lnFQmDZ4y zZTK_6g5yq)pHf7##e$#0oOAR-GVdUqR1#9i@?#i4znMm=^HoY)nc5I=~yf>U+ zJD6vVO>o3@9qde_-HDMid7kk$yZJggI$98jrqTS?Zn2YEGMM!7a2)|BC7)Z8O}|=t z#o1X(LaDm;!ANj0sY{qt~aJJFHfi{+^ah& zBqUU#m)Fme)~(c>K{%8K*U&n`sIp(M7Ab!PO&U3j)9K1O7cb645|~(rqFH?{{p*yX#d(Ek;942w>_io*(!%`W~Q#-Uzghzc2wS~ zDjr&Tk(HISyc|G5v~id)6XxgBUm2{k>grveK7lmh9}-Zq`W^n4I%Yz={Qa#zyn%C~ zn953WCQ+hQ&ei6wu3&Yk-__2a7taXY|M@U*x>eq&P#6GjaeY0ndInBHJMkI9@-!_0 z5SUEnMvrW8adov2R9Oy>!?nNCeE`(=sv8UW@hR~crVws->(;H$gM-qA>pT12m%w6s zGVg|#{_LMS;c>JzXjV~G)wwoFOxDAp%}dDk&8)0`vw{c2h6YIyGmcjJ)zfdHW(AH5 z3tyF2r8-Q-;%M%*IU#V&oQH>J zd(;O_x$POJQlFEZ%};x-5?^m(b@l4vYUA{~FJEjctEx&LP-`euPvmvQc(!+kwnzN# zT~}hHhI?~VCgg|{{ZO3^ET&}PpQ;rAUT_SIXO9*V}ViwV{J&Yu|U0mz`!y^ zBq#F~2GbkR@U1Li%kUGh>0OqXqcLs&YDd5t1h zT)G%N;xv5Qp;EOo4243OkH@UHNQX|%8@0ma%WO$nV3hAAumFgwIBx%^m>8w2>zIaX z{WC!KmIuoW#{IdzoR+%l>#{aCu+f zH3yUh%?eZGPqM&EKRE1l8CO7C8N~lw`D5%5PKqhb$W%ro;cz(YNY!m|F^5y4#oOBv z0YO1hDq-)SKnbMNggka=~Rso~|eH|TjaT)LGf_~X7om*l>3xI@#g|7`fY}VHFY_$a~ z?y(r=3?U&ZFU*1p9ku%BCKel$ij*qA1=1NtJ1O$!~t`pGh zUN1~*oTg5K$?Vw3urNn<{GB`8_GSl{a@GHMvbPrE758>f(mFp z7K^2YA%_?h0=*>s5*W2{uuV3>5xlfy!a4qrmsxwyNNZ<$zF;yhE@+Kx`rwkXbI#ws zLw=wex}iE-Qk(e0`w?<&BNE*@r-h51};P z%F4=*)pFo@f$52VZ~pHSo=cZ&xaxG`47>iFE<-3`L%)?JK82t+$=(`%gYP^-W;gg7Z6t(nQrWIExTDk>^I z0sbhQb1k`}!+hdH=x=dxac4C&P{vQ&y*|~r6F25D!FR^~zWX6=UoYUn1IvY|7LV-Q z+>-KgKHem6JDOFM#o}n$XrSKcYNXSxTUY`?N>WmCl=$cZcOr-oG?{w&6bMgE1AKD^ zSN`S%3)K*0S1xX8X?f$U1W+f3{CK)GE{ZjBJF}qRT#SeMmN@L--nXTQ&^g64DD|i9 ze^hNFwr&b|m|J5|=G9W{-Tqw4@No85g(ZdbVe-dUufTxsmN{1mfDjQ8UoAvTp+`*yo?tB? z^u2rnoR#shX_r0jlU`f)f|HW_|8id?sr`R*B5>r`fyk(Ga@b{qp&B6Cf^019pf%=R GPyP*MiKVju diff --git a/docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png.map b/docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png.map deleted file mode 100644 index 082f9c3..0000000 --- a/docs/_images/inheritance-95149f9804291dbbbe502519b9ab8d95f3e28f93.png.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/_images/inheritance-c92efbd974214a247217ba79cf0775fb65c344af.png b/docs/_images/inheritance-c92efbd974214a247217ba79cf0775fb65c344af.png deleted file mode 100644 index 70b2792c8fef5d1944581846e20c8c86b54bedaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3495 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 - - - diff --git a/docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png b/docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png deleted file mode 100644 index 835d1a40ec1fe9f913605cdb9f947a5c8d663678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3661 zcmZ`+dpMJSA6|qa$0T8jl;s%4LJo@d%b_Y+pcH3_FT{N`F`&2{oMEGPO!Ez=H(XS27y4lrY45AAP}1? z@LT2xCvdF3n92iuae9~=8-n%^-fxJ-86XfJo2lUy`_SCQF_Z;$eV=PZHcy_bug^j? z)n!`9vYk)(=&OrC7It(O_cxTxibBG?!}Er&Zl$|QkJwA8A{Vmm2?#$v>2OTOxZBF5 z+3;7%nV#cbXRK*6>pPz=wIKQENX^_&nsSxoV2v$g}c}i6Wo6L;##nyCww5;-V}zYqs={kOhk zD@N(xW$>?T7nPDolDfLOn{;ecGnm^GCV`mYr!Ve{GoC+wdBGM+E) zHWAp~(ecqw<5O>MukGxd^z0JPXmY^YH6~LKZINlc)8nOXr{&_17@5InAcp7+b2h+ibV`kuuI#O$mA}K8`yBp4l2?oajUEjvXl|pqvxA>(C>LwyF1qB5rh5god@5(HW z6EPKTL^DG}E? zxx&=W+ZWTY*wa0))Z$dt)Zim$9O~?8w&<~m31vo5E_}Z+hyl59A>o>_F_}6>rOpt7 zM|t@9D_M@J7HrCSvZwv3keC$0i6^!Hfkj%C!Yhl1YlU(S#EK5yKc1` zFrwLiS>!`ub#=z~vRhZhlAj&pWJhmK#!ambye`a%r(v3G!@Mo!dcgz~Yqsa^MNz+$ z#rgRIu&7jOHqy+@45FZr6sQHh=jAof*%|Lc8yg#21KNIZ&~vV4My>yt?>xIPvb&Mi z*n*p_Q)AsolScH0Z9FtQ}kjdyWB&VJ({xgnBjgRN%=AP?JKf6XzZn1{L z6%}3T(`x;G7#Pajs&k|TY=`?9G*s`FmzM(=zptvYg>oWlM#t?(0$uALK8}cpn49j( z(C~zzw*$pQMFnVq?d|P0z-Gv2D%*R(F${fu1sd4-#Yr_iq0N)V)l z+9>m(8JzqAJWm7jfi;K;-CMiXZf;h{*={Lmp>k(Af0gelO-;L&mX?QGXY)8UFZcVS zV4Xz_c2FwY3L)y_tH09HPK|*V?sG&Itw4ENr>;D_YU_Or%DpScz2lDn2_&f zP%%Cy|U&d4Yh=STmV zSFo$`V@RoFs=TWU`Icm9YWlX^xy~ul%F3z;K3e-D7rD7|hr-ehS$fC8BXXo;Y-q?> zE-Ud1g`!BFo}TXe7|R1sd0G9BSr5W{wp93frI7(S+!N3fDQsU6#q&>~qEk)h>azAy zJv+dBQ8BUCD~voHln9YXbR9K;qMQgkJw!wIwSp~ za$;m8kwnr}a9`T2?14g|w--kUeT?-ZM~>+G`pN;czjp1K02r+32*?H?aYIHsv7t?4 zurwTK3U9Q!z$TA??ZDumjlKP0kf?-&;jLSz1_lNUdmHHasPnd2ym)-Atj0!) z2S9i>kb+zDa8dVm=^BEMp`6F*^7{h6yJp53; zctuX1^zFrL=ZeMAvZrE_l9D00X1J=qs0B`qoBplh+JENy3$uCZ)d^0?0N3nq+<041 zz;^1?DaWQ@MSxuQh@{HpdKg53lZy-QOO-2gB5-r@OMZsejd2$C$CFP-NdS2C`4XN4 znYWi)L+-ZImp0;JW3RlmeuKktgcJ7~;V{rKUf%msf8fr`QXpRtavvoFnmgS0aOTSi zUcoL>I%_iSbjNHDrvKZw7@!$QmRXrggYB9`o|Wu&v;DYPGC?QSKuU8$!j(Oyf+v9S z(zjSXOu->;eOME9B{*d1%lwW?z-mMix@oA=Jr#hPPhDO8ePtyX{bww$v(u!FMcy{@ z$v4;0gO5N#`q!`X9}r>&U`n446!;V{pFb+a~!BYOGbC@Na^k@ zs8McfefZ?$;{yRo+1$9HzSMxEf1Mn_nTN7^VCgwI@$cV5{%+B+8ssBXMOlAM+Sp!n zG^ostDAp9b7~nXOC4aNxdGK{3z%{gAWMlxWis{wcmk`(Ri?*Go?Y~?gJIf(vk_bBZ zt=Y1KZ~RG!;?gib?cUA8IFuyM;Y5S5TKM9~(Ri%n) zAM0oAGRdb+%+0S}y~++4TUB*6^Vf4_gSXaaR8$0CD!G2_%8*UZ&gOJ?cb}%yr{;^X z&-#5nj}uXfO!4GvZH)w{avz#@@Pa-PS#2qiVnY0CID&ooGA<_OaG4{XO_{hRBz^X5 z|JYbEP*6fIQo=og+5WE9S&87J18QoaMS{b@tpd^Jph(U%uAh+TbY}!{y}26GT~h-E z6zS*c3zm#6$=H)_(PlUUM@P}5 zYiGy98H&w&+l+##$gS0T{f`3gk-|L{13rsC0QDxD{#r;T1qB7w`1DH;_!8EBKII=M z#ztx_T?;P}UtC1Qqv&}d5Wvxa9XuqUAP<4O$;lA~W-Vb+Q4{lQg}1vqe+B_MTF5(; zy=iULUuCfh?@_XC0IYq$8~CJ@lz|G@CI}RoX)kwTem#5y?-@69z9B750H~Iko9j2| zr5VK24jh z?B!nTplW-J%W?kP1TVdDk1%=l?;Gp!$-9Pn3R4!l9*em?k~~x<;5~!CsimgC%xGb8 z4879E_2RT`&ccJ2!_1Ulf)pg4bWS=kF|leZvm^)%3=G0TLIzrSDf#G)TYx}{Bs(uW zI22zoW}TOnWyGTQ$^vs%$OIZTL#J#1HDliy5~1*Dq7^y@AEcx8P!Im=Ldk1*oceFMwlXw88Uta6GI?fm8Y8>j{N&YuSym<2D ziGZ+h46q^E>-VR`lZTsB{&H1=F>=UH;LyQ#QBMn@gotp)-p+CeBji+AMk$trO)UCC zd&o5&c#wzo@q2RY9kd?L36tJ~bfl5REP8%$qMQBS%ac@Q4>iww9Ap<3C=NCNgF+9> z$jZ8}1YS()>K_^!T3!@&Y1;w{!Rk^{QXWMm$Nb-z1)RVH?D40NU2y~Yon}Bj1eqFH K8CDqFe)1n)%swCh diff --git a/docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png.map b/docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png.map deleted file mode 100644 index 99e13ee..0000000 --- a/docs/_images/inheritance-c95de3c82405e783e52102c0d9ccbc16f7e48d7c.png.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png b/docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png deleted file mode 100644 index 06da744e65f19d6099a6eb2358f83c5312a34c50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7364 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 Xg*FpZ#KYR~KT@hFX(;B)oBsJfev`;` diff --git a/docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png.map b/docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png.map deleted file mode 100644 index b6ba07e..0000000 --- a/docs/_images/inheritance-d51eb1f410a57b99d3b85ed60b3f73a1a03a39de.png.map +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/_images/tikz-0405e52eb98193c32482e91a30737e1e9684bad0.svg b/docs/_images/tikz-0405e52eb98193c32482e91a30737e1e9684bad0.svg deleted file mode 100644 index cd2ed0a..0000000 --- a/docs/_images/tikz-0405e52eb98193c32482e91a30737e1e9684bad0.svg +++ /dev/null @@ -1,841 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-115ce7f91e19ed28b7af35a9f18aa096148209ea.svg b/docs/_images/tikz-115ce7f91e19ed28b7af35a9f18aa096148209ea.svg deleted file mode 100644 index 94204d3..0000000 --- a/docs/_images/tikz-115ce7f91e19ed28b7af35a9f18aa096148209ea.svg +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-1281452b980f69540bc7520179e10f3ccc59fe36.svg b/docs/_images/tikz-1281452b980f69540bc7520179e10f3ccc59fe36.svg deleted file mode 100644 index 692fcdc..0000000 --- a/docs/_images/tikz-1281452b980f69540bc7520179e10f3ccc59fe36.svg +++ /dev/null @@ -1,7897 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-2debc244e414ed09dc8909102139ca8f37bae82b.svg b/docs/_images/tikz-2debc244e414ed09dc8909102139ca8f37bae82b.svg deleted file mode 100644 index 0a99188..0000000 --- a/docs/_images/tikz-2debc244e414ed09dc8909102139ca8f37bae82b.svg +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-30c9c7049675e5b06e8364c63b0718d51986e380.svg b/docs/_images/tikz-30c9c7049675e5b06e8364c63b0718d51986e380.svg deleted file mode 100644 index c0194a7..0000000 --- a/docs/_images/tikz-30c9c7049675e5b06e8364c63b0718d51986e380.svg +++ /dev/null @@ -1,3670 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-5b402031da401947efbeae7481d47bd35196791d.svg b/docs/_images/tikz-5b402031da401947efbeae7481d47bd35196791d.svg deleted file mode 100644 index 16626df..0000000 --- a/docs/_images/tikz-5b402031da401947efbeae7481d47bd35196791d.svg +++ /dev/null @@ -1,633 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-6e71605956d62bb837a2533794c8c50348b2f87c.svg b/docs/_images/tikz-6e71605956d62bb837a2533794c8c50348b2f87c.svg deleted file mode 100644 index 38cc7f8..0000000 --- a/docs/_images/tikz-6e71605956d62bb837a2533794c8c50348b2f87c.svg +++ /dev/null @@ -1,2269 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-ae1e764f23cec8b5d67952bc6d8bbe66280e80d1.svg b/docs/_images/tikz-ae1e764f23cec8b5d67952bc6d8bbe66280e80d1.svg deleted file mode 100644 index b0fe297..0000000 --- a/docs/_images/tikz-ae1e764f23cec8b5d67952bc6d8bbe66280e80d1.svg +++ /dev/null @@ -1,2139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-b5a668553fb9bf21fb5abcc4cae46289d11490d1.svg b/docs/_images/tikz-b5a668553fb9bf21fb5abcc4cae46289d11490d1.svg deleted file mode 100644 index da74e3d..0000000 --- a/docs/_images/tikz-b5a668553fb9bf21fb5abcc4cae46289d11490d1.svg +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-b87c5ab6092153f7f845370e9964b266e5d97f55.svg b/docs/_images/tikz-b87c5ab6092153f7f845370e9964b266e5d97f55.svg deleted file mode 100644 index 8b2fbb9..0000000 --- a/docs/_images/tikz-b87c5ab6092153f7f845370e9964b266e5d97f55.svg +++ /dev/null @@ -1,2024 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-c523bba45f9fcaa801dd4f6284c7efa1f320c9b1.svg b/docs/_images/tikz-c523bba45f9fcaa801dd4f6284c7efa1f320c9b1.svg deleted file mode 100644 index bc17e73..0000000 --- a/docs/_images/tikz-c523bba45f9fcaa801dd4f6284c7efa1f320c9b1.svg +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-ce55fa00e38973c00fdf255926bb46304226f2dc.svg b/docs/_images/tikz-ce55fa00e38973c00fdf255926bb46304226f2dc.svg deleted file mode 100644 index 7a233b4..0000000 --- a/docs/_images/tikz-ce55fa00e38973c00fdf255926bb46304226f2dc.svg +++ /dev/null @@ -1,2481 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-f675fc9e85a93771428d0790db395907b3f662fe.svg b/docs/_images/tikz-f675fc9e85a93771428d0790db395907b3f662fe.svg deleted file mode 100644 index a1d1e9f..0000000 --- a/docs/_images/tikz-f675fc9e85a93771428d0790db395907b3f662fe.svg +++ /dev/null @@ -1,5005 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_images/tikz-f7010fa8209b3752026a52619d57bbebb8fa2bcd.svg b/docs/_images/tikz-f7010fa8209b3752026a52619d57bbebb8fa2bcd.svg deleted file mode 100644 index 48de5bf..0000000 --- a/docs/_images/tikz-f7010fa8209b3752026a52619d57bbebb8fa2bcd.svg +++ /dev/null @@ -1,2016 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_sources/ACardEmulator/README.txt b/docs/_sources/ACardEmulator/README.txt index 66edc24..5ff5b0c 100644 --- a/docs/_sources/ACardEmulator/README.txt +++ b/docs/_sources/ACardEmulator/README.txt @@ -134,9 +134,7 @@ submodules:: git clone https://github.com/frankmorgner/vsmartcard.git cd vsmartcard - # fetch the applets that are in the submodules - git submodule init - git submodule update + git submodule update --init --recursive We use `Android Studio`_ to build and deploy the application. Use :menuselection:`File --> Open` to select :file:`vsmartcard/ACardEmulator`. diff --git a/docs/_sources/ccid/README.txt b/docs/_sources/ccid/README.txt index 7cf142e..4f3ed3c 100644 --- a/docs/_sources/ccid/README.txt +++ b/docs/_sources/ccid/README.txt @@ -168,12 +168,6 @@ tools. \texttt{/dev/gadget/ep2-bulk}\\ \texttt{/dev/gadget/ep3-bulk}\\}; - -Running the USB CCID Emulator has the following dependencies: - -- Linux Kernel with GadgetFS_ -- OpenSC_ - Whereas using the USB CCID Emulator on the host system as smart card reader only needs a usable PC/SC middleware with USB CCID driver. This is the case for most modern Windows and Unix-like systems by default. @@ -266,7 +260,12 @@ modern Windows and Unix-like systems by default. .. include:: autotools.txt The USB CCID Emulator depends on :program:`libopensc`, which is automatically -built from a snapshot of the OpenSC source code and then statically linked. +built from a snapshot of the OpenSC_ source code and then statically linked. + +Running the USB CCID Emulator has the following dependencies: + +- Linux Kernel with GadgetFS_ +- OpenSSL_ 1.0.0 or later ================= @@ -334,6 +333,7 @@ Notes and References .. _`GadgetFS`: http://www.linux-usb.org/gadget/ .. _`OpenSC`: https://github.com/frankmorgner/OpenSC +.. _`OpenSSL`: https://www.openssl.org .. _`libccid`: https://ccid.apdu.fr/ .. _`Windows USB CCID driver`: http://msdn.microsoft.com/en-us/windows/hardware/gg487509 .. _`OpenMoko Wiki`: http://wiki.openmoko.org/wiki/Building_Gadget_USB_Module diff --git a/docs/_sources/index.txt b/docs/_sources/index.txt index 5c4df01..bfb7294 100644 --- a/docs/_sources/index.txt +++ b/docs/_sources/index.txt @@ -61,17 +61,17 @@ have a look at these programming guides and try yourself: virtualsmartcard/api -.. image:: https://img.shields.io/travis/frankmorgner/vsmartcard/master.svg?label=Travis%20CI%20build - :target: https://travis-ci.org/frankmorgner/vsmartcard - :alt: Travis CI Build Status Image +.. image:: https://img.shields.io/github/actions/workflow/status/frankmorgner/vsmartcard/ci.yml?branch=master&label=Ubuntu%2FmacOS&logo=github + :target: https://github.com/frankmorgner/vsmartcard/actions/workflows/ci.yml?branch=master + :alt: GitHub CI status .. image:: https://img.shields.io/appveyor/ci/frankmorgner/vsmartcard/master.svg?label=AppVeyor%20build :target: https://ci.appveyor.com/project/frankmorgner/vsmartcard - :alt: AppVeyor CI Build Status Image + :alt: AppVeyor CI status .. image:: https://img.shields.io/coverity/scan/3987.svg?label=Coverity%20scan :target: https://scan.coverity.com/projects/3987 - :alt: Coverity Scan Status + :alt: Coverity Scan status Download diff --git a/docs/_sources/pcsc-relay/README.txt b/docs/_sources/pcsc-relay/README.txt index c81c0eb..e7dd8ba 100644 --- a/docs/_sources/pcsc-relay/README.txt +++ b/docs/_sources/pcsc-relay/README.txt @@ -16,7 +16,7 @@ PC/SC Relay Welcome to PC/SC Relay. The purpose of PC/SC Relay is to relay a smart card using an contact-less interface. Currently the following contact-less -emulators are supported: +**emulators** are supported: - `Hardware supported by libnfc`_ - OpenPICC_ @@ -24,7 +24,7 @@ emulators are supported: Command APDUs are received with the contact-less interface and relayed. The Response APDUs are then sent back via RFID. The contact-less data will be -relayed to one of the following: +relayed to one of the following **connectors**: - to a *real* smart card inserted into one of the systems' smart card readers. The smart card reader must be accessible with PC/SC. The smart card may be @@ -33,6 +33,32 @@ relayed to one of the following: smart card's native interface is used and (despite its name) PC/SC Relay does not need to access PC/SC in this case. +.. + http://www.plantuml.com/plantuml/txt/SoWkIImgAStDuNBDBSr9BCalKj2rKr0gI2vErYrApKciL5AmKd3EpyrDp4jHS0nm2UL2bWEg1KhcvQKc0pLoGLcOHc3eWTjbfH2KMboGdrUS2Z7S8JKl1UWO0000 + + @startuml + skinparam responseMessageBelowArrow true + Emulator -> "pcsc-relay" : Command APDU + "pcsc-relay" -> Connector + Connector -> "pcsc-relay" + "pcsc-relay" -> Emulator : Response APDU + @enduml + +:: + + ┌────────┐ ┌──────────┐ ┌─────────┐ + │Emulator│ │pcsc-relay│ │Connector│ + └───┬────┘ └────┬─────┘ └────┬────┘ + │ Command APDU │ │ + │ ───────────────────> │ + │ │ ───────────────────>│ + │ │ <───────────────────│ + │ Response APDU │ │ + │ <─────────────────── │ + ┌───┴────┐ ┌────┴─────┐ ┌────┴────┐ + │Emulator│ │pcsc-relay│ │Connector│ + └────────┘ └──────────┘ └─────────┘ + .. tikz:: Debug, Analyze and Emulate with PC/SC Relay :stringsubst: :libs: arrows, calc, fit, patterns, plotmarks, shapes.geometric, shapes.misc, shapes.symbols, shapes.arrows, shapes.callouts, shapes.multipart, shapes.gates.logic.US, shapes.gates.logic.IEC, er, automata, backgrounds, chains, topaths, trees, petri, mindmap, matrix, calendar, folding, fadings, through, positioning, scopes, decorations.fractals, decorations.shapes, decorations.text, decorations.pathmorphing, decorations.pathreplacing, decorations.footprints, decorations.markings, shadows diff --git a/docs/_sources/virtualsmartcard/README.txt b/docs/_sources/virtualsmartcard/README.txt index cb2c29d..95e766a 100644 --- a/docs/_sources/virtualsmartcard/README.txt +++ b/docs/_sources/virtualsmartcard/README.txt @@ -103,7 +103,7 @@ Depending on your usage of the |vpicc| you may need to install the following: - Python_ - pyscard_ (relaying a local smart card with `--type=relay`) -- PyCryptodome_, PBKDF2_, PIL_, readline_ or PyReadline_ (emulation of electronic +- PyCryptodome, PBKDF2_, PIL_, readline_ or PyReadline_ (emulation of electronic passport with `--type=ePass`) - OpenPACE_ (emulation of German identity card with `--type=nPA`) - libqrencode_ (to print a QR code on the command line for `vpcd-config`; an @@ -145,11 +145,15 @@ Building and installing |vpcd| on Windows PC/SC. For the Windows integration we extended `Fabio Ottavi's UMDF Driver for a -Virtual Smart Card Reader`_ with a |vpcd| interface. To build |vpcd| for -Windows we use `Windows Driver Kit 10 and Visual Studio 2015`_. The vpcd -installer requires the `WiX Toolset 3.10`_. If you choose +Virtual Smart Card Reader`_ with a |vpcd| interface. If you choose to download the `Windows binaries`_, you may directly jump to step 4. +In the CI environment, we're building |vpcd| for Windows with Visual Studio +Community 2019 with SDK/WDK for Windows 11. (The WDK version needs to match +at least your targeted version of Windows, see this `guide for installing VS +with WDK`_) The vpcd installer additionally +requires the `WiX Toolset 3.10`_ to be installed. + 1. Clone the git repository and make sure it is initialized with all submodules:: @@ -166,10 +170,21 @@ to download the `Windows binaries`_, you may directly jump to step 4. the installer (:file:`BixVReaderInstaller.msi`) in :file:`virtualsmartcard\\win32\\BixVReaderInstaller\\bin\\*Release` -4. To install |vpcd|, double click :file:`BixVReaderInstaller.msi`. Since we - are currently not signing the Installer, this will yield a warning about an - unverified driver software publisher on Windows 8 and later. Click - :guilabel:`Install this driver software anyway`. +4. To import the installer's test signing certificate, double click + :file:`BixVReader.cer` and add it to the *Trusted Root Certification + Authority* and the *Trusted Publishers* at the *Local Computer" (not the + *Current User*). + + On the commandline, you could do this :ref:`as follows`:: + + CertMgr.exe /add BixVReader.cer /s /r localMachine root /all + CertMgr.exe /add BixVReader.cer /s /r localMachine trustedpublisher + + Feel free to remove the certificate from the certificate stores once the + device is installed. + +5. To install |vpcd|, double click :file:`BixVReaderInstaller.msi`. For debugging |vpcd| and building the driver with an older version of Visual Studio or WDK please see `Fabio Ottavi's UMDF Driver for a Virtual Smart Card @@ -300,6 +315,38 @@ through the PC/SC API. You can use the :command:`opensc-explorer` or provide scripts for testing with npa-tool_ and PCSC-Lite's smart card reader driver tester. +-------------------------------------------------------------------------------- +Testing |vpicc| -t ePass +-------------------------------------------------------------------------------- + +A simple tool to test |BAC| is available for Python 2.7. On Ubuntu, its +requiremets are installed as follows:: + + sudo apt-get install python2.7-dev + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py + python2.7 get-pip.py + python2.7 -m pip install pycryptodomex pyscard + python2.7 readpass.py --no-gui + git clone https://github.com/henryk/cyberflex-shell + cd cyberflex-shell + +Now we can create and run a small script:: + + echo "select_application a0000002471001" > script.txt + echo "perform_bac L898902C<3UTO6908061F9406236ZE184226B<<<<<14" >> script.txt + python2.7 cyberflex-shell.py script.txt + +The tool will wait for a (virtual) smart card to appear. Start |vpicc| and make +sure to configure it with the correct MRZ, i.e. +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 W`c(?wkNW@afaE?YNta6+1^gGSDR9sL delta 7805 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 XzF1VVP2Si8{R=I1U9}1o>-YZ)t-Yl0 diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png index 8bc9e642b762a7c2f50a84e6c721af5d5f538929..a9969993201f9cee63cf9f49217646347297b643 100644 GIT binary patch literal 12799 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 literal 12764 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 diff --git a/docs/_static/bootswatch-2.3.2/amelia/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/amelia/bootstrap.min.css index 0a0096b..b8cea32 100644 --- a/docs/_static/bootswatch-2.3.2/amelia/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/amelia/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Lobster|Cabin:400,700');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/cerulean/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/cerulean/bootstrap.min.css index 2086b3c..9740c15 100644 --- a/docs/_static/bootswatch-2.3.2/cerulean/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/cerulean/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url(//fonts.googleapis.com/css?family=Telex);/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/cosmo/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/cosmo/bootstrap.min.css index fbb4117..cae7e4f 100644 --- a/docs/_static/bootswatch-2.3.2/cosmo/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/cosmo/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/cyborg/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/cyborg/bootstrap.min.css index f372706..894f3aa 100644 --- a/docs/_static/bootswatch-2.3.2/cyborg/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/cyborg/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Droid+Sans:400,700');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/flatly/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/flatly/bootstrap.min.css index a462503..a8ba389 100644 --- a/docs/_static/bootswatch-2.3.2/flatly/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/flatly/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("http://fonts.googleapis.com/css?family=Lato:400,700,900,400italic");/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/img/glyphicons-halflings-white.png b/docs/_static/bootswatch-2.3.2/img/glyphicons-halflings-white.png index c06afb588b01357f92ade8c041ece33b181f5a19..3bf6484a29d8da269f9bc874b25493a45fae3bae 100644 GIT binary patch delta 7814 zcmZXYbx_>Tvi28;5P}2a1p8a2&PBnz@>9TUzkWaB5j_ez%k9G3S|+W^LFWFZYzq=KJ*`@I|gD@t>c}9*gvT>*M1DanVb^L&6ns1^H*R zflM||*In`IMw+7-6jM&0_o2r*&Pt4^KcwYQ$VyX(#&NLe2z03G$72N)Pi6CY=LKn_ zXaWZ-VrJ+gaHly;sy?xku(N&}iUoBL;z?peHINmF+PrQm?cPAzQr=t%+S}x)T`50v zvmp?#TpETfy%8H^mI@w-(|J=8vcTn@)|;f_+%w`oX`eoqZZE2R7-6&5CG*o|R03|Ww3JzaSN>>_;kbHdjef#1C096TGISdGKgR9 zpan4HvG;qD)()y!F_09T5&rOIxU!D;*`j4~pSS*}-*TmNzzmFCbtg8O&mdcO)cCqY zv#JeX0N*hO)AaSqE`FlqV?&fR`vG-zU@SeKy|M=&gk|y>SpktJ(N~C-k9off?BAgo ze|U#${P3RNGqozB+=;HCC)mi|tdibIe4v5_8fw0cEKeNbR6U#QWkrY+!5$L&TK#0P z^Exs{OzND_8>g+aQDQV|OB$q~F3QwE=sjq>S~mG_j4|+*_L}*uwSn$Y&tc1^n5^lI z`1CgvbjxHo{Ez7JwLQWUETE_}(>fXy*R=4q7tZ=+#KsM&8fh>4QC4qoCa+^b(inK7 z!K*E6s$vElkqCT4ECU7+6uqZ|We83#11w3&``{ysYnTqRL#$wv&dF>@=enSk(eB4JmA)y~Ecw1s~{pE*7IgO(HeC5Bivk5DaybsX6)Q=QCP;xQASMA7s|1nKi<69RN&|Yd$CSRhrKOpEL^DMC%P;2DlHMk}} zJSAlAEsZ$uIDAp%9=0wA!#SRm2@+QJViYdRwvq?Zr#`Fu57fRiTbKM~wmq?%d#sri zAf?@Xtt`T&9HqpSA{R-pXZW$z&t2wI;shNz?a0T%Z3_{*PG5@n?+vsbk7D)d%nkoS zcO>C|P?o&=ld}m-BU;69t&-eV6k*C3qMy5fp=VlBEAq!1=Ybtsp`NJ&u*cb@w`(~b zZjS!aYNp#)+fF3y?<2)O6JOK0aSfow3gw>O5e12Lvh9@PO@BCfM9_e!y$NpoiD4~D zf{)zDruSY{6_~`v+4yEPd%R>A(|=swN^hPUIIpfECv+V^bm-V;3)v8#ftxR|%!MCg zu`#2w+E07X)xs3NU#t+oBg@*Gl>YgbYj8hWwL@5z_u1)jJ>Dr|?4=J=Z9&{G%T3LoHF+nF#hicUxtLJ1%K( zm5T9s_^?YDHL7^#Pr99-3L)!gF9=k|%nczE?5m^#VqMT=%l+btIM;&>H)@umYRuv;+O|Ez=FqYQsw5Kr?`p8ajud; z`pe1oFP={>xHh8KpI5NR%5WK;xn&!7SZNX|d9HSN+syM>!JHPK#jP=H| zXTgj~7E9lY9>D;?vEfII)ovP0`=J{g$_z!9+&z|~Y*eKtaAK<>-Nhrqt1825Wa(?m z=%>}Z(tKf*0w>TefeXlQ#7^0DL}9X-t@87%}Y61FQx_F3ArXW;!5&F#leBu0hp{V|0nK+A4jF0TO&l z%T6C_ICpsPxV5~)5{6`jBevQ0XV4C{7$0iTGsK->ddrrMN_AKatKL^1@dZ#HM?+|t z4{X3)#4w8on8HJ>1r@3vqg2|U+=+;jlQC5v5Nt%rW^_(f_whB-y7ih>bif6X`Wfn? zPLZC`@I&s*a8&s^Oz}S7u*Bz^9aG66WrwBb)7}!uK5Mu6(F^rQ!OYsCwaYgVbmh~| za#-ImE6k~YkxW&5V}xP(gZ`Hc93sD5cV))lYZWPzua3O=h`*|lgIaQSA3!P!4MY2Y zefAfDR;6wjp8*w>9qhIQ*`mJ(t(G6!>nyMsmrTv%7vz5#;%DHDdJIH|y3AESf@h*c z{^4hCk3Hk%)!wro-47dfDf)+*j7!C1j$iEi<1Qx^Vq0A@NW~CeG>&Lu|20Lr+;bcr zXTH&dYst;QvhDv5ejM-<}wg0StMZvwRNw+2s zmn!oqW1U+6@GOjO{!{M7N&lx-l^q=tO`WvXD9BsFM{%GlgkVe!PXNpW;7FC)X2{IJQ;QX##CGoA1@qBTHWJc3wRDwBZ$1VIfO;oB@rM6AQvMD%C}?L3Ss z)oQ6746JGeRiIfnLs1$~4|=ZJXnJ@O5JTkiX4tFTW(JoWagvPTfmuHId(Sg(8ojhH zzrRXjbnIuFv=orA5-4&ZfYs0svp0zN{+VoC({5YD_I>s>?fMR_M_nSzx4le|g!5+9iNPV z-`mCrCK-I%f@tsnT^^M>O{Dz1G=1zFCyTMVlAoV&#w~*X`mUPwY3JOje znDkB&;lBCE9r|;?YyoB$`h#GHO`ZlwAa`I)(k<(|)b3VlOyzV^4N{DBF-zCwojt*L z_bB&pE~43Kn=(D{G(Lw)N)$6>L!G8YW?eWR*oGxIOGjoMt7IKI2bn_@D}Y-H3M?TT zdh(1V;FXB170JpNMN@?@uhvXvNv=dmjmZ-}PMT!+(ln{*8~?+on}xidwR8f+VIM4F zb;k?Y3^>i+gXK!p-tH^oOQ-TehZgI%Xp!GlyEl~hO8Dt{@`IOXCT~J^&GWfek= zn52n%p~RbVK8u|j<8CsL-%qdkJ-DQ^7cKvdt$_0Xpkc56>ni(X1K1H(t`8?8ZPr&b zXiq5)1Q_LGeo6=SU0cu$mNk!2|1&Y2g||{$&IMXv{K)JO(Ot+oFn6{i5*4fZ>qEQN zcTU(A^F@BBZj$(|3Q^A9I7*LeH`ibbM&W_pf@eiN2CKFD#eHh< z5})ty%jDHMqb!;m1T2udD(h8dPc^!^2G}Q!(Et^meE#?u3IY}w1#}E5qKQ5Jy`-;E z{k}CZV@?t#Li#e`iFu0Il)R2)wMg*-@aOJ9g>Ixy#btQYmf#DDnOTeuXSb;R;+(D` z0+Y=kn-!k*uih8lgIJ{cKE6%d( zCcwjSV0bnhO65~#NgiWp`b)l5Y)_6GUSYMjAWG7e4%1AFq+Ywh>AQ#^zAw0@sIaRHQRem)gNvxNN^Rh>0G!o_^;HzQ4TLdqac6Xz4*85LRMTwM(C!Xx z)=z0448jz)bec4h1i5FZ&^S*n{olaqZY1;`3OWT)-mBU40nS!tT@+lx5?I;Co)zCCWbc@k79*i%^g!H-3(Zx)LQ7`(i6 z0gfbs)*w0Ymp0r6Ux~6fQ=F-X-PPDGW{odOn6E@I*b8Ngy?0;qMkkk!J+~I{40=x_ z{1#gD#)SEe_ni-KA3lv6i?@PlvV1GvfVCjrJ{p=|eOtNPZKOc}A~woy7K<#!0-1@$ zM}dJVJ4KGSr-nn895bAV|1N?8VAoE-Fjs-iREj7)&(sxAC+WVr3s(!xqRT7Z)Fo$4 z+R-QVLuOj|7=e(;W*azFe4|no|9D|j^@i(&k@x#A)Nq#aTA5>O=MwawJjH*Nqq{-p zO{>Ila)B}<;;)EGP2h3??LC4CXl9F9vi#^L{AfNi9h%>j@sIr<1_1Yl{?n}AgIQ>& zoAppy;{W%qvF3}%@E=EIkQ!=unMu6r-@6)C?njHbT*7oJeNWP*w$b^b`=_;rJX=Pl z!1zD1U#z=d>Y?#QJHh@tiuCO_Y0jPK!L2Wn%1lt(C1#6(Ej7ki%rr3>k4A`-x-WxE zSh-DfrW?S*+F9$E*i3C#!_6k`f0&A}pyO*5Ayc;1C6%nBa~cYj+_V>6%14vcnBzIy z#eIJz{CU>Wb||*sMch=uam%Iyk^M3*&(|}9un$d$fAilH;6HN!vAA-V?0{f#u)oAo zwknOE_Gw(XkrUI<7M6vT12$h{Jro+rQHQf!1Y$?Vy0Av&GM%rX2wPRjg zi$|YR5XPPMhodIce+fya&+rW%i|Bl!^;rw`fOC zA(Ep7Mx{#lwuJ5GSgq1|D46f=%>-eh8n|q~hCAzGER?H_ z^HgLf#q*_7;lMk4b2~gHCG;$*qS?Tx<S->I*pr0pX6v;n&Tl$QYYB9dfHv_vAz#X4_MfNIxQe|!cy zy}xtQP)_VqI)uQwU+~1Jl#T|jvH2Cape03Xz(#~mANRs~w~HNEMc0PPo!*f^EEK zMHz_#dz_lH?OhmBROuqO%CKKWj z`;afv9?#i2DyquZ3HuU3nNz)q&@=?EEca;mp&2s2^AbBThJ^%UOvAf-4w9@vT->nh zwU=hH<_^}@Ri@id$T8s_wE&OXT~fcqY!qsnkH7MObi=5T=B;Gi=>{R53U_+UMfwHe zKJ^*7FOY;g$J6^L40paUK93|;&{rTDZ~CPF>o6ksXBc;6d7RjUouWvvqLO71`@R~dCo`n{#6VL8Ze!4?f9Q3Xd?p8Eq7x9^7ezU=72 zop-sxp8pCGC;3P5Uikq!Scf~-FZMzstQP}V{qg}4oO%tPh2DjU*L~|`16^|XoI+~ne|dCP+;)tbGQp~U;W@y!?X=5 zT=CV+&(jG(Kbo5Ht^3&bZ%MtVtWh(D1QuFfSHL>|h*7z`W-Cc6OMhj!4Z~5g;1B_V z<;2>&5&ti$- zl{%3c)IBc6ZC4-_JA?i}q4SM}d$*HU;gaQQk{g=-hBmoomVIauNo2vlA3|&IB?*@o zo&+aE4#(J1=4B^`NM9YIZ0kSO>=pwP!)A4=q8LeDYGviH!TrI9X6FT4mgF(du~&5J zvqE;yW{=VRX62yeF-K``pi4ge=^c~Bl>3*P{lZNG-hCDgS!21|duj`yd3md$DxEkr zWzx5M)WZ2-raBS*B%N>zs9JbD9FsclgIpTiw-SxSd%`TKB8NTD(*JV5CUt|9mz$uVUpp-($)*Cx z;X%8Ziv=(I_Y+4~dwwe=H{$P$j!-vk*);rdd+K;g&>0qg#6)l}GuLQyh&@ZPOwirZ z$=|oE>p=QXl{LFQZSPowasazASZt2cUVAo*9PEnUKOXdWkaXnOd?(+aa;J%`N19TL zR3VEsp_fB@e_SW4hVJaTV~Kl%qMmg$)0@c*{+@Xh*4@$YnW~ea7~{B=`?U-?3Acvm zs&uB*wA8RlLvW?wG{Q@zKHgS3!(+HJ&mXEV`@Hb0k_HF0v%Sx#jsbT^$GHi2X}yIRND4u%pV*u$yVt2 zc???PNuvQb7!nzTzY4eDL5h?$#B zBQ-;E&CiRD5_u%Ij2riFkMRFEg+PL?eyUDb;G!k2Y6K@V8kdZjtFheU+Eukci06hy zhlw)ed{Qg!QjCVhFf&~zF|(fvtvQj^%eiOX&nA^x=kTdRb7Cy^8*3SiLn;9!f@JEf zwjR&YVa@iCeK<0Qeof9bvZxiT_?zx)UfSGVM*GoeNyU=Wj#d0QrG%-Y5)g3lxY?RM z5#;9|4Ee-=#f|hx)moe+^W7rn_Z(`3Y}8aTHk`8mXd!!5G)F!pD$`ik#~FSr|jOn!77Rr!LYh@#;tKSM`SOd-tx zgSNv}pMosj#WpvG!g>e!1YBr7cF+W%)mw1a+6$J2=^j*;tV$UQXg$0kz(DG@U%6@V zt(lyTZvBMysI_|Cj;`k^DV#_EM`KSIQGcMc>ag7@XsP$o1~x^L+i70E`+D=xveU(> zo#>2;-d0fJbduoYdt1l?p-sh?eL05JoA8(YcaV_;c@EHmJmX9h&=SL4aSnF7(;kl* zRKGmOKc6MFjdOXLw0YW1Det?5xqH?TlT7|ff#meT=H=>KZK*CapXLppC>#{Cbbj}r z{h=o`OwlU$4DBYr?!yHM_v=g8r-TQFjfjQROO3pW1jWQ<3k>jwHSnFrPj~SFcwZmM;}HT0y2<#*xDqM#vJX)E8XM1+X<UF8yF(b*Z&$XWKx>7bY zsP9x`a#oYW9v_9Mzg+3jTRwIh^36TY?D%53ORh2d<=iedgoSBmW$3dhj7M!8CBPWz zk<&W@Flzdf0S9*n-+RJ%|GuP;Sq&I*KP+2NYMa&9L@mh*AUh3AsJ{9nyt(e46df|L zjfle>9zZLp*wBM$`BoaUWAwutrFg{Ai(@s(>uDcMg^RJLUaqX@bHIWsJi;U7w*B%K z9vy_(fH3d$SNmU&E+?Ek)Q3yP>iAS*1u2ws*Fd|zPoiEjF#DD>nFUH^8l4g*F9Hyy zdY%N9o@*xPV5dh^?w2OJp&U=nsix69uANZy0z}!q#tV~sLBB_WuIzUN*`Wf573^^A zw|U8lo$L>HPbV~G=cg3cPtH}YmyF5=$~X7QJ{z++v>eL!NFh;Z^}Ll-k>JaGH)E;` z!^eFIlXIP>w~PvoapBIlynesKEK{KfC>gxY5~cyD^cTqep~hzWI?r)=n9CPIm9M{L z(_9;bpwHi@k>9n1D%Ma_$2m!w-7^wlPrdz|*I=}?p{{ThEj(LLeGNNkW()kAow@Zl zf;TaI^gRUe<`WUA>bS4_H;5x+N*tU`-Q5Gzy=6s{;e9tBPspM~YI@OkUOtTa+6-AD zw%{vI2MF-WS?9THzQch>bgWa!Vtlrux%DH3l;B%knGtnOO7q~Wgm;&zfo>4K7M?l@ zoc-sqN{K7dZ68MNV86N;1fWl^Se$~8(cg2QbYD=8gFql!?1djDsK}I>&}?HFPLjkQ W`c(?wkNW@afaE?YNta6+1^gGSDR9sL delta 7805 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 XzF1VVP2Si8{R=I1U9}1o>-YZ)t-Yl0 diff --git a/docs/_static/bootswatch-2.3.2/img/glyphicons-halflings.png b/docs/_static/bootswatch-2.3.2/img/glyphicons-halflings.png index 8bc9e642b762a7c2f50a84e6c721af5d5f538929..a9969993201f9cee63cf9f49217646347297b643 100644 GIT binary patch literal 12799 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 literal 12764 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 diff --git a/docs/_static/bootswatch-2.3.2/journal/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/journal/bootstrap.min.css index 261963a..f310a55 100644 --- a/docs/_static/bootswatch-2.3.2/journal/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/journal/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=News+Cycle:400,700');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/readable/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/readable/bootstrap.min.css index 32f12a6..0efc48f 100644 --- a/docs/_static/bootswatch-2.3.2/readable/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/readable/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/simplex/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/simplex/bootstrap.min.css index b0d924a..a3e828f 100644 --- a/docs/_static/bootswatch-2.3.2/simplex/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/simplex/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Josefin+Sans:300,400,700');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/spacelab/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/spacelab/bootstrap.min.css index d455dc0..7b7b4bb 100644 --- a/docs/_static/bootswatch-2.3.2/spacelab/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/spacelab/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/spruce/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/spruce/bootstrap.min.css index 3fb0775..6d5279c 100644 --- a/docs/_static/bootswatch-2.3.2/spruce/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/spruce/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url(//fonts.googleapis.com/css?family=Crete+Round);/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/superhero/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/superhero/bootstrap.min.css index 3f416a9..6635d7d 100644 --- a/docs/_static/bootswatch-2.3.2/superhero/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/superhero/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url('//fonts.googleapis.com/css?family=Oswald|Noticia+Text');/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-2.3.2/united/bootstrap.min.css b/docs/_static/bootswatch-2.3.2/united/bootstrap.min.css index e261220..29cb6b6 100644 --- a/docs/_static/bootswatch-2.3.2/united/bootstrap.min.css +++ b/docs/_static/bootswatch-2.3.2/united/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url(//fonts.googleapis.com/css?family=Ubuntu);/*! * Bootstrap v2.3.2 * * Copyright 2012 Twitter, Inc diff --git a/docs/_static/bootswatch-3.3.7/cosmo/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/cosmo/bootstrap.min.css index c8a7c43..5ddc0b4 100644 --- a/docs/_static/bootswatch-3.3.7/cosmo/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/cosmo/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/cyborg/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/cyborg/bootstrap.min.css index f364f81..3b9a526 100644 --- a/docs/_static/bootswatch-3.3.7/cyborg/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/cyborg/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto:400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/darkly/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/darkly/bootstrap.min.css index ea052b6..90f14a4 100644 --- a/docs/_static/bootswatch-3.3.7/darkly/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/darkly/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/flatly/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/flatly/bootstrap.min.css index 129ae1d..afeeb3b 100644 --- a/docs/_static/bootswatch-3.3.7/flatly/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/flatly/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/journal/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/journal/bootstrap.min.css index 415a910..de6209c 100644 --- a/docs/_static/bootswatch-3.3.7/journal/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/journal/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=News+Cycle:400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/lumen/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/lumen/bootstrap.min.css index cc4517f..0bb7b1c 100644 --- a/docs/_static/bootswatch-3.3.7/lumen/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/lumen/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700,400italic");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/paper/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/paper/bootstrap.min.css index 2a6caf1..e8d6228 100644 --- a/docs/_static/bootswatch-3.3.7/paper/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/paper/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/readable/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/readable/bootstrap.min.css index 57ff084..7b3cf73 100644 --- a/docs/_static/bootswatch-3.3.7/readable/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/readable/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Raleway:400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/sandstone/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/sandstone/bootstrap.min.css index b0416b4..e2596a7 100644 --- a/docs/_static/bootswatch-3.3.7/sandstone/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/sandstone/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto:400,500,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/simplex/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/simplex/bootstrap.min.css index dd33ce2..b040e19 100644 --- a/docs/_static/bootswatch-3.3.7/simplex/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/simplex/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/solar/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/solar/bootstrap.min.css index cb1e238..42ab992 100644 --- a/docs/_static/bootswatch-3.3.7/solar/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/solar/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2017 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/spacelab/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/spacelab/bootstrap.min.css index f56202e..1cd4857 100644 --- a/docs/_static/bootswatch-3.3.7/spacelab/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/spacelab/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/superhero/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/superhero/bootstrap.min.css index 967e0dc..ceac7d5 100644 --- a/docs/_static/bootswatch-3.3.7/superhero/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/superhero/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:300,400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/united/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/united/bootstrap.min.css index 3cf4fa9..e6a405a 100644 --- a/docs/_static/bootswatch-3.3.7/united/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/united/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Ubuntu:400,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/bootswatch-3.3.7/yeti/bootstrap.min.css b/docs/_static/bootswatch-3.3.7/yeti/bootstrap.min.css index 8a3d742..cda7d4a 100644 --- a/docs/_static/bootswatch-3.3.7/yeti/bootstrap.min.css +++ b/docs/_static/bootswatch-3.3.7/yeti/bootstrap.min.css @@ -1,3 +1,4 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700");/*! * bootswatch v3.3.7 * Homepage: http://bootswatch.com * Copyright 2012-2016 Thomas Park diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index b12dc86..8e02366 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '2021-04-28', + VERSION: '2023-09-27', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/ccid/README.html b/docs/ccid/README.html index 05702a4..7924a13 100644 --- a/docs/ccid/README.html +++ b/docs/ccid/README.html @@ -4,7 +4,7 @@ - USB CCID Emulator — vsmartcard 2021-04-28 documentation + USB CCID Emulator — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -24,6 +20,10 @@ + + + + @@ -144,7 +144,7 @@
-
+

USB CCID Emulator

@@ -163,8 +163,51 @@ standard USB CCID reader. USB CCID Emulator can be used as trusted intermediary enabling secure PIN entry and PIN modification. In combination with OpenSC 2 also PACE can be performed by the emulator.

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\tikzstyle{bla}=[kleiner, text width=.45\textwidth] + +\node (reader) +{\includegraphics[width=1cm]{$wd/bilder/my_cardreader.pdf}}; +\node (readertext) [right=0of reader, bla] +{Smartphone provides smart card reader via USB}; +\node (display) [below=0of reader] +{\includegraphics[width=1cm]{$wd/bilder/display.pdf}}; +\node (displaytext) [right=0of display, bla] +{Secure display of service provider and purpose of transaction}; +\node (keyboard) [below=0of display] +{\includegraphics[width=1cm]{$wd/bilder/keyboard.pdf}}; +\node (keyboardtext) [right=0of keyboard, bla] +{Secure PIN Entry}; +\node (firewall) [below=0of keyboard] +{\includegraphics[width=1cm]{$wd/bilder/Firewall.pdf}}; +\node (firewalltext) [right=0of firewall, bla] +{Verification of terminal authentication and sanitiy checks}; + +\node (features) [fit=(display) (keyboard) (reader) (firewall)] {}; + +\node (moko) [left=0of features.west] {\includegraphics[height=4cm]{$wd/bilder/phone-fic-neo-freerunner.pdf}}; + +\node (epa) [left=1.5of moko, yshift=-2cm] +{\includegraphics[width=3cm]{$wd/bilder/nPA_VS.png}}; +\node (pc) [left=1.5of moko, yshift=1.5cm] +{\includegraphics[width=3cm]{$wd/bilder/computer-tango.pdf}}; + +\begin{pgfonlayer}{background} + + \node (mokobox) + [box, + fit=(moko) (readertext) (displaytext) (keyboardtext) (firewalltext) + (features)] {}; + + \draw [usb] + (moko) -- (pc.center) ; + \draw [decorate, decoration={expanding waves, angle=20, segment length=6}, nichtrundelinie] + (moko) -- (epa) ; + +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

Portable smart card reader with trusted user interface

If the machine running ccid-emulator is in USB device mode, a local reader is forwareded via USB to another machine. If in USB host mode, the USB @@ -201,7 +244,7 @@ their PC/SC counterpart:

transmitting (SCardTransmit) specially crafted APDUs. Only the alternative initialization of PACE using SCardControl requires patching the driver (available for libccid, see patches). The pseudo APDUs with no need for -patches are defined as follows (see BSI TR-03119 1.3 6 p. 33-34):

+patches are defined as follows (see BSI TR-03119 1.3 7 p. 33-34):

@@ -269,19 +312,143 @@ an error

The USB CCID Emulator is implemented using GadgetFS 1. Some fragments of the source code are based on the GadgetFS example and on the source code of the OpenSC tools.

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\tikzstyle{schicht}=[text width=5cm, align=right] +\tikzstyle{fade down}=[path fading=south, color=huslateblue] + + \node (kernel) +[box, shape=rectangle split, rectangle split parts=3, kleiner] + {Linux Kernel + \nodepart{second} +\footnotesize S3C24xx Controller Driver + \nodepart{third} +\footnotesize GadgetFS + }; + + \node (ccid) + [aktivbox, shape=rectangle split, rectangle split parts=2, below=of kernel] + {CCID Emulator + \nodepart{second} +\texttt{usb}\qquad\texttt{ccid} + }; + \draw [box] ($(ccid.text split)-(.05cm,0)$) -- ($(ccid.south)-(.05cm,0)$); + + \node (opensc) [box, below=of ccid, kleiner] {OpenSC}; + +\node (controller) [klein, right=0of kernel.two east, schicht] +{Driver for USB Controller}; +\node (gadget) [klein, right=0of kernel.three east, schicht] +{Gadget Driver}; +\node (upper) [klein, right=0of kernel.three east, schicht, yshift=-1.75cm] +{Upper Layers}; + +\tikzstyle{rechts}=[to path={-- ++(1,0) |- (\tikztotarget)}] +\tikzstyle{links}=[to path={-- ++(-1,0) |- (\tikztotarget)}] +\begin{pgfonlayer}{background} + \path + (ccid.two west) edge [links, linie] (kernel.three west) + (ccid.two east) edge [rechts, linie] (opensc.east) + ; + + \path [color=black!30] + (controller.north east) edge +(-9,0) + (gadget.north east) edge +(-9,0) + (upper.north east) edge +(-9,0) + ; +\end{pgfonlayer} + +\node [kleiner, anchor=east, text width=3cm] +at ($($(ccid.two west)+(-3,0)$)!.5!(kernel.three west)$) +{\color{hublue} +\texttt{/dev/gadget/ep1-bulk}\\ +\texttt{/dev/gadget/ep2-bulk}\\ +\texttt{/dev/gadget/ep3-bulk}\\};)

+

!pdf2svg command cannot be run

+

Software stack of the USB CCID Emulator running on the OpenMoko Neo FreeRunner

-

Running the USB CCID Emulator has the following dependencies:

- -

Whereas using the USB CCID Emulator on the host system as smart card reader only +

Whereas using the USB CCID Emulator on the host system as smart card reader only needs a usable PC/SC middleware with USB CCID driver. This is the case for most modern Windows and Unix-like systems by default.

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\tikzstyle{keks}=[to path={-- ++(.1,0) |- (\tikztotarget)}] + +\tikzstyle{bla}=[shape=rectangle split, rectangle split parts=2, +every text node part/.style={align=center, klein}, text width=7cm, +every second node part/.style={kleiner}, inner sep=0pt] + +\node (ccid-emulator) +{\texttt{ccid-emulator}}; + +\node (basis) [below=3of ccid-emulator] +{\includegraphics[keepaspectratio, height=2cm, + width=2cm]{$wd/bilder/moko/basisleser_plain_klein.png}}; +\node (basisbeschreibung) [below=0cm of basis, kleiner, text width=2cm] +{Reiner SCT RFID basis}; + +\node (npa) [left=1.5of basis] +{\includegraphics[keepaspectratio, height=3cm, + width=3cm]{$wd/bilder/nPA_VS.png}}; +\node (npabeschreibung) [below=0cm of npa, kleiner] +{German identity card}; + +\node (funktionenchat) [right=.6cm of ccid-emulator.east, anchor=text west, bla] +{ + PACE + \nodepart{second} + \begin{itemize} + + \item Display CHAT + \begin{itemize} + \item Display context (eID/eSign) + \item Display requested permissions + \end{itemize} + + \item Display certificate description + \begin{itemize} + \item Identification of service provider + \item Display purpose of transaction + \end{itemize} + + \item Secure PIN entry + \end{itemize} +}; +\node (funktionenpace) [below=.5 of funktionenchat, bla] +{ + Terminal Authentication + \nodepart{second} + \begin{itemize} + \item Verify authenticy of terminal + \item Check freshness of cv certificate + \end{itemize} +}; + +\begin{pgfonlayer}{background} + \node (box) [fit=(ccid-emulator) (basis) (basisbeschreibung) + (funktionenchat) (funktionenpace), box, inner sep=.5cm] {}; + \node (boxbild) at (box.north west) + {\includegraphics[keepaspectratio, height=1.5cm, + width=1.5cm]{$wd/bilder/moko/moko_reader.png}}; + \node [right=0cm of boxbild.east, yshift=.3cm] + {Openmoko Neo FreeRunner}; +\end{pgfonlayer} + +\node (a) [above=1of npa] + {\includegraphics[keepaspectratio, height=3cm, + width=3cm]{$wd/bilder/computer-tango.pdf}}; + + +\begin{pgfonlayer}{background} + \path + (ccid-emulator) edge [doppelpfeil] (basis) + (basis) edge [rfid] (npa) + (a.center) edge [usb] (ccid-emulator) + (ccid-emulator.east) edge [pfeil, keks] (funktionenchat.text west) + (ccid-emulator.east) edge [pfeil, keks] (funktionenpace.text west); +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

Implementation of a mobile smart card reader for the German ID card

Download

@@ -289,6 +456,8 @@ modern Windows and Unix-like systems by default.

still available on Sourceforge.

Alternatively, you can clone our git repository:

git clone https://github.com/frankmorgner/vsmartcard.git
+cd vsmartcard
+git submodule update --init --recursive
 
@@ -312,13 +481,18 @@ make install

The USB CCID Emulator depends on libopensc, which is automatically -built from a snapshot of the OpenSC source code and then statically linked.

+built from a snapshot of the OpenSC2 source code and then statically linked.

+

Running the USB CCID Emulator has the following dependencies:

+

Hints on GadgetFS

To create a USB Gadget in both USB host and USB client mode, you need to load the kernel module gadgetfs. Here is how to get a running version of -GadgetFS on a Debian system (see also OpenMoko Wiki 5):

+GadgetFS on a Debian system (see also OpenMoko Wiki 6):

sudo apt-get install linux-source linux-headers-`uname -r`
 sudo tar xjf /usr/src/linux-source-*.tar.bz2
 cd linux-source-*/drivers/usb/gadget
@@ -349,12 +523,12 @@ loading the module, you maybe want to check out Usage
 

The USB CCID Emulator has various command line options to customize the appearance on the USB host. In order to run the USB CCID Emulator GadgetFS must be loaded -and mounted. The USB CCID Emulator is compatible with the unix driver libccid 3 -and the Windows USB CCID driver 4. PIN commands are supported if implemented +and mounted. The USB CCID Emulator is compatible with the unix driver libccid 4 +and the Windows USB CCID driver 5. PIN commands are supported if implemented by the driver.

New in version 0.7: USB CCID Emulator now supports the boxing commands defined in BSI TR-03119 -1.3 6.

+1.3 7.

Usage: ccid-emulator [OPTION]...
 Emulate a USB CCID compliant smart card reader
@@ -396,15 +570,18 @@ more than welcome! Please use our https://github.com/frankmorgner/OpenSC

3
-

https://ccid.apdu.fr/

+

https://www.openssl.org

4
-

http://msdn.microsoft.com/en-us/windows/hardware/gg487509

+

https://ccid.apdu.fr/

5
+

http://msdn.microsoft.com/en-us/windows/hardware/gg487509

+
+
6

http://wiki.openmoko.org/wiki/Building_Gadget_USB_Module

-
6(1,2)
+
7(1,2)

https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr03119/index_htm.html

@@ -423,7 +600,7 @@ more than welcome! Please use our - Welcome to the Virtual Smart Card Architecture documentation! — vsmartcard 2021-04-28 documentation + Welcome to the Virtual Smart Card Architecture documentation! — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -23,6 +19,10 @@ + + + + @@ -132,15 +132,40 @@
-
+

Welcome to the Virtual Smart Card Architecture documentation!

Welcome to the Virtual Smart Card Architecture. Virtual Smart Card Architecture is an umbrella project for various projects concerned with the emulation of different types of smart card readers or smart cards themselves.

-
-

Figure made with TikZ

+
+

System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\tikzstyle{bla}=[box, klein, rounded rectangle, inner sep=.3cm] +\node (a) {}; + +\node[bla, above left=.5cm of a] +(usb) {USB Terminal}; + +\node[bla, below left=.5cm of a] +(nfc) {NFC Terminal}; + +\node[bla, rounded rectangle left arc=concave, above right=.5cm of a] +(sc) {Real Smart Card}; + +\node[bla, rounded rectangle left arc=concave, below right=.5cm of a] +(vsc) {Virtual Smart Card}; + +\begin{pgfonlayer}{background} +\path[line width=.8cm,color=hublue!20] +(a.mid) edge [out=180, in=0] (usb.center) +edge [out=180, in=0] (nfc.center) +edge [out=0, in=180] (sc.center) +edge [out=0, in=180] (vsc.center) +; +\end{pgfonlayer})

+

!pdf2svg command cannot be run

+

The Virtual Smart Card Architecture connects different aspects of smart card handling

Currently the following projects are part of Virtual Smart Card Architecture:

@@ -161,9 +186,9 @@ have a look at these programming guides and try yourself:

  • Creating a Virtual Smart Card
  • -Travis CI Build Status Image -AppVeyor CI Build Status Image -Coverity Scan Status +GitHub CI status +AppVeyor CI status +Coverity Scan status

    Download

    You can download the latest release of the Virtual Smart Card Architecture here. Older releases are @@ -212,7 +237,7 @@ location.

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/objects.inv b/docs/objects.inv index f26e99bdff4533322665cac7d99494fdb99b2aec..2fb98a8b0c827eea7e63394cdfeba741aa533aa5 100644 GIT binary patch delta 4153 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 diff --git a/docs/pcsc-relay/README.html b/docs/pcsc-relay/README.html index c6929e4..89e1f14 100644 --- a/docs/pcsc-relay/README.html +++ b/docs/pcsc-relay/README.html @@ -4,7 +4,7 @@ - PC/SC Relay — vsmartcard 2021-04-28 documentation + PC/SC Relay — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -24,6 +20,10 @@ + + + + @@ -146,7 +146,7 @@
    -
    +

    PC/SC Relay

    @@ -166,7 +166,7 @@

    Welcome to PC/SC Relay. The purpose of PC/SC Relay is to relay a smart card using an contact-less interface. Currently the following contact-less -emulators are supported:

    +emulators are supported:

    Command APDUs are received with the contact-less interface and relayed. The Response APDUs are then sent back via RFID. The contact-less data will be -relayed to one of the following:

    +relayed to one of the following connectors:

    • to a real smart card inserted into one of the systems’ smart card readers. The smart card reader must be accessible with PC/SC. The smart card may be @@ -183,14 +183,147 @@ contact-based or contact-less.

    • smart card’s native interface is used and (despite its name) PC/SC Relay does not need to access PC/SC in this case.

    -
    -

    Figure made with TikZ

    +
    ┌────────┐          ┌──────────┐          ┌─────────┐
    +│Emulator│          │pcsc-relay│          │Connector│
    +└───┬────┘          └────┬─────┘          └────┬────┘
    +    │    Command APDU    │                     │
    +    │ ───────────────────>                     │
    +    │                    │ ───────────────────>│
    +    │                    │ <───────────────────│
    +    │    Response APDU   │                     │
    +    │ <───────────────────                     │
    +┌───┴────┐          ┌────┴─────┐          ┌────┴────┐
    +│Emulator│          │pcsc-relay│          │Connector│
    +└────────┘          └──────────┘          └─────────┘
    +
    +
    +
    +

    System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\node (pcsc-relay) {\texttt{pcsc-relay}}; + +\node [kleiner, right=2cm of pcsc-relay, yshift=.9cm] +(libnfc) {Libnfc Devices}; +\node [kleiner, right=2cm of pcsc-relay, yshift=.3cm] +(openpicc) {OpenPICC}; +\node [kleiner, right=2cm of pcsc-relay, yshift=-.3cm] +(vpcd) {Virtual Smart Card Reader}; +\node [kleiner, right=2cm of pcsc-relay, yshift=-.9cm] +(acardemulator) {Android Smart Card Emulator}; + +\node [kleiner, left=2cm of pcsc-relay, yshift=.9cm] +(contactbased) {Contact-based Smart Card}; +\node [kleiner, left=2cm of pcsc-relay, yshift=.3cm] +(contactless) {Contact-less Smart Card}; +\node [kleiner, left=2cm of pcsc-relay, yshift=-.9cm] +(remotereader) {Remote Smart Card Reader}; +\node [kleiner, left=2cm of pcsc-relay, yshift=-.3cm] +(virtual) {Virtual Smart Card}; + +\node [above=.3cm of pcsc-relay, kleiner, xshift=1.2cm] +(capdu) {Command APDU}; +\node [below=.3cm of pcsc-relay, kleiner, xshift=-1.2cm] +(rapdu) {Response APDU}; +\draw (rapdu.east) edge [pfeil] +(1,0); +\draw (capdu.west) edge [pfeil] +(-1,0); + +\begin{pgfonlayer}{background} +\path[line width=.5cm,color=hublue!20] +(pcsc-relay.mid) edge [out=180, in=0] (contactbased.east) +edge [out=180, in=0] (contactless.east) +edge [out=180, in=0] (virtual.east) +edge [out=180, in=0] (remotereader.east) +edge [out=0, in=180] (libnfc.west) +edge [out=0, in=180] (openpicc.west) +edge [out=0, in=180] (vpcd.west) +edge [out=0, in=180] (acardemulator.west) +; +\end{pgfonlayer})

    +

    !pdf2svg command cannot be run

    +

    Debug, Analyze and Emulate with PC/SC Relay

    With PC/SC Relay you can relay a contact-less or contact based smart card over a long distance. Also you can use it in combination with the Virtual Smart Card to completely emulate an ISO/IEC 14443 smart card.

    -
    -

    Figure made with TikZ

    +
    +

    System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} +\tikzstyle{bla}=[shape=rectangle split, rectangle split parts=2, +every text node part/.style={align=center, klein}, text width=7cm, +every second node part/.style={kleiner}, inner sep=0pt] + +\tikzstyle{keks}=[to path={-- ++(.1,0) |- (\tikztotarget)}] + +\node (touchatag) + {\includegraphics[keepaspectratio, height=2cm, + width=2cm]{$wd/bilder/touchatag.png}}; +\node (touchatagbeschreibung) [below=0cm of touchatag, kleiner] +{touchatag}; + +\node (pcsc-relay) [right=of touchatag] +{\texttt{pcsc-relay}}; +\node (pcsc-relaybeschreibung) [below=0cm of pcsc-relay, kleiner] +{NFC emulator +}; + +\node (vicc) [right=of pcsc-relay] +{\texttt{vicc -t nPA}}; +\node (viccbeschreibung) [below=0cm of vicc, kleiner] +{nPA emulator}; + +\node (group) [fit=(touchatag) (pcsc-relay) (vicc) (touchatagbeschreibung) +(pcsc-relaybeschreibung) (viccbeschreibung)] {}; +\node (funktionenchat) [below=0cm of group, bla] +{ + PACE + \nodepart{second} + \begin{itemize} + \item Display context (eID/eSign) + \item Display requested permissions + \end{itemize} +}; +\node (funktionenpace) [below=.5 of funktionenchat, bla] +{ + Terminal Authentication + \nodepart{second} + \begin{itemize} + \item Verify authenticy of terminal + \item Check freshness of cv certificate + \item With certificate database + \begin{itemize} + \item Identification of service provider + \item Display purpose of transaction + \end{itemize} + \end{itemize} +}; + +\begin{pgfonlayer}{background} + \node (box) [fit=(touchatag) (pcsc-relay) (vicc) (touchatagbeschreibung) + (pcsc-relaybeschreibung) (viccbeschreibung) (funktionenchat) + (funktionenpace), box, inner sep=.5cm] {}; + \node (boxbild) at (box.north west) + {\includegraphics[keepaspectratio, height=1.5cm, + width=1.5cm]{$wd/bilder/moko/moko_reader.png}}; + \node [right=0cm of boxbild.east, yshift=.3cm] + {Openmoko Neo FreeRunner}; +\end{pgfonlayer} + +\node (a) [left=1.5of box] + {\includegraphics[keepaspectratio, height=4cm, + width=4cm]{$wd/bilder/ivak_kiosk-terminal.pdf}}; +\node (e) [below=0cm of a, text width=2.5cm, align=center] +{(Public) Terminal}; + + +\begin{pgfonlayer}{background} + \path + (touchatag) edge [doppelpfeil] (pcsc-relay) + (pcsc-relay) edge [doppelpfeil] (vicc) + (vicc.east) edge [keks, pfeil] (funktionenchat.text east) + (vicc.east) edge [keks, pfeil] (funktionenpace.text east) + (a) edge [decorate, decoration={expanding waves, angle=20, segment + length=6}, nichtrundelinie] (touchatag.south west); +\end{pgfonlayer})

    +

    !pdf2svg command cannot be run

    +

    Emulate a contact-less German ID card to perform sanity checks

    PC/SC Relay has the following dependencies:

      @@ -209,6 +342,8 @@ but it generally concerns all contact-less smart cards.

      still available on Sourceforge.

      Alternatively, you can clone our git repository:

      git clone https://github.com/frankmorgner/vsmartcard.git
      +cd vsmartcard
      +git submodule update --init --recursive
       
    @@ -420,7 +555,7 @@ more than welcome! Please use our - Remote Smart Card Reader — vsmartcard 2021-04-28 documentation + Remote Smart Card Reader — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -24,6 +20,10 @@ + + + + @@ -138,7 +138,7 @@
    -
    +

    Remote Smart Card Reader

    @@ -157,8 +157,26 @@ smartcard reader. On the host computer a special smart card driver, vpcd, must be installed. The app establishes a connection to vpcd over the network when a contact-less card is detected.

    -
    -

    Figure made with TikZ

    +
    +

    System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} + \node (pcsc) [klein, aktivbox, inner xsep=.75cm, align=center] {PC/SC\\Framework}; +\node (sca) [aktivbox, klein, left=.75cm of pcsc, align=center] {Smart Card\\Application}; +\node (vpcd) [box, at=(pcsc.east), kleiner] {\texttt{vpcd}}; +\node (phone) [right=2cm of vpcd] {\includegraphics[width=3cm]{$wd/bilder/smartphone.pdf}}; +\node (app) [at=(phone.center)] {\includegraphics[width=2.8cm, height=4.9cm]{$wd/bilder/remote-reader.png}}; +\node (card) [right=0cm of phone, rotate=45] {\includegraphics[width=2cm]{$wd/bilder/smartcard.pdf}}; + +\begin{pgfonlayer}{background} + \node (box) [box, fit=(pcsc) (sca) (vpcd), inner ysep=1.5em] {}; + \node [at=(box.north west)] {\includegraphics[width=1cm]{$wd/bilder/computer-tango.pdf}}; + \path[linie] + (sca) edge (pcsc) + (vpcd) edge node {\includegraphics[width=1.5cm]{$wd/bilder/simplecloud.pdf}} (app) + ; + \draw [rfid] (phone.center) -- (card.center) ; +\end{pgfonlayer})

    +

    !pdf2svg command cannot be run

    +

    Remote Smart Card Reader used to access a contact-less card

    The Remote Smart Card Reader has the following dependencies:

      @@ -171,8 +189,30 @@ requires permission to access the camera

    For remotely accessing a traditional smart card reader on one computer from an other computer, the Virtual Smart Card in relay mode can be used:

    -
    -

    Figure made with TikZ

    +
    +

    System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} + \node (pcsc) [klein, aktivbox, inner xsep=.75cm, align=center] {PC/SC\\Framework}; +\node (sca) [aktivbox, klein, left=.75cm of pcsc, align=center] {Smart Card\\Application}; +\node (vpcd) [box, at=(pcsc.east), kleiner] {\texttt{vpcd}}; + \node (pcsc2) [klein, aktivbox, inner xsep=.75cm, align=center, below=2.5cm of vpcd] {PC/SC\\Framework}; +\node (vicc) [aktivbox, left=1cm of pcsc2, kleiner] {\texttt{vicc -t relay}}; +\node (reader) [right=1cm of pcsc2] {\includegraphics[width=2cm]{$wd/bilder/my_cardreader.pdf}}; +\node (card) [at=(reader.east), rotate=45] {\includegraphics[width=2cm]{$wd/bilder/smartcard.pdf}}; + +\begin{pgfonlayer}{background} + \node (box) [box, fit=(pcsc) (sca) (vpcd), inner ysep=1.5em] {}; + \node (box2) [box, fit=(vicc) (pcsc2), inner ysep=1.5em] {}; + \node [at=(box.north west)] {\includegraphics[width=1cm]{$wd/bilder/computer-tango.pdf}}; + \node [at=(box2.north west)] {\includegraphics[width=1cm]{$wd/bilder/computer-tango.pdf}}; + \path[linie] + (sca) edge (pcsc) + (vpcd) edge [out=south, in=north] node {\includegraphics[width=1.5cm]{$wd/bilder/simplecloud.pdf}} (vicc) + (vicc) edge (pcsc2) + (pcsc2) edge [usb] (reader.center) + ; +\end{pgfonlayer})

    +

    !pdf2svg command cannot be run

    +

    Virtual Smart Card used in relay mode to remotely access a card

    Note

    @@ -228,7 +268,7 @@ more than welcome! Please use our - Search — vsmartcard 2021-04-28 documentation + Search — vsmartcard 2023-09-27 documentation @@ -12,16 +12,10 @@ - - - - - - + + @@ -29,6 +23,10 @@ + + + + @@ -121,7 +119,7 @@
    -
    +

    Search

    @@ -145,9 +143,9 @@
    - - + +
    @@ -164,7 +162,7 @@

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/searchindex.js b/docs/searchindex.js index 4286fb3..5189e16 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["ACardEmulator/README","TCardEmulator/README","ccid/README","index","pcsc-relay/README","remote-reader/README","virtualsmartcard/README","virtualsmartcard/api","virtualsmartcard/api/virtualsmartcard","virtualsmartcard/api/virtualsmartcard.CardGenerator","virtualsmartcard/api/virtualsmartcard.ConstantDefinitions","virtualsmartcard/api/virtualsmartcard.CryptoUtils","virtualsmartcard/api/virtualsmartcard.SEutils","virtualsmartcard/api/virtualsmartcard.SWutils","virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem","virtualsmartcard/api/virtualsmartcard.SmartcardSAM","virtualsmartcard/api/virtualsmartcard.TLVutils","virtualsmartcard/api/virtualsmartcard.VirtualSmartcard","virtualsmartcard/api/virtualsmartcard.cards","virtualsmartcard/api/virtualsmartcard.cards.HandlerTest","virtualsmartcard/api/virtualsmartcard.cards.Relay","virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman","virtualsmartcard/api/virtualsmartcard.cards.cryptoflex","virtualsmartcard/api/virtualsmartcard.cards.ePass","virtualsmartcard/api/virtualsmartcard.cards.nPA","virtualsmartcard/api/virtualsmartcard.tests","virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test","virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test","virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test","virtualsmartcard/api/virtualsmartcard.tests.utils_test","virtualsmartcard/api/virtualsmartcard.utils"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinxcontrib.bibtex":7,sphinx:56},filenames:["ACardEmulator/README.txt","TCardEmulator/README.txt","ccid/README.txt","index.txt","pcsc-relay/README.txt","remote-reader/README.txt","virtualsmartcard/README.txt","virtualsmartcard/api.txt","virtualsmartcard/api/virtualsmartcard.txt","virtualsmartcard/api/virtualsmartcard.CardGenerator.txt","virtualsmartcard/api/virtualsmartcard.ConstantDefinitions.txt","virtualsmartcard/api/virtualsmartcard.CryptoUtils.txt","virtualsmartcard/api/virtualsmartcard.SEutils.txt","virtualsmartcard/api/virtualsmartcard.SWutils.txt","virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem.txt","virtualsmartcard/api/virtualsmartcard.SmartcardSAM.txt","virtualsmartcard/api/virtualsmartcard.TLVutils.txt","virtualsmartcard/api/virtualsmartcard.VirtualSmartcard.txt","virtualsmartcard/api/virtualsmartcard.cards.txt","virtualsmartcard/api/virtualsmartcard.cards.HandlerTest.txt","virtualsmartcard/api/virtualsmartcard.cards.Relay.txt","virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman.txt","virtualsmartcard/api/virtualsmartcard.cards.cryptoflex.txt","virtualsmartcard/api/virtualsmartcard.cards.ePass.txt","virtualsmartcard/api/virtualsmartcard.cards.nPA.txt","virtualsmartcard/api/virtualsmartcard.tests.txt","virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test.txt","virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test.txt","virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test.txt","virtualsmartcard/api/virtualsmartcard.tests.utils_test.txt","virtualsmartcard/api/virtualsmartcard.utils.txt"],objects:{"virtualsmartcard.CardGenerator":{CardGenerator:[9,1,1,""]},"virtualsmartcard.CardGenerator.CardGenerator":{__generate_cryptoflex:[9,2,1,""],__generate_ePass:[9,2,1,""],__generate_iso_card:[9,2,1,""],__generate_nPA:[9,2,1,""],generateCard:[9,2,1,""],getCard:[9,2,1,""],readDatagroups:[9,2,1,""],setCard:[9,2,1,""]},"virtualsmartcard.CryptoUtils":{_makesalt:[11,3,1,""],append_padding:[11,3,1,""],calculate_MAC:[11,3,1,""],cipher:[11,3,1,""],crypto_checksum:[11,3,1,""],decrypt:[11,3,1,""],encrypt:[11,3,1,""],get_cipher:[11,3,1,""],get_cipher_blocklen:[11,3,1,""],get_cipher_keylen:[11,3,1,""],hash:[11,3,1,""],operation_on_string:[11,3,1,""],strip_padding:[11,3,1,""]},"virtualsmartcard.SEutils":{ControlReferenceTemplate:[12,1,1,""],Security_Environment:[12,1,1,""]},"virtualsmartcard.SEutils.ControlReferenceTemplate":{__replace_tag:[12,2,1,""],__set_algo:[12,2,1,""],__set_iv:[12,2,1,""],__set_key:[12,2,1,""],parse_SE_config:[12,2,1,""],to_string:[12,2,1,""]},"virtualsmartcard.SEutils.Security_Environment":{_set_SE:[12,2,1,""],compute_cryptographic_checksum:[12,2,1,""],compute_digital_signature:[12,2,1,""],decipher:[12,2,1,""],encipher:[12,2,1,""],generate_public_key_pair:[12,2,1,""],hash:[12,2,1,""],manage_security_environment:[12,2,1,""],parse_SM_CAPDU:[12,2,1,""],perform_security_operation:[12,2,1,""],protect_response:[12,2,1,""],verify_certificate:[12,2,1,""],verify_cryptographic_checksum:[12,2,1,""],verify_digital_signature:[12,2,1,""]},"virtualsmartcard.SWutils":{SwError:[13,4,1,""]},"virtualsmartcard.SWutils.SwError":{args:[13,5,1,""],with_traceback:[13,2,1,""]},"virtualsmartcard.SmartcardFilesystem":{DF:[14,1,1,""],EF:[14,1,1,""],File:[14,1,1,""],MF:[14,1,1,""],Record:[14,1,1,""],RecordStructureEF:[14,1,1,""],TransparentStructureEF:[14,1,1,""],get_indexes:[14,3,1,""],getfile_byrefdataobj:[14,3,1,""],isEqual:[14,3,1,""],make_property:[14,3,1,""],prettyprint_anything:[14,3,1,""],walk:[14,3,1,""],write:[14,3,1,""]},"virtualsmartcard.SmartcardFilesystem.DF":{append:[14,2,1,""],appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],content:[14,2,1,""],data:[14,2,1,""],decrypt:[14,2,1,""],dfname:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],remove:[14,2,1,""],select:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.EF":{appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],datacoding:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],select:[14,2,1,""],shortfid:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.File":{appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],select:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.MF":{_selectFile:[14,2,1,""],append:[14,2,1,""],appendRecord:[14,2,1,""],appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],content:[14,2,1,""],create:[14,2,1,""],createFile:[14,2,1,""],current:[14,2,1,""],currentDF:[14,2,1,""],currentEF:[14,2,1,""],data:[14,2,1,""],dataObjectHandlingDecodeEncapsulated:[14,2,1,""],dataObjectHandlingDecodePlain:[14,2,1,""],dataUnitsDecodeEncapsulated:[14,2,1,""],dataUnitsDecodePlain:[14,2,1,""],decrypt:[14,2,1,""],deleteFile:[14,2,1,""],dfname:[14,2,1,""],encodeFileControlParameter:[14,2,1,""],encrypt:[14,2,1,""],eraseBinaryEncapsulated:[14,2,1,""],eraseBinaryPlain:[14,2,1,""],eraseRecord:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],firstSFT:[14,2,1,""],getDataEncapsulated:[14,2,1,""],getDataPlain:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],makeFirstSoftwareFunctionTable:[14,2,1,""],makeSecondSoftwareFunctionTable:[14,2,1,""],named_dfs:[14,2,1,""],parent:[14,2,1,""],putDataEncapsulated:[14,2,1,""],putDataPlain:[14,2,1,""],putdata:[14,2,1,""],readBinaryEncapsulated:[14,2,1,""],readBinaryPlain:[14,2,1,""],readRecordEncapsulated:[14,2,1,""],readRecordPlain:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],recordHandlingDecode:[14,2,1,""],remove:[14,2,1,""],searchBinaryEncapsulated:[14,2,1,""],searchBinaryPlain:[14,2,1,""],secondSFT:[14,2,1,""],select:[14,2,1,""],selectFile:[14,2,1,""],simpletlv_data:[14,2,1,""],updateBinaryEncapsulated:[14,2,1,""],updateBinaryPlain:[14,2,1,""],updateRecordEncapsulated:[14,2,1,""],updateRecordPlain:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writeBinaryEncapsulated:[14,2,1,""],writeBinaryPlain:[14,2,1,""],writeRecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.Record":{data:[14,2,1,""],identifier:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.RecordStructureEF":{__getRecords:[14,2,1,""],__getRecordsByIdentifier:[14,2,1,""],__getRecordsByNumber:[14,2,1,""],appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],datacoding:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],eraserecord:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],hasFixedRecordSize:[14,2,1,""],hasSimpleTlv:[14,2,1,""],isCyclic:[14,2,1,""],lifecycle:[14,2,1,""],maxrecordsize:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],recordpointer:[14,2,1,""],records:[14,2,1,""],resetRecordPointer:[14,2,1,""],select:[14,2,1,""],shortfid:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.TransparentStructureEF":{appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],data:[14,2,1,""],datacoding:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],select:[14,2,1,""],shortfid:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardSAM":{SAM:[15,1,1,""],get_referenced_cipher:[15,3,1,""]},"virtualsmartcard.SmartcardSAM.SAM":{FSdecrypt:[15,2,1,""],FSencrypt:[15,2,1,""],_get_referenced_key:[15,2,1,""],change_reference_data:[15,2,1,""],erase_SE:[15,2,1,""],external_authenticate:[15,2,1,""],generate_public_key_pair:[15,2,1,""],get_card_number:[15,2,1,""],get_challenge:[15,2,1,""],internal_authenticate:[15,2,1,""],manage_security_environment:[15,2,1,""],mutual_authenticate:[15,2,1,""],parse_SM_CAPDU:[15,2,1,""],perform_security_operation:[15,2,1,""],protect_result:[15,2,1,""],restore_SE:[15,2,1,""],set_MF:[15,2,1,""],set_asym_algorithm:[15,2,1,""],store_SE:[15,2,1,""],verify:[15,2,1,""]},"virtualsmartcard.TLVutils":{bertlv_pack:[16,3,1,""],bertlv_unpack:[16,3,1,""],decodeDiscretionaryDataObjects:[16,3,1,""],decodeExtendedHeaderList:[16,3,1,""],decodeHeaderList:[16,3,1,""],decodeOffsetDataObjects:[16,3,1,""],decodeTagList:[16,3,1,""],encodeDataOffsetObjects:[16,3,1,""],encodeDiscretionaryDataObjects:[16,3,1,""],encodebertlvDatalist:[16,3,1,""],pack:[16,3,1,""],simpletlv_pack:[16,3,1,""],simpletlv_unpack:[16,3,1,""],tlv_find_tag:[16,3,1,""],tlv_find_tags:[16,3,1,""],tlv_unpack:[16,3,1,""],unpack:[16,3,1,""]},"virtualsmartcard.VirtualSmartcard":{Iso7816OS:[17,1,1,""],SmartcardOS:[17,1,1,""],VirtualICC:[17,1,1,""],loadMitMFromPath:[17,3,1,""]},"virtualsmartcard.VirtualSmartcard.Iso7816OS":{SAM:[17,2,1,""],execute:[17,2,1,""],formatResult:[17,2,1,""],getATR:[17,2,1,""],getResponse:[17,2,1,""],makeATR:[17,2,1,""],makeThirdSoftwareFunctionTable:[17,2,1,""],mf:[17,2,1,""],powerDown:[17,2,1,""],powerUp:[17,2,1,""],reset:[17,2,1,""],seekable:[17,2,1,""]},"virtualsmartcard.VirtualSmartcard.SmartcardOS":{execute:[17,2,1,""],getATR:[17,2,1,""],powerDown:[17,2,1,""],powerUp:[17,2,1,""],reset:[17,2,1,""]},"virtualsmartcard.VirtualSmartcard.VirtualICC":{__recvFromVPICC:[17,2,1,""],__sendToVPICC:[17,2,1,""],connectToPort:[17,2,1,""],openPort:[17,2,1,""],run:[17,2,1,""],stop:[17,2,1,""]},"virtualsmartcard.cards":{HandlerTest:[19,0,0,"-"],Relay:[20,0,0,"-"],RelayMiddleman:[21,0,0,"-"],cryptoflex:[22,0,0,"-"],ePass:[23,0,0,"-"]},"virtualsmartcard.cards.HandlerTest":{HandlerTestOS:[19,1,1,""]},"virtualsmartcard.cards.HandlerTest.HandlerTestOS":{__output_from_le:[19,2,1,""],execute:[19,2,1,""],getATR:[19,2,1,""],powerDown:[19,2,1,""],powerUp:[19,2,1,""],reset:[19,2,1,""]},"virtualsmartcard.cards.Relay":{RelayOS:[20,1,1,""]},"virtualsmartcard.cards.Relay.RelayOS":{cleanup:[20,2,1,""],execute:[20,2,1,""],getATR:[20,2,1,""],powerDown:[20,2,1,""],powerUp:[20,2,1,""],reset:[20,2,1,""]},"virtualsmartcard.cards.RelayMiddleman":{RelayMiddleman:[21,1,1,""]},"virtualsmartcard.cards.RelayMiddleman.RelayMiddleman":{handleInPDU:[21,2,1,""],handleOutPDU:[21,2,1,""]},"virtualsmartcard.cards.cryptoflex":{CryptoflexMF:[22,1,1,""],CryptoflexOS:[22,1,1,""],CryptoflexSAM:[22,1,1,""],CryptoflexSE:[22,1,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexMF":{_selectFile:[22,2,1,""],append:[22,2,1,""],appendRecord:[22,2,1,""],appendrecord:[22,2,1,""],bertlv_data:[22,2,1,""],content:[22,2,1,""],create:[22,2,1,""],createFile:[22,2,1,""],current:[22,2,1,""],currentDF:[22,2,1,""],currentEF:[22,2,1,""],data:[22,2,1,""],dataObjectHandlingDecodeEncapsulated:[22,2,1,""],dataObjectHandlingDecodePlain:[22,2,1,""],dataUnitsDecodeEncapsulated:[22,2,1,""],dataUnitsDecodePlain:[22,2,1,""],decrypt:[22,2,1,""],deleteFile:[22,2,1,""],dfname:[22,2,1,""],encodeFileControlParameter:[22,2,1,""],encrypt:[22,2,1,""],eraseBinaryEncapsulated:[22,2,1,""],eraseBinaryPlain:[22,2,1,""],eraseRecord:[22,2,1,""],erasebinary:[22,2,1,""],fid:[22,2,1,""],filedescriptor:[22,2,1,""],firstSFT:[22,2,1,""],getDataEncapsulated:[22,2,1,""],getDataPlain:[22,2,1,""],getMF:[22,2,1,""],getdata:[22,2,1,""],getpath:[22,2,1,""],lifecycle:[22,2,1,""],makeFirstSoftwareFunctionTable:[22,2,1,""],makeSecondSoftwareFunctionTable:[22,2,1,""],named_dfs:[22,2,1,""],parent:[22,2,1,""],putDataEncapsulated:[22,2,1,""],putDataPlain:[22,2,1,""],putdata:[22,2,1,""],readBinaryEncapsulated:[22,2,1,""],readBinaryPlain:[22,2,1,""],readRecordEncapsulated:[22,2,1,""],readRecordPlain:[22,2,1,""],readbinary:[22,2,1,""],readrecord:[22,2,1,""],recordHandlingDecode:[22,2,1,""],remove:[22,2,1,""],searchBinaryEncapsulated:[22,2,1,""],searchBinaryPlain:[22,2,1,""],secondSFT:[22,2,1,""],select:[22,2,1,""],selectFile:[22,2,1,""],simpletlv_data:[22,2,1,""],updateBinaryEncapsulated:[22,2,1,""],updateBinaryPlain:[22,2,1,""],updateRecordEncapsulated:[22,2,1,""],updateRecordPlain:[22,2,1,""],updatebinary:[22,2,1,""],updaterecord:[22,2,1,""],writeBinaryEncapsulated:[22,2,1,""],writeBinaryPlain:[22,2,1,""],writeRecord:[22,2,1,""],writebinary:[22,2,1,""],writerecord:[22,2,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexOS":{SAM:[22,2,1,""],execute:[22,2,1,""],formatResult:[22,2,1,""],getATR:[22,2,1,""],getResponse:[22,2,1,""],makeATR:[22,2,1,""],makeThirdSoftwareFunctionTable:[22,2,1,""],mf:[22,2,1,""],powerDown:[22,2,1,""],powerUp:[22,2,1,""],reset:[22,2,1,""],seekable:[22,2,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexSAM":{FSdecrypt:[22,2,1,""],FSencrypt:[22,2,1,""],_get_referenced_key:[22,2,1,""],change_reference_data:[22,2,1,""],erase_SE:[22,2,1,""],external_authenticate:[22,2,1,""],generate_public_key_pair:[22,2,1,""],get_card_number:[22,2,1,""],get_challenge:[22,2,1,""],internal_authenticate:[22,2,1,""],manage_security_environment:[22,2,1,""],mutual_authenticate:[22,2,1,""],parse_SM_CAPDU:[22,2,1,""],perform_security_operation:[22,2,1,""],pezorform_security_operation:[22,2,1,""],protect_result:[22,2,1,""],restore_SE:[22,2,1,""],set_MF:[22,2,1,""],set_asym_algorithm:[22,2,1,""],store_SE:[22,2,1,""],verify:[22,2,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexSE":{_set_SE:[22,2,1,""],compute_cryptographic_checksum:[22,2,1,""],compute_digital_signature:[22,2,1,""],decipher:[22,2,1,""],encipher:[22,2,1,""],generate_public_key_pair:[22,2,1,""],hash:[22,2,1,""],manage_security_environment:[22,2,1,""],parse_SM_CAPDU:[22,2,1,""],perform_security_operation:[22,2,1,""],protect_response:[22,2,1,""],verify_certificate:[22,2,1,""],verify_cryptographic_checksum:[22,2,1,""],verify_digital_signature:[22,2,1,""]},"virtualsmartcard.cards.ePass":{PassportSAM:[23,1,1,""],ePass_SE:[23,1,1,""]},"virtualsmartcard.cards.ePass.PassportSAM":{FSdecrypt:[23,2,1,""],FSencrypt:[23,2,1,""],__computeKeys:[23,2,1,""],_get_referenced_key:[23,2,1,""],change_reference_data:[23,2,1,""],derive_key:[23,2,1,""],erase_SE:[23,2,1,""],external_authenticate:[23,2,1,""],generate_public_key_pair:[23,2,1,""],get_card_number:[23,2,1,""],get_challenge:[23,2,1,""],internal_authenticate:[23,2,1,""],manage_security_environment:[23,2,1,""],mutual_authenticate:[23,2,1,""],parse_SM_CAPDU:[23,2,1,""],perform_security_operation:[23,2,1,""],protect_result:[23,2,1,""],restore_SE:[23,2,1,""],set_MF:[23,2,1,""],set_asym_algorithm:[23,2,1,""],store_SE:[23,2,1,""],verify:[23,2,1,""]},"virtualsmartcard.cards.ePass.ePass_SE":{_set_SE:[23,2,1,""],compute_cryptographic_checksum:[23,2,1,""],compute_digital_signature:[23,2,1,""],decipher:[23,2,1,""],encipher:[23,2,1,""],generate_public_key_pair:[23,2,1,""],hash:[23,2,1,""],manage_security_environment:[23,2,1,""],parse_SM_CAPDU:[23,2,1,""],perform_security_operation:[23,2,1,""],protect_response:[23,2,1,""],verify_certificate:[23,2,1,""],verify_cryptographic_checksum:[23,2,1,""],verify_digital_signature:[23,2,1,""]},"virtualsmartcard.tests":{CardGenerator_test:[26,0,0,"-"],CryptoUtils_test:[27,0,0,"-"],SmartcardSAM_test:[28,0,0,"-"],utils_test:[29,0,0,"-"]},"virtualsmartcard.tests.CardGenerator_test":{CryptoflexGeneratorTest:[26,1,1,""],ISO7816GeneratorTest:[26,1,1,""],TestNPACardGenerator:[26,1,1,""]},"virtualsmartcard.tests.CardGenerator_test.CryptoflexGeneratorTest":{_addExpectedFailure:[26,2,1,""],_addSkip:[26,2,1,""],_addUnexpectedSuccess:[26,2,1,""],_baseAssertEqual:[26,2,1,""],_callCleanup:[26,2,1,""],_callSetUp:[26,2,1,""],_callTearDown:[26,2,1,""],_callTestMethod:[26,2,1,""],_classSetupFailed:[26,5,1,""],_class_cleanups:[26,5,1,""],_deprecate:[26,2,1,""],_diffThreshold:[26,5,1,""],_feedErrorsToResult:[26,2,1,""],_formatMessage:[26,2,1,""],_getAssertEqualityFunc:[26,2,1,""],_truncateMessage:[26,2,1,""],addClassCleanup:[26,2,1,""],addCleanup:[26,2,1,""],addTypeEqualityFunc:[26,2,1,""],assertAlmostEqual:[26,2,1,""],assertAlmostEquals:[26,2,1,""],assertCountEqual:[26,2,1,""],assertDictContainsSubset:[26,2,1,""],assertDictEqual:[26,2,1,""],assertEqual:[26,2,1,""],assertEquals:[26,2,1,""],assertFalse:[26,2,1,""],assertGreater:[26,2,1,""],assertGreaterEqual:[26,2,1,""],assertIn:[26,2,1,""],assertIs:[26,2,1,""],assertIsInstance:[26,2,1,""],assertIsNone:[26,2,1,""],assertIsNot:[26,2,1,""],assertIsNotNone:[26,2,1,""],assertLess:[26,2,1,""],assertLessEqual:[26,2,1,""],assertListEqual:[26,2,1,""],assertLogs:[26,2,1,""],assertMultiLineEqual:[26,2,1,""],assertNotAlmostEqual:[26,2,1,""],assertNotAlmostEquals:[26,2,1,""],assertNotEqual:[26,2,1,""],assertNotEquals:[26,2,1,""],assertNotIn:[26,2,1,""],assertNotIsInstance:[26,2,1,""],assertNotRegex:[26,2,1,""],assertNotRegexpMatches:[26,2,1,""],assertRaises:[26,2,1,""],assertRaisesRegex:[26,2,1,""],assertRaisesRegexp:[26,2,1,""],assertRegex:[26,2,1,""],assertRegexpMatches:[26,2,1,""],assertSequenceEqual:[26,2,1,""],assertSetEqual:[26,2,1,""],assertTrue:[26,2,1,""],assertTupleEqual:[26,2,1,""],assertWarns:[26,2,1,""],assertWarnsRegex:[26,2,1,""],assert_:[26,2,1,""],card_type:[26,5,1,""],countTestCases:[26,2,1,""],debug:[26,2,1,""],defaultTestResult:[26,2,1,""],doClassCleanups:[26,2,1,""],doCleanups:[26,2,1,""],fail:[26,2,1,""],failIf:[26,2,1,""],failIfAlmostEqual:[26,2,1,""],failIfEqual:[26,2,1,""],failUnless:[26,2,1,""],failUnlessAlmostEqual:[26,2,1,""],failUnlessEqual:[26,2,1,""],failUnlessRaises:[26,2,1,""],failureException:[26,5,1,""],id:[26,2,1,""],longMessage:[26,5,1,""],maxDiff:[26,5,1,""],run:[26,2,1,""],setUp:[26,2,1,""],setUpClass:[26,2,1,""],shortDescription:[26,2,1,""],skipTest:[26,2,1,""],subTest:[26,2,1,""],tearDown:[26,2,1,""],tearDownClass:[26,2,1,""],test_card_creation:[26,2,1,""],test_get_and_set_card:[26,2,1,""]},"virtualsmartcard.tests.CardGenerator_test.ISO7816GeneratorTest":{_addExpectedFailure:[26,2,1,""],_addSkip:[26,2,1,""],_addUnexpectedSuccess:[26,2,1,""],_baseAssertEqual:[26,2,1,""],_callCleanup:[26,2,1,""],_callSetUp:[26,2,1,""],_callTearDown:[26,2,1,""],_callTestMethod:[26,2,1,""],_classSetupFailed:[26,5,1,""],_class_cleanups:[26,5,1,""],_deprecate:[26,2,1,""],_diffThreshold:[26,5,1,""],_feedErrorsToResult:[26,2,1,""],_formatMessage:[26,2,1,""],_getAssertEqualityFunc:[26,2,1,""],_truncateMessage:[26,2,1,""],addClassCleanup:[26,2,1,""],addCleanup:[26,2,1,""],addTypeEqualityFunc:[26,2,1,""],assertAlmostEqual:[26,2,1,""],assertAlmostEquals:[26,2,1,""],assertCountEqual:[26,2,1,""],assertDictContainsSubset:[26,2,1,""],assertDictEqual:[26,2,1,""],assertEqual:[26,2,1,""],assertEquals:[26,2,1,""],assertFalse:[26,2,1,""],assertGreater:[26,2,1,""],assertGreaterEqual:[26,2,1,""],assertIn:[26,2,1,""],assertIs:[26,2,1,""],assertIsInstance:[26,2,1,""],assertIsNone:[26,2,1,""],assertIsNot:[26,2,1,""],assertIsNotNone:[26,2,1,""],assertLess:[26,2,1,""],assertLessEqual:[26,2,1,""],assertListEqual:[26,2,1,""],assertLogs:[26,2,1,""],assertMultiLineEqual:[26,2,1,""],assertNotAlmostEqual:[26,2,1,""],assertNotAlmostEquals:[26,2,1,""],assertNotEqual:[26,2,1,""],assertNotEquals:[26,2,1,""],assertNotIn:[26,2,1,""],assertNotIsInstance:[26,2,1,""],assertNotRegex:[26,2,1,""],assertNotRegexpMatches:[26,2,1,""],assertRaises:[26,2,1,""],assertRaisesRegex:[26,2,1,""],assertRaisesRegexp:[26,2,1,""],assertRegex:[26,2,1,""],assertRegexpMatches:[26,2,1,""],assertSequenceEqual:[26,2,1,""],assertSetEqual:[26,2,1,""],assertTrue:[26,2,1,""],assertTupleEqual:[26,2,1,""],assertWarns:[26,2,1,""],assertWarnsRegex:[26,2,1,""],assert_:[26,2,1,""],card_type:[26,5,1,""],countTestCases:[26,2,1,""],debug:[26,2,1,""],defaultTestResult:[26,2,1,""],doClassCleanups:[26,2,1,""],doCleanups:[26,2,1,""],fail:[26,2,1,""],failIf:[26,2,1,""],failIfAlmostEqual:[26,2,1,""],failIfEqual:[26,2,1,""],failUnless:[26,2,1,""],failUnlessAlmostEqual:[26,2,1,""],failUnlessEqual:[26,2,1,""],failUnlessRaises:[26,2,1,""],failureException:[26,5,1,""],id:[26,2,1,""],longMessage:[26,5,1,""],maxDiff:[26,5,1,""],run:[26,2,1,""],setUp:[26,2,1,""],setUpClass:[26,2,1,""],shortDescription:[26,2,1,""],skipTest:[26,2,1,""],subTest:[26,2,1,""],tearDown:[26,2,1,""],tearDownClass:[26,2,1,""],test_card_creation:[26,2,1,""],test_get_and_set_card:[26,2,1,""]},"virtualsmartcard.tests.CardGenerator_test.TestNPACardGenerator":{_addExpectedFailure:[26,2,1,""],_addSkip:[26,2,1,""],_addUnexpectedSuccess:[26,2,1,""],_baseAssertEqual:[26,2,1,""],_callCleanup:[26,2,1,""],_callSetUp:[26,2,1,""],_callTearDown:[26,2,1,""],_callTestMethod:[26,2,1,""],_classSetupFailed:[26,5,1,""],_class_cleanups:[26,5,1,""],_deprecate:[26,2,1,""],_diffThreshold:[26,5,1,""],_feedErrorsToResult:[26,2,1,""],_formatMessage:[26,2,1,""],_getAssertEqualityFunc:[26,2,1,""],_truncateMessage:[26,2,1,""],addClassCleanup:[26,2,1,""],addCleanup:[26,2,1,""],addTypeEqualityFunc:[26,2,1,""],assertAlmostEqual:[26,2,1,""],assertAlmostEquals:[26,2,1,""],assertCountEqual:[26,2,1,""],assertDictContainsSubset:[26,2,1,""],assertDictEqual:[26,2,1,""],assertEqual:[26,2,1,""],assertEquals:[26,2,1,""],assertFalse:[26,2,1,""],assertGreater:[26,2,1,""],assertGreaterEqual:[26,2,1,""],assertIn:[26,2,1,""],assertIs:[26,2,1,""],assertIsInstance:[26,2,1,""],assertIsNone:[26,2,1,""],assertIsNot:[26,2,1,""],assertIsNotNone:[26,2,1,""],assertLess:[26,2,1,""],assertLessEqual:[26,2,1,""],assertListEqual:[26,2,1,""],assertLogs:[26,2,1,""],assertMultiLineEqual:[26,2,1,""],assertNotAlmostEqual:[26,2,1,""],assertNotAlmostEquals:[26,2,1,""],assertNotEqual:[26,2,1,""],assertNotEquals:[26,2,1,""],assertNotIn:[26,2,1,""],assertNotIsInstance:[26,2,1,""],assertNotRegex:[26,2,1,""],assertNotRegexpMatches:[26,2,1,""],assertRaises:[26,2,1,""],assertRaisesRegex:[26,2,1,""],assertRaisesRegexp:[26,2,1,""],assertRegex:[26,2,1,""],assertRegexpMatches:[26,2,1,""],assertSequenceEqual:[26,2,1,""],assertSetEqual:[26,2,1,""],assertTrue:[26,2,1,""],assertTupleEqual:[26,2,1,""],assertWarns:[26,2,1,""],assertWarnsRegex:[26,2,1,""],assert_:[26,2,1,""],card_type:[26,5,1,""],countTestCases:[26,2,1,""],debug:[26,2,1,""],defaultTestResult:[26,2,1,""],doClassCleanups:[26,2,1,""],doCleanups:[26,2,1,""],fail:[26,2,1,""],failIf:[26,2,1,""],failIfAlmostEqual:[26,2,1,""],failIfEqual:[26,2,1,""],failUnless:[26,2,1,""],failUnlessAlmostEqual:[26,2,1,""],failUnlessEqual:[26,2,1,""],failUnlessRaises:[26,2,1,""],failureException:[26,5,1,""],id:[26,2,1,""],longMessage:[26,5,1,""],maxDiff:[26,5,1,""],run:[26,2,1,""],setUp:[26,2,1,""],setUpClass:[26,2,1,""],shortDescription:[26,2,1,""],skipTest:[26,2,1,""],subTest:[26,2,1,""],tearDown:[26,2,1,""],tearDownClass:[26,2,1,""],test_card_creation:[26,2,1,""],test_get_and_set_card:[26,2,1,""],test_readDatagroups:[26,2,1,""]},"virtualsmartcard.tests.CryptoUtils_test":{TestCryptoUtils:[27,1,1,""]},"virtualsmartcard.tests.CryptoUtils_test.TestCryptoUtils":{_addExpectedFailure:[27,2,1,""],_addSkip:[27,2,1,""],_addUnexpectedSuccess:[27,2,1,""],_baseAssertEqual:[27,2,1,""],_callCleanup:[27,2,1,""],_callSetUp:[27,2,1,""],_callTearDown:[27,2,1,""],_callTestMethod:[27,2,1,""],_classSetupFailed:[27,5,1,""],_class_cleanups:[27,5,1,""],_deprecate:[27,2,1,""],_diffThreshold:[27,5,1,""],_feedErrorsToResult:[27,2,1,""],_formatMessage:[27,2,1,""],_getAssertEqualityFunc:[27,2,1,""],_truncateMessage:[27,2,1,""],addClassCleanup:[27,2,1,""],addCleanup:[27,2,1,""],addTypeEqualityFunc:[27,2,1,""],assertAlmostEqual:[27,2,1,""],assertAlmostEquals:[27,2,1,""],assertCountEqual:[27,2,1,""],assertDictContainsSubset:[27,2,1,""],assertDictEqual:[27,2,1,""],assertEqual:[27,2,1,""],assertEquals:[27,2,1,""],assertFalse:[27,2,1,""],assertGreater:[27,2,1,""],assertGreaterEqual:[27,2,1,""],assertIn:[27,2,1,""],assertIs:[27,2,1,""],assertIsInstance:[27,2,1,""],assertIsNone:[27,2,1,""],assertIsNot:[27,2,1,""],assertIsNotNone:[27,2,1,""],assertLess:[27,2,1,""],assertLessEqual:[27,2,1,""],assertListEqual:[27,2,1,""],assertLogs:[27,2,1,""],assertMultiLineEqual:[27,2,1,""],assertNotAlmostEqual:[27,2,1,""],assertNotAlmostEquals:[27,2,1,""],assertNotEqual:[27,2,1,""],assertNotEquals:[27,2,1,""],assertNotIn:[27,2,1,""],assertNotIsInstance:[27,2,1,""],assertNotRegex:[27,2,1,""],assertNotRegexpMatches:[27,2,1,""],assertRaises:[27,2,1,""],assertRaisesRegex:[27,2,1,""],assertRaisesRegexp:[27,2,1,""],assertRegex:[27,2,1,""],assertRegexpMatches:[27,2,1,""],assertSequenceEqual:[27,2,1,""],assertSetEqual:[27,2,1,""],assertTrue:[27,2,1,""],assertTupleEqual:[27,2,1,""],assertWarns:[27,2,1,""],assertWarnsRegex:[27,2,1,""],assert_:[27,2,1,""],countTestCases:[27,2,1,""],debug:[27,2,1,""],defaultTestResult:[27,2,1,""],doClassCleanups:[27,2,1,""],doCleanups:[27,2,1,""],fail:[27,2,1,""],failIf:[27,2,1,""],failIfAlmostEqual:[27,2,1,""],failIfEqual:[27,2,1,""],failUnless:[27,2,1,""],failUnlessAlmostEqual:[27,2,1,""],failUnlessEqual:[27,2,1,""],failUnlessRaises:[27,2,1,""],failureException:[27,5,1,""],id:[27,2,1,""],longMessage:[27,5,1,""],maxDiff:[27,5,1,""],run:[27,2,1,""],setUp:[27,2,1,""],setUpClass:[27,2,1,""],shortDescription:[27,2,1,""],skipTest:[27,2,1,""],subTest:[27,2,1,""],tearDown:[27,2,1,""],tearDownClass:[27,2,1,""],test_padding:[27,2,1,""]},"virtualsmartcard.tests.SmartcardSAM_test":{TestSmartcardSAM:[28,1,1,""]},"virtualsmartcard.tests.SmartcardSAM_test.TestSmartcardSAM":{_addExpectedFailure:[28,2,1,""],_addSkip:[28,2,1,""],_addUnexpectedSuccess:[28,2,1,""],_baseAssertEqual:[28,2,1,""],_callCleanup:[28,2,1,""],_callSetUp:[28,2,1,""],_callTearDown:[28,2,1,""],_callTestMethod:[28,2,1,""],_classSetupFailed:[28,5,1,""],_class_cleanups:[28,5,1,""],_deprecate:[28,2,1,""],_diffThreshold:[28,5,1,""],_feedErrorsToResult:[28,2,1,""],_formatMessage:[28,2,1,""],_getAssertEqualityFunc:[28,2,1,""],_truncateMessage:[28,2,1,""],addClassCleanup:[28,2,1,""],addCleanup:[28,2,1,""],addTypeEqualityFunc:[28,2,1,""],assertAlmostEqual:[28,2,1,""],assertAlmostEquals:[28,2,1,""],assertCountEqual:[28,2,1,""],assertDictContainsSubset:[28,2,1,""],assertDictEqual:[28,2,1,""],assertEqual:[28,2,1,""],assertEquals:[28,2,1,""],assertFalse:[28,2,1,""],assertGreater:[28,2,1,""],assertGreaterEqual:[28,2,1,""],assertIn:[28,2,1,""],assertIs:[28,2,1,""],assertIsInstance:[28,2,1,""],assertIsNone:[28,2,1,""],assertIsNot:[28,2,1,""],assertIsNotNone:[28,2,1,""],assertLess:[28,2,1,""],assertLessEqual:[28,2,1,""],assertListEqual:[28,2,1,""],assertLogs:[28,2,1,""],assertMultiLineEqual:[28,2,1,""],assertNotAlmostEqual:[28,2,1,""],assertNotAlmostEquals:[28,2,1,""],assertNotEqual:[28,2,1,""],assertNotEquals:[28,2,1,""],assertNotIn:[28,2,1,""],assertNotIsInstance:[28,2,1,""],assertNotRegex:[28,2,1,""],assertNotRegexpMatches:[28,2,1,""],assertRaises:[28,2,1,""],assertRaisesRegex:[28,2,1,""],assertRaisesRegexp:[28,2,1,""],assertRegex:[28,2,1,""],assertRegexpMatches:[28,2,1,""],assertSequenceEqual:[28,2,1,""],assertSetEqual:[28,2,1,""],assertTrue:[28,2,1,""],assertTupleEqual:[28,2,1,""],assertWarns:[28,2,1,""],assertWarnsRegex:[28,2,1,""],assert_:[28,2,1,""],countTestCases:[28,2,1,""],debug:[28,2,1,""],defaultTestResult:[28,2,1,""],doClassCleanups:[28,2,1,""],doCleanups:[28,2,1,""],fail:[28,2,1,""],failIf:[28,2,1,""],failIfAlmostEqual:[28,2,1,""],failIfEqual:[28,2,1,""],failUnless:[28,2,1,""],failUnlessAlmostEqual:[28,2,1,""],failUnlessEqual:[28,2,1,""],failUnlessRaises:[28,2,1,""],failureException:[28,5,1,""],id:[28,2,1,""],longMessage:[28,5,1,""],maxDiff:[28,5,1,""],run:[28,2,1,""],setUp:[28,2,1,""],setUpClass:[28,2,1,""],shortDescription:[28,2,1,""],skipTest:[28,2,1,""],subTest:[28,2,1,""],tearDown:[28,2,1,""],tearDownClass:[28,2,1,""],test_counter_decrement:[28,2,1,""],test_external_authenticate:[28,2,1,""],test_incorrect_pin:[28,2,1,""],test_internal_authenticate:[28,2,1,""],test_security_environment:[28,2,1,""]},"virtualsmartcard.tests.utils_test":{TestUtils:[29,1,1,""]},"virtualsmartcard.tests.utils_test.TestUtils":{_addExpectedFailure:[29,2,1,""],_addSkip:[29,2,1,""],_addUnexpectedSuccess:[29,2,1,""],_baseAssertEqual:[29,2,1,""],_callCleanup:[29,2,1,""],_callSetUp:[29,2,1,""],_callTearDown:[29,2,1,""],_callTestMethod:[29,2,1,""],_classSetupFailed:[29,5,1,""],_class_cleanups:[29,5,1,""],_deprecate:[29,2,1,""],_diffThreshold:[29,5,1,""],_feedErrorsToResult:[29,2,1,""],_formatMessage:[29,2,1,""],_getAssertEqualityFunc:[29,2,1,""],_truncateMessage:[29,2,1,""],addClassCleanup:[29,2,1,""],addCleanup:[29,2,1,""],addTypeEqualityFunc:[29,2,1,""],assertAlmostEqual:[29,2,1,""],assertAlmostEquals:[29,2,1,""],assertCountEqual:[29,2,1,""],assertDictContainsSubset:[29,2,1,""],assertDictEqual:[29,2,1,""],assertEqual:[29,2,1,""],assertEquals:[29,2,1,""],assertFalse:[29,2,1,""],assertGreater:[29,2,1,""],assertGreaterEqual:[29,2,1,""],assertIn:[29,2,1,""],assertIs:[29,2,1,""],assertIsInstance:[29,2,1,""],assertIsNone:[29,2,1,""],assertIsNot:[29,2,1,""],assertIsNotNone:[29,2,1,""],assertLess:[29,2,1,""],assertLessEqual:[29,2,1,""],assertListEqual:[29,2,1,""],assertLogs:[29,2,1,""],assertMultiLineEqual:[29,2,1,""],assertNotAlmostEqual:[29,2,1,""],assertNotAlmostEquals:[29,2,1,""],assertNotEqual:[29,2,1,""],assertNotEquals:[29,2,1,""],assertNotIn:[29,2,1,""],assertNotIsInstance:[29,2,1,""],assertNotRegex:[29,2,1,""],assertNotRegexpMatches:[29,2,1,""],assertRaises:[29,2,1,""],assertRaisesRegex:[29,2,1,""],assertRaisesRegexp:[29,2,1,""],assertRegex:[29,2,1,""],assertRegexpMatches:[29,2,1,""],assertSequenceEqual:[29,2,1,""],assertSetEqual:[29,2,1,""],assertTrue:[29,2,1,""],assertTupleEqual:[29,2,1,""],assertWarns:[29,2,1,""],assertWarnsRegex:[29,2,1,""],assert_:[29,2,1,""],countTestCases:[29,2,1,""],debug:[29,2,1,""],defaultTestResult:[29,2,1,""],doClassCleanups:[29,2,1,""],doCleanups:[29,2,1,""],fail:[29,2,1,""],failIf:[29,2,1,""],failIfAlmostEqual:[29,2,1,""],failIfEqual:[29,2,1,""],failUnless:[29,2,1,""],failUnlessAlmostEqual:[29,2,1,""],failUnlessEqual:[29,2,1,""],failUnlessRaises:[29,2,1,""],failureException:[29,5,1,""],id:[29,2,1,""],longMessage:[29,5,1,""],maxDiff:[29,5,1,""],run:[29,2,1,""],setUp:[29,2,1,""],setUpClass:[29,2,1,""],shortDescription:[29,2,1,""],skipTest:[29,2,1,""],subTest:[29,2,1,""],tearDown:[29,2,1,""],tearDownClass:[29,2,1,""],test_CAPDU:[29,2,1,""],test_RAPDU:[29,2,1,""]},"virtualsmartcard.utils":{APDU:[30,1,1,""],C_APDU:[30,1,1,""],R_APDU:[30,1,1,""],_make_byte_property:[30,3,1,""],hexdump:[30,3,1,""],inttostring:[30,3,1,""],stringtoint:[30,3,1,""]},"virtualsmartcard.utils.APDU":{_deldata:[30,2,1,""],_format_parts:[30,2,1,""],_getdata:[30,2,1,""],_setbyte:[30,2,1,""],_setdata:[30,2,1,""],data:[30,2,1,""]},"virtualsmartcard.utils.C_APDU":{"case":[30,2,1,""],CLA:[30,2,1,""],INS:[30,2,1,""],Lc:[30,2,1,""],Le:[30,2,1,""],P1:[30,2,1,""],P2:[30,2,1,""],_deldata:[30,2,1,""],_format_fields:[30,2,1,""],_format_parts:[30,2,1,""],_getdata:[30,2,1,""],_setbyte:[30,2,1,""],_setdata:[30,2,1,""],cla:[30,2,1,""],data:[30,2,1,""],effective_Le:[30,2,1,""],ins:[30,2,1,""],lc:[30,2,1,""],le:[30,2,1,""],p1:[30,2,1,""],p2:[30,2,1,""],parse:[30,2,1,""],render:[30,2,1,""]},"virtualsmartcard.utils.R_APDU":{SW1:[30,2,1,""],SW2:[30,2,1,""],SW:[30,2,1,""],_deldata:[30,2,1,""],_format_fields:[30,2,1,""],_format_parts:[30,2,1,""],_getdata:[30,2,1,""],_getsw:[30,2,1,""],_setbyte:[30,2,1,""],_setdata:[30,2,1,""],_setsw:[30,2,1,""],data:[30,2,1,""],parse:[30,2,1,""],render:[30,2,1,""],sw1:[30,2,1,""],sw2:[30,2,1,""],sw:[30,2,1,""]},virtualsmartcard:{CardGenerator:[9,0,0,"-"],ConstantDefinitions:[10,0,0,"-"],CryptoUtils:[11,0,0,"-"],SEutils:[12,0,0,"-"],SWutils:[13,0,0,"-"],SmartcardFilesystem:[14,0,0,"-"],SmartcardSAM:[15,0,0,"-"],TLVutils:[16,0,0,"-"],VirtualSmartcard:[17,0,0,"-"],utils:[30,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","exception","Python exception"],"5":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:exception","5":"py:attribute"},terms:{"0000":[12,23,30],"03119":2,"05_":3,"07_":3,"0x00":[7,12,23],"0x00000000":6,"0x00000001":6,"0x01":[2,7],"0x02":[2,7],"0x03":2,"0x04":[2,7],"0x0c":[14,22],"0x0d46":2,"0x0e":[14,22],"0x0f":[14,22],"0x10":2,"0x18d1":6,"0x3010":2,"0x40":22,"0x4ee1":6,"0x60":22,"0x80":[12,22,23],"0x8c7b":[6,7],"0x8e":[12,22,23],"0x9000":2,"0x9a":[2,12,22,23],"0x9e":[12,22,23],"0xa4":[7,14,22],"0xac":[12,22,23],"0xb0":[14,22],"0xb1":[14,22],"0xb2":[14,22],"0xb3":[14,22],"0xbc":[12,22,23],"0xca":[14,22],"0xcb":[14,22],"0xd0":[14,22],"0xd1":[14,22],"0xd2":[14,22],"0xd6":[14,22],"0xd7":[14,22],"0xda":[14,22],"0xdb":[14,22],"0xdc":[14,22],"0xdd":[14,22],"0xe0":[14,22],"0xe2":[14,22],"0xe4":[14,22],"0xff":[2,7,17,22],"0xxx":7,"1007":3,"1024":22,"107":3,"134010":6,"14443":4,"147":[26,27,28,29],"179":3,"188":3,"2010":3,"2011":3,"2012":3,"2015":6,"256":22,"27c3":3,"27th":3,"3083254":7,"3083586":7,"33392":3,"35963":[4,6],"35964":6,"3b80800101":4,"4297":3,"512":22,"640":[26,27,28,29],"642":3,"65535":14,"65536":[26,27,28,29],"7816":[0,6,12,17,22,23],"78166":7,"7_3":3,"7_win32":6,"978":3,"byte":[7,12,14,15,17,21,22,23,30],"case":[2,4,6,7,22,26,27,28,29,30],"class":[6,7,9,12,14,15,17,19,20,21,22,23,26,27,28,29,30],"default":[2,4,6,26,27,28,29],"enum":4,"f\u00fcr":3,"function":[3,7,11,14,15,17,22,23,26,27,28,29,30],"import":[1,7],"int":[2,4],"long":[4,7,14,22],"m\u00fcller":3,"new":[2,3,6,7,9,12,14,22,23],"null":6,"pl\u00f6tz":6,"public":[3,6,12,15,22,23],"return":[0,7,11,12,13,14,15,16,17,19,20,22,23,26,27,28,29,30],"short":[14,30],"static":[2,14,17,22,23],"switch":[2,6,12,22,23],"throw":7,"true":[14,22,26,27,28,29,30],"try":[3,7],"universit\u00e4t":3,"while":7,Bus:2,But:[6,7],DFs:[14,22],DGs:6,For:[5,6,14,22,26,27,28,29],INS:[2,30],Its:7,Near:1,One:[12,23],QES:6,SWs:7,The:[0,1,2,3,4,5,6,7,11,12,14,15,17,20,21,22,23,26,27,28,29,30],Then:6,There:[7,12],Use:[2,4,6,26,27,28,29],Used:22,Using:[1,4],Will:7,With:[0,4],__computekei:23,__generate_cryptoflex:9,__generate_epass:9,__generate_iso_card:9,__generate_npa:9,__getrecord:14,__getrecordsbyidentifi:14,__getrecordsbynumb:14,__init__:7,__output_from_l:19,__recvfromvpicc:17,__replace_tag:12,__repr__:30,__sendtovpicc:17,__set_algo:12,__set_iv:12,__set_kei:12,__str__:30,__traceback__:13,_addexpectedfailur:[26,27,28,29],_addskip:[26,27,28,29],_addunexpectedsuccess:[26,27,28,29],_baseassertequ:[26,27,28,29],_callcleanup:[26,27,28,29],_callsetup:[26,27,28,29],_callteardown:[26,27,28,29],_calltestmethod:[26,27,28,29],_class_cleanup:[26,27,28,29],_classsetupfail:[26,27,28,29],_deldata:30,_deprec:[26,27,28,29],_diffthreshold:[26,27,28,29],_feederrorstoresult:[26,27,28,29],_format_field:30,_format_part:30,_formatmessag:[26,27,28,29],_get_referenced_kei:[15,22,23],_getassertequalityfunc:[26,27,28,29],_getdata:30,_getsw:30,_make_byte_properti:30,_makesalt:11,_selectfil:[14,22],_set_s:[12,22,23],_setbyt:30,_setdata:30,_setsw:30,_truncatemessag:[26,27,28,29],a000000397425446590201:0,a000000527210101:0,abl:[1,6,9],about:[6,7,26,27,28,29],abov:6,academictitl:6,acardemul:[0,4],accept:[26,27,28,29],access:[0,2,4,5,6,12,15,17,22,23],accessori:1,accord:[7,12,14,17,22,23],accordingli:6,act:[6,7],activ:4,actual:[4,5,7,20],add:[2,4,7,12,26,27,28,29],add_data:7,addclasscleanup:[26,27,28,29],addcleanup:[26,27,28,29],added:[15,22,23,26,27,28,29],addit:[4,26,27,28,29],addition:[2,4,6],address:6,addtypeequalityfunc:[26,27,28,29],adjust:[12,23],adress:30,af_inet:7,after:[26,27,28,29],against:[4,5,6],agreement:[12,22,23],aid:4,aid_list:4,algo:11,algorithm:[11,12,15,22,23],alia:[26,27,28,29],all:[4,5,6,7,12,14,15,16,22,23,26,27,28,29],allow:[0,1,4,5,6,26,27,28,29],almost:[26,27,28,29],alreadi:12,also:[0,1,2,4,6,7,9,14,22,26,27,28,29],altern:[2,3,4,6],although:6,analyz:4,anchor:[6,12,22,23],andrea:3,android:[1,3,6,7],angriff:3,ani:[0,1,2,4,5,6,7,15,22,23],annex:23,anoth:2,answer:[17,22],anywai:[6,23],apart:3,apdu:[0,1,2,4,6,7,12,14,15,17,19,20,22,23,30],api:[6,7],app:[0,1,4,5,6,7],appear:2,append:[11,12,14,22],append_pad:11,appendrecord:[14,22],appl:6,applet:0,applic:[0,1,2,4,5,6,17],applicationidentifi:[14,22],appropri:[1,12,22,23],apt:2,architectur:6,arg:[7,13,14,17,22,26,27,28,29,30],argument:[6,26,27,28,29],argz:[14,22],around:4,arrai:6,articl:6,asctim:7,aspect:3,assert:[26,27,28,29],assert_:[26,27,28,29],assertalmostequ:[26,27,28,29],assertcountequ:[26,27,28,29],assertdictcontainssubset:[26,27,28,29],assertdictequ:[26,27,28,29],assertequ:[26,27,28,29],assertfals:[26,27,28,29],assertgreat:[26,27,28,29],assertgreaterequ:[26,27,28,29],asserti:[26,27,28,29],assertin:[26,27,28,29],assertionerror:[26,27,28,29],assertisinst:[26,27,28,29],assertisnon:[26,27,28,29],assertisnot:[26,27,28,29],assertisnotnon:[26,27,28,29],assertless:[26,27,28,29],assertlessequ:[26,27,28,29],assertlistequ:[26,27,28,29],assertlog:[26,27,28,29],assertmultilineequ:[26,27,28,29],assertnotalmostequ:[26,27,28,29],assertnotequ:[26,27,28,29],assertnotin:[26,27,28,29],assertnotisinst:[26,27,28,29],assertnotregex:[26,27,28,29],assertnotregexpmatch:[26,27,28,29],assertrais:[26,27,28,29],assertraisesregex:[26,27,28,29],assertraisesregexp:[26,27,28,29],assertregex:[26,27,28,29],assertregexpmatch:[26,27,28,29],assertsequenceequ:[26,27,28,29],assertsetequ:[26,27,28,29],asserttru:[26,27,28,29],asserttupleequ:[26,27,28,29],assertwarn:[26,27,28,29],assertwarnsregex:[26,27,28,29],assign:[14,30],assignlogicalchannel:[17,22],associ:[12,23],assum:7,asym:12,atexit:7,atr:[4,7,17,19,20,22],attach:[0,1,5],attack:[4,5,7,20],attempt:6,attribut:[14,22,26,27,28,29,30],auf:3,authent:[12,15,22,23],authenticate_head:[12,22,23],authentisierung:3,autodetect:[2,4],automat:[2,6,17,22,26,27,28,29],autoreconf:[2,4,6],autotool:6,auxiliari:[2,4,6],avail:[0,2,3,4,5,6,7,14,22],avoid:7,bac:6,back:[1,4,7,17,20],backend:4,bar:[5,26,27,28,29],base:[0,2,4,9,12,13,14,15,17,19,20,21,22,23,26,27,28,29,30],basi:[26,27,28,29],basic:[23,26,27,28,29],basicconfig:7,basiert:3,been:[7,26,27,28,29],befor:[7,26,27,28,29],begin:[14,22],being:6,below:[4,6],ber:[14,22],berlin:3,bertlv:16,bertlv_data:[14,22],bertlv_pack:16,bertlv_unpack:16,besitz:3,best:[4,7],better:7,between:[0,2,6,17,22,26,27,28,29],big:[7,12,22,23],bin:6,binari:[6,14,22,30],birthnam:6,bit:[11,14,22],bitmask:[12,22,23],bitstr:[17,22],bix:6,bixvread:6,bixvreaderinstal:6,bleed:[2,4,6],block:[7,11,15,22,23,26,27,28,29],blocklen:11,bndl:6,bool:[14,17,22],both:[2,26,27,28,29],box:2,bring:6,brows:[0,3,5],bsi:2,buffer:7,bug:[2,4,6,7],build:[0,1,2,4,5],building_gadget_usb_modul:2,built:[0,2,4,5,6],bund:2,bundl:6,bz2:2,c_apdu:30,ca_kei:[6,7,17],calcul:[4,11,17,22,23],calculate_mac:11,call:[7,14,21,26,27,28,29],callabl:[26,27,28,29],camera:[0,5],can:[0,2,3,4,5,6,7,14,20,22,26,27,28,29],capabl:[14,17,22],capdu:[12,15,17,22,23],card:[8,9,12,14,15,17,19,20,21,22,23],card_typ:[7,9,17,26],cardaccess:6,cardconnectionexcept:7,cardgener:[7,8],cardgenerator_test:[8,25],cardnumb:15,cardsecret:15,cardsecur:6,cardtyp:7,caught:[26,27,28,29],cbc:11,ccc:3,ccid:3,cct:12,cert:6,certif:[1,6,12,22,23],certifc:6,cfbundledevelopmentregion:6,cfbundleexecut:6,cfbundleinfodictionaryvers:6,cfbundlenam:6,cfbundlepackagetyp:6,cfbundlesignatur:6,cfbundlevers:6,challeng:[15,22,23],chang:[2,4,6,15,22,23],change_reference_data:[15,22,23],channelid:6,chao:3,charact:[17,19,20,22],check:[2,4,6,7,15,22,23,26,27,28,29],checksum:[11,12,22,23],children:[26,27,28,29],chip:6,chipkartenles:3,choic:5,choos:[0,1,4,5,6],chosen:6,chr:7,chv:[15,22,23],cipher:[11,15,22,23],cipherspec:11,citi:6,cla:[2,30],classmethod:[26,27,28,29],cleanup:[7,20,26,27,28,29],click:6,client:2,clone:[0,1,2,3,4,5,6],close:[7,20],cls:[26,27,28,29],club:3,code:[0,2,5,6,7,12,14,16,22,23,26,27,28,29,30],codeproject:6,collect:[26,27,28,29],com:[0,1,2,3,4,5,6,7],combin:[2,4,12],come:7,command:[0,1,2,4,6,7,12,14,15,17,19,20,22,23,30],commandchaing:[17,22],commun:[0,1,3,4,5,6,7,17],communityid:6,compar:[22,26,27,28,29],comparison:[26,27,28,29],compat:2,compil:[0,1,2,4,5,6],complet:[4,6,7,26,27,28,29],complex:7,comput:[0,3,5,6,11,12,22,23],compute_cryptographic_checksum:[12,22,23],compute_digital_signatur:[12,22,23],concern:[3,4,5],conf:[6,7],config:[2,4,5,6,12],configur:[0,2,4,5,7,12],congress:3,connect:[0,1,3,4,5,6,7,17,20],connector:[4,6],connecttoport:[7,17],consecut:30,consid:[26,27,28,29],constantdefinit:8,contact:[4,6],contactless:0,contain:[6,12,14,15,22,23,26,27,28,29],content:[7,9,12,14,22,30],context:[7,26,27,28,29],contribut:[0,1,2,4,5,6],control:[12,14,22,23],controlreferencetempl:12,convent:[17,22],copyright:6,core:2,correct:[7,14,15,22,23],correctli:[15,22],correspond:[7,15,26,27,28,29],counter:[11,15,22,23,26,27,28,29],counterpart:2,countri:6,counttestcas:[26,27,28,29],cover:[4,6],craft:2,creat:[2,3,6,14,22],createfil:[14,22],cross:4,crt:[12,23],crypt:11,crypto_checksum:11,cryptoflex:[6,7,8,9,18,26],cryptoflexgeneratortest:26,cryptoflexmf:[7,22],cryptoflexo:[7,22],cryptoflexs:22,cryptoflexsam:22,cryptograph:[11,12,22,23],cryptotokenkit:6,cryptoutil:[8,15],cryptoutils_test:[8,25],current:[0,3,4,6,9,11,12,14,15,22,23],currentdf:[14,22],currentef:[14,22],custom:2,custom_url:7,cvca:[6,7,17],cyanogenmod:[0,5],cyberflex:[6,11],cycl:[14,22],cyclic:14,d2760001240102000000000000010000:0,daemon:6,data:[0,2,4,5,6,7,11,12,14,15,16,17,22,23,26,27,28,29,30],datacod:14,datagroup:9,datagroupnam:6,datagroupvalu:6,datalist:[14,16],dataobjecthandlingdecodeencapsul:[14,22],dataobjecthandlingdecodeplain:[14,22],dataset:[6,7],datasetfil:[6,7,9,17],datatyp:[26,27,28,29],dataunitsdecodeencapsul:[14,22],dataunitsdecodeplain:[14,22],datefmt:7,dateofbirth:6,dateofexpiri:6,dcb:[14,22],debian:[2,4,6,19],debug:[4,6,26,27,28,29],decim:[26,27,28,29],deciph:[12,22,23],decipher:[12,22,23],decive_unit:6,decod:[14,22],decodediscretionarydataobject:16,decodeextendedheaderlist:16,decodeheaderlist:16,decodeoffsetdataobject:16,decodetaglist:16,deconstruct:[26,27,28,29],decor:14,decrement:[15,22,23],decrypt:[11,14,15,22,23],dedic:14,deem:[26,27,28,29],def:7,default_s:15,default_uid:2,defaulttestresult:[26,27,28,29],defin:[2,15,23],deleg:[0,1,6],deletefil:[14,22],delta:[26,27,28,29],den:3,depend:[0,2,4,5,6,11,14,22,23,26,27,28,29,30],deploi:[0,1,5],deriv:[7,21,23],derive_kei:23,des3:11,des:3,describ:6,descript:[26,27,28,29],descriptor:[14,22],design:7,despit:4,destroypacechannel:2,detail:[6,7,26,27,28,29],detect:5,determin:[26,27,28,29],dev:[2,6],develop:[0,1,4,5],devic:[0,1,2,6],devicenam:6,devices_compatibility_matrix:4,devmgmt:6,dfname:[14,22],dfselectionbyapplication_implicit:[14,22],dfselectionbyfid:[14,22],dfselectionbyfulldfnam:[14,22],dfselectionbypartialdfnam:[14,22],dfselectionbypath:[14,22],dg12:6,dg14:6,dg15:6,dg16:6,dg21:6,dialog:1,dict:6,dictionari:[12,26,27,28,29],die:3,die_gesamte_technik_ist_sich:3,diff:[26,27,28,29],differ:[3,6,7,9,11,12,23,26,27,28,29],digit:[12,22,23,26,27,28,29],direct:[17,22],directconvent:[17,22],directli:[4,6],directori:[2,6,7],disabl:6,disable_check:[7,17],disconnect:7,discuss:[4,5],disk:[7,9],dispatch:[15,17],distanc:4,distribut:4,dlitz:6,do_encrypt:11,do_someth:[26,27,28,29],doc:[6,14],doclasscleanup:[26,27,28,29],docleanup:[26,27,28,29],docstr:[14,26,27,28,29],doctyp:6,document:7,documenttyp:6,doe:[4,6,7,23],doi:3,dominik:[3,4],done:[4,7],doubl:6,down:[7,17,19,20,22],driver:[2,5,6,19],droid:[0,5],dsa:[15,22,23],dst:12,dtd:6,ducktyp:[26,27,28,29],dummy_hcd:2,dylib:6,eac:6,each:[14,21],earlier:6,echo:2,edg:[2,4,6],edit:7,editor:3,ef_cardaccess:[6,7,17],ef_cardsecur:[6,7,17],effect:[26,27,28,29],effective_l:30,efstructure_cyclic_nofurtherinfo:7,efstructure_linear_fixed_:7,efstructure_linear_variable_:7,efstructure_transpar:7,eid:3,einem:3,either:[0,12,14,22,23],electron:[0,6],element:[6,26,27,28,29],elementari:14,elif:7,els:7,email:6,emit:[26,27,28,29],emul:[3,7,17],enabl:[2,3,4,6],enciph:[12,22,23],encipher:[12,22,23],enclos:[26,27,28,29],encod:[6,7,12],encodebertlvdatalist:16,encodedataoffsetobject:16,encodediscretionarydataobject:16,encodefilecontrolparamet:[14,22],encrypt:[7,9,11,14,15,22,23],end:[12,14,22,23,26,27,28,29],endian:7,enforc:[26,27,28,29],engin:3,english:6,ensur:6,enter:[15,22,23],entir:7,entri:2,environ:[4,12,15,22,23],epass:[6,7,8,18],epass_s:23,epassport:23,equal:[14,15,22,23,26,27,28,29],eras:[12,14,15,22,23],erase_s:[15,22,23],erasebinari:[14,22],erasebinaryencapsul:[14,22],erasebinaryplain:[14,22],erasefrom:14,eraserecord:[14,22],eraseto:14,erik:0,eriknellessen:0,err_incorrectparamet:7,err_wronglength:7,error:[2,7,14,22,26,27,28,29],error_cod:[26,27,28,29],erweiterung:3,esign:6,esign_ca_cert:[6,7,17],esign_cert:[6,7,17],esign_kei:[7,17],especi:[4,5],establish:[5,6],establishpacechannel:2,establishpacechannelinput:2,establishpacechanneloutput:2,etc:[6,7],even:[7,14,22,26,27,28,29],everi:6,exactli:[26,27,28,29],exampl:[2,4,6,26,27,28,29,30],exc_info:[26,27,28,29],except:[7,13,26,27,28,29],exe:6,execut:[6,7,17,19,20,22,26,27,28,29],exercis:[26,27,28,29],exist:[0,4,7],exit:[2,4,6,7],expect:[7,26,27,28,29],expected_except:[26,27,28,29],expected_regex:[26,27,28,29],expected_warn:[26,27,28,29],explain:4,explicit:[26,27,28,29],explor:6,expon:22,expr1:[26,27,28,29],expr2:[26,27,28,29],expr:[26,27,28,29],express:[26,27,28,29],extend:[3,6,7],extended_length:17,extendedl:[17,22],extens:1,extern:[6,12,22,23],external_authent:[15,22,23],extra:[26,27,28,29],extra_fci_data:14,f276a288bcfba69d34f31001:0,fabio:6,fail:[7,26,27,28,29],failif:[26,27,28,29],failifalmostequ:[26,27,28,29],failifequ:[26,27,28,29],failunless:[26,27,28,29],failunlessalmostequ:[26,27,28,29],failunlessequ:[26,27,28,29],failunlessrais:[26,27,28,29],failur:[26,27,28,29],failureexcept:[26,27,28,29],fals:[6,7,14,16,17,22,26,27,28,29,30],familynam:6,far:6,fci:[14,22],fdb:7,fdid:[0,5],featur:3,feature_execute_pac:2,feature_modify_pin_direct:2,feature_verify_pin_direct:2,fed:21,feedback:[0,1,2,4,5,6],fetch:[0,1,5,7],ff557573:6,fid:[7,14,22],field:[1,12,22,23,30],file:[0,2,4,5,6,7,9,14,15,17,22],filedescriptor:[7,14,22],filenam:[2,26,27,28,29],filesystem:[9,15,22,23],fill:9,filter:[26,27,28,29],find:[2,4,6,7,16],firewal:7,first:[6,7,14,22,26,27,28,29],firstsft:[14,22],firstsoftwar:[14,22],fix:14,fixtur:[26,27,28,29],fmd:[14,22],focu:6,follow:[0,2,3,4,5,6,7,14,22],foo:[26,27,28,29],foreground:4,form:[4,9,11,15,22,23],format:[7,26,27,28,29],formatresult:[7,17,22],forwar:4,forward:[2,7,17,20],forwared:2,foss:3,found:[26,27,28,29],fragment:2,framework:6,frank:[2,3,4],frankmorgn:[0,1,2,3,4,5,6],fraunhof:3,freerunn:2,friendlynam:6,from:[0,1,2,3,4,5,6,7,9,12,14,15,17,20,21,22,23,26,27,28,29],fsdecrypt:[15,22,23],fsencrypt:[15,22,23],fukuchi:6,full:[4,5,30],further:[26,27,28,29],futur:[15,22,23],g_ether:2,gadget:2,gear:1,gener:[0,2,4,5,6,7,9,11,12,14,15,22,23,26,27,28,29,30],generate_public_key_pair:[12,15,22,23],generatecard:9,german:[0,2,4,5,6],gertrud:6,gesamt:3,get:[2,4,6,7,9,14,22,26,27,28,29],get_card_numb:[15,22,23],get_challeng:[15,22,23],get_ciph:11,get_cipher_blocklen:11,get_cipher_keylen:11,get_index:14,get_referenced_ciph:15,getatr:[7,17,19,20,22],getcard:[7,9],getdata:[14,22],getdataencapsul:[14,22],getdataplain:[14,22],getfile_byrefdataobj:14,getlogg:[26,27,28,29],getmf:[14,22],getpath:[14,22],getreaderpacecap:2,getrespons:[17,22],getsocknam:7,gg487509:2,gid:0,gidsapplet:0,giovanni:3,git:[0,1,2,3,4,5,6],github:[0,1,2,3,4,5,6],give:[6,7,26,27,28,29],given:[4,7,12,14,15,16,17,19,20,22,23,26,27,28,29],givennam:6,global:[12,15,22,23],gmail:2,gnu:[2,4,6],gpl:[0,1,2,4,5,6],group:[6,7],guess:6,guid:[1,3],guidelin:1,guidelines_on_connecting_gears2_device_using_wifi_151222:1,handi:3,handl:[3,7,14,22,26,27,28,29],handleinpdu:[7,21],handleoutpdu:[7,21],handler_test:[6,7,19],handlertest:[7,8,18],handlertesto:[7,19],hardwar:[0,2,4,5,6],has:[0,2,4,5,7,14,22,26,27,28,29],hasfixedrecords:14,hash:[11,12,22,23],hashmap:15,hashmethod:11,hassimpletlv:14,have:[0,1,2,3,4,5,6,7,26,27,28,29],hce:[0,1],header:[2,4,12,22,23],header_authent:[15,22,23],headless:1,heidelberg:3,help:[2,4,6],henryk:6,here:[2,3,4,6,7],hexdump:30,higher:[26,27,28,29],histchar:[17,22],histor:[14,17,22],hmac:11,holder:6,honor:14,honour:[26,27,28,29],hook:[7,26,27,28,29],host:[0,2,4,5,6,7,17],hostnam:[4,6,7],how:[2,4,7],html:[0,1,2,3,5,6],http:[0,1,2,3,4,5,6,7,19],human:[26,27,28,29],humboldt:3,icao:[9,11,23],icc:23,ident:[0,6],identifi:[0,4,14,15,22,23,26,27,28,29],identifier_first:14,identifier_last:14,identifier_next:14,identifier_previ:14,iec:4,ifd:6,ifdcap:6,ifdfriendlynam:6,ifdmanufacturerstr:6,ifdproductid:6,ifdproductstr:6,ifdprotocolsupport:6,ifdread:6,ifdvendorid:6,ifdversionnumb:6,imag:6,immedi:[26,27,28,29],impact:[4,5],implement:[0,2,6,12,19,20,21,22,23,26,27,28,29],implicitli:7,importerror:7,inact:6,includ:[0,1,3,4,6,7,12,15,22,23,26,27,28,29],include_fil:16,incom:[4,6],incomplet:6,indent:[14,30],index:[4,14,15,22,26,27,28,29],index_curr:[14,22],index_htm:2,indic:[12,22,23],info:[2,6,7,26,27,28,29],infoplist:6,inform:[3,12,14,15,22,23,26,27,28,29],informat:3,informatik:3,informationstechnologi:3,ini:6,init:[0,6],initi:[0,1,2,6,7,11,12,14,23],inpdu:21,inpterpret:7,input:11,ins2handl:[17,22],ins:[7,17,22,30],insert:4,insight:7,insmod:2,inspect:[6,26,27,28,29],instanc:[14,16],instead:[0,6,26,27,28,29,30],institut:3,instruct:[14,22],integ:[14,22],integr:6,interact:9,interfac:[0,2,5,6,17,22],intermediari:2,intern:[12,15,22,23],internal_authent:[15,22,23],internet:6,interrupt:2,inttostr:[7,30],invalid:[6,7,15,22,23],invers:[17,22],invok:[12,22,23,26,27,28,29],involv:14,ioanni:3,iscycl:14,isequ:14,isinst:[7,26,27,28,29],iso7816:[6,7,26],iso7816generatortest:26,iso7816o:[7,17,22],iso:[0,4,6,12,17,22,23,30],isoapplet:0,issimpletlv:[14,22],issu:[2,4,6],issuingst:6,ist:3,item:[14,26,27,28,29],iter:[26,27,28,29],its:[2,4,6,7,12,14,22,23,26,27,28,29],itself:7,java:0,jcardsim:0,jen:3,join:7,jump:6,just:[26,27,28,29],kdir:2,keep:[26,27,28,29],kei:[6,7,11,12,15,22,23],kernel:2,keycard:0,keytyp:[15,22,23],keyword:[26,27,28,29],killal:6,kind:[0,1,2,4,5,6,12,22,23],kit:6,kitkat:[0,5],know:[6,7],knowledg:7,krontiri:3,kwarg:[26,27,28,29,30],last:[11,14,22],lastcommandoffcut:7,lastcommandsw:7,later:[4,6,7,22],latest:[2,3,4,6],layer:6,lead:6,lectur:3,len:[7,17,22],len_extend:30,length:[7,11,12,14,16,22,26,27,28,29,30],less:[4,6,26,27,28,29],let:7,level:[7,26,27,28,29],levelnam:7,lian:3,lib:[2,4,6],libccid:2,libeac:6,libexec:6,libifdvpcd:6,libopensc:2,libpath:6,libpcsclit:6,libqrencod:6,librari:[3,6],libtool:[2,4,6],licens:[0,1,2,4,5,6],life:[14,22],lifecycl:[14,22],lifo:[26,27,28,29],like:[2,4,6,26,27,28,29],line:[2,6,26,27,28,29,30],linelen:30,lineno:[26,27,28,29],link:[2,6],linuxtag:3,list1:[26,27,28,29],list2:[26,27,28,29],list:[2,4,6,7,14,16,22,26,27,28,29],listen:4,listread:7,lite:[4,6,19],littl:7,load:[2,6,7],loadmitmfrompath:[7,17],local:[2,6],local_ip:7,localhost:6,locat:[3,4],log:[6,7,26,27,28,29],logger:[26,27,28,29],logger_nam:[26,27,28,29],logginglevel:[7,17],logic:14,logrecord:[26,27,28,29],longmessag:[26,27,28,29],look:[0,2,3,4,6,7,14],loop:17,lost:7,mac:[11,12,22,23],machin:[2,6,23],maco:6,magic:7,mai:[0,1,4,6,11,12,15,21,22,23],mail:6,main:[4,6,7,17],maintain:17,make:[2,4,6,30],make_properti:14,makeatr:[17,22],makefil:2,makefirstsoftwarefunctiont:[14,22],makesecondsoftwarefunctiont:[14,22],makethirdsoftwarefunctiont:[17,22],man:[6,21],manag:[6,7,26,27,28,29],manage_security_environ:[12,15,22,23],mani:16,manipul:[12,22,23],manual:[0,1,5],map:[7,22],mark:[26,27,28,29],mass:6,master:[3,14,15,17,22],match:[4,6,14,26,27,28,29],max:[11,17,22],maxdiff:[26,27,28,29],maximum:[14,15,22,23],maximumchannel:[17,22],maxl:[7,22],maxrecords:[7,14],maxsiz:14,mayb:2,mean:[6,7,11,12,15,17,22,23,26,27,28,29],measur:[26,27,28,29],mechan:[12,22,23],media:3,member:[26,27,28,29],memori:[15,22,23],messag:[6,7,11,12,15,17,22,23,26,27,28,29],meta:30,method:[9,12,15,21,22,23,26,27,28,29],methodnam:[26,27,28,29],microsoft:[2,4,6],middl:[6,21],middlewar:2,might:[7,15,21,22,23,26,27,28,29],min:7,mingw:4,miss:[2,4,6],mitm:[6,7,20],mitmpath:[7,17],mkdir:2,mmc:6,mmo11:3,mo10:3,mobil:[2,3],mobilen:3,mode:[2,4,5,6,7,11,12,15],modern:[2,4],modif:[2,7],modifi:[2,4,7,12,21],modprob:2,modul:[2,4,6,8,18,25],momr12:3,mor12:3,more:[0,1,2,4,5,6,7,12,23,26,27,28,29],morgner:[2,3,4],most:[2,4,7,16,26,27,28,29],mostli:7,mount:2,mous:6,mrtd:[6,23],mrz:9,msc:6,msdn:[2,6],mse:12,msg:[7,17,19,20,22,26,27,28,29],msi:6,multi:[26,27,28,29],multipl:[2,6,7],must:[2,4,5,6,7,9,11,12,14,22,23,26,27,28,29],mutual_authent:[15,22,23],mutual_challeng:[15,22,23],name:[4,6,14,22,30],named_df:[14,22],nation:6,nativ:[1,4],necessari:4,need:[0,1,2,4,5,6,7,15,22,23,26,27,28,29],neither:[14,22],nellesson:0,neo:2,net:[0,6],network:[5,7],neuen:3,new_fil:7,newer:[0,5],newli:14,newlist:14,newtlvlist:[14,22],newvalu:[14,16],next:[1,14,22],nfc:[0,1,3,4,5,6,7],nice:30,nicer:[26,27,28,29],nobodi:23,nofurtherinfo:7,none:[7,9,11,14,15,16,17,22,23,26,27,28,29,30],noop:21,nor:[14,22],normal:[7,22,26,27,28,29],normal_rest:7,note:[3,7,14,17,22,23,26,27,28,29],noth:[12,22,23],notif:2,now:[2,4,6,15,22,23],npa:[0,3,6,7,8,18,26],npao:7,num_id:14,num_result:16,number:[2,4,6,7,14,15,22,23,26,27,28,29],numread:6,oath:0,obj:[2,26,27,28,29],object:[7,9,12,14,15,17,20,21,22,23,26,27,28,29,30],occur:[14,22],odd:[14,22],oep10:3,oepen:[3,4],off:[2,7],offer:3,offset:[14,16,22,30],old:[3,14],older:[2,3,4,6],om11:3,omit:[17,22,26,27,28,29],one:[4,5,12,14,22,23,26,27,28,29,30],onetimewrit:14,onli:[2,4,7,11,14,22,23,26,27,28,29],open:[0,5,6,7,17],openmoko:[2,4,6],openpac:6,openpcd:4,openpgp:0,openpicc:4,openport:[7,17],opensc:[2,6],oper:[4,11,12,14,22,23,26,27,28,29],operation_on_str:11,optim:[26,27,28,29],option:[2,4,6,9,11,17,22,26,27,28,29],ord:7,order:[2,7,12,14,15,22,23,26,27,28,29],org:[0,1,2,4,5,6,19],other:[2,5,6,12,15,22,23,26,27,28,29],otherwis:[4,12,14,22,26,27,28,29],ottavi:6,our:[0,1,2,3,4,5,6,7,30],out:[2,7,26,27,28,29],outpdu:21,output:[6,26,27,28,29],over:[4,5,6,7],overview:[6,7],overwrit:[7,30],overwritten:21,own:[0,1,6,21,26,27,28,29],pace:[0,2,6],pacecap:2,pack:16,packag:21,pad:[11,12,22,23],padding_class:11,pair:[12,23],parallel:6,param:[14,26,27,28,29],paramet:[11,12,14,15,17,19,20,22,23,26,27,28,29],parent:[7,14,22],pariti:23,pars:[7,12,15,22,23,30],parse_se_config:12,parse_sm_capdu:[12,15,22,23],part:[3,6,14],partial:[14,22],pass:[7,17],passport:[0,6,9,11,23],passportsam:23,patch:2,path:[6,7,9,14,15,17,22],pattern:[26,27,28,29],pbkdf2:6,pc_to_rdr_secur:2,pc_to_rdr_xfrblock:2,pcd:[6,7,17],pcsc:[0,4,6],pcsc_scan:6,pcscd:[6,7],pcsclite:[4,6],pdf:[1,3],pdu:21,perform:[2,4,12,17,19,20,22,23],perform_security_oper:[12,15,22,23],period:6,permiss:[0,5],persist:9,personalauswei:3,peter:3,pezorform_security_oper:22,phone:[6,7],photo:9,php:4,physic:[7,20],piec:14,pil:6,pin:[0,2,15,22,23],pipe:[2,6],pkc:6,pkg:[2,4,6],pkg_config_path:4,pkgconfig:4,pki:23,place:[6,26,27,28,29],placeofbirth:6,plain:[12,15,22,23],platform:[0,1,2,4,5,6],pleas:[0,1,2,4,5,6],plist:6,plu:[26,27,28,29],plug:6,point:14,pointer:14,port:[4,6,7,17],portabl:2,posess:[15,22,23],posit:[26,27,28,29],possibl:[0,2,4,6],power:[7,17,19,20,22],powerdown:[7,17,19,20,22],powerup:[7,17,19,20,22],predic:6,prefix:4,prepend:[11,14,22],present:2,pretend:6,pretti:7,prettyprint_anyth:14,previou:[14,22],previous:[7,12,23],print:[2,4,5,6,7,26,27,28,29],print_ascii:7,privaci:3,privat:[6,12,15,22,23],probabl:[2,4,6],problem:6,process:[0,1,4],produc:[17,21],product:[2,6],program:[1,3,6,7],programmingguide_accessori:1,project:[0,1,2,3,4,5,6],prompt:9,prop:[14,30],properti:[14,17,22,30],propertylist:6,proprietari:[2,6,14],protect:[0,6,12,15,22,23],protect_respons:[12,22,23],protect_result:[15,22,23],protocol:[0,1,6,7,17,22,23],prove:[15,22,23],provid:[6,7,12,23,26,27,28,29],pseudo:2,pseudorandom:11,publikationen:2,publish:6,puk:[15,22,23],purpos:[4,26,27,28,29],put:[14,22],putdata:[14,22],putdataencapsul:[14,22],putdataplain:[14,22],pwd:2,pwendland:0,pycrypto:6,pypi:6,pyreadlin:6,pyscard:[6,7],python:[26,27,28,29],pythonwar:6,qrcode:7,qrencod:6,qrserver:7,quit:7,r_apdu:[7,30],rais:[7,14,22,26,27,28,29],random:[2,15,22,23],randomli:6,rapdu:[7,17],raw:[12,22,23],rdr_to_pc_datablock:2,read:[6,7,9,14,22,23],readabl:[23,26,27,28,29],readbinari:[14,22],readbinaryencapsul:[14,22],readbinaryplain:[14,22],readdatagroup:[7,9],reader0:6,reader1:6,reader2:6,reader:[0,1,3,4,6,7,19,20],readernum:[7,17,20],readlin:6,readrecord:[14,22],readrecordencapsul:[14,22],readrecordplain:[14,22],real:[2,4,6,7,20,21],reali:21,realiz:4,reason:[26,27,28,29],recalculate_length:16,receiv:[4,7,17,20],recent:2,recogn:7,reconnect:7,record:[7,14,22,26,27,28,29],recordhandlingdecod:[14,22],recordidentifiersupport:[14,22],recordnumbersupport:[14,22],recordpoint:14,recordstructureef:[7,14,22],recurs:[6,14],redlich:3,ref:14,refdataobj:14,refer:[12,14,15,22,23,26,27,28,29],referenc:[15,22,23],regard:[14,22,26,27,28,29],regex:[26,27,28,29],regexp:[26,27,28,29],regist:[1,4,6,7,26,27,28,29],regular:[26,27,28,29],rel:6,relai:[0,3,5,6,7,8,18,21],relaymiddleman:[7,8,18,20],relayo:[7,20],releas:[2,3,4,6],religiousartisticnam:6,remot:[0,3,4,6],remotesmartcardread:[0,5],remov:[12,14,22,23],render:[7,30],replac:[6,12,14,15,22,23],report:[2,4,6],repositori:[0,2,3,4,5,6],repres:30,represent:14,request:[3,6,7,14],requestedtl:[14,22],requir:[0,2,5,6,7,23],res:4,research:3,reset:[7,14,15,17,19,20,22,23],resetrecordpoint:14,residencepermit1:6,residencepermit2:6,resp_data:23,respect:7,respons:[0,1,2,4,6,7,9,12,14,15,17,19,20,22,23,30],respsons:17,ressourc:1,rest:7,restart:6,restor:[12,15,22,23],restore_s:[15,22,23],result:[7,12,14,16,17,22,23,26,27,28,29],resum:[26,27,28,29],retri:[15,22,23],retriev:[15,22,23],revers:[6,7],rfid:4,rfu:[15,22,23],right:[15,22,23],root:[6,26,27,28,29],round:[26,27,28,29],rousseau:19,routin:6,rpc_type:6,rsa:[15,22,23],rule:[26,27,28,29],run:[0,2,4,5,7,17,26,27,28,29],runtest:[26,27,28,29],runtim:0,russello:3,sai:6,said:7,salsa:19,salt:11,sam:[7,9,12,14,15,17,22,23],same:[6,7,26,27,28,29],samsung:1,saniti:4,sar:3,save:6,scan:[0,5,7],scanner:5,scardcontrol:2,scardtransmit:2,schmidt:3,scienc:3,script:6,sdk:[0,1,5],search:[14,22],searchbinaryencapsul:[14,22],searchbinaryplain:[14,22],second:[14,22,26,27,28,29],secondsft:[14,22],secondsoftwar:[14,22],secret:[11,15,22,23],section:4,secur:[2,3,6,7,12,15,17,22,23],security_environ:[12,15,22,23],see:[2,4,6,7,14,17,19,22],seed:23,seekabl:[7,17,22],seid:[12,15,22,23],select:[0,1,4,5,7,11,14,17,22],selectfil:[14,22],self:[7,13,26,27,28,29],send:[1,4,7,11,12,17,20,21,22,23],sendcommandapdu:7,sent:[4,7],seper:6,seq1:[26,27,28,29],seq2:[26,27,28,29],seq_typ:[26,27,28,29],sequenc:[11,23,26,27,28,29],sequenti:14,serial:[2,6],serv:21,server_sock:7,servic:[1,6],session:7,session_kei:11,set1:[26,27,28,29],set2:[26,27,28,29],set:[4,6,9,12,13,14,17,22,23,26,27,28,29],set_asym_algorithm:[15,22,23],set_mf:[15,22,23],setcard:9,setter:[15,22,23],settimeout:7,setup:[26,27,28,29],setupclass:[26,27,28,29],seutil:[8,15,22,23],sever:[2,4,6],sex:6,shall:[6,12,22,23],shell:6,shiguo:3,ship:[2,4,6],shortdescript:[26,27,28,29],shortfid:14,shortfidsupport:[14,22],should:[4,6,7,12,14,22,23,26,27,28,29],show:6,sicher:3,sicherheitsanalys:3,sigkil:6,sign:[6,12,22,23],signatur:[6,12,22,23],signific:[26,27,28,29],silenc:[26,27,28,29],similar:[7,26,27,28,29],similarli:[26,27,28,29],simpl:[0,7,14,22],simplest:21,simpletlv:16,simpletlv_data:[14,22],simpletlv_pack:16,simpletlv_unpack:16,simpli:[6,7],simul:[0,1],sinc:[2,6],sit:3,six:12,size:[11,14,22],skip:[26,27,28,29],skiptest:[26,27,28,29],sln:6,slot:6,sm_header:[12,22,23],smart:[17,19,20,21],smartcard:[3,5,6,7,14,17,20],smartcardfilesystem:[8,22],smartcardo:[7,17,19,20,22],smartcardsam:[8,22,23],smartcardsam_test:[8,25],smartcardservic:6,smartphon:[0,3,5],smartwatch:0,snapshot:2,social:3,sock:7,sock_dgram:7,socket:[0,6,7,17],softwar:[2,4,5,6,7,14,17,22],solut:6,some:[2,3,7],some_attribut:[26,27,28,29],someexcept:[26,27,28,29],someth:6,somewarn:[26,27,28,29],sourc:[0,1,2,5,7],sourceforg:[2,4,6,7],space:30,special:[2,5],specif:[7,15,22,23,26,27,28,29],specifi:[4,6,7,11,12,14,15,16,22,23,26,27,28,29],specifii:6,springer:3,spsmartcardsdatatyp:6,spusbdatatyp:6,src:[2,4],ssc:[11,23],stabl:6,stack:2,stai:4,standalon:6,standard:[2,4,6,7,23,26,27,28,29],standardmsg:[26,27,28,29],start:[2,4,6,14],startup:6,state:14,statu:[2,14,22,30],step:6,still:[2,3,4,6],stop:[6,7,17],storag:[6,9],store:[12,15,22,23],store_s:[15,22,23],str:[7,17],straight:7,street:6,string1:11,string2:11,string:[2,4,6,7,11,12,14,15,16,17,19,20,22,26,27,28,29,30],stringtoint:[7,30],strip:11,strip_pad:11,structur:[14,16],studio:[0,4,5,6],stuttgart:3,style:[26,27,28,29],subclass:[26,27,28,29],subdir:2,submodul:[0,1,6],subset:[2,26,27,28,29],subsystem:6,subtest:[26,27,28,29],success:[15,22,23,26,27,28,29],successful:7,successfulli:6,sudo:[2,6],suffer:[26,27,28,29],suggest:[0,1,2,4,5,6],suitabl:11,sun:4,superset:[26,27,28,29],support:[2,4,6,9,11,12,22,26,27,28,29],suppos:6,sure:[6,7],sw1:[2,7,30],sw2:[2,7,30],swerror:[7,13],swutil:8,sym:12,symmetri:[26,27,28,29],syntax:6,sys:7,sysconfdir:6,system:[2,3,4,5,6,7,15],system_profil:6,systemroot:6,szenario:3,t15:[17,22],tabl:[12,14,17,22,23],tag:[12,14,16,22,23],tagungsband:3,tai:[17,22],taj:[17,22],take:[14,15,22,23,26,27,28,29],taken:6,tar:2,tbi:[17,22],tbj:[17,22],tcardemul:1,tci:[17,22],tcj:[17,22],tck:[17,22],tcp:[6,14,22],tcp_port:6,tdi:[17,22],teardown:[26,27,28,29],teardownclass:[26,27,28,29],tech:1,techdoc:1,technik:3,technischerichtlinien:2,telecommun:3,templat:[7,12,14,22,23],term:6,termin:[0,4,12,15,21,22,23],test:[0,1,2,4,5,6,8,26,27,28,29],test_capdu:29,test_card_cr:26,test_cas:[26,27,28,29],test_counter_decr:28,test_external_authent:28,test_get_and_set_card:26,test_incorrect_pin:28,test_internal_authent:28,test_pad:27,test_rapdu:29,test_readdatagroup:26,test_security_environ:28,testcas:[26,27,28,29],testcryptoutil:27,tester:[6,19],testnpacardgener:26,testresult:[26,27,28,29],testsmartcardsam:28,testutil:29,text:[22,26,27,28,29],than:[0,1,2,4,5,6,26,27,28,29],the_except:[26,27,28,29],the_warn:[26,27,28,29],thehistor:[14,22],thei:[6,11,12,26,27,28,29],them:[0,17],themselv:3,therefor:9,thesi:3,thi:[2,4,5,6,7,9,11,12,14,15,17,19,20,21,22,23,26,27,28,29,30],thing:[7,14],third:[17,22],those:[7,26,27,28,29],through:[0,2,6],time:[2,4,6,7,26,27,28,29],tip:1,titl:4,tizen:[0,3],tlv:[12,14,16,22,23],tlv_data:16,tlv_find_tag:16,tlv_unpack:16,tlvutil:8,tmp:4,to_str:12,togeth:[0,4],tool:[1,2,4,6],toolset:6,tr03119:2,tracker:[0,1,2,4,5,6],tradit:[5,6],transmiss:[17,22],transmit:[0,2,4,7],transpar:14,transparentstructureef:[7,14,22],tri:6,trigger:[26,27,28,29],trust:[2,6,12,22,23],tupl:[14,16,22,26,27,28,29],tuple1:[26,27,28,29],tuple2:[26,27,28,29],two:[14,22,26,27,28,29],type:[3,6,9,11,12,15,22,23,26,27,28,29],typeobj:[26,27,28,29],ubuntu:[2,4,6],udc:2,ulrich:3,umbrella:3,umdf:6,umfeld:3,unam:2,und:3,under:[15,22,23],understood:15,unequ:[26,27,28,29],unexpect:[26,27,28,29],unexpected_regex:[26,27,28,29],unfamiliar:[2,4,6],unit:[14,22],unittest:[26,27,28,29],univers:2,unix:5,unknown:[7,14,22],unless:[26,27,28,29],unlik:[26,27,28,29],unpack:16,unplug:6,unprotect:[12,15,22,23],unprotected_result:[15,22,23],until:[15,22,23],unverifi:6,updat:[0,6,14,22],updatebinari:[14,22],updatebinaryencapsul:[14,22],updatebinaryplain:[14,22],updaterecord:[14,22],updaterecordencapsul:[14,22],updaterecordplain:[14,22],url:[3,6],usabl:[2,3],usag:6,usb:[3,6],use:[0,1,2,4,5,6,7,11,12,14,15,17,22,23,26,27,28,29],used:[0,2,4,5,6,7,9,11,12,14,15,19,20,22,23,26,27,28,29,30],useful:[1,26,27,28,29],user:[2,6,9,15,21,22,23],uses:[0,1,2,4,6,23,26,27,28,29],using:[0,1,2,3,4,5,6,7,12,14,15,22,23],usr:[2,6],usual:[2,6,7,14,26,27,28,29],utf:6,util:[6,8],utils_test:[8,25],valid:[6,7,15,22,23,26,27,28,29],valu:[4,6,12,14,15,17,22,23,26,27,28,29,30],variabl:14,variou:[2,3,11,12,22,23],vdpu:21,vector:11,vendor:[2,6],vendor_ifd_typ:6,vendor_nam:6,verbos:[2,4,6],verif:[0,2,12,22,23],verifi:[0,2,6,12,15,22,23],verify_certif:[12,22,23],verify_cryptographic_checksum:[12,22,23],verify_digital_signatur:[12,22,23],verlag:3,version:[0,1,2,4,5,6,15,22,23],via:[0,1,2,4,5,6,7,11,15,17,20],vicc:[4,6,7,17,21],virtual:[0,4,5,17],virtualicc:[7,17],virtualsmartcard:[6,7,9,11,12,13,14,15,16,19,20,21,22,23,26,27,28,29,30],visual:[4,6],vletoux:0,volum:3,vpcd:[4,5,7,17,20],vpicc:[7,17],vsmartcard:[0,1,2,3,4,5,6],w64:4,wai:6,wait:[4,6],waldmann:3,walk:14,want:[0,2,3,7],warm:[17,19,20,22],warn:[6,7,26,27,28,29],warn_noinfo63:22,warnclass:[26,27,28,29],wdk:6,web:3,welcom:[0,1,2,4,5,6],well:6,what:[4,7,12,14,22,23],whatev:30,when:[4,5,6,7,26,27,28,29,30],where:[2,4,5,6,7,14],wherea:2,whether:[12,15,17,22,23,26,27,28,29],which:[0,2,4,6,7,11,12,14,17,21,22,26,27,28,29,30],whose:[26,27,28,29],wiki:2,win32:6,window:[2,4,5],winscard:[4,6],wireless:1,wissen:3,with_mark:16,with_traceback:13,without:[0,6,11,26,27,28,29,30],wix:6,wixtoolset:6,wolf:3,word:30,work:[2,4,6,7],workaround:7,workshop:3,write:[14,22],writeand:14,writebinari:[14,22],writebinaryencapsul:[14,22],writebinaryplain:[14,22],writeor:14,writerecord:[14,22],written:[2,4],wudfhost:6,www:[0,2,4,6],x00:11,x01:7,x02:7,x03:7,x04:7,x38:7,x64:6,x82:6,xff:7,xjf:2,xml:[4,6],xor:14,xxx:7,yield:[6,26,27,28,29],ykneo:0,you:[0,1,2,3,4,5,6,7,14,22,26,27,28,29],your:[0,1,2,4,5,6,7],yourself:[3,7],yubico:0,zero:[15,22,23,26,27,28,29],zip:6,zone:23,zum:3,zur:3},titles:["Android Smart Card Emulator","Tizen Smart Card Emulator","USB CCID Emulator","Welcome to the Virtual Smart Card Architecture documentation!","PC/SC Relay","Remote Smart Card Reader","Virtual Smart Card","Creating a Virtual Smart Card","virtualsmartcard Package","CardGenerator Module","ConstantDefinitions Module","CryptoUtils Module","SEutils Module","SWutils Module","SmartcardFilesystem Module","SmartcardSAM Module","TLVutils Module","VirtualSmartcard Module","cards Package","HandlerTest Module","Relay Module","RelayMiddleman Module","cryptoflex Module","ePass Module","nPA Module","tests Package","CardGenerator_test Module","CryptoUtils_test Module","SmartcardSAM_test Module","utils_test Module","utils Module"],titleterms:{"7816":7,Use:[0,1,5],Using:6,android:[0,4,5],architectur:3,build:6,card:[0,1,2,3,4,5,6,7,18],cardgener:9,cardgenerator_test:26,ccid:2,compliant:2,configur:6,constantdefinit:10,contact:[0,1,5],contactless:4,creat:7,cryptoflex:22,cryptoutil:11,cryptoutils_test:27,document:3,download:[0,1,2,3,4,5,6],emul:[0,1,2,4,6],epass:23,exampl:7,gadgetf:2,handlertest:19,hint:[2,4],implement:7,instal:[0,1,2,4,5,6],interfac:4,iso:7,less:[0,1,5],libnfc:4,like:7,linux:[2,4,6],mac:6,middlewar:4,modul:[9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,26,27,28,29,30],note:[0,1,2,4,5,6],npa:24,other:7,packag:[8,18,25],phone:[0,5],python:6,question:[0,1,2,4,5,6],reader:[2,5],refer:[0,1,2,3,4,5,6],relai:[4,20],relaymiddleman:21,remot:5,run:6,seutil:12,similar:[2,4,6],smart:[0,1,2,3,4,5,6,7],smartcardfilesystem:14,smartcardsam:15,smartcardsam_test:28,smartwatch:1,swutil:13,test:25,tizen:1,tlvutil:16,type:7,unix:[2,4,6],usag:[2,4],usb:2,util:30,utils_test:29,virtual:[3,6,7],virtualsmartcard:[8,17],vpcd:6,vpicc:6,welcom:3,window:6,written:6}}) \ No newline at end of file +Search.setIndex({docnames:["ACardEmulator/README","TCardEmulator/README","ccid/README","index","pcsc-relay/README","remote-reader/README","virtualsmartcard/README","virtualsmartcard/api","virtualsmartcard/api/virtualsmartcard","virtualsmartcard/api/virtualsmartcard.CardGenerator","virtualsmartcard/api/virtualsmartcard.ConstantDefinitions","virtualsmartcard/api/virtualsmartcard.CryptoUtils","virtualsmartcard/api/virtualsmartcard.SEutils","virtualsmartcard/api/virtualsmartcard.SWutils","virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem","virtualsmartcard/api/virtualsmartcard.SmartcardSAM","virtualsmartcard/api/virtualsmartcard.TLVutils","virtualsmartcard/api/virtualsmartcard.VirtualSmartcard","virtualsmartcard/api/virtualsmartcard.cards","virtualsmartcard/api/virtualsmartcard.cards.cryptoflex","virtualsmartcard/api/virtualsmartcard.cards.ePass","virtualsmartcard/api/virtualsmartcard.cards.nPA","virtualsmartcard/api/virtualsmartcard.utils"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinxcontrib.bibtex":7,sphinx:56},filenames:["ACardEmulator/README.txt","TCardEmulator/README.txt","ccid/README.txt","index.txt","pcsc-relay/README.txt","remote-reader/README.txt","virtualsmartcard/README.txt","virtualsmartcard/api.txt","virtualsmartcard/api/virtualsmartcard.txt","virtualsmartcard/api/virtualsmartcard.CardGenerator.txt","virtualsmartcard/api/virtualsmartcard.ConstantDefinitions.txt","virtualsmartcard/api/virtualsmartcard.CryptoUtils.txt","virtualsmartcard/api/virtualsmartcard.SEutils.txt","virtualsmartcard/api/virtualsmartcard.SWutils.txt","virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem.txt","virtualsmartcard/api/virtualsmartcard.SmartcardSAM.txt","virtualsmartcard/api/virtualsmartcard.TLVutils.txt","virtualsmartcard/api/virtualsmartcard.VirtualSmartcard.txt","virtualsmartcard/api/virtualsmartcard.cards.txt","virtualsmartcard/api/virtualsmartcard.cards.cryptoflex.txt","virtualsmartcard/api/virtualsmartcard.cards.ePass.txt","virtualsmartcard/api/virtualsmartcard.cards.nPA.txt","virtualsmartcard/api/virtualsmartcard.utils.txt"],objects:{"virtualsmartcard.CardGenerator":{CardGenerator:[9,1,1,""]},"virtualsmartcard.CardGenerator.CardGenerator":{__generate_cryptoflex:[9,2,1,""],__generate_ePass:[9,2,1,""],__generate_iso_card:[9,2,1,""],__generate_nPA:[9,2,1,""],generateCard:[9,2,1,""],getCard:[9,2,1,""],readDatagroups:[9,2,1,""],setCard:[9,2,1,""]},"virtualsmartcard.CryptoUtils":{_makesalt:[11,3,1,""],append_padding:[11,3,1,""],calculate_MAC:[11,3,1,""],cipher:[11,3,1,""],crypto_checksum:[11,3,1,""],decrypt:[11,3,1,""],encrypt:[11,3,1,""],get_cipher:[11,3,1,""],get_cipher_blocklen:[11,3,1,""],get_cipher_keylen:[11,3,1,""],hash:[11,3,1,""],operation_on_string:[11,3,1,""],strip_padding:[11,3,1,""]},"virtualsmartcard.SEutils":{ControlReferenceTemplate:[12,1,1,""],Security_Environment:[12,1,1,""]},"virtualsmartcard.SEutils.ControlReferenceTemplate":{__replace_tag:[12,2,1,""],__set_algo:[12,2,1,""],__set_iv:[12,2,1,""],__set_key:[12,2,1,""],parse_SE_config:[12,2,1,""],to_string:[12,2,1,""]},"virtualsmartcard.SEutils.Security_Environment":{_set_SE:[12,2,1,""],compute_cryptographic_checksum:[12,2,1,""],compute_digital_signature:[12,2,1,""],decipher:[12,2,1,""],encipher:[12,2,1,""],generate_public_key_pair:[12,2,1,""],hash:[12,2,1,""],manage_security_environment:[12,2,1,""],parse_SM_CAPDU:[12,2,1,""],perform_security_operation:[12,2,1,""],protect_response:[12,2,1,""],verify_certificate:[12,2,1,""],verify_cryptographic_checksum:[12,2,1,""],verify_digital_signature:[12,2,1,""]},"virtualsmartcard.SWutils":{SwError:[13,4,1,""]},"virtualsmartcard.SWutils.SwError":{args:[13,5,1,""],with_traceback:[13,2,1,""]},"virtualsmartcard.SmartcardFilesystem":{DF:[14,1,1,""],EF:[14,1,1,""],File:[14,1,1,""],MF:[14,1,1,""],Record:[14,1,1,""],RecordStructureEF:[14,1,1,""],TransparentStructureEF:[14,1,1,""],get_indexes:[14,3,1,""],getfile_byrefdataobj:[14,3,1,""],isEqual:[14,3,1,""],make_property:[14,3,1,""],prettyprint_anything:[14,3,1,""],walk:[14,3,1,""],write:[14,3,1,""]},"virtualsmartcard.SmartcardFilesystem.DF":{append:[14,2,1,""],appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],content:[14,2,1,""],data:[14,2,1,""],decrypt:[14,2,1,""],dfname:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],remove:[14,2,1,""],select:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.EF":{appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],datacoding:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],select:[14,2,1,""],shortfid:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.File":{appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],select:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.MF":{_selectFile:[14,2,1,""],append:[14,2,1,""],appendRecord:[14,2,1,""],appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],content:[14,2,1,""],create:[14,2,1,""],createFile:[14,2,1,""],current:[14,2,1,""],currentDF:[14,2,1,""],currentEF:[14,2,1,""],data:[14,2,1,""],dataObjectHandlingDecodeEncapsulated:[14,2,1,""],dataObjectHandlingDecodePlain:[14,2,1,""],dataUnitsDecodeEncapsulated:[14,2,1,""],dataUnitsDecodePlain:[14,2,1,""],decrypt:[14,2,1,""],deleteFile:[14,2,1,""],dfname:[14,2,1,""],encodeFileControlParameter:[14,2,1,""],encrypt:[14,2,1,""],eraseBinaryEncapsulated:[14,2,1,""],eraseBinaryPlain:[14,2,1,""],eraseRecord:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],firstSFT:[14,2,1,""],getDataEncapsulated:[14,2,1,""],getDataPlain:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],makeFirstSoftwareFunctionTable:[14,2,1,""],makeSecondSoftwareFunctionTable:[14,2,1,""],named_dfs:[14,2,1,""],parent:[14,2,1,""],putDataEncapsulated:[14,2,1,""],putDataPlain:[14,2,1,""],putdata:[14,2,1,""],readBinaryEncapsulated:[14,2,1,""],readBinaryPlain:[14,2,1,""],readRecordEncapsulated:[14,2,1,""],readRecordPlain:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],recordHandlingDecode:[14,2,1,""],remove:[14,2,1,""],searchBinaryEncapsulated:[14,2,1,""],searchBinaryPlain:[14,2,1,""],secondSFT:[14,2,1,""],select:[14,2,1,""],selectFile:[14,2,1,""],simpletlv_data:[14,2,1,""],updateBinaryEncapsulated:[14,2,1,""],updateBinaryPlain:[14,2,1,""],updateRecordEncapsulated:[14,2,1,""],updateRecordPlain:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writeBinaryEncapsulated:[14,2,1,""],writeBinaryPlain:[14,2,1,""],writeRecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.Record":{data:[14,2,1,""],identifier:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.RecordStructureEF":{__getRecords:[14,2,1,""],__getRecordsByIdentifier:[14,2,1,""],__getRecordsByNumber:[14,2,1,""],appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],datacoding:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],eraserecord:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],hasFixedRecordSize:[14,2,1,""],hasSimpleTlv:[14,2,1,""],isCyclic:[14,2,1,""],lifecycle:[14,2,1,""],maxrecordsize:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],recordpointer:[14,2,1,""],records:[14,2,1,""],resetRecordPointer:[14,2,1,""],select:[14,2,1,""],shortfid:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardFilesystem.TransparentStructureEF":{appendrecord:[14,2,1,""],bertlv_data:[14,2,1,""],data:[14,2,1,""],datacoding:[14,2,1,""],decrypt:[14,2,1,""],encrypt:[14,2,1,""],erasebinary:[14,2,1,""],fid:[14,2,1,""],filedescriptor:[14,2,1,""],getMF:[14,2,1,""],getdata:[14,2,1,""],getpath:[14,2,1,""],lifecycle:[14,2,1,""],parent:[14,2,1,""],putdata:[14,2,1,""],readbinary:[14,2,1,""],readrecord:[14,2,1,""],select:[14,2,1,""],shortfid:[14,2,1,""],simpletlv_data:[14,2,1,""],updatebinary:[14,2,1,""],updaterecord:[14,2,1,""],writebinary:[14,2,1,""],writerecord:[14,2,1,""]},"virtualsmartcard.SmartcardSAM":{SAM:[15,1,1,""],get_referenced_cipher:[15,3,1,""]},"virtualsmartcard.SmartcardSAM.SAM":{FSdecrypt:[15,2,1,""],FSencrypt:[15,2,1,""],_get_referenced_key:[15,2,1,""],change_reference_data:[15,2,1,""],erase_SE:[15,2,1,""],external_authenticate:[15,2,1,""],generate_public_key_pair:[15,2,1,""],get_card_number:[15,2,1,""],get_challenge:[15,2,1,""],internal_authenticate:[15,2,1,""],manage_security_environment:[15,2,1,""],mutual_authenticate:[15,2,1,""],parse_SM_CAPDU:[15,2,1,""],perform_security_operation:[15,2,1,""],protect_result:[15,2,1,""],restore_SE:[15,2,1,""],set_MF:[15,2,1,""],set_asym_algorithm:[15,2,1,""],store_SE:[15,2,1,""],verify:[15,2,1,""]},"virtualsmartcard.TLVutils":{bertlv_pack:[16,3,1,""],bertlv_unpack:[16,3,1,""],decodeDiscretionaryDataObjects:[16,3,1,""],decodeExtendedHeaderList:[16,3,1,""],decodeHeaderList:[16,3,1,""],decodeOffsetDataObjects:[16,3,1,""],decodeTagList:[16,3,1,""],encodeDataOffsetObjects:[16,3,1,""],encodeDiscretionaryDataObjects:[16,3,1,""],encodebertlvDatalist:[16,3,1,""],pack:[16,3,1,""],simpletlv_pack:[16,3,1,""],simpletlv_unpack:[16,3,1,""],tlv_find_tag:[16,3,1,""],tlv_find_tags:[16,3,1,""],tlv_unpack:[16,3,1,""],unpack:[16,3,1,""]},"virtualsmartcard.VirtualSmartcard":{Iso7816OS:[17,1,1,""],SmartcardOS:[17,1,1,""],VirtualICC:[17,1,1,""],loadMitMFromPath:[17,3,1,""]},"virtualsmartcard.VirtualSmartcard.Iso7816OS":{SAM:[17,2,1,""],execute:[17,2,1,""],formatResult:[17,2,1,""],getATR:[17,2,1,""],getResponse:[17,2,1,""],makeATR:[17,2,1,""],makeThirdSoftwareFunctionTable:[17,2,1,""],mf:[17,2,1,""],powerDown:[17,2,1,""],powerUp:[17,2,1,""],reset:[17,2,1,""],seekable:[17,2,1,""]},"virtualsmartcard.VirtualSmartcard.SmartcardOS":{execute:[17,2,1,""],getATR:[17,2,1,""],powerDown:[17,2,1,""],powerUp:[17,2,1,""],reset:[17,2,1,""]},"virtualsmartcard.VirtualSmartcard.VirtualICC":{__recvFromVPICC:[17,2,1,""],__sendToVPICC:[17,2,1,""],connectToPort:[17,2,1,""],openPort:[17,2,1,""],run:[17,2,1,""],stop:[17,2,1,""]},"virtualsmartcard.cards":{cryptoflex:[19,0,0,"-"],ePass:[20,0,0,"-"]},"virtualsmartcard.cards.cryptoflex":{CryptoflexMF:[19,1,1,""],CryptoflexOS:[19,1,1,""],CryptoflexSAM:[19,1,1,""],CryptoflexSE:[19,1,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexMF":{_selectFile:[19,2,1,""],append:[19,2,1,""],appendRecord:[19,2,1,""],appendrecord:[19,2,1,""],bertlv_data:[19,2,1,""],content:[19,2,1,""],create:[19,2,1,""],createFile:[19,2,1,""],current:[19,2,1,""],currentDF:[19,2,1,""],currentEF:[19,2,1,""],data:[19,2,1,""],dataObjectHandlingDecodeEncapsulated:[19,2,1,""],dataObjectHandlingDecodePlain:[19,2,1,""],dataUnitsDecodeEncapsulated:[19,2,1,""],dataUnitsDecodePlain:[19,2,1,""],decrypt:[19,2,1,""],deleteFile:[19,2,1,""],dfname:[19,2,1,""],encodeFileControlParameter:[19,2,1,""],encrypt:[19,2,1,""],eraseBinaryEncapsulated:[19,2,1,""],eraseBinaryPlain:[19,2,1,""],eraseRecord:[19,2,1,""],erasebinary:[19,2,1,""],fid:[19,2,1,""],filedescriptor:[19,2,1,""],firstSFT:[19,2,1,""],getDataEncapsulated:[19,2,1,""],getDataPlain:[19,2,1,""],getMF:[19,2,1,""],getdata:[19,2,1,""],getpath:[19,2,1,""],lifecycle:[19,2,1,""],makeFirstSoftwareFunctionTable:[19,2,1,""],makeSecondSoftwareFunctionTable:[19,2,1,""],named_dfs:[19,2,1,""],parent:[19,2,1,""],putDataEncapsulated:[19,2,1,""],putDataPlain:[19,2,1,""],putdata:[19,2,1,""],readBinaryEncapsulated:[19,2,1,""],readBinaryPlain:[19,2,1,""],readRecordEncapsulated:[19,2,1,""],readRecordPlain:[19,2,1,""],readbinary:[19,2,1,""],readrecord:[19,2,1,""],recordHandlingDecode:[19,2,1,""],remove:[19,2,1,""],searchBinaryEncapsulated:[19,2,1,""],searchBinaryPlain:[19,2,1,""],secondSFT:[19,2,1,""],select:[19,2,1,""],selectFile:[19,2,1,""],simpletlv_data:[19,2,1,""],updateBinaryEncapsulated:[19,2,1,""],updateBinaryPlain:[19,2,1,""],updateRecordEncapsulated:[19,2,1,""],updateRecordPlain:[19,2,1,""],updatebinary:[19,2,1,""],updaterecord:[19,2,1,""],writeBinaryEncapsulated:[19,2,1,""],writeBinaryPlain:[19,2,1,""],writeRecord:[19,2,1,""],writebinary:[19,2,1,""],writerecord:[19,2,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexOS":{SAM:[19,2,1,""],execute:[19,2,1,""],formatResult:[19,2,1,""],getATR:[19,2,1,""],getResponse:[19,2,1,""],makeATR:[19,2,1,""],makeThirdSoftwareFunctionTable:[19,2,1,""],mf:[19,2,1,""],powerDown:[19,2,1,""],powerUp:[19,2,1,""],reset:[19,2,1,""],seekable:[19,2,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexSAM":{FSdecrypt:[19,2,1,""],FSencrypt:[19,2,1,""],_get_referenced_key:[19,2,1,""],change_reference_data:[19,2,1,""],erase_SE:[19,2,1,""],external_authenticate:[19,2,1,""],generate_public_key_pair:[19,2,1,""],get_card_number:[19,2,1,""],get_challenge:[19,2,1,""],internal_authenticate:[19,2,1,""],manage_security_environment:[19,2,1,""],mutual_authenticate:[19,2,1,""],parse_SM_CAPDU:[19,2,1,""],perform_security_operation:[19,2,1,""],pezorform_security_operation:[19,2,1,""],protect_result:[19,2,1,""],restore_SE:[19,2,1,""],set_MF:[19,2,1,""],set_asym_algorithm:[19,2,1,""],store_SE:[19,2,1,""],verify:[19,2,1,""]},"virtualsmartcard.cards.cryptoflex.CryptoflexSE":{_set_SE:[19,2,1,""],compute_cryptographic_checksum:[19,2,1,""],compute_digital_signature:[19,2,1,""],decipher:[19,2,1,""],encipher:[19,2,1,""],generate_public_key_pair:[19,2,1,""],hash:[19,2,1,""],manage_security_environment:[19,2,1,""],parse_SM_CAPDU:[19,2,1,""],perform_security_operation:[19,2,1,""],protect_response:[19,2,1,""],verify_certificate:[19,2,1,""],verify_cryptographic_checksum:[19,2,1,""],verify_digital_signature:[19,2,1,""]},"virtualsmartcard.cards.ePass":{PassportSAM:[20,1,1,""],ePass_SE:[20,1,1,""]},"virtualsmartcard.cards.ePass.PassportSAM":{FSdecrypt:[20,2,1,""],FSencrypt:[20,2,1,""],__computeKeys:[20,2,1,""],_get_referenced_key:[20,2,1,""],change_reference_data:[20,2,1,""],derive_key:[20,2,1,""],erase_SE:[20,2,1,""],external_authenticate:[20,2,1,""],generate_public_key_pair:[20,2,1,""],get_card_number:[20,2,1,""],get_challenge:[20,2,1,""],internal_authenticate:[20,2,1,""],manage_security_environment:[20,2,1,""],mutual_authenticate:[20,2,1,""],parse_SM_CAPDU:[20,2,1,""],perform_security_operation:[20,2,1,""],protect_result:[20,2,1,""],restore_SE:[20,2,1,""],set_MF:[20,2,1,""],set_asym_algorithm:[20,2,1,""],store_SE:[20,2,1,""],verify:[20,2,1,""]},"virtualsmartcard.cards.ePass.ePass_SE":{_set_SE:[20,2,1,""],compute_cryptographic_checksum:[20,2,1,""],compute_digital_signature:[20,2,1,""],decipher:[20,2,1,""],encipher:[20,2,1,""],generate_public_key_pair:[20,2,1,""],hash:[20,2,1,""],manage_security_environment:[20,2,1,""],parse_SM_CAPDU:[20,2,1,""],perform_security_operation:[20,2,1,""],protect_response:[20,2,1,""],verify_certificate:[20,2,1,""],verify_cryptographic_checksum:[20,2,1,""],verify_digital_signature:[20,2,1,""]},"virtualsmartcard.utils":{APDU:[22,1,1,""],C_APDU:[22,1,1,""],R_APDU:[22,1,1,""],_make_byte_property:[22,3,1,""],hexdump:[22,3,1,""],inttostring:[22,3,1,""],stringtoint:[22,3,1,""]},"virtualsmartcard.utils.APDU":{_deldata:[22,2,1,""],_format_parts:[22,2,1,""],_getdata:[22,2,1,""],_setbyte:[22,2,1,""],_setdata:[22,2,1,""],data:[22,2,1,""]},"virtualsmartcard.utils.C_APDU":{"case":[22,2,1,""],CLA:[22,2,1,""],INS:[22,2,1,""],Lc:[22,2,1,""],Le:[22,2,1,""],P1:[22,2,1,""],P2:[22,2,1,""],_deldata:[22,2,1,""],_format_fields:[22,2,1,""],_format_parts:[22,2,1,""],_getdata:[22,2,1,""],_setbyte:[22,2,1,""],_setdata:[22,2,1,""],cla:[22,2,1,""],data:[22,2,1,""],effective_Le:[22,2,1,""],ins:[22,2,1,""],lc:[22,2,1,""],le:[22,2,1,""],p1:[22,2,1,""],p2:[22,2,1,""],parse:[22,2,1,""],render:[22,2,1,""]},"virtualsmartcard.utils.R_APDU":{SW1:[22,2,1,""],SW2:[22,2,1,""],SW:[22,2,1,""],_deldata:[22,2,1,""],_format_fields:[22,2,1,""],_format_parts:[22,2,1,""],_getdata:[22,2,1,""],_getsw:[22,2,1,""],_setbyte:[22,2,1,""],_setdata:[22,2,1,""],_setsw:[22,2,1,""],data:[22,2,1,""],parse:[22,2,1,""],render:[22,2,1,""],sw1:[22,2,1,""],sw2:[22,2,1,""],sw:[22,2,1,""]},virtualsmartcard:{CardGenerator:[9,0,0,"-"],ConstantDefinitions:[10,0,0,"-"],CryptoUtils:[11,0,0,"-"],SEutils:[12,0,0,"-"],SWutils:[13,0,0,"-"],SmartcardFilesystem:[14,0,0,"-"],SmartcardSAM:[15,0,0,"-"],TLVutils:[16,0,0,"-"],VirtualSmartcard:[17,0,0,"-"],utils:[22,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","exception","Python exception"],"5":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function","4":"py:exception","5":"py:attribute"},terms:{"0000":[12,20,22],"03119":2,"05_":3,"07_":3,"0x00":[7,12,20],"0x00000000":6,"0x00000001":6,"0x01":[2,7],"0x02":[2,7],"0x03":2,"0x04":[2,7],"0x0c":[14,19],"0x0d46":2,"0x0e":[14,19],"0x0f":[14,19],"0x10":2,"0x18d1":6,"0x3010":2,"0x40":19,"0x4ee1":6,"0x60":19,"0x80":[12,19,20],"0x8c7b":[6,7],"0x8e":[12,19,20],"0x9000":2,"0x9a":[2,12,19,20],"0x9e":[12,19,20],"0xa4":[7,14,19],"0xac":[12,19,20],"0xb0":[14,19],"0xb1":[14,19],"0xb2":[14,19],"0xb3":[14,19],"0xbc":[12,19,20],"0xca":[14,19],"0xcb":[14,19],"0xd0":[14,19],"0xd1":[14,19],"0xd2":[14,19],"0xd6":[14,19],"0xd7":[14,19],"0xda":[14,19],"0xdb":[14,19],"0xdc":[14,19],"0xdd":[14,19],"0xe0":[14,19],"0xe2":[14,19],"0xe4":[14,19],"0xff":[2,7,17,19],"0xxx":7,"1007":3,"1024":19,"107":3,"134010":6,"14443":4,"179":3,"188":3,"2010":3,"2011":3,"2012":3,"2019":6,"256":19,"27c3":3,"27th":3,"3083254":7,"3083586":7,"33392":3,"35963":[4,6],"35964":6,"3b80800101":4,"3uto6908061f9406236ze184226b":6,"4297":3,"512":19,"642":3,"65535":14,"7816":[0,6,12,17,19,20],"78166":7,"7_3":3,"978":3,"byte":[7,12,14,15,17,19,20,22],"case":[2,4,6,7,19,22],"class":[6,7,9,12,14,15,17,19,20,22],"default":[2,4,6],"enum":4,"f\u00fcr":3,"function":[3,7,11,14,15,17,19,20,22],"import":[1,6,7],"int":[2,4],"long":[4,7,14,19],"m\u00fcller":3,"new":[2,3,6,7,9,12,14,19,20],"null":6,"pl\u00f6tz":6,"public":[3,6,12,15,19,20],"return":[0,7,11,12,13,14,15,16,17,19,20,22],"short":[14,22],"static":[2,14,17,19,20],"switch":[2,6,12,19,20],"throw":7,"true":[14,19,22],"try":[3,7],"universit\u00e4t":3,"while":7,Bus:2,But:[6,7],DFs:[14,19],DGs:6,For:[5,6,14,19],INS:[2,22],Its:7,Near:1,One:[12,20],QES:6,SWs:7,The:[0,1,2,3,4,5,6,7,11,12,14,15,17,19,20,22],Then:6,There:[7,12],Use:[2,4,6],Used:19,Using:[1,4],Will:7,With:[0,4],__computekei:20,__generate_cryptoflex:9,__generate_epass:9,__generate_iso_card:9,__generate_npa:9,__getrecord:14,__getrecordsbyidentifi:14,__getrecordsbynumb:14,__init__:7,__recvfromvpicc:17,__replace_tag:12,__repr__:22,__sendtovpicc:17,__set_algo:12,__set_iv:12,__set_kei:12,__str__:22,__traceback__:13,_deldata:22,_format_field:22,_format_part:22,_get_referenced_kei:[15,19,20],_getdata:22,_getsw:22,_make_byte_properti:22,_makesalt:11,_selectfil:[14,19],_set_s:[12,19,20],_setbyt:22,_setdata:22,_setsw:22,a0000002471001:6,a000000397425446590201:0,a000000527210101:0,abl:[1,6,9],about:[6,7],abov:6,academictitl:6,acardemul:[0,4],access:[0,2,4,5,6,12,15,17,19,20],accessori:1,accord:[7,12,14,17,19,20],accordingli:6,act:[6,7],activ:4,actual:[4,5,7],add:[2,4,6,7,12],add_data:7,added:[15,19,20],addit:[4,6],addition:[2,4,6],address:6,adjust:[12,20],adress:22,af_inet:7,against:[4,5,6],agreement:[12,19,20],aid:4,aid_list:4,algo:11,algorithm:[11,12,15,19,20],all:[4,5,6,7,12,14,15,16,19,20],allow:[0,1,4,5,6],alreadi:12,also:[0,1,2,4,6,7,9,14,19],altern:[2,3,4,6],although:6,analyz:4,anchor:[6,12,19,20],andrea:3,android:[1,3,6,7],angriff:3,ani:[0,1,2,4,5,6,7,15,19,20],anna:6,annex:20,anoth:2,answer:[17,19],anywai:20,apart:3,apdu:[0,1,2,4,6,7,12,14,15,17,19,20,22],api:[6,7],app:[0,1,4,5,6,7],appear:[2,6],append:[11,12,14,19],append_pad:11,appendrecord:[14,19],appl:6,applet:0,applic:[0,1,2,4,5,6,17],applicationidentifi:[14,19],appropri:[1,12,19,20],apt:[2,6],architectur:6,arg:[7,13,14,17,19,22],argument:6,argz:[14,19],around:4,arrai:6,articl:6,asctim:7,aspect:3,assign:[14,22],assignlogicalchannel:[17,19],associ:[12,20],assum:7,asym:12,atexit:7,atr:[4,7,17,19],attach:[0,1,5],attack:[4,5,7],attempt:6,attribut:[14,19,22],auf:3,authent:[12,15,19,20],authenticate_head:[12,19,20],authentisierung:3,author:6,autodetect:[2,4],automat:[2,6,17,19],autoreconf:[2,4,6],autotool:6,auxiliari:[2,4,6],avail:[0,2,3,4,5,6,7,14,19],avoid:7,bac:6,back:[1,4,7,17],backend:4,bar:5,base:[0,2,4,9,12,13,14,15,17,19,20,22],basic:20,basicconfig:7,basiert:3,been:7,befor:7,begin:[14,19],being:6,below:[4,6],ber:[14,19],berlin:3,bertlv:16,bertlv_data:[14,19],bertlv_pack:16,bertlv_unpack:16,besitz:3,best:[4,7],better:7,between:[0,2,6,17,19],big:[7,12,19,20],bin:6,binari:[6,14,19,22],birthnam:6,bit:[11,14,19],bitmask:[12,19,20],bitstr:[17,19],bix:6,bixvread:6,bixvreaderinstal:6,bleed:[2,4,6],block:[7,11,15,19,20],blocklen:11,bndl:6,bool:[14,17,19],bootstrap:6,both:2,box:2,bring:6,brows:[0,3,5],bsi:2,buffer:7,bug:[2,4,6,7],build:[0,1,2,4,5],building_gadget_usb_modul:2,built:[0,2,4,5,6],bund:2,bundl:6,bz2:2,c_apdu:22,ca_kei:[6,7,17],calcul:[4,11,17,19,20],calculate_mac:11,call:[7,14],camera:[0,5],can:[0,2,3,4,5,6,7,14,19],capabl:[14,17,19],capdu:[12,15,17,19,20],card:[8,9,12,14,15,17,19,20],card_typ:[7,9,17],cardaccess:6,cardconnectionexcept:7,cardgener:[7,8],cardnumb:15,cardsecret:15,cardsecur:6,cardtyp:7,cbc:11,ccc:3,ccid:3,cct:12,cer:6,cert:6,certif:[1,6,12,19,20],certifc:6,certmgr:6,cfbundledevelopmentregion:6,cfbundleexecut:6,cfbundleinfodictionaryvers:6,cfbundlenam:6,cfbundlepackagetyp:6,cfbundlesignatur:6,cfbundlevers:6,challeng:[15,19,20],chang:[2,4,6,15,19,20],change_reference_data:[15,19,20],channelid:6,chao:3,charact:[17,19],check:[2,4,6,7,15,19,20],checksum:[11,12,19,20],chip:6,chipkartenles:3,choic:5,choos:[0,1,4,5,6],chosen:6,chr:7,chv:[15,19,20],cipher:[11,15,19,20],cipherspec:11,citi:6,cla:[2,22],cleanup:7,click:6,client:2,clone:[0,1,2,3,4,5,6],close:7,club:3,code:[0,2,5,6,7,12,14,16,19,20,22],codeproject:6,com:[0,1,2,3,4,5,6,7],combin:[2,4,12],come:7,command:[0,1,2,4,6,7,12,14,15,17,19,20,22],commandchaing:[17,19],commandlin:6,commun:[0,1,3,4,5,6,7,17],communityid:6,compar:19,compat:2,compil:[0,1,2,4,5,6],complet:[4,6,7],complex:7,comput:[0,3,5,6,11,12,19,20],compute_cryptographic_checksum:[12,19,20],compute_digital_signatur:[12,19,20],concern:[3,4,5],conf:[6,7],config:[2,4,5,6,12],configur:[0,2,4,5,7,12],congress:3,connect:[0,1,3,4,5,6,7,17],connector:[4,6],connecttoport:[7,17],consecut:22,constantdefinit:8,contact:[4,6],contactless:0,contain:[6,12,14,15,19,20],content:[7,9,12,14,19,22],context:7,contribut:[0,1,2,4,5,6],control:[12,14,19,20],controlreferencetempl:12,convent:[17,19],copyright:6,core:2,correct:[6,7,14,15,19,20],correctli:[15,19],correspond:[7,15],could:6,counter:[11,15,19,20],counterpart:2,countri:6,cover:[4,6],craft:2,creat:[2,3,6,14,19],createfil:[14,19],critic:7,cross:4,crt:[12,20],crypt:11,crypto_checksum:11,cryptoflex:[6,7,8,9,18],cryptoflexmf:[7,19],cryptoflexo:[7,19],cryptoflexs:19,cryptoflexsam:19,cryptograph:[11,12,19,20],cryptotokenkit:6,cryptoutil:[8,15],curl:6,current:[0,3,4,6,9,11,12,14,15,19,20],currentdf:[14,19],currentef:[14,19],custom:2,custom_url:7,cvca:[6,7,17],cyanogenmod:[0,5],cyberflex:[6,11],cycl:[14,19],cyclic:14,d2760001240102000000000000010000:0,daemon:6,data:[0,2,4,5,6,7,11,12,14,15,16,17,19,20,22],datacod:14,datagroup:9,datagroupnam:6,datagroupvalu:6,datalist:[14,16],dataobjecthandlingdecodeencapsul:[14,19],dataobjecthandlingdecodeplain:[14,19],dataset:[6,7],datasetfil:[6,7,9,17],dataunitsdecodeencapsul:[14,19],dataunitsdecodeplain:[14,19],datefmt:7,dateofbirth:6,dateofexpiri:6,dcb:[14,19],debian:[2,4,6],debug:[4,6],deciph:[12,19,20],decipher:[12,19,20],decive_unit:6,decod:[14,19],decodediscretionarydataobject:16,decodeextendedheaderlist:16,decodeheaderlist:16,decodeoffsetdataobject:16,decodetaglist:16,decor:14,decrement:[15,19,20],decrypt:[11,14,15,19,20],dedic:14,def:7,default_s:15,default_uid:2,defin:[2,15,20],deleg:[0,1,6],deletefil:[14,19],den:3,depend:[0,2,4,5,6,11,14,19,20,22],deploi:[0,1,5],deriv:[7,20],derive_kei:20,des3:11,des:3,describ:6,descriptor:[14,19],design:7,despit:4,destroypacechannel:2,detail:[6,7],detect:5,dev:[2,6],develop:[0,1,4,5],devic:[0,1,2,6],devicenam:6,devices_compatibility_matrix:4,devmgmt:6,dfname:[14,19],dfselectionbyapplication_implicit:[14,19],dfselectionbyfid:[14,19],dfselectionbyfulldfnam:[14,19],dfselectionbypartialdfnam:[14,19],dfselectionbypath:[14,19],dg12:6,dg14:6,dg15:6,dg16:6,dg21:6,dialog:1,dict:6,dictionari:12,die:3,die_gesamte_technik_ist_sich:3,differ:[3,6,7,9,11,12,20],digit:[12,19,20],direct:[17,19],directconvent:[17,19],directli:[4,6],directori:[2,6,7],disabl:6,disable_check:[7,17],disconnect:7,discuss:[4,5],disk:[7,9],dispatch:[15,17],distanc:4,distribut:4,dlitz:6,do_encrypt:11,doc:[6,14],docstr:14,doctyp:6,document:7,documenttyp:6,doe:[4,6,7,20],doi:3,dominik:[3,4],done:[4,7],doubl:6,down:[7,17,19],driver:[2,5,6],droid:[0,5],dsa:[15,19,20],dst:12,dtd:6,dummy_hcd:2,dylib:6,eac:6,each:14,earlier:6,echo:[2,6],edg:[2,4,6],edit:7,editor:3,ef_cardaccess:[6,7,17],ef_cardsecur:[6,7,17],effective_l:22,efstructure_cyclic_nofurtherinfo:7,efstructure_linear_fixed_:7,efstructure_linear_variable_:7,efstructure_transpar:7,eid:3,einem:3,either:[0,12,14,19,20],electron:[0,6],element:6,elementari:14,elif:7,els:7,email:6,emul:[3,7,17],enabl:[2,3,4,6],enciph:[12,19,20],encipher:[12,19,20],encod:[6,7,12],encodebertlvdatalist:16,encodedataoffsetobject:16,encodediscretionarydataobject:16,encodefilecontrolparamet:[14,19],encrypt:[7,9,11,14,15,19,20],end:[12,14,19,20],endian:7,engin:3,english:6,ensur:6,enter:[6,15,19,20],entir:7,entri:2,environ:[4,6,12,15,19,20],epass:[7,8,18],epass_s:20,epassport:20,equal:[14,15,19,20],eras:[12,14,15,19,20],erase_s:[15,19,20],erasebinari:[14,19],erasebinaryencapsul:[14,19],erasebinaryplain:[14,19],erasefrom:14,eraserecord:[14,19],eraseto:14,erik:0,eriknellessen:0,err_incorrectparamet:7,err_wronglength:7,error:[2,7,14,19],erweiterung:3,esign:6,esign_ca_cert:[6,7,17],esign_cert:[6,7,17],esign_kei:[7,17],especi:[4,5],establish:[5,6],establishpacechannel:2,establishpacechannelinput:2,establishpacechanneloutput:2,etc:[6,7],even:[7,14,19],everi:6,exampl:[2,4,6,22],except:[7,13],exe:6,execut:[6,7,17,19],exist:[0,4,7],exit:[2,4,6,7],expect:7,explain:4,explor:6,expon:19,extend:[3,6,7],extended_length:17,extendedl:[17,19],extens:1,extern:[6,12,19,20],external_authent:[15,19,20],extra_fci_data:14,f276a288bcfba69d34f31001:0,fabio:6,fail:7,fals:[6,7,14,16,17,19,22],familynam:6,far:6,fci:[14,19],fdb:7,fdid:[0,5],featur:3,feature_execute_pac:2,feature_modify_pin_direct:2,feature_verify_pin_direct:2,feedback:[0,1,2,4,5,6],feel:6,fetch:[0,1,5,7],fid:[7,14,19],field:[1,12,19,20,22],file:[0,2,4,5,6,7,9,14,15,17,19],filedescriptor:[7,14,19],filenam:2,filesystem:[9,15,19,20],fill:9,find:[2,4,6,7,16],firewal:7,first:[6,7,14,19],firstsft:[14,19],firstsoftwar:[14,19],fix:14,fmd:[14,19],focu:6,follow:[0,2,3,4,5,6,7,14,19],foreground:4,form:[4,9,11,15,19,20],format:7,formatresult:[7,17,19],forwar:4,forward:[2,7,17],forwared:2,foss:3,fragment:2,framework:6,frank:[2,3,4],frankmorgn:[0,1,2,3,4,5,6],fraunhof:3,free:6,freerunn:2,friendlynam:6,from:[0,1,2,3,4,5,6,7,9,12,14,15,17,19,20],fsdecrypt:[15,19,20],fsencrypt:[15,19,20],fukuchi:6,full:[4,5,22],futur:[15,19,20],g_ether:2,gadget:2,gear:1,gener:[0,2,4,5,6,7,9,11,12,14,15,19,20,22],generate_public_key_pair:[12,15,19,20],generatecard:9,german:[0,2,4,5,6],gertrud:6,gesamt:3,get:[2,4,6,7,9,14,19],get_card_numb:[15,19,20],get_challeng:[15,19,20],get_ciph:11,get_cipher_blocklen:11,get_cipher_keylen:11,get_index:14,get_referenced_ciph:15,getatr:[7,17,19],getcard:[7,9],getdata:[14,19],getdataencapsul:[14,19],getdataplain:[14,19],getfile_byrefdataobj:14,getmf:[14,19],getpath:[14,19],getreaderpacecap:2,getrespons:[17,19],getsocknam:7,gg487509:2,gid:0,gidsapplet:0,giovanni:3,git:[0,1,2,3,4,5,6],github:[0,1,2,3,4,5,6],give:[6,7],given:[4,7,12,14,15,16,17,19,20],givennam:6,global:[12,15,19,20],gmail:2,gnu:[2,4,6],gpl:[0,1,2,4,5,6],group:[6,7],guess:6,gui:6,guid:[1,3,6],guidelin:1,guidelines_on_connecting_gears2_device_using_wifi_151222:1,handi:3,handl:[3,7,14,19],handleinpdu:7,handleoutpdu:7,handler_test:[6,7],handlertest:7,handlertesto:7,hardwar:[0,2,4,5,6],has:[0,2,4,5,7,14,19],hasfixedrecords:14,hash:[11,12,19,20],hashmap:15,hashmethod:11,hassimpletlv:14,have:[0,1,2,3,4,5,6,7],hce:[0,1],header:[2,4,12,19,20],header_authent:[15,19,20],headless:1,heidelberg:3,help:[2,4,6],henryk:6,here:[2,3,4,6,7],hexdump:22,histchar:[17,19],histor:[14,17,19],hmac:11,holder:6,honor:14,hook:7,host:[0,2,4,5,6,7,17],hostnam:[4,6,7],how:[2,4,7],html:[0,1,2,3,5,6],http:[0,1,2,3,4,5,6,7],humboldt:3,icao:[9,11,20],icc:20,ident:[0,6],identifi:[0,4,14,15,19,20],identifier_first:14,identifier_last:14,identifier_next:14,identifier_previ:14,iec:4,ifd:6,ifdcap:6,ifdfriendlynam:6,ifdmanufacturerstr:6,ifdproductid:6,ifdproductstr:6,ifdprotocolsupport:6,ifdread:6,ifdvendorid:6,ifdversionnumb:6,imag:6,impact:[4,5],implement:[0,2,6,12,19,20],implicitli:7,importerror:7,inact:6,includ:[0,1,3,4,6,7,12,15,19,20],include_fil:16,incom:[4,6],incomplet:6,indent:[14,22],index:[4,14,15,19],index_curr:[14,19],index_htm:2,indic:[12,19,20],info:[2,6,7],infoplist:6,inform:[3,12,14,15,19,20],informat:3,informatik:3,informationstechnologi:3,ini:6,init:[0,2,4,6],initi:[0,1,2,6,7,11,12,14,20],inpterpret:7,input:11,ins2handl:[17,19],ins:[7,17,19,22],insert:4,insight:7,insmod:2,inspect:6,instanc:[14,16],instead:[0,6,22],institut:3,instruct:[14,19],integ:[14,19],integr:6,interact:[6,9],interfac:[0,2,5,6,17,19],intermediari:2,intern:[12,15,19,20],internal_authent:[15,19,20],internet:6,interrupt:2,inttostr:[7,22],invalid:[6,7,15,19,20],invers:[17,19],invok:[12,19,20],involv:14,ioanni:3,iscycl:14,isequ:14,isinst:7,iso7816:[6,7],iso7816o:[7,17,19],iso:[0,4,6,12,17,19,20,22],isoapplet:0,issimpletlv:[14,19],issu:[2,4,6],issuingst:6,ist:3,item:14,its:[2,4,6,7,12,14,19,20],itself:7,java:0,jcardsim:0,jen:3,join:7,jump:6,kdir:2,kei:[6,7,11,12,15,19,20],kernel:2,keycard:0,keytyp:[15,19,20],killal:6,kind:[0,1,2,4,5,6,12,19,20],kitkat:[0,5],know:[6,7],knowledg:7,krontiri:3,kwarg:22,l898902c:6,last:[11,14,19],lastcommandoffcut:7,lastcommandsw:7,later:[2,4,6,7,19],latest:[2,3,4,6],layer:6,lead:6,learn:6,least:6,lectur:3,len:[7,17,19],len_extend:22,length:[7,11,12,14,16,19,22],less:[4,6],let:7,level:7,levelnam:7,lian:3,lib:[2,4,6],libccid:2,libeac:6,libexec:6,libifdvpcd:6,libopensc:2,libpath:6,libpcsclit:6,libqrencod:6,librari:[3,6],libtool:[2,4,6],licens:[0,1,2,4,5,6],life:[14,19],lifecycl:[14,19],like:[2,4,6],line:[2,6,22],linelen:22,link:[2,6],linuxtag:3,list:[2,4,6,7,14,16,19],listen:4,listread:7,lite:[4,6],littl:7,load:[2,6,7],loadmitmfrompath:[7,17],local:[2,6],local_ip:7,localhost:6,localmachin:6,locat:[3,4],log:[6,7],logginglevel:[7,17],logic:14,look:[0,2,3,4,6,7,14],loop:17,lost:7,mac:[11,12,19,20],machin:[2,6,20],maco:6,magic:7,mai:[0,1,4,6,11,12,15,19,20],mail:6,main:[4,6,7,17],maintain:17,make:[2,4,6,22],make_properti:14,makeatr:[17,19],makefil:2,makefirstsoftwarefunctiont:[14,19],makesecondsoftwarefunctiont:[14,19],makethirdsoftwarefunctiont:[17,19],man:6,manag:[6,7],manage_security_environ:[12,15,19,20],mani:16,manipul:[12,19,20],manual:[0,1,5],map:[7,19],marix:6,mass:6,master:[3,14,15,17,19],match:[4,6,14],max:[11,17,19],maximum:[14,15,19,20],maximumchannel:[17,19],maxl:[7,19],maxrecords:[7,14],maxsiz:14,mayb:2,mean:[6,7,11,12,15,17,19,20],mechan:[12,19,20],media:3,memori:[15,19,20],messag:[6,7,11,12,15,17,19,20],meta:22,method:[9,12,15,19,20],microsoft:[2,4,6],middl:6,middlewar:2,might:[7,15,19,20],min:7,mingw:4,miss:[2,4,6],mitm:[6,7],mitmpath:[7,17],mkdir:2,mmc:6,mmo11:3,mo10:3,mobil:[2,3],mobilen:3,mode:[2,4,5,6,7,11,12,15],modern:[2,4],modif:[2,7],modifi:[2,4,7,12],modprob:2,modul:[2,4,6,8,18],momr12:3,mor12:3,more:[0,1,2,4,5,6,7,12,20],morgner:[2,3,4],most:[2,4,7,16],mostli:7,mount:2,mous:6,mrtd:[6,20],mrz:[6,9],msc:6,msdn:2,mse:12,msg:[7,17,19],msi:6,multipl:[2,6,7],must:[2,4,5,6,7,9,11,12,14,19,20],mutual_authent:[15,19,20],mutual_challeng:[15,19,20],name:[4,6,14,19,22],named_df:[14,19],nation:6,nativ:[1,4],necessari:4,need:[0,1,2,4,5,6,7,15,19,20],neither:[14,19],nellesson:0,neo:2,net:[0,6],network:[5,7],neuen:3,new_fil:7,newer:[0,5],newli:14,newlist:14,newtlvlist:[14,19],newvalu:[14,16],next:[1,14,19],nfc:[0,1,3,4,5,6,7],nice:22,nobodi:20,nofurtherinfo:7,none:[7,9,11,14,15,16,17,19,20,22],nor:[14,19],normal:[7,19],normal_rest:7,note:[3,7,14,17,19,20],noth:[12,19,20],notif:2,now:[2,4,6,15,19,20],npa:[0,3,6,7,8,18],npao:7,num_id:14,num_result:16,number:[2,4,6,7,14,15,19,20],numread:6,oath:0,obj:2,object:[7,9,12,14,15,17,19,20,22],occur:[14,19],odd:[14,19],oep10:3,oepen:[3,4],off:[2,7],offer:3,offset:[14,16,19,22],old:[3,14],older:[2,3,4,6],om11:3,omit:[17,19],onc:6,one:[4,5,12,14,19,20,22],onetimewrit:14,onli:[2,4,7,11,14,19,20],open:[0,5,6,7,17],openmoko:[2,4,6],openpac:6,openpcd:4,openpgp:0,openpicc:4,openport:[7,17],opensc:[2,6],openssl:2,oper:[4,11,12,14,19,20],operation_on_str:11,option:[2,4,6,9,11,17,19],ord:7,order:[2,7,12,14,15,19,20],org:[0,1,2,4,5,6],other:[2,5,6,12,15,19,20],otherwis:[4,12,14,19],ottavi:6,our:[0,1,2,3,4,5,6,7,22],out:[2,7],output:6,over:[4,5,6,7],overview:[6,7],overwrit:[7,22],own:[0,1,6],pace:[0,2,6],pacecap:2,pack:16,pad:[11,12,19,20],padding_class:11,pair:[12,20],parallel:6,param:14,paramet:[11,12,14,15,17,19,20],parent:[7,14,19],pariti:20,pars:[7,12,15,19,20,22],parse_se_config:12,parse_sm_capdu:[12,15,19,20],part:[3,6,14],partial:[14,19],pass:[7,17],passport:[0,6,9,11,20],passportsam:20,patch:2,path:[6,7,9,14,15,17,19],pbkdf2:6,pc_to_rdr_secur:2,pc_to_rdr_xfrblock:2,pcd:[6,7,17],pcsc:[0,4,6],pcsc_scan:6,pcscd:[6,7],pcsclite:[4,6],pdf:[1,3],perform:[2,4,6,12,17,19,20],perform_bac:6,perform_security_oper:[12,15,19,20],period:6,permiss:[0,5],persist:9,personalauswei:3,peter:3,pezorform_security_oper:19,phone:[6,7],photo:9,php:4,physic:7,piec:14,pil:6,pin:[0,2,15,19,20],pip:6,pipe:[2,6],pkc:6,pkg:[2,4,6],pkg_config_path:4,pkgconfig:4,pki:20,place:6,placeofbirth:6,plain:[12,15,19,20],platform:[0,1,2,4,5,6],pleas:[0,1,2,4,5,6],plist:6,plug:6,point:14,pointer:14,port:[4,6,7,17],portabl:2,posess:[15,19,20],possibl:[0,2,4,6],power:[7,17,19],powerdown:[7,17,19],powerup:[7,17,19],predic:6,prefix:4,prepend:[11,14,19],present:2,pretend:6,pretti:7,prettyprint_anyth:14,previou:[14,19],previous:[7,12,20],print:[2,4,5,6,7],print_ascii:7,privaci:3,privat:[6,12,15,19,20],probabl:[2,4,6],problem:6,process:[0,1,4],produc:17,product:[2,6],program:[1,3,6,7],programmingguide_accessori:1,project:[0,1,2,3,4,5,6],prompt:9,prop:[14,22],properti:[14,17,19,22],propertylist:6,proprietari:[2,6,14],protect:[0,6,12,15,19,20],protect_respons:[12,19,20],protect_result:[15,19,20],protocol:[0,1,6,7,17,19,20],prove:[15,19,20],provid:[6,7,12,20],pseudo:2,pseudorandom:11,publikationen:2,publish:6,puk:[15,19,20],purpos:4,put:[14,19],putdata:[14,19],putdataencapsul:[14,19],putdataplain:[14,19],pwd:2,pwendland:0,pycryptodom:6,pycryptodomex:6,pypa:6,pypi:6,pyreadlin:6,pyscard:[6,7],python2:6,pythonwar:6,qrcode:7,qrencod:6,qrserver:7,quickli:6,quit:7,r_apdu:[7,22],rais:[7,14,19],random:[2,15,19,20],randomli:6,rapdu:[7,17],raw:[12,19,20],rdr_to_pc_datablock:2,read:[6,7,9,14,19,20],readabl:20,readbinari:[14,19],readbinaryencapsul:[14,19],readbinaryplain:[14,19],readdatagroup:[7,9],reader0:6,reader1:6,reader2:6,reader:[0,1,3,4,6,7],readernum:[7,17],readlin:6,readpass:6,readrecord:[14,19],readrecordencapsul:[14,19],readrecordplain:[14,19],real:[2,4,6,7],realiz:4,recalculate_length:16,receiv:[4,7,17],recent:2,recogn:7,reconnect:7,record:[7,14,19],recordhandlingdecod:[7,14,19],recordidentifiersupport:[14,19],recordnumbersupport:[14,19],recordpoint:14,recordstructureef:[7,14,19],recurs:[0,2,4,6,14],redlich:3,ref:14,refdataobj:14,refer:[12,14,15,19,20],referenc:[15,19,20],regard:[14,19],regist:[1,4,6,7],rel:6,relai:[0,3,5,6,7],relaymiddleman:7,relayo:7,releas:[2,3,4,6],religiousartisticnam:6,remot:[0,3,4,6],remotesmartcardread:[0,5],remov:[6,12,14,19,20],render:[7,22],replac:[6,12,14,15,19,20],report:[2,4,6],repositori:[0,2,3,4,5,6],repres:22,represent:14,request:[3,6,7,14],requestedtl:[14,19],requir:[0,2,5,6,7,20],requiremet:6,res:4,research:3,reset:[7,14,15,17,19,20],resetrecordpoint:14,residencepermit1:6,residencepermit2:6,resp_data:20,respect:7,respons:[0,1,2,4,6,7,9,12,14,15,17,19,20,22],respsons:17,ressourc:1,rest:7,restart:6,restor:[12,15,19,20],restore_s:[15,19,20],result:[7,12,14,16,17,19,20],retri:[15,19,20],retriev:[15,19,20],revers:[6,7],rfid:4,rfu:[15,19,20],right:[15,19,20],root:6,routin:6,rpc_type:6,rsa:[15,19,20],run:[0,2,4,5,7,17],runtim:0,russello:3,sai:6,said:7,salt:11,sam:[7,9,12,14,15,17,19,20],same:[6,7],samsung:1,saniti:4,sar:3,save:6,scan:[0,5,7],scanner:5,scardcontrol:2,scardtransmit:2,schmidt:3,scienc:3,script:6,sdk:[0,1,5,6],search:[14,19],searchbinaryencapsul:[14,19],searchbinaryplain:[14,19],second:[14,19],secondsft:[14,19],secondsoftwar:[14,19],secret:[11,15,19,20],section:4,secur:[2,3,6,7,12,15,17,19,20],security_environ:[12,15,19,20],see:[2,4,6,7,14,17,19],seed:20,seekabl:[7,17,19],seid:[12,15,19,20],select:[0,1,4,5,7,11,14,17,19],select_appl:6,selectfil:[14,19],self:[7,13],send:[1,4,7,11,12,17,19,20],sendcommandapdu:7,sent:[4,7],seper:6,sequenc:[11,20],sequenti:14,serial:[2,6],server_sock:7,servic:[1,6],session:7,session_kei:11,set:[4,6,9,12,13,14,17,19,20],set_asym_algorithm:[15,19,20],set_mf:[15,19,20],setcard:9,setter:[15,19,20],settimeout:7,seutil:[8,15,19,20],sever:[2,4,6],sex:6,shall:[6,12,19,20],shell:6,shiguo:3,ship:[2,4,6],shortfid:14,shortfidsupport:[14,19],should:[4,6,7,12,14,19,20],show:6,sicher:3,sicherheitsanalys:3,sigkil:6,sign:[6,12,19,20],signatur:[6,12,19,20],similar:7,simpl:[0,6,7,14,19],simpletlv:16,simpletlv_data:[14,19],simpletlv_pack:16,simpletlv_unpack:16,simpli:[6,7],simul:[0,1],sinc:2,sit:3,six:12,size:[11,14,19],sln:6,slot:6,sm_header:[12,19,20],small:6,smart:17,smartcard:[3,5,6,7,14,17],smartcardfilesystem:[8,19],smartcardo:[7,17,19],smartcardsam:[8,19,20],smartcardservic:6,smartphon:[0,3,5],smartwatch:0,snapshot:2,social:3,sock:7,sock_dgram:7,socket:[0,6,7,17],softwar:[2,4,5,6,7,14,17,19],solut:6,some:[2,3,7],someth:6,sourc:[0,1,2,5,7],sourceforg:[2,4,6,7],space:22,special:[2,5],specif:[7,15,19,20],specifi:[4,6,7,11,12,14,15,16,19,20],specifii:6,springer:3,spsmartcardsdatatyp:6,spusbdatatyp:6,src:[2,4],ssc:[11,20],stabl:6,stack:2,stai:4,standalon:6,standard:[2,4,6,7,20],start:[2,4,6,14],startup:6,state:14,statu:[2,14,19,22],step:6,still:[2,3,4,6],stop:[6,7,17],storag:[6,9],store:[6,12,15,19,20],store_s:[15,19,20],str:7,straight:7,street:6,string1:11,string2:11,string:[2,4,6,7,11,12,14,15,16,17,19,22],stringtoint:[7,22],strip:11,strip_pad:11,structur:[14,16],studio:[0,4,5,6],stuttgart:3,subdir:2,submodul:[0,1,2,4,6],subset:2,subsystem:6,success:[15,19,20],successful:7,successfulli:6,sudo:[2,6],suggest:[0,1,2,4,5,6],suitabl:11,sun:4,support:[2,4,6,9,11,12,19],suppos:6,sure:[6,7],sw1:[2,7,22],sw2:[2,7,22],swerror:[7,13],swutil:8,sym:12,syntax:6,sys:7,sysconfdir:6,system:[2,3,4,5,6,7,15],system_profil:6,systemroot:6,szenario:3,t15:[17,19],tabl:[12,14,17,19,20],tag:[6,12,14,16,19,20],tagungsband:3,tai:[17,19],taj:[17,19],take:[14,15,19,20],taken:6,tar:2,target:6,tbi:[17,19],tbj:[17,19],tcardemul:1,tci:[17,19],tcj:[17,19],tck:[17,19],tcp:[6,14,19],tcp_port:6,tdi:[17,19],tech:1,techdoc:1,technik:3,technischerichtlinien:2,telecommun:3,templat:[7,12,14,19,20],term:6,termin:[0,4,12,15,19,20],test:[0,1,2,4,5],tester:6,text:19,than:[0,1,2,4,5,6],thehistor:[14,19],thei:[6,11,12],them:[0,17],themselv:3,therefor:9,thesi:3,thi:[2,4,5,6,7,9,11,12,14,15,17,19,20,22],thing:[7,14],third:[17,19],those:7,through:[0,2,6],time:[2,4,6,7],tip:1,titl:4,tizen:[0,3],tlv:[12,14,16,19,20],tlv_data:16,tlv_find_tag:16,tlv_unpack:16,tlvutil:8,tmp:4,to_str:12,togeth:[0,4],tool:[1,2,4,6],toolset:6,tr03119:2,tracker:[0,1,2,4,5,6],tradit:[5,6],transmiss:[17,19],transmit:[0,2,4,7],transpar:14,transparentstructureef:[7,14,19],tri:6,trust:[2,6,12,19,20],trustedpublish:6,tupl:[14,16,19],two:[14,19],txt:6,type:[3,6,9,11,12,15,19,20],ubuntu:[2,4,6],udc:2,ulrich:3,umbrella:3,umdf:6,umfeld:3,unam:2,und:3,under:[15,19,20],understood:15,unfamiliar:[2,4,6],unit:[14,19],univers:2,unix:5,unknown:[7,14,19],unpack:16,unplug:6,unprotect:[12,15,19,20],unprotected_result:[15,19,20],until:[15,19,20],updat:[0,2,4,6,14,19],updatebinari:[14,19],updatebinaryencapsul:[14,19],updatebinaryplain:[14,19],updaterecord:[14,19],updaterecordencapsul:[14,19],updaterecordplain:[14,19],url:[3,6],usabl:[2,3],usag:6,usb:[3,6],use:[0,1,2,4,5,6,7,11,12,14,15,17,19,20],used:[0,2,4,5,6,7,9,11,12,14,15,19,20,22],useful:1,user:[2,6,9,15,19,20],uses:[0,1,2,4,6,20],using:[0,1,2,3,4,5,6,7,12,14,15,19,20],usr:[2,6],usual:[2,6,7,14],utf:6,util:[6,8],utoeriksson:6,valid:[6,7,15,19,20],valu:[4,6,12,14,15,17,19,20,22],variabl:14,variou:[2,3,11,12,19,20],vector:11,vendor:[2,6],vendor_ifd_typ:6,vendor_nam:6,verbos:[2,4,6],verif:[0,2,12,19,20],verifi:[0,2,6,12,15,19,20],verify_certif:[12,19,20],verify_cryptographic_checksum:[12,19,20],verify_digital_signatur:[12,19,20],verlag:3,version:[0,1,2,4,5,6,15,19,20],via:[0,1,2,4,5,6,7,11,15,17],vicc:[4,6,7,17],virtual:[0,4,5,17],virtualicc:[7,17],virtualsmartcard:[6,7,9,11,12,13,14,15,16,19,20,22],visual:[4,6],vletoux:0,volum:3,vpcd:[4,5,7,17],vpicc:[7,17],vsmartcard:[0,1,2,3,4,5,6],w64:4,wai:6,wait:[4,6],waldmann:3,walk:14,want:[0,2,3,7],warm:[17,19],warn:7,warn_noinfo63:19,wdk:6,web:3,welcom:[0,1,2,4,5,6],well:6,what:[4,7,12,14,19,20],whatev:22,when:[4,5,6,7,22],where:[2,4,5,6,7,14],wherea:2,whether:[12,15,17,19,20],which:[0,2,4,6,7,11,12,14,17,19,22],wiki:2,win32:6,window:[2,4,5],winscard:[4,6],wireless:1,wissen:3,with_mark:16,with_traceback:13,without:[0,6,11,22],wix:6,wixtoolset:6,wolf:3,word:22,work:[2,4,6,7],workaround:7,workshop:3,write:[14,19],writeand:14,writebinari:[14,19],writebinaryencapsul:[14,19],writebinaryplain:[14,19],writeor:14,writerecord:[14,19],written:[2,4],wudfhost:6,www:[0,2,4,6],x00:11,x01:7,x02:7,x03:7,x04:7,x38:7,x64:6,x82:6,xff:7,xjf:2,xml:[4,6],xor:14,xxx:7,ykneo:0,you:[0,1,2,3,4,5,6,7,14,19],your:[0,1,2,4,5,6,7],yourself:[3,7],yubico:0,zero:[15,19,20],zip:6,zone:20,zum:3,zur:3},titles:["Android Smart Card Emulator","Tizen Smart Card Emulator","USB CCID Emulator","Welcome to the Virtual Smart Card Architecture documentation!","PC/SC Relay","Remote Smart Card Reader","Virtual Smart Card","Creating a Virtual Smart Card","virtualsmartcard Package","CardGenerator Module","ConstantDefinitions Module","CryptoUtils Module","SEutils Module","SWutils Module","SmartcardFilesystem Module","SmartcardSAM Module","TLVutils Module","VirtualSmartcard Module","cards Package","cryptoflex Module","ePass Module","nPA Module","utils Module"],titleterms:{"7816":7,Use:[0,1,5],Using:6,android:[0,4,5],architectur:3,build:6,card:[0,1,2,3,4,5,6,7,18],cardgener:9,ccid:2,compliant:2,configur:6,constantdefinit:10,contact:[0,1,5],contactless:4,creat:7,cryptoflex:19,cryptoutil:11,document:3,download:[0,1,2,3,4,5,6],emul:[0,1,2,4,6],epass:[6,20],exampl:7,gadgetf:2,hint:[2,4],implement:7,instal:[0,1,2,4,5,6],interfac:4,iso:7,less:[0,1,5],libnfc:4,like:7,linux:[2,4,6],mac:6,middlewar:4,modul:[9,10,11,12,13,14,15,16,17,19,20,21,22],note:[0,1,2,4,5,6],npa:21,other:7,packag:[8,18],phone:[0,5],python:6,question:[0,1,2,4,5,6],reader:[2,5],refer:[0,1,2,3,4,5,6],relai:4,remot:5,run:6,seutil:12,similar:[2,4,6],smart:[0,1,2,3,4,5,6,7],smartcardfilesystem:14,smartcardsam:15,smartwatch:1,swutil:13,test:6,tizen:1,tlvutil:16,type:7,unix:[2,4,6],usag:[2,4],usb:2,util:22,virtual:[3,6,7],virtualsmartcard:[8,17],vpcd:6,vpicc:6,welcom:3,window:6,written:6}}) \ No newline at end of file diff --git a/docs/virtualsmartcard/README.html b/docs/virtualsmartcard/README.html index 19091db..ad8f464 100644 --- a/docs/virtualsmartcard/README.html +++ b/docs/virtualsmartcard/README.html @@ -4,7 +4,7 @@ - Virtual Smart Card — vsmartcard 2021-04-28 documentation + Virtual Smart Card — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -24,6 +20,10 @@ + + + + @@ -103,7 +103,10 @@
  • Configuring vpcd on Unix
  • Configuring vpcd on Mac OS X
  • Configuring vpcd on Windows
  • -
  • Running vpicc
  • +
  • Running vpicc +
  • Question
  • @@ -151,7 +154,7 @@
    -
    +

    Virtual Smart Card

    @@ -189,8 +192,25 @@ internet for example.

    PC/SC Relay to make it accessible to an external contact-less smart card reader.

    The file utils.py was taken from Henryk Plötz’s cyberflex-shell 1.

    -
    -

    Figure made with TikZ

    +
    +

    System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} + \node (pcsclite) +[klein, aktivbox, inner xsep=.7cm, text width=3cm] + {PC/SC Framework\\\ +(\texttt{pcscd} or \texttt{SCardSvr}) + }; +\node (sca) [aktivbox, klein, left=of pcsclite] {Smart Card\\Application}; +\node (vpcd) [box, at=(pcsclite.east), xshift=-.3cm] {\texttt{vpcd}}; + \node (vicc) [aktivbox, right=2cm of pcsclite] {\texttt{vicc}}; + +\begin{pgfonlayer}{background} + \path[linie] + (sca) edge (pcsclite) + (vpcd) edge node {\includegraphics[width=1.2cm]{$wd/bilder/simplecloud.pdf}} (vicc) + ; +\end{pgfonlayer})

    +

    !pdf2svg command cannot be run

    +

    Virtual Smart Card used with PCSC-Lite or WinSCard

    New in version 0.7: The Virtual Smart Card optionally brings its own standalone implementation of @@ -198,8 +218,24 @@ PC/SC. This allows accessing vpicc witho implementation acts as replacement for libpcsclite which can lead to problems when used in parallel with PCSC-Lite.

    -
    -

    Figure made with TikZ

    +
    +

    System Message: WARNING/2 (\input{$wd/bilder/tikzstyles.tex} + \node (pcsclite) +[klein, box, text width=4cm] + {Virtual Smart Card's\\ +PC/SC Framework + }; +\node (sca) [aktivbox, klein, left=of pcsclite] {Smart Card\\Application}; + \node (vicc) [aktivbox, right=2cm of pcsclite] {\texttt{vicc}}; + +\begin{pgfonlayer}{background} + \path[linie] + (sca) edge (pcsclite) + (pcsclite) edge node {\includegraphics[width=1.5cm]{$wd/bilder/simplecloud.pdf}} (vicc) + ; +\end{pgfonlayer})

    +

    !pdf2svg command cannot be run

    +

    Virtual Smart Card used with its own PC/SC implementation

    On Android, where a traditional PC/SC framework is not available, you can use our framework to make your real contact-less smart accessible through PKCS#11. @@ -211,10 +247,10 @@ responses via NFC to a contact-less smart card that signs the mail.

    @@ -223,6 +259,8 @@ URL will be printed if libqrencode is not available)

    still available on Sourceforge.

    Alternatively, you can clone our git repository:

    git clone https://github.com/frankmorgner/vsmartcard.git
    +cd vsmartcard
    +git submodule update --init --recursive
     
    @@ -269,10 +307,13 @@ make install PC/SC.

    For the Windows integration we extended Fabio Ottavi’s UMDF Driver for a -Virtual Smart Card Reader 12 with a vpcd interface. To build vpcd for -Windows we use Windows Driver Kit 10 and Visual Studio 2015 13. The vpcd -installer requires the WiX Toolset 3.10 14. If you choose -to download the Windows binaries 15, you may directly jump to step 4.

    +Virtual Smart Card Reader 11 with a vpcd interface. If you choose +to download the Windows binaries 14, you may directly jump to step 4.

    +

    In the CI environment, we’re building vpcd for Windows with Visual Studio +Community 2019 with SDK/WDK for Windows 11. (The WDK version needs to match +at least your targeted version of Windows, see this guide for installing VS +with WDK 12) The vpcd installer additionally +requires the WiX Toolset 3.10 13 to be installed.

    1. Clone the git repository and make sure it is initialized with all submodules:

      @@ -289,14 +330,23 @@ configuration manager, that the project is built for your platform (i.e.
    2. If you can successfully Build the solution, you can find the installer (BixVReaderInstaller.msi) in virtualsmartcard\win32\BixVReaderInstaller\bin\*Release

    3. -
    4. To install vpcd, double click BixVReaderInstaller.msi. Since we -are currently not signing the Installer, this will yield a warning about an -unverified driver software publisher on Windows 8 and later. Click -Install this driver software anyway.

    5. +
    6. To import the installer’s test signing certificate, double click +BixVReader.cer and add it to the Trusted Root Certification +Authority and the Trusted Publishers at the Local Computer” (not the +*Current User).

      +

      On the commandline, you could do this as follows:

      +
      CertMgr.exe /add BixVReader.cer /s /r localMachine root /all
      +CertMgr.exe /add BixVReader.cer /s /r localMachine trustedpublisher
      +
      +
      +

      Feel free to remove the certificate from the certificate stores once the +device is installed.

      +
    7. +
    8. To install vpcd, double click BixVReaderInstaller.msi.

    For debugging vpcd and building the driver with an older version of Visual Studio or WDK please see Fabio Ottavi’s UMDF Driver for a Virtual Smart Card -Reader 12 for details.

    +Reader 11 for details.

    All of Fabio’s card connectors are still available, but inactive by default (see Configuring vpcd on Windows below).

    @@ -454,7 +504,7 @@ to open should be specified in

    Running vpicc

    -

    The compiled Windows binaries 15 of vpicc include OpenPACE. The other +

    The compiled Windows binaries 14 of vpicc include OpenPACE. The other dependencies listed above need to be installed seperately. You can start the vpicc via python.exe vicc.py. On all other systems an executable script vicc is installed using the autotools.

    @@ -538,8 +588,38 @@ chosen accordingly (–hostname and –port)

    When vpcd and vpicc are connected you should be able to access the card through the PC/SC API. You can use the opensc-explorer or pcsc_scan for testing. In Virtual Smart Card’s root directory we also -provide scripts for testing with npa-tool 16 and PCSC-Lite’s smart card +provide scripts for testing with npa-tool 15 and PCSC-Lite’s smart card reader driver tester.

    +
    +

    Testing vpicc -t ePass

    +

    A simple tool to test BAC is available for Python 2.7. On Ubuntu, its +requiremets are installed as follows:

    +
    sudo apt-get install python2.7-dev
    +curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
    +python2.7 get-pip.py
    +python2.7 -m pip install pycryptodomex pyscard
    +python2.7 readpass.py --no-gui
    +git clone https://github.com/henryk/cyberflex-shell
    +cd cyberflex-shell
    +
    +
    +

    Now we can create and run a small script:

    +
    echo "select_application a0000002471001" > script.txt
    +echo "perform_bac L898902C<3UTO6908061F9406236ZE184226B<<<<<14" >> script.txt
    +python2.7 cyberflex-shell.py script.txt
    +
    +
    +

    The tool will wait for a (virtual) smart card to appear. Start vpicc and make +sure to configure it with the correct MRZ, i.e. +P<UTOERIKSSON<<ANNA<MARIX<<<<<<<<<<<<<<<<<<<L898902C<3UTO6908061F9406236ZE184226B<<<<<14 +in this case:

    +
    vicc -t ePass
    +
    +
    +

    Once the card is connected, cyberflex-shell will quickly perform BAC and +exit. Running the tool without arguments allows entering in interactive mode +to run additional tests.

    +
    @@ -563,39 +643,36 @@ more than welcome! Please use our http://pyscard.sourceforge.net/

    5
    -

    https://www.pycryptodome.org/

    -
    -
    6

    https://www.dlitz.net/software/python-pbkdf2/

    -
    7
    +
    6

    https://docs.python.org/3.3/library/readline.html

    -
    8
    +
    7

    https://pypi.python.org/pypi/pyreadline

    -
    9
    +
    8

    http://www.pythonware.com/products/pil/

    -
    10
    +
    9

    https://github.com/frankmorgner/openpace

    -
    11
    +
    10

    https://fukuchi.org/works/qrencode/

    -
    12(1,2)
    +
    11(1,2)

    http://www.codeproject.com/Articles/134010/An-UMDF-Driver-for-a-Virtual-Smart-Card-Reader

    -
    13
    -

    https://msdn.microsoft.com/en-us/library/windows/hardware/ff557573

    +
    12
    +

    https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk

    -
    14
    +
    13

    https://wixtoolset.org/releases/v3.10/stable

    -
    15(1,2)
    -

    https://github.com/frankmorgner/vsmartcard/releases/download/virtualsmartcard-0.7/virtualsmartcard-0.7_win32.zip

    +
    14(1,2)
    +

    https://github.com/frankmorgner/vsmartcard/releases/tag/virtualsmartcard-0.8

    -
    16
    +
    15

    https://github.com/frankmorgner/OpenSC

    @@ -614,9 +691,9 @@ more than welcome! Please use our - Creating a Virtual Smart Card — vsmartcard 2021-04-28 documentation + Creating a Virtual Smart Card — vsmartcard 2023-09-27 documentation @@ -12,10 +12,6 @@ - - - - @@ -23,6 +19,10 @@ + + + + @@ -135,7 +135,7 @@
    -
    +

    Creating a Virtual Smart Card

    @@ -270,14 +270,14 @@ is only a buffer that is forwarded to the smart card OS. First we modify self.sock.settimeout(None) self.server_sock = None except socket.error as e: - logging.error("Failed to open socket: %s", str(e)) - logging.error("Is pcscd running at %s? Is vpcd loaded? Is a \ + logging.critical("Failed to open socket: %s", str(e)) + logging.critical("Is pcscd running at %s? Is vpcd loaded? Is a \ firewall blocking port %u?", host, port) sys.exit() else: # use reversed connection mode try: - local_ip = [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1] + local_ip = [(s.connect(('9.9.9.9', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1] custom_url = 'vicc://%s:%d' % (local_ip, port) print('VICC hostname: %s' % local_ip) print('VICC port: %d' % port) @@ -292,8 +292,8 @@ is only a buffer that is forwarded to the smart card OS. First we modify (self.sock, self.server_sock, host) = self.openPort(port) self.sock.settimeout(None) except socket.error as e: - logging.error("Failed to open socket: %s", str(e)) - logging.error("Is pcscd running? Is vpcd loaded and in \ + logging.critical("Failed to open socket: %s", str(e)) + logging.critical("Is pcscd running? Is vpcd loaded and in \ reversed connection mode? Is a firewall \ blocking port %u?", port) sys.exit() @@ -339,9 +339,7 @@ completely different when creating a file on the smart card. So we derive CryptoflexMF from MF and modify create to our needs.

    -
        def create(p1, p2, data):
    -
    -        if data[0:2] != "\xff\xff":
    +
            if data[0:2] != b"\xff\xff":
                 raise SwError(SW["ERR_INCORRECTPARAMETERS"])
     
             args = {
    @@ -349,11 +347,11 @@ completely different when creating a file on the smart card. So we derive
                     "filedescriptor": 0,
                     "fid": stringtoint(data[4:6]),
                     }
    -        if data[6] == "\x01":
    +        if data[6] == b"\x01":
                 args["data"] = bytes(0)*stringtoint(data[2:4])
                 args["filedescriptor"] = FDB["EFSTRUCTURE_TRANSPARENT"]
                 new_file = TransparentStructureEF(**args)
    -        elif data[6] == "\x02":
    +        elif data[6] == b"\x02":
                 if len(data) > 16:
                     args["maxrecordsize"] = stringtoint(data[16])
                 elif p2:
    @@ -362,15 +360,15 @@ completely different when creating a file on the smart card. So we derive
                 args["filedescriptor"] = FDB["EFSTRUCTURE_LINEAR_FIXED_"
                                              "NOFURTHERINFO"]
                 new_file = RecordStructureEF(**args)
    -        elif data[6] == "\x03":
    +        elif data[6] == b"\x03":
                 args["filedescriptor"] = FDB["EFSTRUCTURE_LINEAR_VARIABLE_"
                                              "NOFURTHERINFO"]
                 new_file = RecordStructureEF(**args)
    -        elif data[6] == "\x04":
    +        elif data[6] == b"\x04":
                 args["filedescriptor"] = FDB["EFSTRUCTURE_CYCLIC_NOFURTHERINFO"]
                 new_file = RecordStructureEF(**args)
    -        elif data[6] == "\x38":
    -            if data[12] != "\x03":
    +        elif data[6] == b"\x38":
    +            if data[12] != b"\x03":
                     raise SwError(SW["ERR_INCORRECTPARAMETERS"])
                 new_file = DF(**args)
             else:
    @@ -378,6 +376,8 @@ completely different when creating a file on the smart card. So we derive
                 raise SwError(SW["ERR_INCORRECTPARAMETERS"])
     
             return [new_file]
    +
    +    def recordHandlingDecode(self, p1, p2):
     

    As you can see it is quite simple to extend the virtual smart card to your @@ -393,7 +393,7 @@ magic that is done while parsing a buffer (an vpcd.

    As before with the cryptoflex card, we let VirtualICC recognize the new type -"relay". RelayOS overwrites all +"relay". RelayOS overwrites all main functions from the template SmartcardOS. Its functions correspond to the commands sent by vpcd. If you know how to use @@ -415,7 +415,7 @@ forward, but see yourself…

    # See which readers are available readers = smartcard.System.listReaders() if len(readers) <= readernum: - logging.error("Invalid number of reader '%u' (only %u available)", + logging.critical("Invalid number of reader '%u' (only %u available)", readernum, len(readers)) sys.exit() @@ -427,7 +427,7 @@ forward, but see yourself…

    try: self.session = smartcard.Session(self.reader) except smartcard.Exceptions.CardConnectionException as e: - logging.error("Error connecting to card: %s", e.message) + logging.critical("Error connecting to card: %s", str(e)) sys.exit() logging.info("Connected to card in '%s'", self.reader) @@ -443,7 +443,7 @@ forward, but see yourself…

    try: self.session.close() except smartcard.Exceptions.CardConnectionException as e: - logging.warning("Error disconnecting from card: %s", e.message) + logging.warning("Error disconnecting from card: %s", str(e)) def getATR(self): # when powerDown has been called, fetching the ATR will throw an error. @@ -457,7 +457,7 @@ forward, but see yourself…

    self.session = smartcard.Session(self.reader) atr = self.session.getATR() except smartcard.Exceptions.CardConnectionException as e: - logging.error("Error getting ATR: %s", e.message) + logging.critical("Error getting ATR: %s", str(e)) sys.exit() return "".join([chr(b) for b in atr]) @@ -473,7 +473,7 @@ forward, but see yourself…

    try: self.session = smartcard.Session(self.reader) except smartcard.Exceptions.CardConnectionException as e: - logging.error("Error connecting to card: %s", e.message) + logging.critical("Error connecting to card: %s", str(e)) sys.exit() def powerDown(self): @@ -482,7 +482,7 @@ forward, but see yourself…

    try: self.session.close() except smartcard.Exceptions.CardConnectionException as e: - logging.error("Error disconnecting from card: %s", str(e)) + logging.critical("Error disconnecting from card: %s", str(e)) sys.exit() def reset(self): @@ -501,7 +501,7 @@ forward, but see yourself…

    try: rapdu, sw1, sw2 = self.session.sendCommandAPDU(apdu) except smartcard.Exceptions.CardConnectionException as e: - logging.error("Error transmitting APDU: %s", str(e)) + logging.critical("Error transmitting APDU: %s", str(e)) sys.exit() # XXX this is a workaround, see on sourceforge bug #3083586 @@ -534,7 +534,7 @@ forward, but see yourself…

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.CardGenerator.html b/docs/virtualsmartcard/api/virtualsmartcard.CardGenerator.html index 2b56800..bbb1325 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.CardGenerator.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.CardGenerator.html @@ -4,7 +4,7 @@ - CardGenerator Module — vsmartcard 2021-04-28 documentation + CardGenerator Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    CardGenerator Module

    @@ -202,7 +202,7 @@ optionally for the path to a photo.

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.ConstantDefinitions.html b/docs/virtualsmartcard/api/virtualsmartcard.ConstantDefinitions.html index f73b02a..0722283 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.ConstantDefinitions.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.ConstantDefinitions.html @@ -4,7 +4,7 @@ - ConstantDefinitions Module — vsmartcard 2021-04-28 documentation + ConstantDefinitions Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    ConstantDefinitions Module

    @@ -141,7 +141,7 @@

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.CryptoUtils.html b/docs/virtualsmartcard/api/virtualsmartcard.CryptoUtils.html index bc467c5..39d6ddd 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.CryptoUtils.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.CryptoUtils.html @@ -4,7 +4,7 @@ - CryptoUtils Module — vsmartcard 2021-04-28 documentation + CryptoUtils Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    CryptoUtils Module

    @@ -232,7 +232,7 @@ Only used by the “CC” algorithm

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.SEutils.html b/docs/virtualsmartcard/api/virtualsmartcard.SEutils.html index b6f7509..555a54f 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.SEutils.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.SEutils.html @@ -4,7 +4,7 @@ - SEutils Module — vsmartcard 2021-04-28 documentation + SEutils Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    SEutils Module

    @@ -579,7 +579,7 @@ contain a data to sign (tag 0x9A, 0xAC or 0xBC) and a digital signature

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.SWutils.html b/docs/virtualsmartcard/api/virtualsmartcard.SWutils.html index 8ea2de8..fc9e042 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.SWutils.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.SWutils.html @@ -4,7 +4,7 @@ - SWutils Module — vsmartcard 2021-04-28 documentation + SWutils Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    SWutils Module

    @@ -162,7 +162,7 @@ set self.__traceback__ to tb and return self.

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem.html b/docs/virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem.html index a13242e..b2fd247 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.SmartcardFilesystem.html @@ -4,7 +4,7 @@ - SmartcardFilesystem Module — vsmartcard 2021-04-28 documentation + SmartcardFilesystem Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    SmartcardFilesystem Module

    @@ -138,7 +138,7 @@
    -class virtualsmartcard.SmartcardFilesystem.DF(parent, fid, filedescriptor=56, lifecycle=5, simpletlv_data=None, bertlv_data=None, dfname=None, data='')
    +class virtualsmartcard.SmartcardFilesystem.DF(parent, fid, filedescriptor=56, lifecycle=5, simpletlv_data=None, bertlv_data=None, dfname=None, data=b'')

    Bases: virtualsmartcard.SmartcardFilesystem.File

    Class for a dedicated file

    @@ -1189,7 +1189,7 @@ data as binary string.

    -class virtualsmartcard.SmartcardFilesystem.Record(identifier=None, data='')
    +class virtualsmartcard.SmartcardFilesystem.Record(identifier=None, data=b'')

    Bases: object

    @@ -1455,7 +1455,7 @@ __getRecords).

    -class virtualsmartcard.SmartcardFilesystem.TransparentStructureEF(parent, fid, filedescriptor=1, lifecycle=5, simpletlv_data=None, bertlv_data=None, datacoding=0, shortfid=0, data='')
    +class virtualsmartcard.SmartcardFilesystem.TransparentStructureEF(parent, fid, filedescriptor=1, lifecycle=5, simpletlv_data=None, bertlv_data=None, datacoding=0, shortfid=0, data=b'')

    Bases: virtualsmartcard.SmartcardFilesystem.EF

    Class for an elementary file with transparent structure.

    @@ -1708,7 +1708,7 @@ DCB[“PROPRIETARY”] (logical xor)

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.SmartcardSAM.html b/docs/virtualsmartcard/api/virtualsmartcard.SmartcardSAM.html index 9cb7ada..467c564 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.SmartcardSAM.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.SmartcardSAM.html @@ -4,7 +4,7 @@ - SmartcardSAM Module — vsmartcard 2021-04-28 documentation + SmartcardSAM Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    SmartcardSAM Module

    @@ -430,7 +430,7 @@ string that is understood by CryptoUtils.py functions

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.TLVutils.html b/docs/virtualsmartcard/api/virtualsmartcard.TLVutils.html index 2aaabc1..b1db19c 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.TLVutils.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.TLVutils.html @@ -4,7 +4,7 @@ - TLVutils Module — vsmartcard 2021-04-28 documentation + TLVutils Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    TLVutils Module

    @@ -238,7 +238,7 @@ results will be returned.

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.VirtualSmartcard.html b/docs/virtualsmartcard/api/virtualsmartcard.VirtualSmartcard.html index 662fe08..9e46f14 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.VirtualSmartcard.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.VirtualSmartcard.html @@ -4,7 +4,7 @@ - VirtualSmartcard Module — vsmartcard 2021-04-28 documentation + VirtualSmartcard Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    VirtualSmartcard Module

    @@ -335,7 +335,7 @@ respsonse APDU back to the vpcd.

    -virtualsmartcard.VirtualSmartcard.loadMitMFromPath(path: str)
    +virtualsmartcard.VirtualSmartcard.loadMitMFromPath(path)
    @@ -352,7 +352,7 @@ respsonse APDU back to the vpcd.

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.HandlerTest.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.HandlerTest.html deleted file mode 100644 index 3b7253a..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.HandlerTest.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - HandlerTest Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    HandlerTest Module

    -
    Inheritance diagram of virtualsmartcard.cards.HandlerTest
    - - - -
    -
    -class virtualsmartcard.cards.HandlerTest.HandlerTestOS
    -

    Bases: virtualsmartcard.VirtualSmartcard.SmartcardOS

    -

    This class implements the commands used for the PC/SC-lite smart card -reader driver tester. See https://salsa.debian.org/rousseau/HandlerTest -and handler_test(1).

    -
    -
    -__output_from_le(msg)
    -
    - -
    -
    -execute(msg)
    -

    Returns response to the given APDU as string of characters

    -
    -
    Parameters
    -

    msg – the APDU as string of characters

    -
    -
    -
    - -
    -
    -getATR()
    -

    Returns the ATR of the card as string of characters

    -
    - -
    -
    -powerDown()
    -

    Powers down the card

    -
    - -
    -
    -powerUp()
    -

    Powers up the card

    -
    - -
    -
    -reset()
    -

    Performs a warm reset of the card (no power down)

    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.Relay.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.Relay.html deleted file mode 100644 index a471215..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.Relay.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - Relay Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    Relay Module

    -
    Inheritance diagram of virtualsmartcard.cards.Relay
    - - - -
    -
    -class virtualsmartcard.cards.Relay.RelayOS(readernum, mitm=<virtualsmartcard.cards.RelayMiddleman.RelayMiddleman object>)
    -

    Bases: virtualsmartcard.VirtualSmartcard.SmartcardOS

    -

    This class implements relaying of a (physical) smartcard. The RelayOS -forwards the command APDUs received from the vpcd to the real smartcard via -an actual smart card reader and sends the responses back to the vpcd. -This class can be used to implement relay or MitM attacks.

    -
    -
    -cleanup()
    -

    Close the connection to the physical card

    -
    - -
    -
    -execute(msg)
    -

    Returns response to the given APDU as string of characters

    -
    -
    Parameters
    -

    msg – the APDU as string of characters

    -
    -
    -
    - -
    -
    -getATR()
    -

    Returns the ATR of the card as string of characters

    -
    - -
    -
    -powerDown()
    -

    Powers down the card

    -
    - -
    -
    -powerUp()
    -

    Powers up the card

    -
    - -
    -
    -reset()
    -

    Performs a warm reset of the card (no power down)

    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman.html deleted file mode 100644 index 81a07f8..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.RelayMiddleman.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - RelayMiddleman Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    RelayMiddleman Module

    -
    Inheritance diagram of virtualsmartcard.cards.RelayMiddleman
    - - -
    -
    -class virtualsmartcard.cards.RelayMiddleman.RelayMiddleman
    -

    Bases: object

    -

    The RelayMiddleman class serves as a base from which a user might derive -their own relay middle man class. This base class implements the simplest -Man-in-the-Middle: the NoOp.

    -
    -
    -handleInPDU(inPDU: bytes)
    -

    This method is called on each PDU that is fed into the realy (vdpu -> vicc). -It may be overwritten to modify the packages send from the terminal to the -real smart card.

    -
    - -
    -
    -handleOutPDU(outPDU: bytes)
    -

    This method is called on each PDU that is produced by the relay (vicc -> vdpu). -It may be overwritten to modify the packages send from the real smart card to the -terminal.

    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.cryptoflex.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.cryptoflex.html index ec6eed5..1d72789 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.cryptoflex.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.cards.cryptoflex.html @@ -4,7 +4,7 @@ - cryptoflex Module — vsmartcard 2021-04-28 documentation + cryptoflex Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    cryptoflex Module

    @@ -1519,7 +1519,7 @@ contain a data to sign (tag 0x9A, 0xAC or 0xBC) and a digital signature

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.ePass.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.ePass.html index 5f80281..e4beb4e 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.ePass.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.cards.ePass.html @@ -4,7 +4,7 @@ - ePass Module — vsmartcard 2021-04-28 documentation + ePass Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    ePass Module

    @@ -818,7 +818,7 @@ contain a data to sign (tag 0x9A, 0xAC or 0xBC) and a digital signature

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.html index b28d09d..2e22559 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.cards.html @@ -4,7 +4,7 @@ - cards Package — vsmartcard 2021-04-28 documentation + cards Package — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,15 +123,12 @@
    -
    +

    cards Package

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.cards.nPA.html b/docs/virtualsmartcard/api/virtualsmartcard.cards.nPA.html index 6de91df..cc640fa 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.cards.nPA.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.cards.nPA.html @@ -4,7 +4,7 @@ - nPA Module — vsmartcard 2021-04-28 documentation + nPA Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    nPA Module

    @@ -141,7 +141,7 @@

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.html b/docs/virtualsmartcard/api/virtualsmartcard.html index 5bfbcc4..ba88164 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.html @@ -4,7 +4,7 @@ - virtualsmartcard Package — vsmartcard 2021-04-28 documentation + virtualsmartcard Package — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,28 +123,18 @@
    -
    +

    virtualsmartcard Package

    diff --git a/docs/virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test.html b/docs/virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test.html deleted file mode 100644 index 897cbf9..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.tests.CardGenerator_test.html +++ /dev/null @@ -1,2262 +0,0 @@ - - - - - - - CardGenerator_test Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    CardGenerator_test Module

    -
    Inheritance diagram of virtualsmartcard.tests.CardGenerator_test
    - - - - -
    -
    -class virtualsmartcard.tests.CardGenerator_test.CryptoflexGeneratorTest(methodName='runTest')
    -

    Bases: virtualsmartcard.tests.CardGenerator_test.ISO7816GeneratorTest

    -
    -
    -_addExpectedFailure(result, exc_info)
    -
    - -
    -
    -_addSkip(result, test_case, reason)
    -
    - -
    -
    -_addUnexpectedSuccess(result)
    -
    - -
    -
    -_baseAssertEqual(first, second, msg=None)
    -

    The default assertEqual implementation, not type specific.

    -
    - -
    -
    -_callCleanup(function, /, *args, **kwargs)
    -
    - -
    -
    -_callSetUp()
    -
    - -
    -
    -_callTearDown()
    -
    - -
    -
    -_callTestMethod(method)
    -
    - -
    -
    -_classSetupFailed = False
    -
    - -
    -
    -_class_cleanups = []
    -
    - -
    -
    -_deprecate()
    -
    - -
    -
    -_diffThreshold = 65536
    -
    - -
    -
    -_feedErrorsToResult(result, errors)
    -
    - -
    -
    -_formatMessage(msg, standardMsg)
    -

    Honour the longMessage attribute when generating failure messages. -If longMessage is False this means: -* Use only an explicit message if it is provided -* Otherwise use the standard message for the assert

    -

    If longMessage is True: -* Use the standard message -* If an explicit message is provided, plus ‘ : ‘ and the explicit message

    -
    - -
    -
    -_getAssertEqualityFunc(first, second)
    -

    Get a detailed comparison function for the types of the two args.

    -

    Returns: A callable accepting (first, second, msg=None) that will -raise a failure exception if first != second with a useful human -readable error message for those types.

    -
    - -
    -
    -_truncateMessage(message, diff)
    -
    - -
    -
    -classmethod addClassCleanup(function, /, *args, **kwargs)
    -

    Same as addCleanup, except the cleanup items are called even if -setUpClass fails (unlike tearDownClass).

    -
    - -
    -
    -addCleanup(function, /, *args, **kwargs)
    -

    Add a function, with arguments, to be called when the test is -completed. Functions added are called on a LIFO basis and are -called after tearDown on test failure or success.

    -

    Cleanup items are called even if setUp fails (unlike tearDown).

    -
    - -
    -
    -addTypeEqualityFunc(typeobj, function)
    -

    Add a type specific assertEqual style function to compare a type.

    -

    This method is for use by TestCase subclasses that need to register -their own type equality functions to provide nicer error messages.

    -
    -
    Args:
    -
    typeobj: The data type to call this function on when both values

    are of the same type in assertEqual().

    -
    -
    function: The callable taking two arguments and an optional

    msg= argument that raises self.failureException with a -useful error message when the two arguments are not equal.

    -
    -
    -
    -
    -
    - -
    -
    -assertAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are unequal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is more than the given -delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    If the two objects compare equal then they will automatically -compare almost equal.

    -
    - -
    -
    -assertAlmostEquals(**kwargs)
    -
    - -
    -
    -assertCountEqual(first, second, msg=None)
    -

    Asserts that two iterables have the same elements, the same number of -times, without regard to order.

    -
    -
    -
    -
    self.assertEqual(Counter(list(first)),

    Counter(list(second)))

    -
    -
    -
    -
    -
    Example:
      -
    • [0, 1, 1] and [1, 0, 1] compare equal.

    • -
    • [0, 0, 1] and [0, 1] compare unequal.

    • -
    -
    -
    -
    -
    - -
    -
    -assertDictContainsSubset(subset, dictionary, msg=None)
    -

    Checks whether dictionary is a superset of subset.

    -
    - -
    -
    -assertDictEqual(d1, d2, msg=None)
    -
    - -
    -
    -assertEqual(first, second, msg=None)
    -

    Fail if the two objects are unequal as determined by the ‘==’ -operator.

    -
    - -
    -
    -assertEquals(**kwargs)
    -
    - -
    -
    -assertFalse(expr, msg=None)
    -

    Check that the expression is false.

    -
    - -
    -
    -assertGreater(a, b, msg=None)
    -

    Just like self.assertTrue(a > b), but with a nicer default message.

    -
    - -
    -
    -assertGreaterEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a >= b), but with a nicer default message.

    -
    - -
    -
    -assertIn(member, container, msg=None)
    -

    Just like self.assertTrue(a in b), but with a nicer default message.

    -
    - -
    -
    -assertIs(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is b), but with a nicer default message.

    -
    - -
    -
    -assertIsInstance(obj, cls, msg=None)
    -

    Same as self.assertTrue(isinstance(obj, cls)), with a nicer -default message.

    -
    - -
    -
    -assertIsNone(obj, msg=None)
    -

    Same as self.assertTrue(obj is None), with a nicer default message.

    -
    - -
    -
    -assertIsNot(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is not b), but with a nicer default message.

    -
    - -
    -
    -assertIsNotNone(obj, msg=None)
    -

    Included for symmetry with assertIsNone.

    -
    - -
    -
    -assertLess(a, b, msg=None)
    -

    Just like self.assertTrue(a < b), but with a nicer default message.

    -
    - -
    -
    -assertLessEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a <= b), but with a nicer default message.

    -
    - -
    -
    -assertListEqual(list1, list2, msg=None)
    -

    A list-specific equality assertion.

    -
    -
    Args:

    list1: The first list to compare. -list2: The second list to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertLogs(logger=None, level=None)
    -

    Fail unless a log message of level level or higher is emitted -on logger_name or its children. If omitted, level defaults to -INFO and logger defaults to the root logger.

    -

    This method must be used as a context manager, and will yield -a recording object with two attributes: output and records. -At the end of the context manager, the output attribute will -be a list of the matching formatted log messages and the -records attribute will be a list of the corresponding LogRecord -objects.

    -

    Example:

    -
    with self.assertLogs('foo', level='INFO') as cm:
    -    logging.getLogger('foo').info('first message')
    -    logging.getLogger('foo.bar').error('second message')
    -self.assertEqual(cm.output, ['INFO:foo:first message',
    -                             'ERROR:foo.bar:second message'])
    -
    -
    -
    - -
    -
    -assertMultiLineEqual(first, second, msg=None)
    -

    Assert that two multi-line strings are equal.

    -
    - -
    -
    -assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are equal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is less than the given delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    Objects that are equal automatically fail.

    -
    - -
    -
    -assertNotAlmostEquals(**kwargs)
    -
    - -
    -
    -assertNotEqual(first, second, msg=None)
    -

    Fail if the two objects are equal as determined by the ‘!=’ -operator.

    -
    - -
    -
    -assertNotEquals(**kwargs)
    -
    - -
    -
    -assertNotIn(member, container, msg=None)
    -

    Just like self.assertTrue(a not in b), but with a nicer default message.

    -
    - -
    -
    -assertNotIsInstance(obj, cls, msg=None)
    -

    Included for symmetry with assertIsInstance.

    -
    - -
    -
    -assertNotRegex(text, unexpected_regex, msg=None)
    -

    Fail the test if the text matches the regular expression.

    -
    - -
    -
    -assertNotRegexpMatches(**kwargs)
    -
    - -
    -
    -assertRaises(expected_exception, *args, **kwargs)
    -

    Fail unless an exception of class expected_exception is raised -by the callable when invoked with specified positional and -keyword arguments. If a different type of exception is -raised, it will not be caught, and the test case will be -deemed to have suffered an error, exactly as for an -unexpected exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertRaises(SomeException):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertRaises -is used as a context object.

    -

    The context manager keeps a reference to the exception as -the ‘exception’ attribute. This allows you to inspect the -exception after the assertion:

    -
    with self.assertRaises(SomeException) as cm:
    -    do_something()
    -the_exception = cm.exception
    -self.assertEqual(the_exception.error_code, 3)
    -
    -
    -
    - -
    -
    -assertRaisesRegex(expected_exception, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a raised exception matches a regex.

    -
    -
    Args:

    expected_exception: Exception class expected to be raised. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertRaisesRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assertRaisesRegexp(**kwargs)
    -
    - -
    -
    -assertRegex(text, expected_regex, msg=None)
    -

    Fail the test unless the text matches the regular expression.

    -
    - -
    -
    -assertRegexpMatches(**kwargs)
    -
    - -
    -
    -assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
    -

    An equality assertion for ordered sequences (like lists and tuples).

    -

    For the purposes of this function, a valid ordered sequence type is one -which can be indexed, has a length, and has an equality operator.

    -
    -
    Args:

    seq1: The first sequence to compare. -seq2: The second sequence to compare. -seq_type: The expected datatype of the sequences, or None if no

    -
    -

    datatype should be enforced.

    -
    -
    -
    msg: Optional message to use on failure instead of a list of

    differences.

    -
    -
    -
    -
    -
    - -
    -
    -assertSetEqual(set1, set2, msg=None)
    -

    A set-specific equality assertion.

    -
    -
    Args:

    set1: The first set to compare. -set2: The second set to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -

    assertSetEqual uses ducktyping to support different types of sets, and -is optimized for sets specifically (parameters must support a -difference method).

    -
    - -
    -
    -assertTrue(expr, msg=None)
    -

    Check that the expression is true.

    -
    - -
    -
    -assertTupleEqual(tuple1, tuple2, msg=None)
    -

    A tuple-specific equality assertion.

    -
    -
    Args:

    tuple1: The first tuple to compare. -tuple2: The second tuple to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertWarns(expected_warning, *args, **kwargs)
    -

    Fail unless a warning of class warnClass is triggered -by the callable when invoked with specified positional and -keyword arguments. If a different type of warning is -triggered, it will not be handled: depending on the other -warning filtering rules in effect, it might be silenced, printed -out, or raised as an exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertWarns(SomeWarning):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertWarns -is used as a context object.

    -

    The context manager keeps a reference to the first matching -warning as the ‘warning’ attribute; similarly, the ‘filename’ -and ‘lineno’ attributes give you information about the line -of Python code from which the warning was triggered. -This allows you to inspect the warning after the assertion:

    -
    with self.assertWarns(SomeWarning) as cm:
    -    do_something()
    -the_warning = cm.warning
    -self.assertEqual(the_warning.some_attribute, 147)
    -
    -
    -
    - -
    -
    -assertWarnsRegex(expected_warning, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a triggered warning matches a regexp. -Basic functioning is similar to assertWarns() with the addition -that only warnings whose messages also match the regular expression -are considered successful matches.

    -
    -
    Args:

    expected_warning: Warning class expected to be triggered. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertWarnsRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assert_(**kwargs)
    -
    - -
    -
    -card_type = 'cryptoflex'
    -
    - -
    -
    -countTestCases()
    -
    - -
    -
    -debug()
    -

    Run the test without collecting errors in a TestResult

    -
    - -
    -
    -defaultTestResult()
    -
    - -
    -
    -classmethod doClassCleanups()
    -

    Execute all class cleanup functions. Normally called for you after -tearDownClass.

    -
    - -
    -
    -doCleanups()
    -

    Execute all cleanup functions. Normally called for you after -tearDown.

    -
    - -
    -
    -fail(msg=None)
    -

    Fail immediately, with the given message.

    -
    - -
    -
    -failIf(**kwargs)
    -
    - -
    -
    -failIfAlmostEqual(**kwargs)
    -
    - -
    -
    -failIfEqual(**kwargs)
    -
    - -
    -
    -failUnless(**kwargs)
    -
    - -
    -
    -failUnlessAlmostEqual(**kwargs)
    -
    - -
    -
    -failUnlessEqual(**kwargs)
    -
    - -
    -
    -failUnlessRaises(**kwargs)
    -
    - -
    -
    -failureException
    -

    alias of AssertionError

    -
    - -
    -
    -id()
    -
    - -
    -
    -longMessage = True
    -
    - -
    -
    -maxDiff = 640
    -
    - -
    -
    -run(result=None)
    -
    - -
    -
    -setUp()
    -

    Hook method for setting up the test fixture before exercising it.

    -
    - -
    -
    -classmethod setUpClass()
    -

    Hook method for setting up class fixture before running tests in the class.

    -
    - -
    -
    -shortDescription()
    -

    Returns a one-line description of the test, or None if no -description has been provided.

    -

    The default implementation of this method returns the first line of -the specified test method’s docstring.

    -
    - -
    -
    -skipTest(reason)
    -

    Skip this test.

    -
    - -
    -
    -subTest(msg=<object object>, **params)
    -

    Return a context manager that will return the enclosed block -of code in a subtest identified by the optional message and -keyword parameters. A failure in the subtest marks the test -case as failed but resumes execution at the end of the enclosed -block, allowing further test code to be executed.

    -
    - -
    -
    -tearDown()
    -

    Hook method for deconstructing the test fixture after testing it.

    -
    - -
    -
    -classmethod tearDownClass()
    -

    Hook method for deconstructing the class fixture after running all tests in the class.

    -
    - -
    -
    -test_card_creation()
    -
    - -
    -
    -test_get_and_set_card()
    -
    - -
    - -
    -
    -class virtualsmartcard.tests.CardGenerator_test.ISO7816GeneratorTest(methodName='runTest')
    -

    Bases: unittest.case.TestCase

    -
    -
    -_addExpectedFailure(result, exc_info)
    -
    - -
    -
    -_addSkip(result, test_case, reason)
    -
    - -
    -
    -_addUnexpectedSuccess(result)
    -
    - -
    -
    -_baseAssertEqual(first, second, msg=None)
    -

    The default assertEqual implementation, not type specific.

    -
    - -
    -
    -_callCleanup(function, /, *args, **kwargs)
    -
    - -
    -
    -_callSetUp()
    -
    - -
    -
    -_callTearDown()
    -
    - -
    -
    -_callTestMethod(method)
    -
    - -
    -
    -_classSetupFailed = False
    -
    - -
    -
    -_class_cleanups = []
    -
    - -
    -
    -_deprecate()
    -
    - -
    -
    -_diffThreshold = 65536
    -
    - -
    -
    -_feedErrorsToResult(result, errors)
    -
    - -
    -
    -_formatMessage(msg, standardMsg)
    -

    Honour the longMessage attribute when generating failure messages. -If longMessage is False this means: -* Use only an explicit message if it is provided -* Otherwise use the standard message for the assert

    -

    If longMessage is True: -* Use the standard message -* If an explicit message is provided, plus ‘ : ‘ and the explicit message

    -
    - -
    -
    -_getAssertEqualityFunc(first, second)
    -

    Get a detailed comparison function for the types of the two args.

    -

    Returns: A callable accepting (first, second, msg=None) that will -raise a failure exception if first != second with a useful human -readable error message for those types.

    -
    - -
    -
    -_truncateMessage(message, diff)
    -
    - -
    -
    -classmethod addClassCleanup(function, /, *args, **kwargs)
    -

    Same as addCleanup, except the cleanup items are called even if -setUpClass fails (unlike tearDownClass).

    -
    - -
    -
    -addCleanup(function, /, *args, **kwargs)
    -

    Add a function, with arguments, to be called when the test is -completed. Functions added are called on a LIFO basis and are -called after tearDown on test failure or success.

    -

    Cleanup items are called even if setUp fails (unlike tearDown).

    -
    - -
    -
    -addTypeEqualityFunc(typeobj, function)
    -

    Add a type specific assertEqual style function to compare a type.

    -

    This method is for use by TestCase subclasses that need to register -their own type equality functions to provide nicer error messages.

    -
    -
    Args:
    -
    typeobj: The data type to call this function on when both values

    are of the same type in assertEqual().

    -
    -
    function: The callable taking two arguments and an optional

    msg= argument that raises self.failureException with a -useful error message when the two arguments are not equal.

    -
    -
    -
    -
    -
    - -
    -
    -assertAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are unequal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is more than the given -delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    If the two objects compare equal then they will automatically -compare almost equal.

    -
    - -
    -
    -assertAlmostEquals(**kwargs)
    -
    - -
    -
    -assertCountEqual(first, second, msg=None)
    -

    Asserts that two iterables have the same elements, the same number of -times, without regard to order.

    -
    -
    -
    -
    self.assertEqual(Counter(list(first)),

    Counter(list(second)))

    -
    -
    -
    -
    -
    Example:
      -
    • [0, 1, 1] and [1, 0, 1] compare equal.

    • -
    • [0, 0, 1] and [0, 1] compare unequal.

    • -
    -
    -
    -
    -
    - -
    -
    -assertDictContainsSubset(subset, dictionary, msg=None)
    -

    Checks whether dictionary is a superset of subset.

    -
    - -
    -
    -assertDictEqual(d1, d2, msg=None)
    -
    - -
    -
    -assertEqual(first, second, msg=None)
    -

    Fail if the two objects are unequal as determined by the ‘==’ -operator.

    -
    - -
    -
    -assertEquals(**kwargs)
    -
    - -
    -
    -assertFalse(expr, msg=None)
    -

    Check that the expression is false.

    -
    - -
    -
    -assertGreater(a, b, msg=None)
    -

    Just like self.assertTrue(a > b), but with a nicer default message.

    -
    - -
    -
    -assertGreaterEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a >= b), but with a nicer default message.

    -
    - -
    -
    -assertIn(member, container, msg=None)
    -

    Just like self.assertTrue(a in b), but with a nicer default message.

    -
    - -
    -
    -assertIs(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is b), but with a nicer default message.

    -
    - -
    -
    -assertIsInstance(obj, cls, msg=None)
    -

    Same as self.assertTrue(isinstance(obj, cls)), with a nicer -default message.

    -
    - -
    -
    -assertIsNone(obj, msg=None)
    -

    Same as self.assertTrue(obj is None), with a nicer default message.

    -
    - -
    -
    -assertIsNot(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is not b), but with a nicer default message.

    -
    - -
    -
    -assertIsNotNone(obj, msg=None)
    -

    Included for symmetry with assertIsNone.

    -
    - -
    -
    -assertLess(a, b, msg=None)
    -

    Just like self.assertTrue(a < b), but with a nicer default message.

    -
    - -
    -
    -assertLessEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a <= b), but with a nicer default message.

    -
    - -
    -
    -assertListEqual(list1, list2, msg=None)
    -

    A list-specific equality assertion.

    -
    -
    Args:

    list1: The first list to compare. -list2: The second list to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertLogs(logger=None, level=None)
    -

    Fail unless a log message of level level or higher is emitted -on logger_name or its children. If omitted, level defaults to -INFO and logger defaults to the root logger.

    -

    This method must be used as a context manager, and will yield -a recording object with two attributes: output and records. -At the end of the context manager, the output attribute will -be a list of the matching formatted log messages and the -records attribute will be a list of the corresponding LogRecord -objects.

    -

    Example:

    -
    with self.assertLogs('foo', level='INFO') as cm:
    -    logging.getLogger('foo').info('first message')
    -    logging.getLogger('foo.bar').error('second message')
    -self.assertEqual(cm.output, ['INFO:foo:first message',
    -                             'ERROR:foo.bar:second message'])
    -
    -
    -
    - -
    -
    -assertMultiLineEqual(first, second, msg=None)
    -

    Assert that two multi-line strings are equal.

    -
    - -
    -
    -assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are equal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is less than the given delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    Objects that are equal automatically fail.

    -
    - -
    -
    -assertNotAlmostEquals(**kwargs)
    -
    - -
    -
    -assertNotEqual(first, second, msg=None)
    -

    Fail if the two objects are equal as determined by the ‘!=’ -operator.

    -
    - -
    -
    -assertNotEquals(**kwargs)
    -
    - -
    -
    -assertNotIn(member, container, msg=None)
    -

    Just like self.assertTrue(a not in b), but with a nicer default message.

    -
    - -
    -
    -assertNotIsInstance(obj, cls, msg=None)
    -

    Included for symmetry with assertIsInstance.

    -
    - -
    -
    -assertNotRegex(text, unexpected_regex, msg=None)
    -

    Fail the test if the text matches the regular expression.

    -
    - -
    -
    -assertNotRegexpMatches(**kwargs)
    -
    - -
    -
    -assertRaises(expected_exception, *args, **kwargs)
    -

    Fail unless an exception of class expected_exception is raised -by the callable when invoked with specified positional and -keyword arguments. If a different type of exception is -raised, it will not be caught, and the test case will be -deemed to have suffered an error, exactly as for an -unexpected exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertRaises(SomeException):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertRaises -is used as a context object.

    -

    The context manager keeps a reference to the exception as -the ‘exception’ attribute. This allows you to inspect the -exception after the assertion:

    -
    with self.assertRaises(SomeException) as cm:
    -    do_something()
    -the_exception = cm.exception
    -self.assertEqual(the_exception.error_code, 3)
    -
    -
    -
    - -
    -
    -assertRaisesRegex(expected_exception, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a raised exception matches a regex.

    -
    -
    Args:

    expected_exception: Exception class expected to be raised. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertRaisesRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assertRaisesRegexp(**kwargs)
    -
    - -
    -
    -assertRegex(text, expected_regex, msg=None)
    -

    Fail the test unless the text matches the regular expression.

    -
    - -
    -
    -assertRegexpMatches(**kwargs)
    -
    - -
    -
    -assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
    -

    An equality assertion for ordered sequences (like lists and tuples).

    -

    For the purposes of this function, a valid ordered sequence type is one -which can be indexed, has a length, and has an equality operator.

    -
    -
    Args:

    seq1: The first sequence to compare. -seq2: The second sequence to compare. -seq_type: The expected datatype of the sequences, or None if no

    -
    -

    datatype should be enforced.

    -
    -
    -
    msg: Optional message to use on failure instead of a list of

    differences.

    -
    -
    -
    -
    -
    - -
    -
    -assertSetEqual(set1, set2, msg=None)
    -

    A set-specific equality assertion.

    -
    -
    Args:

    set1: The first set to compare. -set2: The second set to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -

    assertSetEqual uses ducktyping to support different types of sets, and -is optimized for sets specifically (parameters must support a -difference method).

    -
    - -
    -
    -assertTrue(expr, msg=None)
    -

    Check that the expression is true.

    -
    - -
    -
    -assertTupleEqual(tuple1, tuple2, msg=None)
    -

    A tuple-specific equality assertion.

    -
    -
    Args:

    tuple1: The first tuple to compare. -tuple2: The second tuple to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertWarns(expected_warning, *args, **kwargs)
    -

    Fail unless a warning of class warnClass is triggered -by the callable when invoked with specified positional and -keyword arguments. If a different type of warning is -triggered, it will not be handled: depending on the other -warning filtering rules in effect, it might be silenced, printed -out, or raised as an exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertWarns(SomeWarning):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertWarns -is used as a context object.

    -

    The context manager keeps a reference to the first matching -warning as the ‘warning’ attribute; similarly, the ‘filename’ -and ‘lineno’ attributes give you information about the line -of Python code from which the warning was triggered. -This allows you to inspect the warning after the assertion:

    -
    with self.assertWarns(SomeWarning) as cm:
    -    do_something()
    -the_warning = cm.warning
    -self.assertEqual(the_warning.some_attribute, 147)
    -
    -
    -
    - -
    -
    -assertWarnsRegex(expected_warning, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a triggered warning matches a regexp. -Basic functioning is similar to assertWarns() with the addition -that only warnings whose messages also match the regular expression -are considered successful matches.

    -
    -
    Args:

    expected_warning: Warning class expected to be triggered. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertWarnsRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assert_(**kwargs)
    -
    - -
    -
    -card_type = 'iso7816'
    -
    - -
    -
    -countTestCases()
    -
    - -
    -
    -debug()
    -

    Run the test without collecting errors in a TestResult

    -
    - -
    -
    -defaultTestResult()
    -
    - -
    -
    -classmethod doClassCleanups()
    -

    Execute all class cleanup functions. Normally called for you after -tearDownClass.

    -
    - -
    -
    -doCleanups()
    -

    Execute all cleanup functions. Normally called for you after -tearDown.

    -
    - -
    -
    -fail(msg=None)
    -

    Fail immediately, with the given message.

    -
    - -
    -
    -failIf(**kwargs)
    -
    - -
    -
    -failIfAlmostEqual(**kwargs)
    -
    - -
    -
    -failIfEqual(**kwargs)
    -
    - -
    -
    -failUnless(**kwargs)
    -
    - -
    -
    -failUnlessAlmostEqual(**kwargs)
    -
    - -
    -
    -failUnlessEqual(**kwargs)
    -
    - -
    -
    -failUnlessRaises(**kwargs)
    -
    - -
    -
    -failureException
    -

    alias of AssertionError

    -
    - -
    -
    -id()
    -
    - -
    -
    -longMessage = True
    -
    - -
    -
    -maxDiff = 640
    -
    - -
    -
    -run(result=None)
    -
    - -
    -
    -setUp()
    -

    Hook method for setting up the test fixture before exercising it.

    -
    - -
    -
    -classmethod setUpClass()
    -

    Hook method for setting up class fixture before running tests in the class.

    -
    - -
    -
    -shortDescription()
    -

    Returns a one-line description of the test, or None if no -description has been provided.

    -

    The default implementation of this method returns the first line of -the specified test method’s docstring.

    -
    - -
    -
    -skipTest(reason)
    -

    Skip this test.

    -
    - -
    -
    -subTest(msg=<object object>, **params)
    -

    Return a context manager that will return the enclosed block -of code in a subtest identified by the optional message and -keyword parameters. A failure in the subtest marks the test -case as failed but resumes execution at the end of the enclosed -block, allowing further test code to be executed.

    -
    - -
    -
    -tearDown()
    -

    Hook method for deconstructing the test fixture after testing it.

    -
    - -
    -
    -classmethod tearDownClass()
    -

    Hook method for deconstructing the class fixture after running all tests in the class.

    -
    - -
    -
    -test_card_creation()
    -
    - -
    -
    -test_get_and_set_card()
    -
    - -
    - -
    -
    -class virtualsmartcard.tests.CardGenerator_test.TestNPACardGenerator(methodName='runTest')
    -

    Bases: virtualsmartcard.tests.CardGenerator_test.ISO7816GeneratorTest

    -
    -
    -_addExpectedFailure(result, exc_info)
    -
    - -
    -
    -_addSkip(result, test_case, reason)
    -
    - -
    -
    -_addUnexpectedSuccess(result)
    -
    - -
    -
    -_baseAssertEqual(first, second, msg=None)
    -

    The default assertEqual implementation, not type specific.

    -
    - -
    -
    -_callCleanup(function, /, *args, **kwargs)
    -
    - -
    -
    -_callSetUp()
    -
    - -
    -
    -_callTearDown()
    -
    - -
    -
    -_callTestMethod(method)
    -
    - -
    -
    -_classSetupFailed = False
    -
    - -
    -
    -_class_cleanups = []
    -
    - -
    -
    -_deprecate()
    -
    - -
    -
    -_diffThreshold = 65536
    -
    - -
    -
    -_feedErrorsToResult(result, errors)
    -
    - -
    -
    -_formatMessage(msg, standardMsg)
    -

    Honour the longMessage attribute when generating failure messages. -If longMessage is False this means: -* Use only an explicit message if it is provided -* Otherwise use the standard message for the assert

    -

    If longMessage is True: -* Use the standard message -* If an explicit message is provided, plus ‘ : ‘ and the explicit message

    -
    - -
    -
    -_getAssertEqualityFunc(first, second)
    -

    Get a detailed comparison function for the types of the two args.

    -

    Returns: A callable accepting (first, second, msg=None) that will -raise a failure exception if first != second with a useful human -readable error message for those types.

    -
    - -
    -
    -_truncateMessage(message, diff)
    -
    - -
    -
    -classmethod addClassCleanup(function, /, *args, **kwargs)
    -

    Same as addCleanup, except the cleanup items are called even if -setUpClass fails (unlike tearDownClass).

    -
    - -
    -
    -addCleanup(function, /, *args, **kwargs)
    -

    Add a function, with arguments, to be called when the test is -completed. Functions added are called on a LIFO basis and are -called after tearDown on test failure or success.

    -

    Cleanup items are called even if setUp fails (unlike tearDown).

    -
    - -
    -
    -addTypeEqualityFunc(typeobj, function)
    -

    Add a type specific assertEqual style function to compare a type.

    -

    This method is for use by TestCase subclasses that need to register -their own type equality functions to provide nicer error messages.

    -
    -
    Args:
    -
    typeobj: The data type to call this function on when both values

    are of the same type in assertEqual().

    -
    -
    function: The callable taking two arguments and an optional

    msg= argument that raises self.failureException with a -useful error message when the two arguments are not equal.

    -
    -
    -
    -
    -
    - -
    -
    -assertAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are unequal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is more than the given -delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    If the two objects compare equal then they will automatically -compare almost equal.

    -
    - -
    -
    -assertAlmostEquals(**kwargs)
    -
    - -
    -
    -assertCountEqual(first, second, msg=None)
    -

    Asserts that two iterables have the same elements, the same number of -times, without regard to order.

    -
    -
    -
    -
    self.assertEqual(Counter(list(first)),

    Counter(list(second)))

    -
    -
    -
    -
    -
    Example:
      -
    • [0, 1, 1] and [1, 0, 1] compare equal.

    • -
    • [0, 0, 1] and [0, 1] compare unequal.

    • -
    -
    -
    -
    -
    - -
    -
    -assertDictContainsSubset(subset, dictionary, msg=None)
    -

    Checks whether dictionary is a superset of subset.

    -
    - -
    -
    -assertDictEqual(d1, d2, msg=None)
    -
    - -
    -
    -assertEqual(first, second, msg=None)
    -

    Fail if the two objects are unequal as determined by the ‘==’ -operator.

    -
    - -
    -
    -assertEquals(**kwargs)
    -
    - -
    -
    -assertFalse(expr, msg=None)
    -

    Check that the expression is false.

    -
    - -
    -
    -assertGreater(a, b, msg=None)
    -

    Just like self.assertTrue(a > b), but with a nicer default message.

    -
    - -
    -
    -assertGreaterEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a >= b), but with a nicer default message.

    -
    - -
    -
    -assertIn(member, container, msg=None)
    -

    Just like self.assertTrue(a in b), but with a nicer default message.

    -
    - -
    -
    -assertIs(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is b), but with a nicer default message.

    -
    - -
    -
    -assertIsInstance(obj, cls, msg=None)
    -

    Same as self.assertTrue(isinstance(obj, cls)), with a nicer -default message.

    -
    - -
    -
    -assertIsNone(obj, msg=None)
    -

    Same as self.assertTrue(obj is None), with a nicer default message.

    -
    - -
    -
    -assertIsNot(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is not b), but with a nicer default message.

    -
    - -
    -
    -assertIsNotNone(obj, msg=None)
    -

    Included for symmetry with assertIsNone.

    -
    - -
    -
    -assertLess(a, b, msg=None)
    -

    Just like self.assertTrue(a < b), but with a nicer default message.

    -
    - -
    -
    -assertLessEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a <= b), but with a nicer default message.

    -
    - -
    -
    -assertListEqual(list1, list2, msg=None)
    -

    A list-specific equality assertion.

    -
    -
    Args:

    list1: The first list to compare. -list2: The second list to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertLogs(logger=None, level=None)
    -

    Fail unless a log message of level level or higher is emitted -on logger_name or its children. If omitted, level defaults to -INFO and logger defaults to the root logger.

    -

    This method must be used as a context manager, and will yield -a recording object with two attributes: output and records. -At the end of the context manager, the output attribute will -be a list of the matching formatted log messages and the -records attribute will be a list of the corresponding LogRecord -objects.

    -

    Example:

    -
    with self.assertLogs('foo', level='INFO') as cm:
    -    logging.getLogger('foo').info('first message')
    -    logging.getLogger('foo.bar').error('second message')
    -self.assertEqual(cm.output, ['INFO:foo:first message',
    -                             'ERROR:foo.bar:second message'])
    -
    -
    -
    - -
    -
    -assertMultiLineEqual(first, second, msg=None)
    -

    Assert that two multi-line strings are equal.

    -
    - -
    -
    -assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are equal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is less than the given delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    Objects that are equal automatically fail.

    -
    - -
    -
    -assertNotAlmostEquals(**kwargs)
    -
    - -
    -
    -assertNotEqual(first, second, msg=None)
    -

    Fail if the two objects are equal as determined by the ‘!=’ -operator.

    -
    - -
    -
    -assertNotEquals(**kwargs)
    -
    - -
    -
    -assertNotIn(member, container, msg=None)
    -

    Just like self.assertTrue(a not in b), but with a nicer default message.

    -
    - -
    -
    -assertNotIsInstance(obj, cls, msg=None)
    -

    Included for symmetry with assertIsInstance.

    -
    - -
    -
    -assertNotRegex(text, unexpected_regex, msg=None)
    -

    Fail the test if the text matches the regular expression.

    -
    - -
    -
    -assertNotRegexpMatches(**kwargs)
    -
    - -
    -
    -assertRaises(expected_exception, *args, **kwargs)
    -

    Fail unless an exception of class expected_exception is raised -by the callable when invoked with specified positional and -keyword arguments. If a different type of exception is -raised, it will not be caught, and the test case will be -deemed to have suffered an error, exactly as for an -unexpected exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertRaises(SomeException):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertRaises -is used as a context object.

    -

    The context manager keeps a reference to the exception as -the ‘exception’ attribute. This allows you to inspect the -exception after the assertion:

    -
    with self.assertRaises(SomeException) as cm:
    -    do_something()
    -the_exception = cm.exception
    -self.assertEqual(the_exception.error_code, 3)
    -
    -
    -
    - -
    -
    -assertRaisesRegex(expected_exception, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a raised exception matches a regex.

    -
    -
    Args:

    expected_exception: Exception class expected to be raised. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertRaisesRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assertRaisesRegexp(**kwargs)
    -
    - -
    -
    -assertRegex(text, expected_regex, msg=None)
    -

    Fail the test unless the text matches the regular expression.

    -
    - -
    -
    -assertRegexpMatches(**kwargs)
    -
    - -
    -
    -assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
    -

    An equality assertion for ordered sequences (like lists and tuples).

    -

    For the purposes of this function, a valid ordered sequence type is one -which can be indexed, has a length, and has an equality operator.

    -
    -
    Args:

    seq1: The first sequence to compare. -seq2: The second sequence to compare. -seq_type: The expected datatype of the sequences, or None if no

    -
    -

    datatype should be enforced.

    -
    -
    -
    msg: Optional message to use on failure instead of a list of

    differences.

    -
    -
    -
    -
    -
    - -
    -
    -assertSetEqual(set1, set2, msg=None)
    -

    A set-specific equality assertion.

    -
    -
    Args:

    set1: The first set to compare. -set2: The second set to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -

    assertSetEqual uses ducktyping to support different types of sets, and -is optimized for sets specifically (parameters must support a -difference method).

    -
    - -
    -
    -assertTrue(expr, msg=None)
    -

    Check that the expression is true.

    -
    - -
    -
    -assertTupleEqual(tuple1, tuple2, msg=None)
    -

    A tuple-specific equality assertion.

    -
    -
    Args:

    tuple1: The first tuple to compare. -tuple2: The second tuple to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertWarns(expected_warning, *args, **kwargs)
    -

    Fail unless a warning of class warnClass is triggered -by the callable when invoked with specified positional and -keyword arguments. If a different type of warning is -triggered, it will not be handled: depending on the other -warning filtering rules in effect, it might be silenced, printed -out, or raised as an exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertWarns(SomeWarning):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertWarns -is used as a context object.

    -

    The context manager keeps a reference to the first matching -warning as the ‘warning’ attribute; similarly, the ‘filename’ -and ‘lineno’ attributes give you information about the line -of Python code from which the warning was triggered. -This allows you to inspect the warning after the assertion:

    -
    with self.assertWarns(SomeWarning) as cm:
    -    do_something()
    -the_warning = cm.warning
    -self.assertEqual(the_warning.some_attribute, 147)
    -
    -
    -
    - -
    -
    -assertWarnsRegex(expected_warning, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a triggered warning matches a regexp. -Basic functioning is similar to assertWarns() with the addition -that only warnings whose messages also match the regular expression -are considered successful matches.

    -
    -
    Args:

    expected_warning: Warning class expected to be triggered. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertWarnsRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assert_(**kwargs)
    -
    - -
    -
    -card_type = 'nPA'
    -
    - -
    -
    -countTestCases()
    -
    - -
    -
    -debug()
    -

    Run the test without collecting errors in a TestResult

    -
    - -
    -
    -defaultTestResult()
    -
    - -
    -
    -classmethod doClassCleanups()
    -

    Execute all class cleanup functions. Normally called for you after -tearDownClass.

    -
    - -
    -
    -doCleanups()
    -

    Execute all cleanup functions. Normally called for you after -tearDown.

    -
    - -
    -
    -fail(msg=None)
    -

    Fail immediately, with the given message.

    -
    - -
    -
    -failIf(**kwargs)
    -
    - -
    -
    -failIfAlmostEqual(**kwargs)
    -
    - -
    -
    -failIfEqual(**kwargs)
    -
    - -
    -
    -failUnless(**kwargs)
    -
    - -
    -
    -failUnlessAlmostEqual(**kwargs)
    -
    - -
    -
    -failUnlessEqual(**kwargs)
    -
    - -
    -
    -failUnlessRaises(**kwargs)
    -
    - -
    -
    -failureException
    -

    alias of AssertionError

    -
    - -
    -
    -id()
    -
    - -
    -
    -longMessage = True
    -
    - -
    -
    -maxDiff = 640
    -
    - -
    -
    -run(result=None)
    -
    - -
    -
    -setUp()
    -

    Hook method for setting up the test fixture before exercising it.

    -
    - -
    -
    -classmethod setUpClass()
    -

    Hook method for setting up class fixture before running tests in the class.

    -
    - -
    -
    -shortDescription()
    -

    Returns a one-line description of the test, or None if no -description has been provided.

    -

    The default implementation of this method returns the first line of -the specified test method’s docstring.

    -
    - -
    -
    -skipTest(reason)
    -

    Skip this test.

    -
    - -
    -
    -subTest(msg=<object object>, **params)
    -

    Return a context manager that will return the enclosed block -of code in a subtest identified by the optional message and -keyword parameters. A failure in the subtest marks the test -case as failed but resumes execution at the end of the enclosed -block, allowing further test code to be executed.

    -
    - -
    -
    -tearDown()
    -

    Hook method for deconstructing the test fixture after testing it.

    -
    - -
    -
    -classmethod tearDownClass()
    -

    Hook method for deconstructing the class fixture after running all tests in the class.

    -
    - -
    -
    -test_card_creation()
    -
    - -
    -
    -test_get_and_set_card()
    -
    - -
    -
    -test_readDatagroups()
    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test.html b/docs/virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test.html deleted file mode 100644 index 8d55bfe..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.tests.CryptoUtils_test.html +++ /dev/null @@ -1,843 +0,0 @@ - - - - - - - CryptoUtils_test Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    CryptoUtils_test Module

    -
    Inheritance diagram of virtualsmartcard.tests.CryptoUtils_test
    - - -
    -
    -class virtualsmartcard.tests.CryptoUtils_test.TestCryptoUtils(methodName='runTest')
    -

    Bases: unittest.case.TestCase

    -
    -
    -_addExpectedFailure(result, exc_info)
    -
    - -
    -
    -_addSkip(result, test_case, reason)
    -
    - -
    -
    -_addUnexpectedSuccess(result)
    -
    - -
    -
    -_baseAssertEqual(first, second, msg=None)
    -

    The default assertEqual implementation, not type specific.

    -
    - -
    -
    -_callCleanup(function, /, *args, **kwargs)
    -
    - -
    -
    -_callSetUp()
    -
    - -
    -
    -_callTearDown()
    -
    - -
    -
    -_callTestMethod(method)
    -
    - -
    -
    -_classSetupFailed = False
    -
    - -
    -
    -_class_cleanups = []
    -
    - -
    -
    -_deprecate()
    -
    - -
    -
    -_diffThreshold = 65536
    -
    - -
    -
    -_feedErrorsToResult(result, errors)
    -
    - -
    -
    -_formatMessage(msg, standardMsg)
    -

    Honour the longMessage attribute when generating failure messages. -If longMessage is False this means: -* Use only an explicit message if it is provided -* Otherwise use the standard message for the assert

    -

    If longMessage is True: -* Use the standard message -* If an explicit message is provided, plus ‘ : ‘ and the explicit message

    -
    - -
    -
    -_getAssertEqualityFunc(first, second)
    -

    Get a detailed comparison function for the types of the two args.

    -

    Returns: A callable accepting (first, second, msg=None) that will -raise a failure exception if first != second with a useful human -readable error message for those types.

    -
    - -
    -
    -_truncateMessage(message, diff)
    -
    - -
    -
    -classmethod addClassCleanup(function, /, *args, **kwargs)
    -

    Same as addCleanup, except the cleanup items are called even if -setUpClass fails (unlike tearDownClass).

    -
    - -
    -
    -addCleanup(function, /, *args, **kwargs)
    -

    Add a function, with arguments, to be called when the test is -completed. Functions added are called on a LIFO basis and are -called after tearDown on test failure or success.

    -

    Cleanup items are called even if setUp fails (unlike tearDown).

    -
    - -
    -
    -addTypeEqualityFunc(typeobj, function)
    -

    Add a type specific assertEqual style function to compare a type.

    -

    This method is for use by TestCase subclasses that need to register -their own type equality functions to provide nicer error messages.

    -
    -
    Args:
    -
    typeobj: The data type to call this function on when both values

    are of the same type in assertEqual().

    -
    -
    function: The callable taking two arguments and an optional

    msg= argument that raises self.failureException with a -useful error message when the two arguments are not equal.

    -
    -
    -
    -
    -
    - -
    -
    -assertAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are unequal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is more than the given -delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    If the two objects compare equal then they will automatically -compare almost equal.

    -
    - -
    -
    -assertAlmostEquals(**kwargs)
    -
    - -
    -
    -assertCountEqual(first, second, msg=None)
    -

    Asserts that two iterables have the same elements, the same number of -times, without regard to order.

    -
    -
    -
    -
    self.assertEqual(Counter(list(first)),

    Counter(list(second)))

    -
    -
    -
    -
    -
    Example:
      -
    • [0, 1, 1] and [1, 0, 1] compare equal.

    • -
    • [0, 0, 1] and [0, 1] compare unequal.

    • -
    -
    -
    -
    -
    - -
    -
    -assertDictContainsSubset(subset, dictionary, msg=None)
    -

    Checks whether dictionary is a superset of subset.

    -
    - -
    -
    -assertDictEqual(d1, d2, msg=None)
    -
    - -
    -
    -assertEqual(first, second, msg=None)
    -

    Fail if the two objects are unequal as determined by the ‘==’ -operator.

    -
    - -
    -
    -assertEquals(**kwargs)
    -
    - -
    -
    -assertFalse(expr, msg=None)
    -

    Check that the expression is false.

    -
    - -
    -
    -assertGreater(a, b, msg=None)
    -

    Just like self.assertTrue(a > b), but with a nicer default message.

    -
    - -
    -
    -assertGreaterEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a >= b), but with a nicer default message.

    -
    - -
    -
    -assertIn(member, container, msg=None)
    -

    Just like self.assertTrue(a in b), but with a nicer default message.

    -
    - -
    -
    -assertIs(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is b), but with a nicer default message.

    -
    - -
    -
    -assertIsInstance(obj, cls, msg=None)
    -

    Same as self.assertTrue(isinstance(obj, cls)), with a nicer -default message.

    -
    - -
    -
    -assertIsNone(obj, msg=None)
    -

    Same as self.assertTrue(obj is None), with a nicer default message.

    -
    - -
    -
    -assertIsNot(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is not b), but with a nicer default message.

    -
    - -
    -
    -assertIsNotNone(obj, msg=None)
    -

    Included for symmetry with assertIsNone.

    -
    - -
    -
    -assertLess(a, b, msg=None)
    -

    Just like self.assertTrue(a < b), but with a nicer default message.

    -
    - -
    -
    -assertLessEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a <= b), but with a nicer default message.

    -
    - -
    -
    -assertListEqual(list1, list2, msg=None)
    -

    A list-specific equality assertion.

    -
    -
    Args:

    list1: The first list to compare. -list2: The second list to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertLogs(logger=None, level=None)
    -

    Fail unless a log message of level level or higher is emitted -on logger_name or its children. If omitted, level defaults to -INFO and logger defaults to the root logger.

    -

    This method must be used as a context manager, and will yield -a recording object with two attributes: output and records. -At the end of the context manager, the output attribute will -be a list of the matching formatted log messages and the -records attribute will be a list of the corresponding LogRecord -objects.

    -

    Example:

    -
    with self.assertLogs('foo', level='INFO') as cm:
    -    logging.getLogger('foo').info('first message')
    -    logging.getLogger('foo.bar').error('second message')
    -self.assertEqual(cm.output, ['INFO:foo:first message',
    -                             'ERROR:foo.bar:second message'])
    -
    -
    -
    - -
    -
    -assertMultiLineEqual(first, second, msg=None)
    -

    Assert that two multi-line strings are equal.

    -
    - -
    -
    -assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are equal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is less than the given delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    Objects that are equal automatically fail.

    -
    - -
    -
    -assertNotAlmostEquals(**kwargs)
    -
    - -
    -
    -assertNotEqual(first, second, msg=None)
    -

    Fail if the two objects are equal as determined by the ‘!=’ -operator.

    -
    - -
    -
    -assertNotEquals(**kwargs)
    -
    - -
    -
    -assertNotIn(member, container, msg=None)
    -

    Just like self.assertTrue(a not in b), but with a nicer default message.

    -
    - -
    -
    -assertNotIsInstance(obj, cls, msg=None)
    -

    Included for symmetry with assertIsInstance.

    -
    - -
    -
    -assertNotRegex(text, unexpected_regex, msg=None)
    -

    Fail the test if the text matches the regular expression.

    -
    - -
    -
    -assertNotRegexpMatches(**kwargs)
    -
    - -
    -
    -assertRaises(expected_exception, *args, **kwargs)
    -

    Fail unless an exception of class expected_exception is raised -by the callable when invoked with specified positional and -keyword arguments. If a different type of exception is -raised, it will not be caught, and the test case will be -deemed to have suffered an error, exactly as for an -unexpected exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertRaises(SomeException):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertRaises -is used as a context object.

    -

    The context manager keeps a reference to the exception as -the ‘exception’ attribute. This allows you to inspect the -exception after the assertion:

    -
    with self.assertRaises(SomeException) as cm:
    -    do_something()
    -the_exception = cm.exception
    -self.assertEqual(the_exception.error_code, 3)
    -
    -
    -
    - -
    -
    -assertRaisesRegex(expected_exception, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a raised exception matches a regex.

    -
    -
    Args:

    expected_exception: Exception class expected to be raised. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertRaisesRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assertRaisesRegexp(**kwargs)
    -
    - -
    -
    -assertRegex(text, expected_regex, msg=None)
    -

    Fail the test unless the text matches the regular expression.

    -
    - -
    -
    -assertRegexpMatches(**kwargs)
    -
    - -
    -
    -assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
    -

    An equality assertion for ordered sequences (like lists and tuples).

    -

    For the purposes of this function, a valid ordered sequence type is one -which can be indexed, has a length, and has an equality operator.

    -
    -
    Args:

    seq1: The first sequence to compare. -seq2: The second sequence to compare. -seq_type: The expected datatype of the sequences, or None if no

    -
    -

    datatype should be enforced.

    -
    -
    -
    msg: Optional message to use on failure instead of a list of

    differences.

    -
    -
    -
    -
    -
    - -
    -
    -assertSetEqual(set1, set2, msg=None)
    -

    A set-specific equality assertion.

    -
    -
    Args:

    set1: The first set to compare. -set2: The second set to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -

    assertSetEqual uses ducktyping to support different types of sets, and -is optimized for sets specifically (parameters must support a -difference method).

    -
    - -
    -
    -assertTrue(expr, msg=None)
    -

    Check that the expression is true.

    -
    - -
    -
    -assertTupleEqual(tuple1, tuple2, msg=None)
    -

    A tuple-specific equality assertion.

    -
    -
    Args:

    tuple1: The first tuple to compare. -tuple2: The second tuple to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertWarns(expected_warning, *args, **kwargs)
    -

    Fail unless a warning of class warnClass is triggered -by the callable when invoked with specified positional and -keyword arguments. If a different type of warning is -triggered, it will not be handled: depending on the other -warning filtering rules in effect, it might be silenced, printed -out, or raised as an exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertWarns(SomeWarning):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertWarns -is used as a context object.

    -

    The context manager keeps a reference to the first matching -warning as the ‘warning’ attribute; similarly, the ‘filename’ -and ‘lineno’ attributes give you information about the line -of Python code from which the warning was triggered. -This allows you to inspect the warning after the assertion:

    -
    with self.assertWarns(SomeWarning) as cm:
    -    do_something()
    -the_warning = cm.warning
    -self.assertEqual(the_warning.some_attribute, 147)
    -
    -
    -
    - -
    -
    -assertWarnsRegex(expected_warning, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a triggered warning matches a regexp. -Basic functioning is similar to assertWarns() with the addition -that only warnings whose messages also match the regular expression -are considered successful matches.

    -
    -
    Args:

    expected_warning: Warning class expected to be triggered. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertWarnsRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assert_(**kwargs)
    -
    - -
    -
    -countTestCases()
    -
    - -
    -
    -debug()
    -

    Run the test without collecting errors in a TestResult

    -
    - -
    -
    -defaultTestResult()
    -
    - -
    -
    -classmethod doClassCleanups()
    -

    Execute all class cleanup functions. Normally called for you after -tearDownClass.

    -
    - -
    -
    -doCleanups()
    -

    Execute all cleanup functions. Normally called for you after -tearDown.

    -
    - -
    -
    -fail(msg=None)
    -

    Fail immediately, with the given message.

    -
    - -
    -
    -failIf(**kwargs)
    -
    - -
    -
    -failIfAlmostEqual(**kwargs)
    -
    - -
    -
    -failIfEqual(**kwargs)
    -
    - -
    -
    -failUnless(**kwargs)
    -
    - -
    -
    -failUnlessAlmostEqual(**kwargs)
    -
    - -
    -
    -failUnlessEqual(**kwargs)
    -
    - -
    -
    -failUnlessRaises(**kwargs)
    -
    - -
    -
    -failureException
    -

    alias of AssertionError

    -
    - -
    -
    -id()
    -
    - -
    -
    -longMessage = True
    -
    - -
    -
    -maxDiff = 640
    -
    - -
    -
    -run(result=None)
    -
    - -
    -
    -setUp()
    -

    Hook method for setting up the test fixture before exercising it.

    -
    - -
    -
    -classmethod setUpClass()
    -

    Hook method for setting up class fixture before running tests in the class.

    -
    - -
    -
    -shortDescription()
    -

    Returns a one-line description of the test, or None if no -description has been provided.

    -

    The default implementation of this method returns the first line of -the specified test method’s docstring.

    -
    - -
    -
    -skipTest(reason)
    -

    Skip this test.

    -
    - -
    -
    -subTest(msg=<object object>, **params)
    -

    Return a context manager that will return the enclosed block -of code in a subtest identified by the optional message and -keyword parameters. A failure in the subtest marks the test -case as failed but resumes execution at the end of the enclosed -block, allowing further test code to be executed.

    -
    - -
    -
    -tearDown()
    -

    Hook method for deconstructing the test fixture after testing it.

    -
    - -
    -
    -classmethod tearDownClass()
    -

    Hook method for deconstructing the class fixture after running all tests in the class.

    -
    - -
    -
    -test_padding()
    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test.html b/docs/virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test.html deleted file mode 100644 index d29f332..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.tests.SmartcardSAM_test.html +++ /dev/null @@ -1,863 +0,0 @@ - - - - - - - SmartcardSAM_test Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    SmartcardSAM_test Module

    -
    Inheritance diagram of virtualsmartcard.tests.SmartcardSAM_test
    - - -
    -
    -class virtualsmartcard.tests.SmartcardSAM_test.TestSmartcardSAM(methodName='runTest')
    -

    Bases: unittest.case.TestCase

    -
    -
    -_addExpectedFailure(result, exc_info)
    -
    - -
    -
    -_addSkip(result, test_case, reason)
    -
    - -
    -
    -_addUnexpectedSuccess(result)
    -
    - -
    -
    -_baseAssertEqual(first, second, msg=None)
    -

    The default assertEqual implementation, not type specific.

    -
    - -
    -
    -_callCleanup(function, /, *args, **kwargs)
    -
    - -
    -
    -_callSetUp()
    -
    - -
    -
    -_callTearDown()
    -
    - -
    -
    -_callTestMethod(method)
    -
    - -
    -
    -_classSetupFailed = False
    -
    - -
    -
    -_class_cleanups = []
    -
    - -
    -
    -_deprecate()
    -
    - -
    -
    -_diffThreshold = 65536
    -
    - -
    -
    -_feedErrorsToResult(result, errors)
    -
    - -
    -
    -_formatMessage(msg, standardMsg)
    -

    Honour the longMessage attribute when generating failure messages. -If longMessage is False this means: -* Use only an explicit message if it is provided -* Otherwise use the standard message for the assert

    -

    If longMessage is True: -* Use the standard message -* If an explicit message is provided, plus ‘ : ‘ and the explicit message

    -
    - -
    -
    -_getAssertEqualityFunc(first, second)
    -

    Get a detailed comparison function for the types of the two args.

    -

    Returns: A callable accepting (first, second, msg=None) that will -raise a failure exception if first != second with a useful human -readable error message for those types.

    -
    - -
    -
    -_truncateMessage(message, diff)
    -
    - -
    -
    -classmethod addClassCleanup(function, /, *args, **kwargs)
    -

    Same as addCleanup, except the cleanup items are called even if -setUpClass fails (unlike tearDownClass).

    -
    - -
    -
    -addCleanup(function, /, *args, **kwargs)
    -

    Add a function, with arguments, to be called when the test is -completed. Functions added are called on a LIFO basis and are -called after tearDown on test failure or success.

    -

    Cleanup items are called even if setUp fails (unlike tearDown).

    -
    - -
    -
    -addTypeEqualityFunc(typeobj, function)
    -

    Add a type specific assertEqual style function to compare a type.

    -

    This method is for use by TestCase subclasses that need to register -their own type equality functions to provide nicer error messages.

    -
    -
    Args:
    -
    typeobj: The data type to call this function on when both values

    are of the same type in assertEqual().

    -
    -
    function: The callable taking two arguments and an optional

    msg= argument that raises self.failureException with a -useful error message when the two arguments are not equal.

    -
    -
    -
    -
    -
    - -
    -
    -assertAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are unequal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is more than the given -delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    If the two objects compare equal then they will automatically -compare almost equal.

    -
    - -
    -
    -assertAlmostEquals(**kwargs)
    -
    - -
    -
    -assertCountEqual(first, second, msg=None)
    -

    Asserts that two iterables have the same elements, the same number of -times, without regard to order.

    -
    -
    -
    -
    self.assertEqual(Counter(list(first)),

    Counter(list(second)))

    -
    -
    -
    -
    -
    Example:
      -
    • [0, 1, 1] and [1, 0, 1] compare equal.

    • -
    • [0, 0, 1] and [0, 1] compare unequal.

    • -
    -
    -
    -
    -
    - -
    -
    -assertDictContainsSubset(subset, dictionary, msg=None)
    -

    Checks whether dictionary is a superset of subset.

    -
    - -
    -
    -assertDictEqual(d1, d2, msg=None)
    -
    - -
    -
    -assertEqual(first, second, msg=None)
    -

    Fail if the two objects are unequal as determined by the ‘==’ -operator.

    -
    - -
    -
    -assertEquals(**kwargs)
    -
    - -
    -
    -assertFalse(expr, msg=None)
    -

    Check that the expression is false.

    -
    - -
    -
    -assertGreater(a, b, msg=None)
    -

    Just like self.assertTrue(a > b), but with a nicer default message.

    -
    - -
    -
    -assertGreaterEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a >= b), but with a nicer default message.

    -
    - -
    -
    -assertIn(member, container, msg=None)
    -

    Just like self.assertTrue(a in b), but with a nicer default message.

    -
    - -
    -
    -assertIs(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is b), but with a nicer default message.

    -
    - -
    -
    -assertIsInstance(obj, cls, msg=None)
    -

    Same as self.assertTrue(isinstance(obj, cls)), with a nicer -default message.

    -
    - -
    -
    -assertIsNone(obj, msg=None)
    -

    Same as self.assertTrue(obj is None), with a nicer default message.

    -
    - -
    -
    -assertIsNot(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is not b), but with a nicer default message.

    -
    - -
    -
    -assertIsNotNone(obj, msg=None)
    -

    Included for symmetry with assertIsNone.

    -
    - -
    -
    -assertLess(a, b, msg=None)
    -

    Just like self.assertTrue(a < b), but with a nicer default message.

    -
    - -
    -
    -assertLessEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a <= b), but with a nicer default message.

    -
    - -
    -
    -assertListEqual(list1, list2, msg=None)
    -

    A list-specific equality assertion.

    -
    -
    Args:

    list1: The first list to compare. -list2: The second list to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertLogs(logger=None, level=None)
    -

    Fail unless a log message of level level or higher is emitted -on logger_name or its children. If omitted, level defaults to -INFO and logger defaults to the root logger.

    -

    This method must be used as a context manager, and will yield -a recording object with two attributes: output and records. -At the end of the context manager, the output attribute will -be a list of the matching formatted log messages and the -records attribute will be a list of the corresponding LogRecord -objects.

    -

    Example:

    -
    with self.assertLogs('foo', level='INFO') as cm:
    -    logging.getLogger('foo').info('first message')
    -    logging.getLogger('foo.bar').error('second message')
    -self.assertEqual(cm.output, ['INFO:foo:first message',
    -                             'ERROR:foo.bar:second message'])
    -
    -
    -
    - -
    -
    -assertMultiLineEqual(first, second, msg=None)
    -

    Assert that two multi-line strings are equal.

    -
    - -
    -
    -assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are equal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is less than the given delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    Objects that are equal automatically fail.

    -
    - -
    -
    -assertNotAlmostEquals(**kwargs)
    -
    - -
    -
    -assertNotEqual(first, second, msg=None)
    -

    Fail if the two objects are equal as determined by the ‘!=’ -operator.

    -
    - -
    -
    -assertNotEquals(**kwargs)
    -
    - -
    -
    -assertNotIn(member, container, msg=None)
    -

    Just like self.assertTrue(a not in b), but with a nicer default message.

    -
    - -
    -
    -assertNotIsInstance(obj, cls, msg=None)
    -

    Included for symmetry with assertIsInstance.

    -
    - -
    -
    -assertNotRegex(text, unexpected_regex, msg=None)
    -

    Fail the test if the text matches the regular expression.

    -
    - -
    -
    -assertNotRegexpMatches(**kwargs)
    -
    - -
    -
    -assertRaises(expected_exception, *args, **kwargs)
    -

    Fail unless an exception of class expected_exception is raised -by the callable when invoked with specified positional and -keyword arguments. If a different type of exception is -raised, it will not be caught, and the test case will be -deemed to have suffered an error, exactly as for an -unexpected exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertRaises(SomeException):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertRaises -is used as a context object.

    -

    The context manager keeps a reference to the exception as -the ‘exception’ attribute. This allows you to inspect the -exception after the assertion:

    -
    with self.assertRaises(SomeException) as cm:
    -    do_something()
    -the_exception = cm.exception
    -self.assertEqual(the_exception.error_code, 3)
    -
    -
    -
    - -
    -
    -assertRaisesRegex(expected_exception, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a raised exception matches a regex.

    -
    -
    Args:

    expected_exception: Exception class expected to be raised. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertRaisesRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assertRaisesRegexp(**kwargs)
    -
    - -
    -
    -assertRegex(text, expected_regex, msg=None)
    -

    Fail the test unless the text matches the regular expression.

    -
    - -
    -
    -assertRegexpMatches(**kwargs)
    -
    - -
    -
    -assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
    -

    An equality assertion for ordered sequences (like lists and tuples).

    -

    For the purposes of this function, a valid ordered sequence type is one -which can be indexed, has a length, and has an equality operator.

    -
    -
    Args:

    seq1: The first sequence to compare. -seq2: The second sequence to compare. -seq_type: The expected datatype of the sequences, or None if no

    -
    -

    datatype should be enforced.

    -
    -
    -
    msg: Optional message to use on failure instead of a list of

    differences.

    -
    -
    -
    -
    -
    - -
    -
    -assertSetEqual(set1, set2, msg=None)
    -

    A set-specific equality assertion.

    -
    -
    Args:

    set1: The first set to compare. -set2: The second set to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -

    assertSetEqual uses ducktyping to support different types of sets, and -is optimized for sets specifically (parameters must support a -difference method).

    -
    - -
    -
    -assertTrue(expr, msg=None)
    -

    Check that the expression is true.

    -
    - -
    -
    -assertTupleEqual(tuple1, tuple2, msg=None)
    -

    A tuple-specific equality assertion.

    -
    -
    Args:

    tuple1: The first tuple to compare. -tuple2: The second tuple to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertWarns(expected_warning, *args, **kwargs)
    -

    Fail unless a warning of class warnClass is triggered -by the callable when invoked with specified positional and -keyword arguments. If a different type of warning is -triggered, it will not be handled: depending on the other -warning filtering rules in effect, it might be silenced, printed -out, or raised as an exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertWarns(SomeWarning):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertWarns -is used as a context object.

    -

    The context manager keeps a reference to the first matching -warning as the ‘warning’ attribute; similarly, the ‘filename’ -and ‘lineno’ attributes give you information about the line -of Python code from which the warning was triggered. -This allows you to inspect the warning after the assertion:

    -
    with self.assertWarns(SomeWarning) as cm:
    -    do_something()
    -the_warning = cm.warning
    -self.assertEqual(the_warning.some_attribute, 147)
    -
    -
    -
    - -
    -
    -assertWarnsRegex(expected_warning, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a triggered warning matches a regexp. -Basic functioning is similar to assertWarns() with the addition -that only warnings whose messages also match the regular expression -are considered successful matches.

    -
    -
    Args:

    expected_warning: Warning class expected to be triggered. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertWarnsRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assert_(**kwargs)
    -
    - -
    -
    -countTestCases()
    -
    - -
    -
    -debug()
    -

    Run the test without collecting errors in a TestResult

    -
    - -
    -
    -defaultTestResult()
    -
    - -
    -
    -classmethod doClassCleanups()
    -

    Execute all class cleanup functions. Normally called for you after -tearDownClass.

    -
    - -
    -
    -doCleanups()
    -

    Execute all cleanup functions. Normally called for you after -tearDown.

    -
    - -
    -
    -fail(msg=None)
    -

    Fail immediately, with the given message.

    -
    - -
    -
    -failIf(**kwargs)
    -
    - -
    -
    -failIfAlmostEqual(**kwargs)
    -
    - -
    -
    -failIfEqual(**kwargs)
    -
    - -
    -
    -failUnless(**kwargs)
    -
    - -
    -
    -failUnlessAlmostEqual(**kwargs)
    -
    - -
    -
    -failUnlessEqual(**kwargs)
    -
    - -
    -
    -failUnlessRaises(**kwargs)
    -
    - -
    -
    -failureException
    -

    alias of AssertionError

    -
    - -
    -
    -id()
    -
    - -
    -
    -longMessage = True
    -
    - -
    -
    -maxDiff = 640
    -
    - -
    -
    -run(result=None)
    -
    - -
    -
    -setUp()
    -

    Hook method for setting up the test fixture before exercising it.

    -
    - -
    -
    -classmethod setUpClass()
    -

    Hook method for setting up class fixture before running tests in the class.

    -
    - -
    -
    -shortDescription()
    -

    Returns a one-line description of the test, or None if no -description has been provided.

    -

    The default implementation of this method returns the first line of -the specified test method’s docstring.

    -
    - -
    -
    -skipTest(reason)
    -

    Skip this test.

    -
    - -
    -
    -subTest(msg=<object object>, **params)
    -

    Return a context manager that will return the enclosed block -of code in a subtest identified by the optional message and -keyword parameters. A failure in the subtest marks the test -case as failed but resumes execution at the end of the enclosed -block, allowing further test code to be executed.

    -
    - -
    -
    -tearDown()
    -

    Hook method for deconstructing the test fixture after testing it.

    -
    - -
    -
    -classmethod tearDownClass()
    -

    Hook method for deconstructing the class fixture after running all tests in the class.

    -
    - -
    -
    -test_counter_decrement()
    -
    - -
    -
    -test_external_authenticate()
    -
    - -
    -
    -test_incorrect_pin()
    -
    - -
    -
    -test_internal_authenticate()
    -
    - -
    -
    -test_security_environment()
    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.tests.html b/docs/virtualsmartcard/api/virtualsmartcard.tests.html deleted file mode 100644 index 6fa85e9..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.tests.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - tests Package — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.tests.utils_test.html b/docs/virtualsmartcard/api/virtualsmartcard.tests.utils_test.html deleted file mode 100644 index d84f40d..0000000 --- a/docs/virtualsmartcard/api/virtualsmartcard.tests.utils_test.html +++ /dev/null @@ -1,848 +0,0 @@ - - - - - - - utils_test Module — vsmartcard 2021-04-28 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - -
    -

    utils_test Module

    -
    Inheritance diagram of virtualsmartcard.tests.utils_test
    - - -
    -
    -class virtualsmartcard.tests.utils_test.TestUtils(methodName='runTest')
    -

    Bases: unittest.case.TestCase

    -
    -
    -_addExpectedFailure(result, exc_info)
    -
    - -
    -
    -_addSkip(result, test_case, reason)
    -
    - -
    -
    -_addUnexpectedSuccess(result)
    -
    - -
    -
    -_baseAssertEqual(first, second, msg=None)
    -

    The default assertEqual implementation, not type specific.

    -
    - -
    -
    -_callCleanup(function, /, *args, **kwargs)
    -
    - -
    -
    -_callSetUp()
    -
    - -
    -
    -_callTearDown()
    -
    - -
    -
    -_callTestMethod(method)
    -
    - -
    -
    -_classSetupFailed = False
    -
    - -
    -
    -_class_cleanups = []
    -
    - -
    -
    -_deprecate()
    -
    - -
    -
    -_diffThreshold = 65536
    -
    - -
    -
    -_feedErrorsToResult(result, errors)
    -
    - -
    -
    -_formatMessage(msg, standardMsg)
    -

    Honour the longMessage attribute when generating failure messages. -If longMessage is False this means: -* Use only an explicit message if it is provided -* Otherwise use the standard message for the assert

    -

    If longMessage is True: -* Use the standard message -* If an explicit message is provided, plus ‘ : ‘ and the explicit message

    -
    - -
    -
    -_getAssertEqualityFunc(first, second)
    -

    Get a detailed comparison function for the types of the two args.

    -

    Returns: A callable accepting (first, second, msg=None) that will -raise a failure exception if first != second with a useful human -readable error message for those types.

    -
    - -
    -
    -_truncateMessage(message, diff)
    -
    - -
    -
    -classmethod addClassCleanup(function, /, *args, **kwargs)
    -

    Same as addCleanup, except the cleanup items are called even if -setUpClass fails (unlike tearDownClass).

    -
    - -
    -
    -addCleanup(function, /, *args, **kwargs)
    -

    Add a function, with arguments, to be called when the test is -completed. Functions added are called on a LIFO basis and are -called after tearDown on test failure or success.

    -

    Cleanup items are called even if setUp fails (unlike tearDown).

    -
    - -
    -
    -addTypeEqualityFunc(typeobj, function)
    -

    Add a type specific assertEqual style function to compare a type.

    -

    This method is for use by TestCase subclasses that need to register -their own type equality functions to provide nicer error messages.

    -
    -
    Args:
    -
    typeobj: The data type to call this function on when both values

    are of the same type in assertEqual().

    -
    -
    function: The callable taking two arguments and an optional

    msg= argument that raises self.failureException with a -useful error message when the two arguments are not equal.

    -
    -
    -
    -
    -
    - -
    -
    -assertAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are unequal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is more than the given -delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    If the two objects compare equal then they will automatically -compare almost equal.

    -
    - -
    -
    -assertAlmostEquals(**kwargs)
    -
    - -
    -
    -assertCountEqual(first, second, msg=None)
    -

    Asserts that two iterables have the same elements, the same number of -times, without regard to order.

    -
    -
    -
    -
    self.assertEqual(Counter(list(first)),

    Counter(list(second)))

    -
    -
    -
    -
    -
    Example:
      -
    • [0, 1, 1] and [1, 0, 1] compare equal.

    • -
    • [0, 0, 1] and [0, 1] compare unequal.

    • -
    -
    -
    -
    -
    - -
    -
    -assertDictContainsSubset(subset, dictionary, msg=None)
    -

    Checks whether dictionary is a superset of subset.

    -
    - -
    -
    -assertDictEqual(d1, d2, msg=None)
    -
    - -
    -
    -assertEqual(first, second, msg=None)
    -

    Fail if the two objects are unequal as determined by the ‘==’ -operator.

    -
    - -
    -
    -assertEquals(**kwargs)
    -
    - -
    -
    -assertFalse(expr, msg=None)
    -

    Check that the expression is false.

    -
    - -
    -
    -assertGreater(a, b, msg=None)
    -

    Just like self.assertTrue(a > b), but with a nicer default message.

    -
    - -
    -
    -assertGreaterEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a >= b), but with a nicer default message.

    -
    - -
    -
    -assertIn(member, container, msg=None)
    -

    Just like self.assertTrue(a in b), but with a nicer default message.

    -
    - -
    -
    -assertIs(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is b), but with a nicer default message.

    -
    - -
    -
    -assertIsInstance(obj, cls, msg=None)
    -

    Same as self.assertTrue(isinstance(obj, cls)), with a nicer -default message.

    -
    - -
    -
    -assertIsNone(obj, msg=None)
    -

    Same as self.assertTrue(obj is None), with a nicer default message.

    -
    - -
    -
    -assertIsNot(expr1, expr2, msg=None)
    -

    Just like self.assertTrue(a is not b), but with a nicer default message.

    -
    - -
    -
    -assertIsNotNone(obj, msg=None)
    -

    Included for symmetry with assertIsNone.

    -
    - -
    -
    -assertLess(a, b, msg=None)
    -

    Just like self.assertTrue(a < b), but with a nicer default message.

    -
    - -
    -
    -assertLessEqual(a, b, msg=None)
    -

    Just like self.assertTrue(a <= b), but with a nicer default message.

    -
    - -
    -
    -assertListEqual(list1, list2, msg=None)
    -

    A list-specific equality assertion.

    -
    -
    Args:

    list1: The first list to compare. -list2: The second list to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertLogs(logger=None, level=None)
    -

    Fail unless a log message of level level or higher is emitted -on logger_name or its children. If omitted, level defaults to -INFO and logger defaults to the root logger.

    -

    This method must be used as a context manager, and will yield -a recording object with two attributes: output and records. -At the end of the context manager, the output attribute will -be a list of the matching formatted log messages and the -records attribute will be a list of the corresponding LogRecord -objects.

    -

    Example:

    -
    with self.assertLogs('foo', level='INFO') as cm:
    -    logging.getLogger('foo').info('first message')
    -    logging.getLogger('foo.bar').error('second message')
    -self.assertEqual(cm.output, ['INFO:foo:first message',
    -                             'ERROR:foo.bar:second message'])
    -
    -
    -
    - -
    -
    -assertMultiLineEqual(first, second, msg=None)
    -

    Assert that two multi-line strings are equal.

    -
    - -
    -
    -assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
    -

    Fail if the two objects are equal as determined by their -difference rounded to the given number of decimal places -(default 7) and comparing to zero, or by comparing that the -difference between the two objects is less than the given delta.

    -

    Note that decimal places (from zero) are usually not the same -as significant digits (measured from the most significant digit).

    -

    Objects that are equal automatically fail.

    -
    - -
    -
    -assertNotAlmostEquals(**kwargs)
    -
    - -
    -
    -assertNotEqual(first, second, msg=None)
    -

    Fail if the two objects are equal as determined by the ‘!=’ -operator.

    -
    - -
    -
    -assertNotEquals(**kwargs)
    -
    - -
    -
    -assertNotIn(member, container, msg=None)
    -

    Just like self.assertTrue(a not in b), but with a nicer default message.

    -
    - -
    -
    -assertNotIsInstance(obj, cls, msg=None)
    -

    Included for symmetry with assertIsInstance.

    -
    - -
    -
    -assertNotRegex(text, unexpected_regex, msg=None)
    -

    Fail the test if the text matches the regular expression.

    -
    - -
    -
    -assertNotRegexpMatches(**kwargs)
    -
    - -
    -
    -assertRaises(expected_exception, *args, **kwargs)
    -

    Fail unless an exception of class expected_exception is raised -by the callable when invoked with specified positional and -keyword arguments. If a different type of exception is -raised, it will not be caught, and the test case will be -deemed to have suffered an error, exactly as for an -unexpected exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertRaises(SomeException):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertRaises -is used as a context object.

    -

    The context manager keeps a reference to the exception as -the ‘exception’ attribute. This allows you to inspect the -exception after the assertion:

    -
    with self.assertRaises(SomeException) as cm:
    -    do_something()
    -the_exception = cm.exception
    -self.assertEqual(the_exception.error_code, 3)
    -
    -
    -
    - -
    -
    -assertRaisesRegex(expected_exception, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a raised exception matches a regex.

    -
    -
    Args:

    expected_exception: Exception class expected to be raised. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertRaisesRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assertRaisesRegexp(**kwargs)
    -
    - -
    -
    -assertRegex(text, expected_regex, msg=None)
    -

    Fail the test unless the text matches the regular expression.

    -
    - -
    -
    -assertRegexpMatches(**kwargs)
    -
    - -
    -
    -assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
    -

    An equality assertion for ordered sequences (like lists and tuples).

    -

    For the purposes of this function, a valid ordered sequence type is one -which can be indexed, has a length, and has an equality operator.

    -
    -
    Args:

    seq1: The first sequence to compare. -seq2: The second sequence to compare. -seq_type: The expected datatype of the sequences, or None if no

    -
    -

    datatype should be enforced.

    -
    -
    -
    msg: Optional message to use on failure instead of a list of

    differences.

    -
    -
    -
    -
    -
    - -
    -
    -assertSetEqual(set1, set2, msg=None)
    -

    A set-specific equality assertion.

    -
    -
    Args:

    set1: The first set to compare. -set2: The second set to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -

    assertSetEqual uses ducktyping to support different types of sets, and -is optimized for sets specifically (parameters must support a -difference method).

    -
    - -
    -
    -assertTrue(expr, msg=None)
    -

    Check that the expression is true.

    -
    - -
    -
    -assertTupleEqual(tuple1, tuple2, msg=None)
    -

    A tuple-specific equality assertion.

    -
    -
    Args:

    tuple1: The first tuple to compare. -tuple2: The second tuple to compare. -msg: Optional message to use on failure instead of a list of

    -
    -

    differences.

    -
    -
    -
    -
    - -
    -
    -assertWarns(expected_warning, *args, **kwargs)
    -

    Fail unless a warning of class warnClass is triggered -by the callable when invoked with specified positional and -keyword arguments. If a different type of warning is -triggered, it will not be handled: depending on the other -warning filtering rules in effect, it might be silenced, printed -out, or raised as an exception.

    -

    If called with the callable and arguments omitted, will return a -context object used like this:

    -
    with self.assertWarns(SomeWarning):
    -    do_something()
    -
    -
    -

    An optional keyword argument ‘msg’ can be provided when assertWarns -is used as a context object.

    -

    The context manager keeps a reference to the first matching -warning as the ‘warning’ attribute; similarly, the ‘filename’ -and ‘lineno’ attributes give you information about the line -of Python code from which the warning was triggered. -This allows you to inspect the warning after the assertion:

    -
    with self.assertWarns(SomeWarning) as cm:
    -    do_something()
    -the_warning = cm.warning
    -self.assertEqual(the_warning.some_attribute, 147)
    -
    -
    -
    - -
    -
    -assertWarnsRegex(expected_warning, expected_regex, *args, **kwargs)
    -

    Asserts that the message in a triggered warning matches a regexp. -Basic functioning is similar to assertWarns() with the addition -that only warnings whose messages also match the regular expression -are considered successful matches.

    -
    -
    Args:

    expected_warning: Warning class expected to be triggered. -expected_regex: Regex (re.Pattern object or string) expected

    -
    -

    to be found in error message.

    -
    -

    args: Function to be called and extra positional args. -kwargs: Extra kwargs. -msg: Optional message used in case of failure. Can only be used

    -
    -

    when assertWarnsRegex is used as a context manager.

    -
    -
    -
    -
    - -
    -
    -assert_(**kwargs)
    -
    - -
    -
    -countTestCases()
    -
    - -
    -
    -debug()
    -

    Run the test without collecting errors in a TestResult

    -
    - -
    -
    -defaultTestResult()
    -
    - -
    -
    -classmethod doClassCleanups()
    -

    Execute all class cleanup functions. Normally called for you after -tearDownClass.

    -
    - -
    -
    -doCleanups()
    -

    Execute all cleanup functions. Normally called for you after -tearDown.

    -
    - -
    -
    -fail(msg=None)
    -

    Fail immediately, with the given message.

    -
    - -
    -
    -failIf(**kwargs)
    -
    - -
    -
    -failIfAlmostEqual(**kwargs)
    -
    - -
    -
    -failIfEqual(**kwargs)
    -
    - -
    -
    -failUnless(**kwargs)
    -
    - -
    -
    -failUnlessAlmostEqual(**kwargs)
    -
    - -
    -
    -failUnlessEqual(**kwargs)
    -
    - -
    -
    -failUnlessRaises(**kwargs)
    -
    - -
    -
    -failureException
    -

    alias of AssertionError

    -
    - -
    -
    -id()
    -
    - -
    -
    -longMessage = True
    -
    - -
    -
    -maxDiff = 640
    -
    - -
    -
    -run(result=None)
    -
    - -
    -
    -setUp()
    -

    Hook method for setting up the test fixture before exercising it.

    -
    - -
    -
    -classmethod setUpClass()
    -

    Hook method for setting up class fixture before running tests in the class.

    -
    - -
    -
    -shortDescription()
    -

    Returns a one-line description of the test, or None if no -description has been provided.

    -

    The default implementation of this method returns the first line of -the specified test method’s docstring.

    -
    - -
    -
    -skipTest(reason)
    -

    Skip this test.

    -
    - -
    -
    -subTest(msg=<object object>, **params)
    -

    Return a context manager that will return the enclosed block -of code in a subtest identified by the optional message and -keyword parameters. A failure in the subtest marks the test -case as failed but resumes execution at the end of the enclosed -block, allowing further test code to be executed.

    -
    - -
    -
    -tearDown()
    -

    Hook method for deconstructing the test fixture after testing it.

    -
    - -
    -
    -classmethod tearDownClass()
    -

    Hook method for deconstructing the class fixture after running all tests in the class.

    -
    - -
    -
    -test_CAPDU()
    -
    - -
    -
    -test_RAPDU()
    -
    - -
    - -
    - - -
    - -
    -
    -
    -
    -

    - Back to top - -

    -

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    -

    -
    -
    - - \ No newline at end of file diff --git a/docs/virtualsmartcard/api/virtualsmartcard.utils.html b/docs/virtualsmartcard/api/virtualsmartcard.utils.html index 2a00e32..62b1abe 100644 --- a/docs/virtualsmartcard/api/virtualsmartcard.utils.html +++ b/docs/virtualsmartcard/api/virtualsmartcard.utils.html @@ -4,7 +4,7 @@ - utils Module — vsmartcard 2021-04-28 documentation + utils Module — vsmartcard 2023-09-27 documentation @@ -12,16 +12,16 @@ - - - - + + + + @@ -123,7 +123,7 @@
    -
    +

    utils Module

    @@ -455,7 +455,7 @@ hexdump(b’A’, short=True) -> ‘00 41 (.A)’

    - © Copyright 2009-2021 by Dominik Oepen and Frank Morgner.
    + © Copyright 2009-2023 by Dominik Oepen and Frank Morgner.