Compare commits

...

17 commits

Author SHA1 Message Date
60aed213d6 Resolv merge conflicts 2019-03-19 23:20:38 +01:00
0da833f7d2 Rework document to be compatible with pandoc 2019-03-19 23:14:28 +01:00
123a8e590a
Merge pull request #1 from nahsiy/patch-1
Corrections orthographiques suite à une relecture
2019-03-19 20:52:59 +00:00
yishan
54dcf380f6
Corrections orthographiques suite à une relecture 2019-03-19 21:31:20 +01:00
0abee7fe7b Correct hash footnote 2019-03-19 19:36:22 +01:00
cbba4a04d0 Syntax corrections 2019-03-19 19:22:50 +01:00
fc6bab48f2 Add conclusions 2019-03-19 17:41:41 +01:00
f155893cea Rework introduction 2019-03-19 17:02:07 +01:00
24db750420 Add PKCS part 2019-03-19 16:56:08 +01:00
2523280df1 Create a subtitle for padding oracle attack on smartcard devices 2019-03-19 16:36:47 +01:00
d28de1f6fc Rework padding oracle part 2019-03-19 16:34:29 +01:00
Eol
549ec51967
Syntax correction 2019-03-19 13:37:39 +01:00
adb0113f93 First padding oracle definition version 2019-03-19 11:59:53 +01:00
5effc75823 Add some informations on padding attack 2019-03-19 03:24:58 +01:00
0859d2770a Add padding definition 2019-03-19 00:56:14 +01:00
f990e24da8 Integrate CBC schema and definition 2019-03-19 00:17:09 +01:00
831e01a828 Add CBC Schema 2019-03-18 23:58:43 +01:00
3 changed files with 2765 additions and 57 deletions

1796
files/CBC.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 139 KiB

751
files/pagging.svg Normal file
View file

@ -0,0 +1,751 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg8"
version="1.1"
viewBox="0 0 435.13284 144.2607"
height="144.2607mm"
width="435.13284mm">
<title
id="title1517">CBC Padding</title>
<defs
id="defs2">
<marker
orient="auto"
refY="0"
refX="0"
id="marker10195"
style="overflow:visible">
<path
id="path10193"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker9617"
style="overflow:visible">
<path
id="path9615"
d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
style="fill:#de6a66;fill-opacity:1;fill-rule:evenodd;stroke:#de6a66;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker9341"
style="overflow:visible">
<path
id="path9339"
style="fill:#de6a66;fill-opacity:1;fill-rule:evenodd;stroke:#de6a66;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)" />
</marker>
<marker
style="overflow:visible"
id="marker5939"
refX="0"
refY="0"
orient="auto">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path5937" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker5765"
style="overflow:visible">
<path
id="path5763"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)" />
</marker>
<marker
style="overflow:visible"
id="marker4955"
refX="0"
refY="0"
orient="auto">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path4953" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker3568"
style="overflow:visible">
<path
id="path3566"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)" />
</marker>
<marker
style="overflow:visible"
id="marker3238"
refX="0"
refY="0"
orient="auto">
<path
transform="scale(-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path3236" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker2778"
style="overflow:visible">
<path
id="path2542"
style="fill:#93e7f1;fill-opacity:1;fill-rule:evenodd;stroke:#93e7f1;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)" />
</marker>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1613-1">
<path
id="path1615-8"
d="m 581.01309,-24.619685 v 10.921814 h 10.92129 v -10.921814 z m -14.7438,0.0015 v 0.02687 10.894425 0.02739 h 10.92129 v -0.02739 -10.894425 -0.02687 z m 29.4876,0.0088 v 10.921298 H 606.6782 V -24.60935 Z m 14.7438,0.01912 v 10.921305 h 10.92182 v -10.921269 z m -14.7438,14.6059055 V 0.93693766 H 606.6782 V -9.9843176 Z m -14.7438,0.010851 V 0.94778666 h 10.92129 V -9.9734676 Z m 29.4876,0.03256 V 0.98034666 h 10.92182 V -9.9409106 Z m -44.2314,0.020159 V 1.0005127 h 10.92129 V -9.9207467 Z m 29.4876,14.5788273 V 15.579343 H 606.6782 V 4.6580836 Z m -14.7438,0.01447 V 15.593795 h 10.92129 V 4.6725346 Z m -14.7438,0.04082 V 15.634631 h 10.92129 V 4.7133786 Z m 44.2314,0.0036 V 15.638235 h 10.92182 V 4.7169928 Z m 0,14.4875002 v 10.921299 h 10.92182 V 19.204493 Z m -29.4876,0.01654 v 10.921299 h 10.92129 v -10.92124 z m -14.7438,0.02635 V 30.16914 h 10.92129 V 19.247374 Z m 29.4876,0.01188 V 30.180493 H 606.6782 V 19.259252 Z"
style="opacity:1;fill:#c87137;fill-opacity:1;stroke-width:0.11795517" />
</clipPath>
<marker
orient="auto"
refY="0"
refX="0"
id="marker9617-0"
style="overflow:visible">
<path
id="path9615-3"
d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
style="fill:#de6a66;fill-opacity:1;fill-rule:evenodd;stroke:#de6a66;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
</marker>
<marker
orient="auto"
refY="0"
refX="0"
id="marker9341-4"
style="overflow:visible">
<path
id="path9339-0"
style="fill:#de6a66;fill-opacity:1;fill-rule:evenodd;stroke:#de6a66;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6)" />
</marker>
</defs>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>CBC Padding</dc:title>
<dc:date>2019-03-18</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Yorick Barbanneau / ephase</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:rights>
<cc:license
rdf:resource="http://artlibre.org/licence/lal" />
<dc:language>fr</dc:language>
</cc:Work>
<cc:License
rdf:about="http://artlibre.org/licence/lal">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
</cc:License>
</rdf:RDF>
</metadata>
<rect
style="opacity:1;fill:#de8787;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1008"
width="12.567708"
height="9.5911455"
x="62.655071"
y="323.73459" />
<rect
y="312.97699"
x="92.076035"
height="9.5911455"
width="12.567708"
id="rect1010"
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
y="324.08948"
x="77.060898"
height="9.5911455"
width="12.567708"
id="rect1012"
style="opacity:1;fill:#de6a66;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
style="opacity:1;fill:#41e6a8;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1014"
width="12.567708"
height="9.5911455"
x="92.27446"
y="324.2879" />
<rect
y="335.92209"
x="107.89022"
height="9.5911455"
width="12.567708"
id="rect1016"
style="opacity:1;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
style="opacity:1;fill:#999999;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1018"
width="12.567708"
height="9.5911455"
x="77.073471"
y="336.02771" />
<rect
y="336.02771"
x="62.527325"
height="9.5911455"
width="12.567708"
id="rect1020"
style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
y="335.96039"
x="92.380478"
height="9.5911455"
width="12.567708"
id="rect335"
style="opacity:1;fill:#6a6969;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="101.11867"
y="30.991087"
id="text1916"><tspan
id="tspan1914"
x="101.11867"
y="40.354855"
style="stroke-width:0.26458332" /></text>
<g
id="g696"
transform="matrix(0.78113679,0,0,0.78113679,-316.4678,-23.43516)">
<path
id="rect691"
d="m 420.58519,36.402288 h 19.20604 l 2.64583,2.840415 h -24.4977 z"
style="opacity:1;fill:#41e6a8;fill-opacity:1;stroke-width:0.26381949" />
</g>
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(-6.6989147e-6,25.625772)"
id="use796" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(-6.6989147e-6,51.251559)"
id="use798" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(-6.6989147e-6,76.877329)"
id="use800" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(25.833683,-2.9654083e-6)"
id="use802" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(25.833683,25.625772)"
id="use804" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(25.833683,51.251559)"
id="use806" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(51.667374,-2.9654083e-6)"
id="use810" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(51.667374,25.625772)"
id="use812" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(51.667374,51.251559)"
id="use814" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(77.501063,-2.9654083e-6)"
id="use818" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(77.501063,25.625772)"
id="use820" />
<use
height="100%"
width="100%"
x="0"
y="0"
xlink:href="#g696"
transform="translate(77.501063,51.251559)"
id="use822" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="M 10.000533,7.2181516 V 26.354864 H 29.136317 V 7.2181516 Z m 9.567911,4.6187054 c 2.257366,0 3.399933,1.83602 3.399933,4.93652 0,3.114091 -1.142567,4.962782 -3.399933,4.962782 -2.257404,0 -3.39997,-1.848691 -3.39997,-4.962782 0,-3.1005 1.142566,-4.93652 3.39997,-4.93652 z m 0,1.563718 c -0.951933,0 -1.387155,0.925041 -1.387155,3.372802 0,0.802321 0.02687,1.427308 0.08145,1.903259 l 2.298066,-4.81338 C 20.3432,13.509689 20.030789,13.400575 19.568444,13.400575 Z m 1.332826,2.05356 -2.162233,4.473838 c 0.203978,0.190379 0.475832,0.258052 0.829407,0.258052 0.951896,0 1.373533,-0.883294 1.373533,-3.412648 0,-0.50315 -0.01347,-0.938477 -0.04079,-1.319242 z"
id="rect689-3" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="M 35.833954,7.2181516 V 26.354864 H 54.969745 V 7.2181516 Z m 9.364172,6.8216674 c 2.148604,0 3.154596,0.897051 3.154596,2.556089 v 2.828631 c 0,0.543946 0.136298,0.747745 0.476251,0.870136 l -0.449083,1.414316 c -0.843133,-0.08159 -1.427487,-0.353283 -1.767441,-0.951626 -0.557561,0.66633 -1.468427,0.978794 -2.365934,0.978794 -1.495872,0 -2.448367,-0.938207 -2.448367,-2.270875 0,-1.563845 1.292029,-2.461016 3.522227,-2.461016 h 0.965196 v -0.258052 c 0,-0.761531 -0.502252,-1.115518 -1.426979,-1.115518 -0.462338,0 -1.264906,0.136417 -1.985655,0.381192 l -0.489873,-1.427899 c 0.938304,-0.353561 2.012726,-0.544172 2.815062,-0.544172 z m 0.557748,4.188618 c -1.196671,0 -1.741156,0.380316 -1.741156,1.087444 0,0.557546 0.354181,0.883721 0.966123,0.883721 0.462337,0 1.032741,-0.28549 1.30473,-0.788647 v -1.182518 z"
id="rect2068" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="M 87.50174,7.2181516 V 26.354864 h 19.13579 V 7.2181516 Z m 9.186704,4.6187054 c 2.02617,0 3.20981,1.1012 3.20981,2.42027 0,1.196686 -0.76186,1.917323 -1.93132,2.257292 1.30548,0.17678 2.230116,0.815725 2.230116,2.33878 0,1.591043 -1.387076,2.88296 -3.644436,2.88296 -1.40065,0 -2.52884,-0.516801 -3.3176,-1.414315 l 1.20969,-1.128197 c 0.54399,0.625541 1.22416,0.897305 1.95849,0.897305 0.93831,0 1.59091,-0.489641 1.59091,-1.387155 0,-0.9927 -0.58459,-1.414315 -1.59091,-1.414315 h -0.85653 l 0.24445,-1.468645 h 0.5985 c 0.84313,0 1.42791,-0.420926 1.42791,-1.236846 0,-0.707128 -0.55766,-1.142672 -1.37358,-1.142672 -0.74791,0 -1.34664,0.312659 -1.87699,0.815808 l -1.10103,-1.141773 c 0.85672,-0.829519 1.93063,-1.278497 3.22252,-1.278497 z"
id="rect2116" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="M 61.667382,7.2181516 V 26.354864 H 80.804095 V 7.2181516 Z m 9.636715,6.8216674 c 2.067017,0 3.385466,1.386975 3.385466,3.712352 0,0.244775 -0.01347,0.557486 -0.04079,0.775063 h -4.677585 c 0.149597,1.183087 0.815546,1.645207 1.740274,1.645207 0.652739,0 1.278677,-0.231341 1.849867,-0.5985 l 0.85653,1.16984 c -0.679945,0.584743 -1.659053,0.992378 -2.88293,0.992378 -2.474974,0 -3.753097,-1.590811 -3.753097,-3.834593 0,-2.13499 1.251187,-3.861747 3.522182,-3.861747 z m 0,1.441476 c -0.761539,0 -1.264816,0.543595 -1.359994,1.740281 h 2.651185 c -0.01347,-1.047096 -0.380092,-1.740281 -1.291191,-1.740281 z"
id="rect2183" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 87.50174,32.844239 v 19.1358 h 19.13579 v -19.1358 z m 9.241044,4.61779 c 2.14855,0 3.25056,1.26494 3.25056,2.70639 0,1.52306 -0.93813,2.76027 -3.80743,5.31682 h 4.024716 l -0.230876,1.64611 h -6.25579 v -1.52297 c 3.08692,-3.00531 4.07997,-4.12112 4.07997,-5.24981 0,-0.76152 -0.44899,-1.23685 -1.26491,-1.23685 -0.70711,0 -1.19638,0.2853 -1.69952,0.95163 l -1.30566,-0.99237 c 0.70712,-0.9791 1.68585,-1.61895 3.20894,-1.61895 z"
id="rect2195" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 61.667382,32.844239 v 19.1358 h 19.136713 v -19.1358 z m 9.582386,4.61779 c 1.835819,0 3.113844,0.96602 3.113844,2.50267 0,0.88392 -0.448753,1.46884 -1.455075,2.03998 1.264681,0.63914 1.821778,1.50898 1.821778,2.56968 0,1.45506 -1.196805,2.78787 -3.535767,2.78787 -2.2982,0 -3.453378,-1.27849 -3.453378,-2.73355 0,-1.0743 0.665994,-1.89001 1.726689,-2.35236 -0.965524,-0.61194 -1.359994,-1.15587 -1.359994,-2.20297 0,-1.60463 1.346874,-2.61132 3.141903,-2.61132 z m 0,1.46865 c -0.70712,0 -1.101912,0.39475 -1.101912,1.14267 0,0.66634 0.435267,1.06076 1.373571,1.41432 0.625527,-0.44875 0.802202,-0.87039 0.802202,-1.40074 0,-0.67993 -0.353119,-1.15625 -1.073861,-1.15625 z m -0.462667,3.91698 c -0.557561,0.35357 -0.897327,0.89727 -0.897327,1.64521 0,0.78872 0.448895,1.33282 1.359994,1.33282 0.938305,0 1.331943,-0.58498 1.331943,-1.26492 0,-0.93831 -0.529936,-1.26436 -1.79461,-1.71311 z"
id="rect2203" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 35.833954,32.844239 v 19.1358 h 19.135791 v -19.1358 z m 10.193579,6.82076 c 1.087864,0 1.917742,0.31345 2.638484,0.91178 l -0.925371,1.29209 c -0.489551,-0.33997 -1.033303,-0.54418 -1.618077,-0.54418 -0.979101,0 -1.618024,0.61187 -1.618024,2.24371 0,1.60464 0.679765,2.09431 1.604492,2.09431 0.584729,0 1.087677,-0.25852 1.60444,-0.61209 l 0.95254,1.35999 c -0.639155,0.54395 -1.564152,0.95162 -2.679229,0.95162 -2.339005,0 -3.725928,-1.53646 -3.725928,-3.79383 0,-2.25738 1.441304,-3.9034 3.766673,-3.9034 z"
id="rect2211" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 10.000533,32.844239 v 19.1358 h 19.135784 v -19.1358 z m 10.261447,4.61779 c 0.81592,0 1.509636,0.24492 2.039984,0.61209 l -0.815778,1.30566 c -0.367167,-0.25837 -0.789081,-0.38029 -1.197038,-0.38029 -1.006276,0 -1.768182,0.93771 -1.876989,2.66475 0.571144,-0.57115 1.305747,-0.85656 1.97207,-0.85656 1.46866,0 2.638484,1.12842 2.638484,3.12742 0,1.89023 -1.292216,3.42713 -3.345649,3.42713 -2.502134,0 -3.50859,-2.06684 -3.50859,-4.48741 0,-3.18209 1.536983,-5.41279 4.093506,-5.41279 z m -0.435498,4.82787 c -0.503135,0 -1.019944,0.25836 -1.414323,0.73432 0.02739,1.87662 0.326601,2.80147 1.292073,2.80147 0.81592,0 1.16987,-0.78834 1.16987,-1.76744 0,-1.29188 -0.381297,-1.76835 -1.04762,-1.76835 z"
id="rect2219" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 10.000533,58.470309 v 19.13581 h 19.135784 v -19.13581 z m 6.413315,4.86227 h 6.309147 v 1.45506 l -3.644423,8.1871 -2.039063,-0.63926 3.507714,-7.38395 h -4.133375 z"
id="rect2227" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 35.833954,58.470309 v 19.13581 h 19.135791 v -19.13581 z m 9.32342,4.86227 h 1.904158 v 7.79232 h 1.753857 v 1.63162 h -6.11903 v -1.63162 h 2.270898 v -5.68442 l -1.944903,1.22417 -0.910911,-1.48223 z"
id="rect2235" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 61.667382,58.470309 v 19.13581 h 19.136713 v -19.13581 z m 10.547627,3.96497 2.148603,0.23179 v 10.08945 h -1.90415 l -0.108665,-0.78864 c -0.394335,0.55754 -1.047299,1.02043 -1.99924,1.02043 -1.795028,0 -2.651139,-1.53728 -2.651139,-3.86265 0,-2.23018 1.101537,-3.83458 2.882937,-3.83458 0.639147,0 1.196477,0.23124 1.631654,0.67999 z m -1.061205,4.43309 c -0.747918,0 -1.236862,0.65263 -1.236862,2.27088 0,1.78143 0.461873,2.27177 1.114612,2.27177 0.489551,0 0.870669,-0.31355 1.183455,-0.8303 v -3.11384 c -0.299202,-0.38077 -0.612452,-0.59851 -1.061205,-0.59851 z"
id="rect2243" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="m 87.501066,58.470309 v 19.1358 h 19.135794 v -19.1358 z m 8.711338,4.6178 1.82178,0.67999 -2.21657,5.3983 h 1.69952 l 0.23179,-2.27087 h 1.82178 v 2.27087 h 0.938966 v 1.60537 h -0.938966 v 1.98475 h -2.05357 l -0.0135,-1.98475 h -3.90247 v -1.41432 z"
id="rect2251" />
<path
style="opacity:1;fill:#93f1cd;fill-opacity:1;stroke-width:0.20667578"
d="M 10.000533,84.095489 V 103.2322 H 29.136317 V 84.095489 Z m 9.513582,4.61871 c 2.298156,0 3.467846,1.53649 3.467846,3.76668 0,3.61724 -1.781535,5.48056 -5.738751,6.31009 l -0.449075,-1.50939 c 2.230153,-0.55755 3.467381,-1.44143 3.875337,-2.93729 -0.55756,0.48956 -1.141728,0.78865 -1.916851,0.78865 -1.482243,0 -2.665652,-1.19746 -2.665652,-3.01968 0,-2.0398 1.468936,-3.39906 3.427146,-3.39906 z m -0.01347,1.53655 c -0.77513,0 -1.251373,0.55712 -1.251373,1.7946 0,1.15589 0.517137,1.5782 1.169869,1.5782 0.503135,0 0.92487,-0.19061 1.34641,-0.54417 0.01347,-1.90382 -0.190626,-2.82863 -1.264906,-2.82863 z"
id="rect2283" />
<path
style="fill:#93e7f1;fill-opacity:1;stroke:#93e7f1;stroke-width:3.74216914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5765)"
d="m 122.76142,55.180349 h 46.13007"
id="path5691" />
<g
transform="matrix(7.6585848,0,0,7.6585848,-678.8034,-2406.9816)"
id="g2160">
<rect
style="opacity:1;fill:none;fill-opacity:1;stroke:#6a6969;stroke-width:1.25727844;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect8600"
width="4.5057235"
height="6.5867286"
x="147.23857"
y="298.86365"
ry="2.0741186"
transform="matrix(0.99288615,0.1190676,-0.02687447,0.99963882,0,0)" />
<g
id="g8598"
transform="matrix(0.97127651,0,0,0.97127651,-386.83986,120.53305)">
<path
id="rect8571"
d="m 540.98865,204.2943 5.69758,0.49226 v 6.12001 l -5.69758,0.49226 z"
style="opacity:1;fill:#de8787;fill-opacity:1;stroke:none;stroke-width:0.78761435;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="rect8575"
d="m 538.90393,204.78656 2.08469,-0.49226 v 7.10454 l -2.08469,-0.49226 z"
style="opacity:1;fill:#de6a66;fill-opacity:1;stroke:none;stroke-width:0.64446002;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
transform="matrix(0.7264714,0,0,0.7264714,149.13692,56.890203)"
id="g8591">
<path
style="opacity:1;fill:#626161;fill-opacity:1;stroke:none;stroke-width:1.4198041;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 1676.4668,6.5957031 v 0.2226563 c -1.1393,0.5191412 -1.9629,1.9461079 -1.9629,3.6445316 0,1.07094 0.3334,2.092365 0.9199,2.822265 l -0.9004,10.78125 h 5.7871 l -0.9433,-10.777344 c 0.587,-0.730591 0.9212,-1.754175 0.9219,-2.826171 -10e-5,-2.0787126 -1.2305,-3.7613148 -2.7696,-3.8496098 v -0.017578 h -0.123 z"
transform="matrix(0.24612948,0,0,0.24612948,130.6044,204.07238)"
id="path8577" />
<path
id="path8582"
d="m 543.23242,205.696 c -0.39321,2e-5 -0.71196,0.42603 -0.71197,0.95156 0,0.26359 0.0824,0.51521 0.22675,0.69486 l -0.22151,2.65346 h 1.424 l -0.23205,-2.65272 c 0.14447,-0.17982 0.22658,-0.43175 0.22674,-0.6956 -10e-6,-0.52553 -0.31876,-0.95154 -0.71196,-0.95156 z"
style="opacity:1;fill:#2b2b2b;fill-opacity:1;stroke:none;stroke-width:0.34945565;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1627"
xlink:href="#g696"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1629"
xlink:href="#use796"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1631"
xlink:href="#use798"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1633"
xlink:href="#use800"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1635"
xlink:href="#use802"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1637"
xlink:href="#use804"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1639"
xlink:href="#use806"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1641"
xlink:href="#use810"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1643"
xlink:href="#use812"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1645"
xlink:href="#use814"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1647"
xlink:href="#use818"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1649"
xlink:href="#use820"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1651"
xlink:href="#use822"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1653"
xlink:href="#rect689-3"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1655"
xlink:href="#rect2068"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1657"
xlink:href="#rect2116"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1659"
xlink:href="#rect2183"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1661"
xlink:href="#rect2195"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1663"
xlink:href="#rect2203"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1665"
xlink:href="#rect2211"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1667"
xlink:href="#rect2219"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1669"
xlink:href="#rect2227"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1671"
xlink:href="#rect2235"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1673"
xlink:href="#rect2243"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1675"
xlink:href="#rect2251"
y="0"
x="0" />
<use
height="100%"
width="100%"
transform="translate(183.78895,-2.9654083e-6)"
id="use1677"
xlink:href="#rect2283"
y="0"
x="0" />
<g
id="use1679"
transform="matrix(0.78113679,0,0,0.78113679,-106.72755,53.635969)"
style="fill:#4d4d4d;fill-opacity:1">
<path
id="path1705"
d="m 420.58519,36.402288 h 19.20604 l 2.64583,2.840415 h -24.4977 z"
style="opacity:1;fill:#4d4d4d;fill-opacity:1;stroke-width:0.26381949" />
</g>
<g
id="use1681"
transform="matrix(0.78113679,0,0,0.78113679,-80.893872,53.635969)"
style="fill:#4d4d4d;fill-opacity:1;stroke:none">
<path
id="path1701"
d="m 420.58519,36.402288 h 19.20604 l 2.64583,2.840415 h -24.4977 z"
style="opacity:1;fill:#4d4d4d;fill-opacity:1;stroke-width:0.26381949" />
</g>
<g
id="use1683"
transform="matrix(0.78113679,0,0,0.78113679,-55.060183,53.635969)"
style="fill:#4d4d4d;fill-opacity:1">
<path
id="path1697"
d="m 420.58519,36.402288 h 19.20604 l 2.64583,2.840415 h -24.4977 z"
style="opacity:1;fill:#4d4d4d;fill-opacity:1;stroke-width:0.26381949" />
</g>
<path
style="opacity:1;fill:#cccccc;fill-opacity:1;stroke-width:0.20667578"
d="M 219.74038,84.289929 V 103.42586 H 238.8763 V 84.289929 Z m 3.17108,6.31045 c 1.48549,0 2.23705,1.20812 2.23705,3.24843 0,2.04927 -0.75156,3.26623 -2.23705,3.26623 -1.48549,0 -2.23705,-1.21696 -2.23705,-3.26623 0,-2.04031 0.75156,-3.24843 2.23705,-3.24843 z m 8.02109,0 c 1.48549,0 2.23704,1.20812 2.23704,3.24843 0,2.04927 -0.75155,3.26623 -2.23704,3.26623 -1.4855,0 -2.23742,-1.21696 -2.23742,-3.26623 0,-2.04031 0.75192,-3.24843 2.23742,-3.24843 z m 4.70113,0 c 1.33335,0 2.11211,0.72506 2.11211,1.59308 0,0.78749 -0.50131,1.26147 -1.27091,1.48516 0.85908,0.11635 1.46777,0.53709 1.46777,1.53934 0,1.04701 -0.91283,1.89708 -2.39832,1.89708 -0.92172,0 -1.66465,-0.33994 -2.18366,-0.93057 l 0.79632,-0.74259 c 0.35797,0.41166 0.80548,0.59061 1.28872,0.59061 0.61745,0 1.04697,-0.32214 1.04697,-0.91277 0,-0.65326 -0.38478,-0.93095 -1.04697,-0.93095 h -0.56351 l 0.16089,-0.9665 h 0.39371 c 0.55482,0 0.93984,-0.27722 0.93984,-0.81416 0,-0.46534 -0.36694,-0.75185 -0.90385,-0.75185 -0.4922,0 -0.88594,0.2061 -1.23496,0.5372 l -0.72478,-0.75186 c 0.56377,-0.54587 1.2705,-0.84122 2.12063,-0.84122 z m -12.72222,1.02918 c -0.6264,0 -0.91277,0.60847 -0.91277,2.21925 0,0.52799 0.018,0.93952 0.0537,1.25274 l 1.51224,-3.16761 c -0.14317,-0.23267 -0.34898,-0.30438 -0.65324,-0.30438 z m 8.02109,0 c -0.62641,0 -0.91275,0.60847 -0.91275,2.21925 0,0.52799 0.0177,0.93952 0.0534,1.25274 l 1.51265,-3.16761 c -0.14319,-0.23267 -0.349,-0.30438 -0.65326,-0.30438 z m -7.1439,1.35135 -1.42292,2.94406 c 0.13424,0.12528 0.31306,0.17018 0.54573,0.17018 0.62641,0 0.90386,-0.58187 0.90386,-2.24634 0,-0.3311 -0.009,-0.61734 -0.0266,-0.8679 z m 8.0207,0 -1.42291,2.94406 c 0.13424,0.12528 0.31345,0.17018 0.54611,0.17018 0.62642,0 0.90387,-0.58187 0.90387,-2.24634 0,-0.3311 -0.009,-0.61734 -0.0271,-0.8679 z m -6.40405,0.89768 h 1.02802 l 0.49392,0.9874 0.4761,-0.9874 h 0.9758 l -0.9058,1.4291 1.06283,1.65535 h -1.03962 l -0.60993,-1.15604 -0.58672,1.15604 h -0.99321 l 1.05703,-1.62054 z"
id="use1685" />
<path
style="opacity:1;fill:#cccccc;fill-opacity:1;stroke-width:0.20667578"
d="M 245.57407,84.289889 V 103.42582 H 264.71 V 84.289889 Z m 3.17109,6.31044 c 1.48548,0 2.23705,1.20812 2.23705,3.24844 0,2.04925 -0.75157,3.26623 -2.23705,3.26623 -1.48549,0 -2.23705,-1.21698 -2.23705,-3.26623 0,-2.04032 0.75156,-3.24844 2.23705,-3.24844 z m 8.02108,0 c 1.48549,0 2.23705,1.20812 2.23705,3.24844 0,2.04925 -0.75156,3.26623 -2.23705,3.26623 -1.48549,0 -2.23742,-1.21698 -2.23742,-3.26623 0,-2.04032 0.75193,-3.24844 2.23742,-3.24844 z m 4.70113,0 c 1.33335,0 2.11211,0.72506 2.11211,1.59308 0,0.78749 -0.50131,1.26146 -1.27091,1.48517 0.85909,0.11634 1.46777,0.53708 1.46777,1.53933 0,1.04701 -0.91283,1.89709 -2.39832,1.89709 -0.92172,0 -1.66464,-0.33995 -2.18366,-0.93057 l 0.79633,-0.74259 c 0.35797,0.41165 0.80548,0.5906 1.28871,0.5906 0.61746,0 1.04697,-0.32214 1.04697,-0.91277 0,-0.65325 -0.38477,-0.93094 -1.04697,-0.93094 h -0.56351 l 0.16089,-0.96652 h 0.39371 c 0.55482,0 0.93984,-0.27721 0.93984,-0.81414 0,-0.46534 -0.36694,-0.75186 -0.90385,-0.75186 -0.49219,0 -0.88594,0.2061 -1.23496,0.5372 l -0.72478,-0.75185 c 0.56377,-0.54587 1.2705,-0.84123 2.12063,-0.84123 z m -12.72221,1.02919 c -0.62641,0 -0.91277,0.60847 -0.91277,2.21925 0,0.52798 0.018,0.93951 0.0537,1.25272 l 1.51224,-3.16759 c -0.14317,-0.23267 -0.34897,-0.30438 -0.65323,-0.30438 z m 8.02108,0 c -0.62641,0 -0.91275,0.60847 -0.91275,2.21925 0,0.52798 0.0177,0.93951 0.0534,1.25272 l 1.51264,-3.16759 c -0.14319,-0.23267 -0.34899,-0.30438 -0.65325,-0.30438 z m -7.1439,1.35135 -1.42292,2.94404 c 0.13424,0.12529 0.31306,0.17019 0.54574,0.17019 0.6264,0 0.90385,-0.58188 0.90385,-2.24633 0,-0.3311 -0.009,-0.61734 -0.0266,-0.8679 z m 8.02071,0 -1.42292,2.94404 c 0.13424,0.12529 0.31346,0.17019 0.54611,0.17019 0.62643,0 0.90388,-0.58188 0.90388,-2.24633 0,-0.3311 -0.009,-0.61734 -0.0271,-0.8679 z m -6.40405,0.89768 h 1.02802 l 0.49391,0.9874 0.4761,-0.9874 h 0.9758 l -0.90579,1.42909 1.06282,1.65535 h -1.03962 l -0.60993,-1.15604 -0.58672,1.15604 h -0.9932 l 1.05702,-1.62054 z"
id="use1687" />
<path
style="opacity:1;fill:#cccccc;fill-opacity:1;stroke-width:0.20667578"
d="m 271.40776,84.289889 v 19.135931 h 19.13593 V 84.289889 Z m 3.17109,6.31044 c 1.48548,0 2.23705,1.20812 2.23705,3.24844 0,2.04925 -0.75157,3.26623 -2.23705,3.26623 -1.48549,0 -2.23705,-1.21698 -2.23705,-3.26623 0,-2.04032 0.75156,-3.24844 2.23705,-3.24844 z m 8.02108,0 c 1.48549,0 2.23705,1.20812 2.23705,3.24844 0,2.04925 -0.75156,3.26623 -2.23705,3.26623 -1.48549,0 -2.23742,-1.21698 -2.23742,-3.26623 0,-2.04032 0.75193,-3.24844 2.23742,-3.24844 z m 4.70113,0 c 1.33335,0 2.11211,0.72506 2.11211,1.59308 0,0.78749 -0.50131,1.26146 -1.27091,1.48517 0.85909,0.11634 1.46777,0.53708 1.46777,1.53933 0,1.04701 -0.91283,1.89709 -2.39832,1.89709 -0.92172,0 -1.66464,-0.33995 -2.18366,-0.93057 l 0.79633,-0.74259 c 0.35797,0.41165 0.80548,0.5906 1.28871,0.5906 0.61746,0 1.04697,-0.32214 1.04697,-0.91277 0,-0.65325 -0.38477,-0.93094 -1.04697,-0.93094 h -0.56351 l 0.16089,-0.96652 h 0.39371 c 0.55482,0 0.93984,-0.27721 0.93984,-0.81414 0,-0.46534 -0.36694,-0.75186 -0.90385,-0.75186 -0.49219,0 -0.88594,0.2061 -1.23496,0.5372 l -0.72478,-0.75185 c 0.56377,-0.54587 1.2705,-0.84123 2.12063,-0.84123 z m -12.72221,1.02919 c -0.62641,0 -0.91277,0.60847 -0.91277,2.21925 0,0.52798 0.018,0.93951 0.0537,1.25272 l 1.51224,-3.16759 c -0.14317,-0.23267 -0.34897,-0.30438 -0.65323,-0.30438 z m 8.02108,0 c -0.6264,0 -0.91275,0.60847 -0.91275,2.21925 0,0.52798 0.0177,0.93951 0.0534,1.25272 l 1.51263,-3.16759 c -0.14319,-0.23267 -0.34899,-0.30438 -0.65325,-0.30438 z m -7.1439,1.35135 -1.42292,2.94404 c 0.13424,0.12529 0.31306,0.17019 0.54574,0.17019 0.6264,0 0.90385,-0.58188 0.90385,-2.24633 0,-0.3311 -0.009,-0.61734 -0.0266,-0.8679 z m 8.02071,0 -1.42292,2.94404 c 0.13424,0.12529 0.31346,0.17019 0.54611,0.17019 0.62643,0 0.90388,-0.58188 0.90388,-2.24633 0,-0.3311 -0.009,-0.61734 -0.0271,-0.8679 z m -6.40405,0.89768 h 1.02802 l 0.49391,0.9874 0.4761,-0.9874 h 0.9758 l -0.90579,1.42909 1.06282,1.65535 h -1.03962 l -0.60993,-1.15604 -0.58672,1.15604 h -0.9932 l 1.05702,-1.62054 z"
id="use1689" />
<use
height="100%"
width="100%"
transform="translate(177.55313,-2.9654083e-6)"
id="use2162"
xlink:href="#path5691"
y="0"
x="0" />
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#de6a66;stroke-width:1.0583334;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle13326"
cx="59.710625"
cy="128.40491"
r="10.326617" />
<text
id="text3898"
y="133.70311"
x="55.019024"
style="font-style:normal;font-weight:normal;font-size:15.35711765px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.38392791"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Medium';fill:#4d4d4d;fill-opacity:1;stroke-width:0.38392791"
y="133.70311"
x="55.019024"
id="tspan3896">1</tspan></text>
<circle
r="10.326617"
cy="128.40491"
cx="242.00858"
id="circle3900"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#de6a66;stroke-width:1.0583334;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:15.35711765px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.38392791"
x="237.31699"
y="133.70311"
id="text3904"><tspan
id="tspan3902"
x="237.31699"
y="133.70311"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:'Fira Code';-inkscape-font-specification:'Fira Code Medium';fill:#4d4d4d;fill-opacity:1;stroke-width:0.38392791">2</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -1,51 +1,68 @@
L'authentification par certificats x.509 et smartcard ---
----------------------------------------------------- title: Authentification par smartcard et PKI
documentclass: scrbook
author:
- Luc Lauriou
- Yorick Barbanneau
fontsize: 12pt
mainfont: DejaVu Serif
geometry: [top=1.5cm, bottom=3cm, left=3cm, right=3cm]
header-includes:
- \definecolor{liens}{HTML}{de6a66}
urlcolor: liens
linkstyle: bold
...
## Introduction ## Introduction
Depuis toujours, l'authentification sur des systèmes informatique est Depuis toujours, l'authentification sur des systèmes informatiques est
principalement régie par l'utilisation du couple identifiant / mot de passe. principalement régie par l'utilisation du couple identifiant / mot de passe.
C'est pourtant un facteur d'identification peu fiables : utilisation du même mot C'est pourtant un facteur d'identification peu fiable : utilisation du même mot
de passe pour plusieurs - voir tous les - services, mot de passe faible, progrès de passe pour plusieurs - voir tous les - services, mot de passe faible, progrès
technique rendant leur cassage plus efficaces etc. Dans un communiqué de presse technique rendant leur cassage plus efficace etc. Dans un communiqué de presse
du W3C et de l'Alliance FIDO, "les mots de passe volés, faibles ou par défaut du W3C et de l'Alliance FIDO, "les mots de passe volés, faibles ou par défaut
sont à l'origine de 81% des atteintes à la protection des données". sont à l'origine de 81% des atteintes à la protection des données".
Il existe des solution pour pallier cette faiblesse, avec notamment > Les mots de passe volés, faibles ou par défaut
l'introduction d'un ou plusieurs autres facteurs d'authentification (TOTP, SMS > sont à l'origine de 81% des atteintes à la protection des données.
etc.), ou les gestionnaires de mots de passe (keepass, LastPass ...).
L'authentification par certificats semble être une alternative Il existe des solutions pour pallier ces faiblesses, avec notamment
intéressante au traditionnel mot de passe. Nous allons dans ce mémoire étudier l'introduction d'un ou plusieurs autres facteurs d'authentification (TOTP, SMS
son fonctionnement, parler de son intégration dans GNU/Linux, parler de sa mise etc.) ou les gestionnaires de mots de passe (keepass, LastPass, etc ...).
en œuvre et tenter d'exposer ses limites.
L'authentification par certificats semble être une alternative intéressante aux
traditionnels mots de passe. Nous allons dans ce mémoire parler de la norme
X.509, des infrastructures à clefs publiques, des smartcards et des attaques
connues.
## La norme X.509 ## La norme X.509
La norme X.509 régissant les formats les format pour les certificats à clé La norme X.509 régie les formats pour les certificats à clés
publique. Elle est définie par l'Union Internationale des Télécommunications et publiques. Elle est définie par l'Union Internationale des Télécommunications et
établie : établie comme suit :
- Le **format de certificat** - Le **format de certificat**
- La **liste de révocation** des certificats - La **liste de révocation** des certificats
- leurs **attributs** - leurs **attributs**
- un **algorithme de validation de chemin de certificats** - un **algorithme de validation de chemin des certificats**
Contrairement à OpenPGP qui repose sur une toile de confiance, X.509 repose sur Contrairement à OpenPGP qui repose sur une toile de confiance, X.509 repose sur
les autorités de certifications : un tiers de confiance délivre les certificats les autorités de certifications : un tiers de confiance délivre les certificats
et fournit les moyens de les vérifier. et fournit les moyens de les vérifier.
Les certificats X.509 sont donc composé de deux éléments : une partie publique Les certificats X.509 sont donc composé de deux éléments : une partie publique
et une partie privée. Ces certificats peuvent assurer plusieurs rôles et une partie privée. Ces certificats peuvent assurer plusieurs rôles.
En voici quelques uns :
### PKI - Infrastructure à clefs publiques ### PKI - Infrastructure à clefs publiques
Une infrastructure à clefs publiques est un ensemble d'éléments, qu'ils soient Une infrastructure à clefs publiques est un ensemble d'éléments, qu'ils soient
humain, matériels ou logiciels, destinés à gérer les clefs publiques des humains, matériels ou logiciels, destinés à gérer les clefs publiques des
utilisateurs d'un système. utilisateurs d'un système.
Cette infrastructure est utilisée pour créer, gérer, distribuer et révoquer des Cette infrastructure est utilisée pour créer, gérer, distribuer et révoquer des
certificats certificats.
#### La PKI elle va te crypter l'Internet du digital #### La PKI elle va te crypter l'Internet du digital
@ -56,7 +73,7 @@ le fonctionnement du chiffrement TLS.
## Une SmartCard? ## Une SmartCard?
Maintenant que nous avons parlé de la norme X.509, nous allons parler de notre Maintenant que nous avons parlé de la norme X.509, nous allons parler de notre
**startcard**. D'après Wikipedia ([source](l_sc-wiki)) : **startcard**. D'après Wikipédia ([source](l_sc-wiki)) :
> Une carte à puce est une carte en matière plastique, voire en papier ou en > Une carte à puce est une carte en matière plastique, voire en papier ou en
> carton, de quelques centimètres de côté et moins d'un millimètre d'épaisseur, > carton, de quelques centimètres de côté et moins d'un millimètre d'épaisseur,
@ -86,7 +103,25 @@ et de l'utiliser. Lors de son utilisation, un code PIN sera demandé, le
certificat contenu pourra alors être utilisé pour s'authentifier, signer ou certificat contenu pourra alors être utilisé pour s'authentifier, signer ou
chiffrer. chiffrer.
Certaines Smartcard permettent la génération de certificats. Certaines smartcards permettent la génération de certificats.
### Les "normes" PKCS
PKCS pour *Public Key Cryptographics Standard* est un ensemble de spécifications
portées au départ par la Société *RSA Security* afin d'implanter les techniques
liées à la cryptographie par clé publique. Par la suite, beaucoup de ces
spécifications sont devenues des standard par le biais de RFC écrites par le
groupe de travail PKIX[^n_pkix] de l'IETF.
Les plus utiles ici sont :
- **PKCS#7** : standard de syntaxe de message cryptographiques, normalisé par
les RFC 2315 et 5653.
- **PKCS#11** : API définissant une interface générique pour les périphériques
cryptographiques.
[^n_pkix]:Public Key Infrastructure X.509, groupe de travail de l'IETF dédié aux
infrastructures à clé publiques
### Le Web plus accessible aux authentifications par certificats ### Le Web plus accessible aux authentifications par certificats
@ -94,13 +129,13 @@ Aujourd'hui, l'un des principaux défauts de l'authentification par certificats,
c'est qu'elle n'est pas déployée largement : seul un petit nombre de services c'est qu'elle n'est pas déployée largement : seul un petit nombre de services
l'utilisent. l'utilisent.
Cependant, supporté par le constat que les mots de passe perdent Cependant, supporté par le constat que les mots de passe perdent en efficacité,
en efficacité, le standard WebAuthn (pour Web Authentication) a récemment été le standard WebAuthn - pour *Web Authentication* - a récemment été créé et
créé et publiée par le W3C. Ce standard définit une API destinée aux publiée par le W3C. Ce standard définit une API destinée aux navigateurs, aux
navigateurs, aux applications web et aux autres plateformes nécessitant une applications web et aux autres plateformes nécessitant une authentification
authentification forte basée sur clés publiques. forte basée sur clés publiques.
Les grands du Web ont déjà ont déjà mit en place le support de WebAuthn sur Les grands du Web ont déjà mis en place le support de WebAuthn sur
leurs outils : Windows 10, Android, Google Chrome, Mozilla Firefox, leurs outils : Windows 10, Android, Google Chrome, Mozilla Firefox,
Microsoft Edge et Safari. L'apparition de ce standard va sans aucun doute Microsoft Edge et Safari. L'apparition de ce standard va sans aucun doute
encourager une adoption plus large de ce type d'authentification. encourager une adoption plus large de ce type d'authentification.
@ -109,10 +144,10 @@ encourager une adoption plus large de ce type d'authentification.
### Attaques par canal auxiliaire ### Attaques par canal auxiliaire
Les attaques par canal auxiliaire regroupe les attaques qui tentent d'exploiter Les attaques par canal auxiliaire regroupent les attaques qui tentent d'exploiter
des failles sur l'implémentation des procédures de sécurité plutôt que sur les des failles sur l'implémentation des procédures de sécurité plutôt que sur les
procédures elles-mêmes. Voici une liste de types d'attaques par canal procédures elles-mêmes. Voici une liste de types d'attaques par canal
auxiliaire sur lesquels on va s'attarder car elles touchent les smartcard : auxiliaire sur lesquels on va s'attarder car elles touchent les smartcards :
#### Attaque par sondage #### Attaque par sondage
@ -126,7 +161,7 @@ détérioration de la puce, etc.
#### Analyse de consommation #### Analyse de consommation
En fonction des opérations résolues par un processeur, sa consommation en En fonction des opérations résolues par un processeur, sa consommation en
énergie diffère. En étudiant les variations d'énergie utilisée par un lecteur de énergie diffère. En étudiant les variations d'énergie utilisées par un lecteur de
cartes, il est possible de trouver des indices sur la clé privée, sur un cartes, il est possible de trouver des indices sur la clé privée, sur un
échantillon suffisant. Aujourd'hui, cette attaque peut être aisément échantillon suffisant. Aujourd'hui, cette attaque peut être aisément
contrecarrée en apposant du bruit sur le circuit ou en le blindant. contrecarrée en apposant du bruit sur le circuit ou en le blindant.
@ -134,7 +169,7 @@ contrecarrée en apposant du bruit sur le circuit ou en le blindant.
#### Analyse d'émanations électromagnétiques #### Analyse d'émanations électromagnétiques
Semblable à l'Analyse de consommation, à ceci prêt qu'on ne s'attache pas, cette Semblable à l'Analyse de consommation, à ceci prêt qu'on ne s'attache pas, cette
fois ci à, l'énergie consommée mais au rayonnement électromagnétique émis par un fois ci à l'énergie consommée mais au rayonnement électromagnétique émis par un
appareil. A l'instar de la consommation en énergie, le rayonnement n'est pas appareil. A l'instar de la consommation en énergie, le rayonnement n'est pas
le même en fonction des opérations exécutées par le terminal. L'étude du le même en fonction des opérations exécutées par le terminal. L'étude du
rayonnement thermique peut s'apparenter à une analyse d'émanations rayonnement thermique peut s'apparenter à une analyse d'émanations
@ -156,18 +191,18 @@ efficacité.
### Attaques sur les PKI ### Attaques sur les PKI
Même si elle ne touchent pas directement les smartcard, Il est intéressant de Même si elle ne touchent pas directement les smartcards, Il est intéressant de
parler des attaque sur les infrastructures à clé publiques. parler des attaques sur les infrastructures à clé publique.
#### Collision MD5 #### Collision MD5
Le MD5 (pour Message Digest 5) est un algorithme de hachage cryptographique Le MD5 pour *Message Digest 5* est un algorithme de hachage cryptographique
permettant d'obtenir l'empreinte d'un fichier / d'une chaine de caractères. Elle permettant d'obtenir l'empreinte d'un fichier / d'une chaine de caractères. Elle
a été inventée par Ronald Rivets en 1991 pour succéder à MD4. a été inventée par **Ronald Rivets** en 1991 pour succéder à MD4.
Il doit être considéré comme obsolète depuis 1996, années de découverte d'une Il doit être considéré comme obsolète depuis 1996, année de découverte d'une
faille dans l'algorithme ouvrant la voie à des collisions. En 2004 une équipe de faille dans l'algorithme ouvrant la voie à des collisions. En 2004 une équipe de
chercheurs chinois menés par la mathématicienne Wang Xiaoyun [démontre la chercheurs chinois menée par la mathématicienne Wang Xiaoyun [démontre la
faisabilité][l_md5_2005] d'une collision complète. Mais cette attaque n'est pas faisabilité][l_md5_2005] d'une collision complète. Mais cette attaque n'est pas
encore suffisamment sophistiquée pour être utilisée sur un cas concret. Wang, encore suffisamment sophistiquée pour être utilisée sur un cas concret. Wang,
Lenstra et de Wegner feront la [démonstration de leur attaque][l_md5_2006] sur Lenstra et de Wegner feront la [démonstration de leur attaque][l_md5_2006] sur
@ -179,32 +214,35 @@ deux certificats X.509 différents ayant la même signature MD5 en 2006.
##### Attaque par collision ##### Attaque par collision
Une attaque par collision est menée sur une fonction de hashage cryptographique Une attaque par collision est menée sur une fonction de hashage cryptographique
afin trouver deux entrées différentes donnant lieux au même résultat. Comme la afin trouver **deux entrées différentes donnant lieux au même résultat**. Comme
plupart des fonctions de signature électronique le font sur le hash d'un la plupart des fonctions de signature électronique se font sur le *condensat*
document plutôt que sur le document lui-même. Ainsi s'il est possible de d'un document plutôt que sur le document lui-même. Ainsi s'il est possible de
produire deux documents avec le même hash, leurs signatures sera strictement produire deux documents avec le même *condensat*[^n_hash], leurs signatures
la même. Il suffit alors d'envoyer à l'autorité de certification le document seront strictement identiques. Il suffit alors d'envoyer à l'autorité de
légitime et copier la signature obtenue sur le document frauduleux. certification le document légitime et **copier la signature obtenue sur le
document frauduleux**.
[^n_hash]:Le mot français pour *hash*
##### Attaque par collision avec préfixe choisi ##### Attaque par collision avec préfixe choisi
Dans le cadre de certificats, les choses se compliquent un peu : c'est Dans le cadre de certificats, les choses se compliquent un peu : c'est
l'autorité de certification qui génère le certificat en fonction des **l'autorité de certification qui génère le certificat** en fonction des
informations contenues dans le CSR. L'attaquant doit alors manipuler les données informations contenues dans le CSR. L'attaquant doit alors manipuler les données
contenues dans le CSR qu'il envoie et y intégrer des blocs de collision pour contenues dans le CSR qu'il envoie et y intégrer des blocs de collision pour
annuler les différences entre les hashes du certificats obtenu et celui forgé. annuler les différences entre les hashes du certificat obtenu et celui forgé.
Il va jouer sur le préfixe du CSR, d'où le nom de l'attaque. Il va jouer sur le préfixe du CSR, d'où le nom de l'attaque.
Ce type d'attaque n'est cependant pas aisé, l'attaquant devra anticiper Ce type d'attaque n'est cependant pas aisé, l'attaquant devra anticiper
certaines informations qui seront intégrées dans le certificat produit par certaines informations qui seront intégrées dans le certificat produit par
l'autorité. Certaines pourront être influencées comme le champ CN, d'autres l'autorité. Certaines pourront être influencées comme le champ CN, d'autres
récupérées sur d'autre certificats signés par la même autorité (le contenu des récupérées sur d'autres certificats signés par la même autorité (le contenu des
champs *issuer* par exemple) et enfin d'autres devront être champs *issuer* par exemple) et enfin d'autres devront être
"devinées" [^n_devinees] - numéro de série du certificat et date d'expiration - "devinées" [^n_devinees] - numéro de série du certificat et date d'expiration -
[Une telle attaque a été démontrée][l_md5_2008] en décembre 2008 par une équipe [Une telle attaque a été démontrée][l_md5_2008] en décembre 2008 par une équipe
de chercheurs menée par Sotirov et Stevens. Ils ont ainsi pu obtenir un de chercheurs menée par Sotirov et Stevens. Ils ont ainsi pu obtenir un
certificat à même de signer n'importe quel autres certificats et reconnu par les certificat à même de signer n'importe quels autres certificats et reconnu par les
principaux navigateurs de l'époque. principaux navigateurs de l'époque.
Une technique similaire a été utilisée par le malware *Flame* découvert en 2012. Une technique similaire a été utilisée par le malware *Flame* découvert en 2012.
@ -212,30 +250,153 @@ Il usurpait une signature de code Microsoft pour se propager au travers de
Windows Update. Windows Update.
[l_md5_2008]:https://www.win.tue.nl/hashclash/rogue-ca/ [l_md5_2008]:https://www.win.tue.nl/hashclash/rogue-ca/
[^n_devinees]:Prédites serait plus adapté, dans l'attaque menée par Sotirov et [^n_devinees]:Prédites serait plus adapté, dans l'attaque menée par Sotirov et
Stevens, l'équipe de chercheurs a réussi prédire ces deux éléments en étudiant le Stevens, l'équipe de chercheurs a réussi à prédire ces deux éléments en étudiant le
fonctionnement de l'autorité de certification utilisée. fonctionnement de l'autorité de certification utilisée.
### Attaque par oracle de padding ### Attaque par oracle de padding
Ce type d'attaque a été mené avec succès sur différents périphériques Ce type d'attaque a été mené avec succès sur différents périphériques
cryptographiques par un équipe de recherche internationale. Leurs travaux a cryptographiques par une équipe de recherche internationale. Leurs travaux a
donne lieu ã une publication en avril 2012. donné lieu à une publication en avril 2012.
Ils on pu ainsi extraire les clefs privées de la plupart des périphériques Ils on ainsi pu extraire les clefs privées de la plupart des périphériques
disponibles sur le marché quel que soit leurs marques. disponibles sur le marché quels que soient leurs marques.
#### fonctionnement de cette attaque. La première démonstration pratique de cette attaque a été faite par Daniel
Bleichenbacher alors chercheur en cryptographie chez *Bell Laboratories*
##### Fonctionnement du chiffrement par bloc #### Comment fonctionne t-elle?
Avant de rentrer plus en détail dans le fonctionnement de l'attaque par oracle ##### Le chiffrement par bloc
Avant de rentrer plus en détails dans le fonctionnement de l'attaque par oracle
de padding, il est nécessaire d'expliquer le fonctionnement du chiffrement par de padding, il est nécessaire d'expliquer le fonctionnement du chiffrement par
bloc. Il exxiste une multitude de chiffrement par bloc, nous resterons sur le bloc. Il existe une multitude de chiffrement par bloc, nous resterons sur le
mode CBC *Cipher Block Chaining*. mode CBC *Cipher Block Chaining*.
<schema> ![Fonctionnement du chiffrement par bloc en mode CBC](./files/CBC.svg)
Pour éviter l'apparition de motifs dans le bloc chiffré qui pourrait faciliter
la création de "dictionnaire de code", le mode *CBC* utilise le précédent bloc
chiffré pour réaliser une opération booléenne avec le bloc actuel en clair avant
de le chiffrer. Pour le premier bloc à envoyer, *CBC* utilise un vecteur
d'initialisation.
Contrairement au chiffrement de flux, le chiffrement par bloc nécessite une
taille de donnée définie en entrée. Si les données sont trop importantes, il
faut les découper, si elle sont plus petites on utilisera alors la technique du
padding.
$$
cleartext[n] = decrypt(cblock[n]) \oplus cblock[n-1]
$$
##### Le padding
![Fonctionnement du padding](./files/pagging.svg)
Dans notre exemple, notre bloc doit faire 128 bits mais les données ne
représente que 104 bits [1]. Nous allons donc rajouter trois octets avec pour
valeur hexadécimale `0x03` qui représente le nombre d'octets manquant [2].
##### L'attaque par oracle de padding
Une **oracle de padding** est un mechanisme prenant un bloc chiffré en entrée,
le déchiffre et avertit l'utilisateur si le padding est correct ou non.
Le chiffrement par bloc en mode *CBC* a un énorme défaut : l'intégrité des
messages n'est pas vérifiée. Du coup un attaquant peut modifier le résultat
de `cleartext[n]` en modifiant `cblock[n-1]`, ou tout simplement en le
forgeant à notre convenance.
Prenons `X` comme bloc de chiffrement forgé pour l'occasion, et `cblock[n]`
bloc de chiffrement à attaquer, nous pouvons écrire :
$$
cleartexthack[n] = decrypt(cblock[n]) \oplus X
$$
Nous savons aussi que :
$$
cblock[a] = encrypt(cleartextr[n] \oplus cblock[n-1])
$$
Donc on peut écrire :
$$
cleartexthack = decrypt(encrypt(txt_clair[n] \oplus cblock[n-1])) \oplus X
$$
En simplifiant :
$$
cleartext = cleartext[a] \oplus cblock[n-1] \oplus X
$$
Cette équation se compose de deux éléments que nous avons en notre possession :
`X` notre bloc forgé et `cblock[n-1]` notre avant-dernier bloc, et deux
éléments inconnus : `cleartexthack` le résultat en clair de la manipulation de
notre attaque et `cleartext[n]` le résultat du déchiffrement de `cblock[n]`.
Il n'est plus question ici de chiffrement, mais de simples opérations
booléennes.
Comme nous avons accès à une **oracle de padding** nous n'avons qu'à tester
toutes les valeurs du dernier octet de `X` jusqu'à obtenir un padding correct
(`0x01`). Dans le cadre de notre block de 16 octets :
$$
0x01 = cleartext[n][15] \oplus cblock[n-1][15] \oplus X[15]
$$
Il ne nous reste plus qu'une inconnue `cleartext[15]`, nous pouvons résoudre
l'équation.
Il suffit de procéder ainsi pour les 16 octets de notre bloc pour le déchiffrer
en entier et ainsi de suite...
##### Et son utilisation contre les smartcard
C'est bien entendu une version simplifiée de l'attaque par padding oracle, mais
elle permet de comprendre son fonctionnement. Elle fut au centre des travaux de
recherche menés par Romain Bardou, Riccardo Focardi, Yusuke Kawamoto, Lorenzo
Simionato, Graham Steel, et al. donnant lieu à une publication. Ces travaux
permirent, en 2012, **l'extraction des clés privées** de beaucoup de
périphériques de cryptographie (PKCS#11) de marques différentes. Les chercheurs
ont par ailleurs largement améliorer les algorithmes de Bleichenbacher pour
accélérer sensiblement les performances, surtout sur les appareils peu puissant
comme les smartcards.
## Conclusion
L'authentification par smartcards liée à une PKI est intéressante à bien des
égard, réservée jusque là au monde de l'entreprise de par la complexité de
l'infrastructure à déployer. Mais l'apparition de périphériques comme les
*Yubikey* et la nécessité de pallier aux problèmes des mots de passes pousse les
entreprises touchant le grand public à trouver des solutions; *WebAuth* en est
la preuve (mais sans la partie PKI).
Il est cependant utopique de penser que les smartcards résolvent tous les
problèmes, bien au contraire. Nous avons vu qu'il est possible d'attaquer
directement l'infrastructure de clés[^n_infra]. Mais il est est aussi possible
d'attaquer le périphérique lui même: n'oublions pas que celui-ci est complexe,
équipé de plusieurs processeurs et d'un système d'exploitation, agrandissant la
surface d'attaque[^n_yubikey].
N'oublions pas aussi qu'un périphérique se vole; et si la plupart des smartcards
sont résistante à l'ouverture par la force, une attaque ciblée couplée à de
l'ingénierie sociale bien menée pour retrouver le code PIN reste possible.
[^n_infra]:Google a publié le 23 février 2017 un article annonçant la première
collision sur du SHA1. https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html)
[^n_yubikey]:La Yubikey 4, et d'autre périphériques cryptographiques sont
touchés par ROCAT, une faille touchant des librairies utilisées par des puces
de la marque Infineon Technologies AG et permettant de prédire la clé privée
grâce à la clé publique - CVE-2017-15361. https://crocs.fi.muni.cz/public/papers/rsa_ccs17
## Bibliographie ## Bibliographie