From 870521e698f42a626844e2f5cbeab37a3eeeab4a Mon Sep 17 00:00:00 2001 From: jaseg Date: Thu, 8 Apr 2021 14:06:57 +0200 Subject: Repo re-org: move doc/paper to top level --- doc/paper/.gitignore | 10 - doc/paper/CC-by.eps | 2727 -------------------- doc/paper/CC-by.pdf | Bin 4153 -> 0 bytes doc/paper/Makefile | 35 - doc/paper/circuits.ipynb | 1115 -------- doc/paper/concept_vis_one_axis.pdf | Bin 6623 -> 0 bytes doc/paper/concept_vis_one_axis.svg | 344 --- doc/paper/goette_inertial_hsms_v1_5_eprint.pdf | Bin 112344 -> 0 bytes doc/paper/iacrtrans.cls | 448 ---- doc/paper/ihsm_shaft_countermeasures_a.pdf | Bin 1486 -> 0 bytes doc/paper/ihsm_shaft_countermeasures_a.svg | 160 -- doc/paper/ihsm_shaft_countermeasures_b.pdf | Bin 1597 -> 0 bytes doc/paper/ihsm_shaft_countermeasures_b.svg | 174 -- doc/paper/ihsm_shaft_countermeasures_c.pdf | Bin 1806 -> 0 bytes doc/paper/ihsm_shaft_countermeasures_c.svg | 246 -- doc/paper/ir_tx_schema.pdf | Bin 4112 -> 0 bytes doc/paper/ir_tx_schema.svg | 340 --- doc/paper/mesh_gen_viz.pdf | Bin 6880 -> 0 bytes doc/paper/mesh_gen_viz.svg | 1547 ----------- doc/paper/mesh_scan_crop.jpg | Bin 400578 -> 0 bytes doc/paper/photolink_schematic.pdf | Bin 15968 -> 0 bytes doc/paper/photolink_schematic.pro | 43 - doc/paper/photolink_schematic.sch | 486 ---- doc/paper/photolink_schematic.svg | 3246 ------------------------ doc/paper/proto_3d_design.jpg | Bin 63447 -> 0 bytes doc/paper/prototype_early_comms_small.jpg | Bin 518517 -> 0 bytes doc/paper/prototype_pic.jpg | Bin 1391843 -> 0 bytes doc/paper/prototype_pic2.jpg | Bin 1466004 -> 0 bytes doc/paper/rotohsm.bib | 249 -- doc/paper/rotohsm_paper.pdf | Bin 3564423 -> 0 bytes doc/paper/rotohsm_paper.tex | 742 ------ doc/paper/rotohsm_tech_report.pdf | Bin 112288 -> 0 bytes doc/paper/rotohsm_tech_report.tex | 300 --- doc/paper/rotor_stator.jpg | Bin 1031734 -> 0 bytes paper/.gitignore | 10 + paper/CC-by.eps | 2727 ++++++++++++++++++++ paper/CC-by.pdf | Bin 0 -> 4153 bytes paper/Makefile | 35 + paper/circuits.ipynb | 1115 ++++++++ paper/concept_vis_one_axis.pdf | Bin 0 -> 6623 bytes paper/concept_vis_one_axis.svg | 344 +++ paper/goette_inertial_hsms_v1_5_eprint.pdf | Bin 0 -> 112344 bytes paper/iacrtrans.cls | 448 ++++ paper/ihsm_shaft_countermeasures_a.pdf | Bin 0 -> 1486 bytes paper/ihsm_shaft_countermeasures_a.svg | 160 ++ paper/ihsm_shaft_countermeasures_b.pdf | Bin 0 -> 1597 bytes paper/ihsm_shaft_countermeasures_b.svg | 174 ++ paper/ihsm_shaft_countermeasures_c.pdf | Bin 0 -> 1806 bytes paper/ihsm_shaft_countermeasures_c.svg | 246 ++ paper/ir_tx_schema.pdf | Bin 0 -> 4112 bytes paper/ir_tx_schema.svg | 340 +++ paper/mesh_gen_viz.pdf | Bin 0 -> 6880 bytes paper/mesh_gen_viz.svg | 1547 +++++++++++ paper/mesh_scan_crop.jpg | Bin 0 -> 400578 bytes paper/photolink_schematic.pdf | Bin 0 -> 15968 bytes paper/photolink_schematic.pro | 43 + paper/photolink_schematic.sch | 486 ++++ paper/photolink_schematic.svg | 3246 ++++++++++++++++++++++++ paper/proto_3d_design.jpg | Bin 0 -> 63447 bytes paper/prototype_early_comms_small.jpg | Bin 0 -> 518517 bytes paper/prototype_pic.jpg | Bin 0 -> 1391843 bytes paper/prototype_pic2.jpg | Bin 0 -> 1466004 bytes paper/rotohsm.bib | 249 ++ paper/rotohsm_paper.pdf | Bin 0 -> 3564423 bytes paper/rotohsm_paper.tex | 742 ++++++ paper/rotohsm_tech_report.pdf | Bin 0 -> 112288 bytes paper/rotohsm_tech_report.tex | 300 +++ paper/rotor_stator.jpg | Bin 0 -> 1031734 bytes 68 files changed, 12212 insertions(+), 12212 deletions(-) delete mode 100644 doc/paper/.gitignore delete mode 100755 doc/paper/CC-by.eps delete mode 100755 doc/paper/CC-by.pdf delete mode 100644 doc/paper/Makefile delete mode 100644 doc/paper/circuits.ipynb delete mode 100644 doc/paper/concept_vis_one_axis.pdf delete mode 100644 doc/paper/concept_vis_one_axis.svg delete mode 100755 doc/paper/goette_inertial_hsms_v1_5_eprint.pdf delete mode 100755 doc/paper/iacrtrans.cls delete mode 100755 doc/paper/ihsm_shaft_countermeasures_a.pdf delete mode 100755 doc/paper/ihsm_shaft_countermeasures_a.svg delete mode 100755 doc/paper/ihsm_shaft_countermeasures_b.pdf delete mode 100755 doc/paper/ihsm_shaft_countermeasures_b.svg delete mode 100755 doc/paper/ihsm_shaft_countermeasures_c.pdf delete mode 100755 doc/paper/ihsm_shaft_countermeasures_c.svg delete mode 100644 doc/paper/ir_tx_schema.pdf delete mode 100644 doc/paper/ir_tx_schema.svg delete mode 100644 doc/paper/mesh_gen_viz.pdf delete mode 100644 doc/paper/mesh_gen_viz.svg delete mode 100644 doc/paper/mesh_scan_crop.jpg delete mode 100644 doc/paper/photolink_schematic.pdf delete mode 100644 doc/paper/photolink_schematic.pro delete mode 100644 doc/paper/photolink_schematic.sch delete mode 100644 doc/paper/photolink_schematic.svg delete mode 100644 doc/paper/proto_3d_design.jpg delete mode 100644 doc/paper/prototype_early_comms_small.jpg delete mode 100644 doc/paper/prototype_pic.jpg delete mode 100644 doc/paper/prototype_pic2.jpg delete mode 100644 doc/paper/rotohsm.bib delete mode 100644 doc/paper/rotohsm_paper.pdf delete mode 100644 doc/paper/rotohsm_paper.tex delete mode 100644 doc/paper/rotohsm_tech_report.pdf delete mode 100644 doc/paper/rotohsm_tech_report.tex delete mode 100644 doc/paper/rotor_stator.jpg create mode 100644 paper/.gitignore create mode 100755 paper/CC-by.eps create mode 100755 paper/CC-by.pdf create mode 100644 paper/Makefile create mode 100644 paper/circuits.ipynb create mode 100644 paper/concept_vis_one_axis.pdf create mode 100644 paper/concept_vis_one_axis.svg create mode 100755 paper/goette_inertial_hsms_v1_5_eprint.pdf create mode 100755 paper/iacrtrans.cls create mode 100755 paper/ihsm_shaft_countermeasures_a.pdf create mode 100755 paper/ihsm_shaft_countermeasures_a.svg create mode 100755 paper/ihsm_shaft_countermeasures_b.pdf create mode 100755 paper/ihsm_shaft_countermeasures_b.svg create mode 100755 paper/ihsm_shaft_countermeasures_c.pdf create mode 100755 paper/ihsm_shaft_countermeasures_c.svg create mode 100644 paper/ir_tx_schema.pdf create mode 100644 paper/ir_tx_schema.svg create mode 100644 paper/mesh_gen_viz.pdf create mode 100644 paper/mesh_gen_viz.svg create mode 100644 paper/mesh_scan_crop.jpg create mode 100644 paper/photolink_schematic.pdf create mode 100644 paper/photolink_schematic.pro create mode 100644 paper/photolink_schematic.sch create mode 100644 paper/photolink_schematic.svg create mode 100644 paper/proto_3d_design.jpg create mode 100644 paper/prototype_early_comms_small.jpg create mode 100644 paper/prototype_pic.jpg create mode 100644 paper/prototype_pic2.jpg create mode 100644 paper/rotohsm.bib create mode 100644 paper/rotohsm_paper.pdf create mode 100644 paper/rotohsm_paper.tex create mode 100644 paper/rotohsm_tech_report.pdf create mode 100644 paper/rotohsm_tech_report.tex create mode 100644 paper/rotor_stator.jpg diff --git a/doc/paper/.gitignore b/doc/paper/.gitignore deleted file mode 100644 index c49262e..0000000 --- a/doc/paper/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.out -*.bbl -*.aux -*.toc -*.blg -*.bcf -*.log -*.run.xml - -version.tex diff --git a/doc/paper/CC-by.eps b/doc/paper/CC-by.eps deleted file mode 100755 index ae05c8b..0000000 --- a/doc/paper/CC-by.eps +++ /dev/null @@ -1,2727 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (by.eps) %%CreationDate: 3/27/08 4:25 PM %%BoundingBox: 360 291 441 307 %%HiResBoundingBox: 360.4727 291.9463 440.5146 306.9878 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 360.5 292 440.5 307 %AI3_TemplateBox: 400.5 299.5 400.5 299.5 %AI3_TileBox: 112 -56 688 678 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 800 600 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: -381 756 1 1566 923 26 0 0 73 75 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %AI7_Thumbnail: 128 24 8 %%BeginData: 3634 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C4527FD80F82752522752525227FD07522752525227FD075227525252 %27FD5D52F8F8F852FD7CFF52F8F852FFFD087D52F8F8F852A8FD07FF5227 %F8F827FD077DFD58F827FF27F8F852FF7D7D7D83FD047DF8F8F8A8FD0AFF %A852F8F827A87D7D7D837D52FD57F827FF52F8F852FFFD077DF8F8F8A8FD %0DFF52F8F827A77D7D7D837DFD58F8FF52F8F852FF7D837D7D7DA827F8F8 %A8FD0FFF52F8F852A87D7D7DA852FD56F827FF52F8F852FFFD057D52F8F8 %52FD08FFA8FD07FFA8F8F827FD067DFD04F8277D527D525227F8277D5227 %F8F8F8525252FD41F8FF52F8F852FF7D837D837D52F827FD04FF7D52527D %FFFFFF7D27527DFFFFFF52F8F87D7D837DA77D27F8F8F852FD06FF7D27FF %FFA8F8F852FFFF7DFD40F827FF52F8F852FFFD057DF8F852FFFFFF27FD04 %F852A827FD04F827FFFFA8F8F852837D7D7DA82DF8F8F852FFFF52F87DFF %FFF852FFFF52F8A8FF7DFD42F8FF52F8F852FF7D7D7DA77DF8F87DFFFF52 %F8F8A8A827527DF827A8FF2752FFFFFF27F8527D837D7D7D58F8F8F852FF %FF27F87DFFFF27F8A8FFFFA8FFFF27FD41F827FF52F8F852FFFD057DF8F8 %7DFFFF27F87DFD04FF27F852FD07FFF8F82783FD047D52F8F8F827FD06FF %52F8F8F8FD04FF52FD43F8FF27F8F852FF7D837DA858F8F8A8FFFF27F852 %FD04FF52F87DFD07FF27F8527D837D837D7DF8F8F852FFFF7DA8A8FFA827 %F8F827FFFFA8FD43F827FF52F8F852FFFD057DF8F87DFFFF52F827A8FF27 %5252F8F8A8A82727FFFFFFF8F82783FD047D52F8F8F827FFFF27F827FFFF %7DF8F827A8FF52FD44F8FF52F8F852FF7D837D7D7D27F852FFFFA827FD04 %F827FF27FD04F827FFFFA8F8F8587D7D7D837D52F8F8F852FFFF522752FF %FF7DF8F827FFFF7DFD43F827FF52F8F852FFFD057D27F8F8FFFFFFA85227 %527DFFFFFF5227277DFFFFFF7DF8F852FD047D8327F8F8F852FD07FFF8F8 %F827FFFF52FD44F8FF52F8F852FF7D837D837D7DF8F852FD11FFF8F827A8 %7D837DA87D27F8F8F827FD067DFD05F87D7D52FD43F827FF52F8F852FFFD %067D27F8F87DFD0FFF27F8F858FD057D52FD57F8FF52F8F852FF7D7D7D83 %7D8358F8F827A8FD0DFF52F8F8527D7D7D837D7DFD57F827FF52F8F852FF %FD077D52F8F8F87DFD0AFFA827F8F827FD057D8327FD58F8FF27F8F852FF %7D837DA87D837DA85227F8F852A8FD07FF7DF8F8F8277DA87D837DA85827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827FF52 %F8F852FD0CFFA8FFA8FD07FFA8FFA8FD63FF52F8F827FD7C5227FD80F8F8 %%EndData %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) -%%Version: 1.2 0 -%%CreationDate: (04/10/93) () -%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) -userdict /Adobe_level2_AI5 26 dict dup begin - put - /packedarray where not - { - userdict begin - /packedarray - { - array astore readonly - } bind def - /setpacking /pop load def - /currentpacking false def - end - 0 - } if - pop - userdict /defaultpacking currentpacking put true setpacking - /initialize - { - Adobe_level2_AI5 begin - } bind def - /terminate - { - currentdict Adobe_level2_AI5 eq - { - end - } if - } bind def - mark - /setcustomcolor where not - { - /findcmykcustomcolor - { - (AI8_CMYK_CustomColor) - 6 packedarray - } bind def - /findrgbcustomcolor - { - (AI8_RGB_CustomColor) - 5 packedarray - } bind def - /setcustomcolor - { - exch - aload pop dup - (AI8_CMYK_CustomColor) eq - { - pop pop - 4 - { - 4 index mul - 4 1 roll - } repeat - 5 -1 roll pop - setcmykcolor - } - { - dup (AI8_RGB_CustomColor) eq - { - pop pop - 3 - { - 1 exch sub - 3 index mul - 1 exch sub - 3 1 roll - } repeat - 4 -1 roll pop - setrgbcolor - } - { - pop - 4 - { - 4 index mul 4 1 roll - } repeat - 5 -1 roll pop - setcmykcolor - } ifelse - } ifelse - } - def - } if - /setAIseparationgray - { - false setoverprint - 0 setgray - /setseparationgray where{ - pop setseparationgray - }{ - /setcolorspace where{ - pop - [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace - 1 exch sub setcolor - }{ - setgray - }ifelse - }ifelse - } def - - /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def - userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put - userdict /level2? - systemdict /languagelevel known dup - { - pop systemdict /languagelevel get 2 ge - } if - put -/level2ScreenFreq -{ - begin - 60 - HalftoneType 1 eq - { - pop Frequency - } if - HalftoneType 2 eq - { - pop GrayFrequency - } if - HalftoneType 5 eq - { - pop Default level2ScreenFreq - } if - end -} bind def -userdict /currentScreenFreq - level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put -level2? not - { - /setcmykcolor where not - { - /setcmykcolor - { - exch .11 mul add exch .59 mul add exch .3 mul add - 1 exch sub setgray - } def - } if - /currentcmykcolor where not - { - /currentcmykcolor - { - 0 0 0 1 currentgray sub - } def - } if - /setoverprint where not - { - /setoverprint /pop load def - } if - /selectfont where not - { - /selectfont - { - exch findfont exch - dup type /arraytype eq - { - makefont - } - { - scalefont - } ifelse - setfont - } bind def - } if - /cshow where not - { - /cshow - { - [ - 0 0 5 -1 roll aload pop - ] cvx bind forall - } bind def - } if - } if - cleartomark - /anyColor? - { - add add add 0 ne - } bind def - /testColor - { - gsave - setcmykcolor currentcmykcolor - grestore - } bind def - /testCMYKColorThrough - { - testColor anyColor? - } bind def - userdict /composite? - 1 0 0 0 testCMYKColorThrough - 0 1 0 0 testCMYKColorThrough - 0 0 1 0 testCMYKColorThrough - 0 0 0 1 testCMYKColorThrough - and and and - put - composite? not - { - userdict begin - gsave - /cyan? 1 0 0 0 testCMYKColorThrough def - /magenta? 0 1 0 0 testCMYKColorThrough def - /yellow? 0 0 1 0 testCMYKColorThrough def - /black? 0 0 0 1 testCMYKColorThrough def - grestore - /isCMYKSep? cyan? magenta? yellow? black? or or or def - /customColor? isCMYKSep? not def - end - } if - end defaultpacking setpacking -%%EndResource -%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 -userdict /Adobe_ColorImage_AI6 known not -{ - userdict /Adobe_ColorImage_AI6 53 dict put -} if -userdict /Adobe_ColorImage_AI6 get begin -/initialize { - Adobe_ColorImage_AI6 begin - Adobe_ColorImage_AI6 { - dup type /arraytype eq { - dup xcheck { - bind - } if - } if - pop pop - } forall -} def -/terminate { end } def -currentdict /Adobe_ColorImage_AI6_Vars known not { - /Adobe_ColorImage_AI6_Vars 41 dict def -} if -Adobe_ColorImage_AI6_Vars begin - /plateindex -1 def - /_newproc null def - /_proc1 null def - /_proc2 null def - /sourcearray 4 array def - /_ptispace null def - /_ptiname null def - /_pti0 0 def - /_pti1 0 def - /_ptiproc null def - /_ptiscale 0 def - /_pticomps 0 def - /_ptibuf 0 string def - /_gtigray 0 def - /_cticmyk null def - /_rtirgb null def - /XIEnable true def - /XIType 0 def - /XIEncoding 0 def - /XICompression 0 def - /XIChannelCount 0 def - /XIBitsPerPixel 0 def - /XIImageHeight 0 def - /XIImageWidth 0 def - /XIImageMatrix null def - /XIRowBytes 0 def - /XIFile null def - /XIBuffer1 null def - /XIBuffer2 null def - /XIBuffer3 null def - /XIDataProc null def - /XIColorSpace /DeviceGray def - /XIColorValues 0 def - /XIPlateList false def -end -/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def -/ci6image systemdict /image get def -/ci6curtransfer systemdict /currenttransfer get def -/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def -/ci6foureq { - 4 index ne { - pop pop pop false - }{ - 4 index ne { - pop pop false - }{ - 4 index ne { - pop false - }{ - 4 index eq - } ifelse - } ifelse - } ifelse -} def -/ci6testplate { - Adobe_ColorImage_AI6_Vars begin - /plateindex -1 def - /setcmykcolor where { - pop - gsave - 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub - grestore - 1 0 0 0 ci6foureq { - /plateindex 0 def - }{ - 0 1 0 0 ci6foureq { - /plateindex 1 def - }{ - 0 0 1 0 ci6foureq { - /plateindex 2 def - }{ - 0 0 0 1 ci6foureq { - /plateindex 3 def - }{ - 0 0 0 0 ci6foureq { - /plateindex 5 def - } if - } ifelse - } ifelse - } ifelse - } ifelse - pop pop pop pop - } if - plateindex - end -} def -/ci6concatprocs { - /packedarray where { - pop dup type /packedarraytype eq 2 index type - /packedarraytype eq or - }{ - false - } ifelse - { - /_proc2 exch cvlit def - /_proc1 exch cvlit def - _proc1 aload pop - _proc2 aload pop - _proc1 length - _proc2 length add - packedarray cvx - }{ - /_proc2 exch cvlit def - /_proc1 exch cvlit def - /_newproc _proc1 length _proc2 length add array def - _newproc 0 _proc1 putinterval - _newproc _proc1 length _proc2 putinterval - _newproc cvx - } ifelse -} def -/ci6istint { - type /arraytype eq -} def -/ci6isspot { - dup type /arraytype eq { - dup length 1 sub get /Separation eq - }{ - pop false - } ifelse -} def -/ci6spotname { - dup ci6isspot {dup length 2 sub get}{pop ()} ifelse -} def -/ci6altspace { - aload pop pop pop ci6colormake -} def -/ci6numcomps { - dup /DeviceGray eq { - pop 1 - }{ - dup /DeviceRGB eq { - pop 3 - }{ - /DeviceCMYK eq { - 4 - }{ - 1 - } ifelse - } ifelse - } ifelse -} def -/ci6marksplate { - dup /DeviceGray eq { - pop plateindex 3 eq - }{ - dup /DeviceRGB eq { - pop plateindex 5 ne - }{ - dup /DeviceCMYK eq { - pop plateindex 5 ne - }{ - dup ci6isspot { - /findcmykcustomcolor where { - pop - dup length 2 sub get - 0.1 0.1 0.1 0.1 5 -1 roll - findcmykcustomcolor 1 setcustomcolor - systemdict /currentgray get exec - 1 ne - }{ - pop plateindex 5 ne - } ifelse - }{ - pop plateindex 5 ne - } ifelse - } ifelse - } ifelse - } ifelse -} def -/ci6colormake { - dup ci6numcomps - exch 1 index 2 add 1 roll - dup 1 eq {pop}{array astore} ifelse - exch -} def -/ci6colorexpand { - dup ci6spotname exch - dup ci6istint { - ci6altspace - exch 4 1 roll - }{ - 1 3 1 roll - } ifelse -} def -/ci6colortint { - dup /DeviceGray eq { - 3 1 roll 1 exch sub mul 1 exch sub exch - }{ - dup /DeviceRGB eq { - 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch - }{ - dup /DeviceCMYK eq { - 3 1 roll {1 index mul exch} forall pop 4 array astore exch - }{ - 3 1 roll mul exch - } ifelse - } ifelse - } ifelse -} def -/ci6colortocmyk { - dup /DeviceGray eq { - pop 1 exch sub 0 0 0 4 -1 roll 4 array astore - }{ - dup /DeviceRGB eq { - pop aload pop _rgbtocmyk 4 array astore - }{ - dup /DeviceCMYK eq { - pop - }{ - ci6altspace ci6colortint ci6colortocmyk - } ifelse - } ifelse - } ifelse -} def -/ci6makeimagedict { - 7 dict begin - /ImageType 1 def - /Decode exch def - /DataSource exch def - /ImageMatrix exch def - /BitsPerComponent exch def - /Height exch def - /Width exch def - currentdict end -} def -/ci6stringinvert { - 0 1 2 index length 1 sub { - dup 2 index exch get 255 exch sub 2 index 3 1 roll put - } for -} def -/ci6stringknockout { - 0 1 2 index length 1 sub { - 255 2 index 3 1 roll put - } for -} def -/ci6stringapply { - 0 1 4 index length 1 sub { - dup - 4 index exch get - 3 index 3 1 roll - 3 index exec - } for - pop exch pop -} def -/ci6walkrgbstring { - 0 3 index - dup length 1 sub 0 3 3 -1 roll { - 3 getinterval {} forall - 5 index exec - 3 index - } for - - 5 {pop} repeat -} def -/ci6walkcmykstring -{ - 0 3 index - dup length 1 sub 0 4 3 -1 roll { - 4 getinterval {} forall - - 6 index exec - - 3 index - - } for - - 5 { pop } repeat - -} def -/ci6putrgbtograystr -{ - .11 mul exch - - .59 mul add exch - - .3 mul add - - cvi 3 copy put - - pop 1 add -} def -/ci6putcmyktograystr -{ - exch .11 mul add - - exch .59 mul add - - exch .3 mul add - - dup 255 gt { pop 255 } if - - 255 exch sub cvi 3 copy put - - pop 1 add -} def -/ci6rgbtograyproc { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - XIBuffer3 - dup 3 1 roll - - /ci6putrgbtograystr load exch - ci6walkrgbstring - end -} def -/ci6cmyktograyproc { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - XIBuffer3 - dup 3 1 roll - - /ci6putcmyktograystr load exch - ci6walkcmykstring - end -} def -/ci6separatecmykproc { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - - XIBuffer3 - - 0 2 index - - plateindex 4 2 index length 1 sub { - get 255 exch sub - - 3 copy put pop 1 add - - 2 index - } for - pop pop exch pop - end -} def - -/ci6compositeimage { - dup 1 eq { - pop pop image - }{ - /ci6colorimage load null ne { - ci6colorimage - }{ - 3 1 roll pop - sourcearray 0 3 -1 roll put - 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load - image - } ifelse - } ifelse -} def -/ci6knockoutimage { - gsave - 0 ci6curtransfer exec 1 ci6curtransfer exec - eq { - 0 ci6curtransfer exec 0.5 lt - }{ - 0 ci6curtransfer exec 1 ci6curtransfer exec gt - } ifelse - {{pop 0}}{{pop 1}} ifelse - systemdict /settransfer get exec - ci6compositeimage - grestore -} def -/ci6drawimage { - ci6testplate -1 eq { - pop ci6compositeimage - }{ - dup type /arraytype eq { - dup length plateindex gt {plateindex get}{pop false} ifelse - }{ - { - true - }{ - dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse - } ifelse - } ifelse - { - dup 1 eq { - pop pop ci6image - }{ - dup 3 eq { - ci6compositeimage - }{ - pop pop - sourcearray 0 3 -1 roll put - /ci6separatecmykproc load - ci6image - } ifelse - } ifelse - }{ - ci6curoverprint { - 7 {pop} repeat - }{ - ci6knockoutimage - } ifelse - } ifelse - } ifelse -} def -/ci6proctintimage { - /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store - /_pticomps _ptispace ci6numcomps store - /_ptiscale _pti1 _pti0 sub store - level2? { - _ptiname length 0 gt version cvr 2012 ge and { - [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace - [_pti0 _pti1] ci6makeimagedict ci6image - }{ - [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace - [0 255] ci6makeimagedict ci6image - } ifelse - }{ - _pticomps 1 eq { - { - dup - { - 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put - } ci6stringapply - } ci6concatprocs ci6image - }{ - { - dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse - _ptibuf { - exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc - _pticomps 2 add -2 roll - _pticomps 1 sub -1 0 { - 1 index add 2 index exch - 5 -1 roll - 255 mul cvi put - } for - pop pop - } ci6stringapply - } ci6concatprocs false _pticomps - /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse - } ifelse - } ifelse -} def -/ci6graytintimage { - /_gtigray 5 -1 roll store - {1 _gtigray sub mul 1 exch sub} 4 1 roll - /DeviceGray ci6proctintimage -} def -/ci6cmyktintimage { - /_cticmyk 5 -1 roll store - {_cticmyk {1 index mul exch} forall pop} 4 1 roll - /DeviceCMYK ci6proctintimage -} def -/ci6rgbtintimage { - /_rtirgb 5 -1 roll store - {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll - /DeviceRGB ci6proctintimage -} def -/ci6tintimage { - ci6testplate -1 eq { - ci6colorexpand - 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll - dup /DeviceGray eq { - pop ci6graytintimage - }{ - dup /DeviceRGB eq { - pop ci6rgbtintimage - }{ - pop ci6cmyktintimage - } ifelse - } ifelse - }{ - dup ci6marksplate { - plateindex 5 lt { - ci6colortocmyk plateindex get - dup 0 eq ci6curoverprint and { - 7 {pop} repeat - }{ - 1 exch sub - exch {1 0}{0 1} ifelse () ci6graytintimage - } ifelse - }{ - pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage - } ifelse - }{ - ci6curoverprint { - 8 {pop} repeat - }{ - pop pop pop - {pop 1} 0 1 () /DeviceGray ci6proctintimage - } ifelse - } ifelse - } ifelse -} def -/XINullImage { -} def -/XIImageMask { - XIImageWidth XIImageHeight false - [XIImageWidth 0 0 XIImageHeight neg 0 0] - /XIDataProc load - imagemask -} def -/XIImageTint { - XIImageWidth XIImageHeight XIBitsPerPixel - [XIImageWidth 0 0 XIImageHeight neg 0 0] - /XIDataProc load - XIType 3 eq XIColorValues XIColorSpace ci6tintimage -} def -/XIImage { - XIImageWidth XIImageHeight XIBitsPerPixel - [XIImageWidth 0 0 XIImageHeight neg 0 0] - /XIDataProc load - false XIChannelCount XIPlateList ci6drawimage -} def -/XG { - pop pop -} def -/XF { - 13 {pop} repeat -} def -/Xh { - Adobe_ColorImage_AI6_Vars begin - gsave - /XIType exch def - /XIImageHeight exch def - /XIImageWidth exch def - /XIImageMatrix exch def - 0 0 moveto - XIImageMatrix concat - XIImageWidth XIImageHeight scale - - /_lp /null ddef - _fc - /_lp /imagemask ddef - end -} def -/XH { - Adobe_ColorImage_AI6_Vars begin - grestore - end -} def -/XIEnable { - Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put -} def -/XC { - Adobe_ColorImage_AI6_Vars begin - ci6colormake - /XIColorSpace exch def - /XIColorValues exch def - end -} def -/XIPlates { - Adobe_ColorImage_AI6_Vars begin - /XIPlateList exch def - end -} def -/XI -{ - Adobe_ColorImage_AI6_Vars begin - gsave - /XIType exch def - cvi dup - 256 idiv /XICompression exch store - 256 mod /XIEncoding exch store - pop pop - /XIChannelCount exch def - /XIBitsPerPixel exch def - /XIImageHeight exch def - /XIImageWidth exch def - pop pop pop pop - /XIImageMatrix exch def - XIBitsPerPixel 1 eq { - XIImageWidth 8 div ceiling cvi - }{ - XIImageWidth XIChannelCount mul - } ifelse - /XIRowBytes exch def - XIEnable { - /XIBuffer3 XIImageWidth string def - XICompression 0 eq { - /XIBuffer1 XIRowBytes string def - XIEncoding 0 eq { - {currentfile XIBuffer1 readhexstring pop} - }{ - {currentfile XIBuffer1 readstring pop} - } ifelse - }{ - /XIBuffer1 256 string def - /XIBuffer2 XIRowBytes string def - {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} - /ASCII85Decode filter /DCTDecode filter - /XIFile exch def - {XIFile XIBuffer2 readstring pop} - } ifelse - /XIDataProc exch def - - XIType 1 ne { - 0 setgray - } if - XIType 1 eq { - XIImageMask - }{ - XIType 2 eq XIType 3 eq or { - XIImageTint - }{ - XIImage - } ifelse - } ifelse - }{ - XINullImage - } ifelse - /XIPlateList false def - grestore - end -} def -end -%%EndProcSet -%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 -%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) -%%Version: 1.3 0 -%%CreationDate: (3/7/1994) () -%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin -put -/_?cmyk false def -/_eo false def -/_lp /none def -/_pf -{ -} def -/_ps -{ -} def -/_psf -{ -} def -/_pss -{ -} def -/_pjsf -{ -} def -/_pjss -{ -} def -/_pola 0 def -/_doClip 0 def -/cf currentflat def -/_lineorientation 0 def -/_charorientation 0 def -/_yokoorientation 0 def -/_tm matrix def -/_renderStart -[ -/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 -] def -/_renderEnd -[ -null null null null /i1 /i1 /i1 /i1 -] def -/_render -1 def -/_shift [0 0] def -/_ax 0 def -/_ay 0 def -/_cx 0 def -/_cy 0 def -/_leading -[ -0 0 -] def -/_ctm matrix def -/_mtx matrix def -/_sp 16#020 def -/_hyphen (-) def -/_fontSize 0 def -/_fontAscent 0 def -/_fontDescent 0 def -/_fontHeight 0 def -/_fontRotateAdjust 0 def -/Ss 256 string def -Ss 0 (fonts/) putinterval -/_cnt 0 def -/_scale [1 1] def -/_nativeEncoding 0 def -/_useNativeEncoding 0 def -/_tempEncode 0 def -/_pntr 0 def -/_tDict 2 dict def -/_hfname 100 string def -/_hffound false def -/Tx -{ -} def -/Tj -{ -} def -/CRender -{ -} def -/_AI3_savepage -{ -} def -/_gf null def -/_cf 4 array def -/_rgbf 3 array def -/_if null def -/_of false def -/_fc -{ -} def -/_gs null def -/_cs 4 array def -/_rgbs 3 array def -/_is null def -/_os false def -/_sc -{ -} def -/_pd 1 dict def -/_ed 15 dict def -/_pm matrix def -/_fm null def -/_fd null def -/_fdd null def -/_sm null def -/_sd null def -/_sdd null def -/_i null def -/_lobyte 0 def -/_hibyte 0 def -/_cproc null def -/_cscript 0 def -/_hvax 0 def -/_hvay 0 def -/_hvwb 0 def -/_hvcx 0 def -/_hvcy 0 def -/_bitfont null def -/_bitlobyte 0 def -/_bithibyte 0 def -/_bitkey null def -/_bitdata null def -/_bitindex 0 def -/discardSave null def -/buffer 256 string def -/beginString null def -/endString null def -/endStringLength null def -/layerCnt 1 def -/layerCount 1 def -/perCent (%) 0 get def -/perCentSeen? false def -/newBuff null def -/newBuffButFirst null def -/newBuffLast null def -/clipForward? false def -end -userdict /Adobe_Illustrator_AI5 known not { - userdict /Adobe_Illustrator_AI5 100 dict put -} if -userdict /Adobe_Illustrator_AI5 get begin -/initialize -{ - Adobe_Illustrator_AI5 dup begin - Adobe_Illustrator_AI5_vars begin - /_aicmykps where {pop /_?cmyk _aicmykps def}if - discardDict - { - bind pop pop - } forall - dup /nc get begin - { - dup xcheck 1 index type /operatortype ne and - { - bind - } if - pop pop - } forall - end - newpath -} def -/terminate -{ - end - end -} def -/_ -null def -/ddef -{ - Adobe_Illustrator_AI5_vars 3 1 roll put -} def -/xput -{ - dup load dup length exch maxlength eq - { - dup dup load dup - length 2 mul dict copy def - } if - load begin - def - end -} def -/npop -{ - { - pop - } repeat -} def -/hswj -{ - dup stringwidth 3 2 roll - { - _hvwb eq { exch _hvcx add exch _hvcy add } if - exch _hvax add exch _hvay add - } cforall -} def -/vswj -{ - 0 0 3 -1 roll - { - dup 255 le - _charorientation 1 eq - and - { - dup cstring stringwidth 5 2 roll - _hvwb eq { exch _hvcy sub exch _hvcx sub } if - exch _hvay sub exch _hvax sub - 4 -1 roll sub exch - 3 -1 roll sub exch - } - { - _hvwb eq { exch _hvcy sub exch _hvcx sub } if - exch _hvay sub exch _hvax sub - _fontHeight sub - } ifelse - } cforall -} def -/swj -{ - 6 1 roll - /_hvay exch ddef - /_hvax exch ddef - /_hvwb exch ddef - /_hvcy exch ddef - /_hvcx exch ddef - _lineorientation 0 eq { hswj } { vswj } ifelse -} def -/sw -{ - 0 0 0 6 3 roll swj -} def -/vjss -{ - 4 1 roll - { - dup cstring - dup length 1 eq - _charorientation 1 eq - and - { - -90 rotate - currentpoint - _fontRotateAdjust add - moveto - gsave - false charpath currentpoint - 5 index setmatrix stroke - grestore - _fontRotateAdjust sub - moveto - _sp eq - { - 5 index 5 index rmoveto - } if - 2 copy rmoveto - 90 rotate - } - { - currentpoint - _fontHeight sub - 5 index sub - 3 index _sp eq - { - 9 index sub - } if - - currentpoint - exch 4 index stringwidth pop 2 div sub - exch _fontAscent sub - moveto - - gsave - 2 index false charpath - 6 index setmatrix stroke - grestore - - moveto pop pop - } ifelse - } cforall - 6 npop -} def -/hjss -{ - 4 1 roll - { - dup cstring - gsave - false charpath currentpoint - 5 index setmatrix stroke - grestore - moveto - _sp eq - { - 5 index 5 index rmoveto - } if - 2 copy rmoveto - } cforall - 6 npop -} def -/jss -{ - _lineorientation 0 eq { hjss } { vjss } ifelse -} def -/ss -{ - 0 0 0 7 3 roll jss -} def -/vjsp -{ - 4 1 roll - { - dup cstring - dup length 1 eq - _charorientation 1 eq - and - { - -90 rotate - currentpoint - _fontRotateAdjust add - moveto - false charpath - currentpoint - _fontRotateAdjust sub - moveto - _sp eq - { - 5 index 5 index rmoveto - } if - 2 copy rmoveto - 90 rotate - } - { - currentpoint - _fontHeight sub - 5 index sub - 3 index _sp eq - { - 9 index sub - } if - - currentpoint - exch 4 index stringwidth pop 2 div sub - exch _fontAscent sub - moveto - - 2 index false charpath - - moveto pop pop - } ifelse - } cforall - 6 npop -} def -/hjsp -{ - 4 1 roll - { - dup cstring - false charpath - _sp eq - { - 5 index 5 index rmoveto - } if - 2 copy rmoveto - } cforall - 6 npop -} def -/jsp -{ - matrix currentmatrix - _lineorientation 0 eq {hjsp} {vjsp} ifelse -} def -/sp -{ - matrix currentmatrix - 0 0 0 7 3 roll - _lineorientation 0 eq {hjsp} {vjsp} ifelse -} def -/pl -{ - transform - 0.25 sub round 0.25 add exch - 0.25 sub round 0.25 add exch - itransform -} def -/setstrokeadjust where -{ - pop true setstrokeadjust - /c - { - curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll curveto - } def - /V - /v load def - /y - { - 2 copy curveto - } def - /Y - /y load def - /l - { - lineto - } def - /L - /l load def - /m - { - moveto - } def -} -{ - /c - { - pl curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll pl curveto - } def - /V - /v load def - /y - { - pl 2 copy curveto - } def - /Y - /y load def - /l - { - pl lineto - } def - /L - /l load def - /m - { - pl moveto - } def -} ifelse -/d -{ - setdash -} def -/cf -{ -} def -/i -{ - dup 0 eq - { - pop cf - } if - setflat -} def -/j -{ - setlinejoin -} def -/J -{ - setlinecap -} def -/M -{ - setmiterlimit -} def -/w -{ - setlinewidth -} def -/XR -{ - 0 ne - /_eo exch ddef -} def -/H -{ -} def -/h -{ - closepath -} def -/N -{ - _pola 0 eq - { - _doClip 1 eq - { - _eo {eoclip} {clip} ifelse /_doClip 0 ddef - } if - newpath - } - { - /CRender - { - N - } ddef - } ifelse -} def -/n -{ - N -} def -/F -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc - /_doClip 0 ddef - } - { - _pf - } ifelse - } - { - /CRender - { - F - } ddef - } ifelse -} def -/f -{ - closepath - F -} def -/S -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - _ps - } ifelse - } - { - /CRender - { - S - } ddef - } ifelse -} def -/s -{ - closepath - S -} def -/B -{ - _pola 0 eq - { - _doClip 1 eq - gsave F grestore - { - gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - S - } ifelse - } - { - /CRender - { - B - } ddef - } ifelse -} def -/b -{ - closepath - B -} def -/W -{ - /_doClip 1 ddef -} def -/* -{ - count 0 ne - { - dup type /stringtype eq - { - pop - } if - } if - newpath -} def -/u -{ -} def -/U -{ -} def -/q -{ - _pola 0 eq - { - gsave - } if -} def -/Q -{ - _pola 0 eq - { - grestore - } if -} def -/*u -{ - _pola 1 add /_pola exch ddef -} def -/*U -{ - _pola 1 sub /_pola exch ddef - _pola 0 eq - { - CRender - } if -} def -/D -{ - pop -} def -/*w -{ -} def -/*W -{ -} def -/` -{ - /_i save ddef - clipForward? - { - nulldevice - } if - 6 1 roll 4 npop - concat pop - userdict begin - /showpage - { - } def - 0 setgray - 0 setlinecap - 1 setlinewidth - 0 setlinejoin - 10 setmiterlimit - [] 0 setdash - /setstrokeadjust where {pop false setstrokeadjust} if - newpath - 0 setgray - false setoverprint -} def -/~ -{ - end - _i restore -} def -/_rgbtocmyk -{ - 3 - { - 1 exch sub 3 1 roll - } repeat - 3 copy 1 4 1 roll - 3 - { - 3 index 2 copy gt - { - exch - } if - pop 4 1 roll - } repeat - pop pop pop - 4 1 roll - 3 - { - 3 index sub - 3 1 roll - } repeat - 4 -1 roll -} def -/setrgbfill -{ - _rgbf astore pop - /_fc - { - _lp /fill ne - { - _of setoverprint - _rgbf aload pop setrgbcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - hvashow - } ddef - /_pjsf - { - _fc - hvawidthshow - } ddef - /_lp /none ddef -} def -/setrgbstroke -{ - _rgbs astore pop - /_sc - { - _lp /stroke ne - { - _os setoverprint - _rgbs aload pop setrgbcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/O -{ - 0 ne - /_of exch ddef - /_lp /none ddef -} def -/R -{ - 0 ne - /_os exch ddef - /_lp /none ddef -} def -/g -{ - /_gf exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _gf setgray - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - hvashow - } ddef - /_pjsf - { - _fc - hvawidthshow - } ddef - /_lp /none ddef -} def -/G -{ - /_gs exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _gs setgray - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/k -{ - _cf astore pop - /_fc - { - _lp /fill ne - { - _of setoverprint - _cf aload pop setcmykcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - hvashow - } ddef - /_pjsf - { - _fc - hvawidthshow - } ddef - /_lp /none ddef -} def -/K -{ - _cs astore pop - /_sc - { - _lp /stroke ne - { - _os setoverprint - _cs aload pop setcmykcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/Xa -{ - _?cmyk { - 3 npop k - }{ - setrgbfill 4 npop - } ifelse -} def -/XA -{ - _?cmyk { - 3 npop K - }{ - setrgbstroke 4 npop - } ifelse -} def -/Xs -{ - /_gf exch ddef - 5 npop - /_fc - { - _lp /fill ne - { - _of setoverprint - _gf setAIseparationgray - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - hvashow - } ddef - /_pjsf - { - _fc - hvawidthshow - } ddef - /_lp /none ddef -} def -/XS -{ - /_gs exch ddef - 5 npop - /_sc - { - _lp /stroke ne - { - _os setoverprint - _gs setAIseparationgray - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/Xx -{ - exch - /_gf exch ddef - 0 eq { - findcmykcustomcolor - }{ - _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse - { - 4 1 roll 3 npop - findcmykcustomcolor - }{ - 8 -4 roll 4 npop - findrgbcustomcolor - } ifelse - } ifelse - /_if exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _if _gf 1 exch sub setcustomcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - hvashow - } ddef - /_pjsf - { - _fc - hvawidthshow - } ddef - /_lp /none ddef -} def -/XX -{ - exch - /_gs exch ddef - 0 eq { - findcmykcustomcolor - }{ - _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse - { - 4 1 roll 3 npop - findcmykcustomcolor - }{ - 8 -4 roll 4 npop - findrgbcustomcolor - } ifelse - } ifelse - /_is exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _is _gs 1 exch sub setcustomcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/x -{ - /_gf exch ddef - findcmykcustomcolor - /_if exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _if _gf 1 exch sub setcustomcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - hvashow - } ddef - /_pjsf - { - _fc - hvawidthshow - } ddef - /_lp /none ddef -} def -/X -{ - /_gs exch ddef - findcmykcustomcolor - /_is exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _is _gs 1 exch sub setcustomcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/XK -{ - 3 -1 roll pop - 0 eq - { - 1 exch sub - 3 {dup 3 1 roll mul 5 1 roll} repeat - mul 4 1 roll - K - } - { - 1 exch sub 4 1 roll - 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat - 4 -1 roll pop - XA - } ifelse -} def -/Xk -{ - 3 -1 roll pop - 0 eq - { - 1 exch sub - 3 {dup 3 1 roll mul 5 1 roll} repeat - mul 4 1 roll - k - } - { - 1 exch sub 4 1 roll - 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat - 4 -1 roll pop - Xa - } ifelse -} def -/A -{ - pop -} def -/annotatepage -{ -userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse -} def -/XT { - pop pop -} def -/Xt { - pop -} def -/discard -{ - save /discardSave exch store - discardDict begin - /endString exch store - gt38? - { - 2 add - } if - load - stopped - pop - end - discardSave restore -} bind def -userdict /discardDict 7 dict dup begin -put -/pre38Initialize -{ - /endStringLength endString length store - /newBuff buffer 0 endStringLength getinterval store - /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store - /newBuffLast newBuff endStringLength 1 sub 1 getinterval store -} def -/shiftBuffer -{ - newBuff 0 newBuffButFirst putinterval - newBuffLast 0 - currentfile read not - { - stop - } if - put -} def -0 -{ - pre38Initialize - mark - currentfile newBuff readstring exch pop - { - { - newBuff endString eq - { - cleartomark stop - } if - shiftBuffer - } loop - } - { - stop - } ifelse -} def -1 -{ - pre38Initialize - /beginString exch store - mark - currentfile newBuff readstring exch pop - { - { - newBuff beginString eq - { - /layerCount dup load 1 add store - } - { - newBuff endString eq - { - /layerCount dup load 1 sub store - layerCount 0 eq - { - cleartomark stop - } if - } if - } ifelse - shiftBuffer - } loop - } if -} def -2 -{ - mark - { - currentfile buffer {readline} stopped { - % assume error was due to overfilling the buffer - }{ - not - { - stop - } if - endString eq { - cleartomark stop - } if - }ifelse - } loop -} def -3 -{ - /beginString exch store - /layerCnt 1 store - mark - { - currentfile buffer {readline} stopped { - % assume error was due to overfilling the buffer - }{ - not - { - stop - } if - dup beginString eq - { - pop /layerCnt dup load 1 add store - } - { - endString eq - { - layerCnt 1 eq - { - cleartomark stop - } - { - /layerCnt dup load 1 sub store - } ifelse - } if - } ifelse - }ifelse - } loop -} def -end -userdict /clipRenderOff 15 dict dup begin -put -{ - /n /N /s /S /f /F /b /B -} -{ - { - _doClip 1 eq - { - /_doClip 0 ddef _eo {eoclip} {clip} ifelse - } if - newpath - } def -} forall -/Tr /pop load def -/Bb {} def -/BB /pop load def -/Bg {12 npop} def -/Bm {6 npop} def -/Bc /Bm load def -/Bh {4 npop} def -end -/Lb -{ - 6 npop - 7 2 roll - 5 npop - 0 eq - { - 0 eq - { - (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard - } - { - - /clipForward? true def - - /Tx /pop load def - /Tj /pop load def - - currentdict end clipRenderOff begin begin - } ifelse - } - { - 0 eq - { - save /discardSave exch store - } if - } ifelse -} bind def -/LB -{ - discardSave dup null ne - { - restore - } - { - pop - clipForward? - { - currentdict - end - end - begin - - /clipForward? false ddef - } if - } ifelse -} bind def -/Pb -{ - pop pop - 0 (%AI5_EndPalette) discard -} bind def -/Np -{ - 0 (%AI5_End_NonPrinting--) discard -} bind def -/Ln /pop load def -/Ap -/pop load def -/Ar -{ - 72 exch div - 0 dtransform dup mul exch dup mul add sqrt - dup 1 lt - { - pop 1 - } if - setflat -} def -/Mb -{ - q -} def -/Md -{ -} def -/MB -{ - Q -} def -/nc 4 dict def -nc begin -/setgray -{ - pop -} bind def -/setcmykcolor -{ - 4 npop -} bind def -/setrgbcolor -{ - 3 npop -} bind def -/setcustomcolor -{ - 2 npop -} bind def -currentdict readonly pop -end -/XP -{ - 4 npop -} bind def -/XD -{ - pop -} bind def -end -setpacking -%%EndResource -%%BeginResource: procset Adobe_cshow 2.0 8 -%%Title: (Writing System Operators) -%%Version: 2.0 8 -%%CreationDate: (1/23/89) () -%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_cshow 14 dict dup begin put -/initialize -{ - Adobe_cshow begin - Adobe_cshow - { - dup xcheck - { - bind - } if - pop pop - } forall - end - Adobe_cshow begin -} def -/terminate -{ -currentdict Adobe_cshow eq - { - end - } if -} def -/cforall -{ - /_lobyte 0 ddef - /_hibyte 0 ddef - /_cproc exch ddef - /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef - { - /_lobyte exch ddef - _hibyte 0 eq - _cscript 1 eq - _lobyte 129 ge _lobyte 159 le and - _lobyte 224 ge _lobyte 252 le and or and - _cscript 2 eq - _lobyte 161 ge _lobyte 254 le and and - _cscript 3 eq - _lobyte 161 ge _lobyte 254 le and and - _cscript 25 eq - _lobyte 161 ge _lobyte 254 le and and - _cscript -1 eq - or or or or and - { - /_hibyte _lobyte ddef - } - { - _hibyte 256 mul _lobyte add - _cproc - /_hibyte 0 ddef - } ifelse - } forall -} def -/cstring -{ - dup 256 lt - { - (s) dup 0 4 3 roll put - } - { - dup 256 idiv exch 256 mod - (hl) dup dup 0 6 5 roll put 1 4 3 roll put - } ifelse -} def -/clength -{ - 0 exch - { 256 lt { 1 } { 2 } ifelse add } cforall -} def -/hawidthshow -{ - { - dup cstring - show - _hvax _hvay rmoveto - _hvwb eq { _hvcx _hvcy rmoveto } if - } cforall -} def -/vawidthshow -{ - { - dup 255 le - _charorientation 1 eq - and - { - -90 rotate - 0 _fontRotateAdjust rmoveto - cstring - _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow - 0 _fontRotateAdjust neg rmoveto - 90 rotate - } - { - currentpoint - _fontHeight sub - exch _hvay sub exch _hvax sub - 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if - 3 2 roll - cstring - dup stringwidth pop 2 div neg _fontAscent neg rmoveto - show - moveto - } ifelse - } cforall -} def -/hvawidthshow -{ - 6 1 roll - /_hvay exch ddef - /_hvax exch ddef - /_hvwb exch ddef - /_hvcy exch ddef - /_hvcx exch ddef - _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse -} def -/hvwidthshow -{ - 0 0 3 -1 roll hvawidthshow -} def -/hvashow -{ - 0 0 0 6 -3 roll hvawidthshow -} def -/hvshow -{ - 0 0 0 0 0 6 -1 roll hvawidthshow -} def -currentdict readonly pop end -setpacking -%%EndResource -%%BeginResource: procset Adobe_shading_AI8 1.0 0 -%%Title: (Adobe Illustrator 8 Shading Procset) -%%Version: 1.0 0 -%%CreationDate: (12/17/97) () -%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) -userdict /defaultpacking currentpacking put true setpacking -userdict /Adobe_shading_AI8 10 dict dup begin put -/initialize { - Adobe_shading_AI8 begin - Adobe_shading_AI8 bdprocs - Mesh /initialize get exec -} def -/terminate { - currentdict Adobe_shading_AI8 eq { - end - } if -} def -/bdprocs { - { - dup xcheck 1 index type /arraytype eq and { - bind - } if - pop pop - } forall -} def -/X! {pop} def -/X# {pop pop} def -/Mesh 40 dict def -Mesh begin -/initialize { - Mesh bdprocs - Mesh begin - /emulate? /AI8MeshEmulation where { - pop AI8MeshEmulation - }{ - systemdict /shfill known not - } ifelse def - end -} def -/bd { - shadingdict begin -} def -/paint { - emulate? { - end - }{ - /_lp /none ddef _fc /_lp /none ddef - - /AIColorSpace AIColorSpace tocolorspace store - /ColorSpace AIColorSpace topsspace store - - version_ge_3010.106 not systemdict /setsmoothness known and { - 0.0001 setsmoothness - } if - - composite? { - /DataSource getdatasrc def - Matrix concat - currentdict end - shfill - }{ - AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { - end - }{ - /ColorSpace /DeviceGray store - /Decode [0 1 0 1 0 1] store - /DataSource getplatesrc def - Matrix concat - currentdict end - shfill - } ifelse - } ifelse - } ifelse -} def -/shadingdict 12 dict def -shadingdict begin - /ShadingType 6 def - /BitsPerCoordinate 16 def - /BitsPerComponent 8 def - /BitsPerFlag 8 def -end -/datafile null def -/databuf 256 string def -/dataptr 0 def -/srcspace null def -/srcchannels 0 def -/dstchannels 0 def -/dstplate 0 def -/srctodstcolor null def -/getplatesrc { - /srcspace AIColorSpace store - /srcchannels AIColorSpace getnchannels store - /dstchannels 1 store - /dstplate getplateindex store - /srctodstcolor srcspace makesmarks { - dstplate 4 eq { - {1 exch sub} - }{ - {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} - } ifelse - }{ - {srcchannels {pop} repeat 1} - } ifelse store - /datafile getdatasrc store - /rdpatch168 load DataLength () /SubFileDecode filter -} def -/getdatasrc { - /rdcmntline load /ASCII85Decode filter -} def -/rdpatch168 { - /dataptr 0 store - 49 rdcount - 4 { - dup {pop srcchannels getint8} if - dup {pop srctodstcolor dstchannels putint8 true} if - } repeat - {databuf 0 dataptr getinterval}{()} ifelse -} def -/rdpatch3216 { - /dataptr 0 store - 97 rdcount - 4 { - dup {pop srcchannels getint16} if - dup {pop srctodstcolor dstchannels putint16 true} if - } repeat - {databuf 0 dataptr getinterval}{()} ifelse -} def -/rdcount { - dup 0 gt { - datafile databuf dataptr 4 -1 roll getinterval readstring - exch length dataptr add /dataptr exch store - }{ - true - } ifelse -} def -/getint8 { - mark true 3 -1 roll - { - dup {pop datafile read} if - dup {pop 255 div true} if - } repeat - { - counttomark 1 add -1 roll pop true - }{ - cleartomark false - } ifelse -} def -/putint8 { - dup dataptr add /dataptr exch store - dataptr exch - { - 1 sub exch - 255 mul cvi - databuf 2 index - 3 -1 roll put - } repeat - pop -} def -/getint16 { - mark true 3 -1 roll - { - dup {pop datafile read} if - dup {pop 256 mul datafile read} if - dup {pop add 65535 div true} if - } repeat - { - counttomark 1 add -1 roll pop true - }{ - cleartomark false - } ifelse -} def -/putint16 { - dup 2 mul dataptr add /dataptr exch store - dataptr exch - { - 2 sub exch - 65535 mul cvi dup - 256 idiv databuf 3 index 3 -1 roll put - 256 mod databuf 2 index 1 add 3 -1 roll put - } repeat - pop -} def -/srcbuf 256 string def -/rdcmntline { - currentfile srcbuf readline pop - (%) anchorsearch {pop} if -} def -/getplateindex { - 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall -} def -/aicsarray 4 array def -/aicsaltvals 4 array def -/aicsaltcolr aicsaltvals def -/tocolorspace { - dup type /arraytype eq { - mark exch aload pop - aicsarray 0 3 -1 roll put - aicsarray 1 3 -1 roll put - dup aicsarray 2 3 -1 roll put - gettintxform aicsarray 3 3 -1 roll put - counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store - aicsaltcolr astore pop pop - aicsarray - } if -} def -/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def -/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def -/gettintxform { - /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load -} def -/getnchannels { - dup type /arraytype eq {0 get} if - colorspacedict exch get begin Channels end -} def -/makesmarks { - composite? { - pop true - }{ - dup dup type /arraytype eq {0 get} if - colorspacedict exch get begin MarksPlate end - } ifelse -} def -/markingplate { - composite? { - pop true - }{ - dup type /arraytype eq { - dup length getplateindex gt {getplateindex get}{pop false} ifelse - } if - } ifelse -} def -/tocmyk { - dup dup type /arraytype eq {0 get} if - colorspacedict exch get begin ToCMYK end -} def -/topsspace { - dup dup type /arraytype eq {0 get} if - colorspacedict exch get begin ToPSSpace end -} def -/colorspacedict 5 dict dup begin - /DeviceGray 4 dict dup begin - /Channels 1 def - /MarksPlate {pop black?} def - /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def - /ToPSSpace {} def - end def - /DeviceRGB 4 dict dup begin - /Channels 3 def - /MarksPlate {pop isCMYKSep?} def - /ToCMYK {pop _rgbtocmyk} def - /ToPSSpace {} def - end def - /DeviceCMYK 4 dict dup begin - /Channels 4 def - /MarksPlate {pop isCMYKSep?} def - /ToCMYK {pop} def - /ToPSSpace {} def - end def - /Separation 4 dict dup begin - /Channels 1 def - /MarksPlate { - /findcmykcustomcolor where { - pop dup 1 exch ToCMYK 5 -1 roll 1 get - findcmykcustomcolor 1 setcustomcolor - systemdict /currentgray get exec - 1 ne - }{ - pop false - } ifelse - } def - /ToCMYK { - dup 2 get mark exch 4 2 roll - 3 get exec - counttomark -1 roll tocmyk - 5 -1 roll pop - } def - /ToPSSpace {} def - end def - /Process 4 dict dup begin - /Channels 1 def - /MarksPlate { - isCMYKSep? { - 1 exch ToCMYK 4 array astore getplateindex get 0 ne - }{ - pop false - } ifelse - } def - /ToCMYK { - dup 2 get mark exch 4 2 roll - 3 get exec - counttomark -1 roll tocmyk - 5 -1 roll pop - } def - /ToPSSpace { - 4 array copy dup 0 /Separation put - } def - end def -end def -/isoverprint { - /currentoverprint where {pop currentoverprint}{_of} ifelse -} def -/version_ge_3010.106 { - version {cvr} stopped { - pop - false - }{ - 3010.106 ge - } ifelse -} def -end -end -defaultpacking setpacking -%%EndResource -%%EndProlog %%BeginSetup userdict /_useSmoothShade false put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec -Adobe_cshow /initialize get exec -Adobe_ColorImage_AI6 /initialize get exec -Adobe_shading_AI8 /initialize get exec -Adobe_Illustrator_AI5 /initialize get exec -%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (svg2279) Ln 0 A u U u u u 0 O 0 0 0 0 1 1 1 Xa 0 R 0.74902 0.678431 0.670588 0.901961 0 0 0 XA 0 J 0 j 1.04162 w 4 M []0 d 0 XR 360.9937 306.4668 m 439.9941 306.4668 L 439.9941 292.4668 L 360.9937 292.4668 L 360.9937 306.4668 L b 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 1 w 362.4751 305.0669 m 438.5127 305.0669 L 438.5127 293.8672 L 362.4751 293.8672 L 362.4751 305.0669 L f 1 D 0.345098 0.239216 0.309804 0 0.670588 0.694118 0.666667 Xa 362.4751 305.0547 m 362.4751 293.8545 L 382.5557 293.8545 L 383.8477 295.4883 384.7197 297.3867 384.7197 299.4546 c 384.7197 301.5088 383.8628 303.4282 382.5864 305.0547 C 362.4751 305.0547 L f q 0 D 362.6411 305.0669 m 382.2085 305.0669 L 382.2085 293.8672 L 362.6411 293.8672 L 362.6411 305.0669 L h W n u 0 O 0 0 0 0 1 1 1 Xa 379.79 299.4668 m 379.792 295.9746 376.7988 293.1426 373.1045 293.1406 c 369.4106 293.1387 366.4136 295.9668 366.4116 299.459 c 366.4116 299.4614 366.4116 299.4639 366.4116 299.4668 c 366.4092 302.9585 369.4023 305.791 373.0967 305.793 C 376.791 305.7949 379.7876 302.9658 379.79 299.4741 c 379.79 299.4717 379.79 299.4692 379.79 299.4668 c f *u 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 378.5386 304.6162 m 380.0215 303.2144 380.7637 301.4976 380.7637 299.4668 c 380.7637 297.4355 380.0347 295.7373 378.5767 294.3711 C 377.0293 292.9326 375.2012 292.2129 373.0913 292.2129 c 371.0068 292.2129 369.21 292.9268 367.7012 294.3535 C 366.1919 295.7793 365.4375 297.4844 365.4375 299.4668 c 365.4375 301.4492 366.1919 303.166 367.7012 304.6162 C 369.1714 306.019 370.9683 306.7202 373.0913 306.7202 c 375.2397 306.7202 377.0552 306.019 378.5386 304.6162 C f 1 D 368.6997 303.6733 m 367.4453 302.4761 366.8188 301.0737 366.8188 299.4648 c 366.8188 297.8564 367.4395 296.4658 368.6802 295.293 C 369.9214 294.1201 371.3994 293.5332 373.1138 293.5332 c 374.8281 293.5332 376.3184 294.126 377.585 295.3105 C 378.7876 296.4121 379.3892 297.7959 379.3892 299.4648 c 379.3892 301.1211 378.7778 302.5273 377.5562 303.6821 C 376.3345 304.8369 374.8535 305.4146 373.1138 305.4146 c 371.3735 305.4146 369.9019 304.834 368.6997 303.6733 C f 0 D 372 300.1724 m 371.8081 300.5674 371.5215 300.7646 371.1387 300.7646 c 370.4624 300.7646 370.1245 300.3345 370.1245 299.4741 c 370.1245 298.6133 370.4624 298.1836 371.1387 298.1836 c 371.5854 298.1836 371.9043 298.3926 372.0957 298.8125 C 373.0332 298.3408 L 372.5864 297.5898 371.916 297.2148 371.022 297.2148 c 370.3325 297.2148 369.7803 297.415 369.3657 297.8145 C 368.9502 298.2139 368.7432 298.7646 368.7432 299.4668 c 368.7432 300.1567 368.957 300.7041 369.3848 301.1099 C 369.8125 301.5156 370.3452 301.7183 370.9839 301.7183 c 371.9287 301.7183 372.6055 301.3662 373.0146 300.6631 C 372 300.1724 L f 376.4102 300.1724 m 376.2183 300.5674 375.9375 300.7646 375.5669 300.7646 c 374.877 300.7646 374.5317 300.3345 374.5317 299.4741 c 374.5317 298.6133 374.877 298.1836 375.5669 298.1836 c 376.0142 298.1836 376.3271 298.3926 376.5059 298.8125 C 377.4644 298.3408 L 377.0186 297.5898 376.3491 297.2148 375.4565 297.2148 c 374.7681 297.2148 374.2173 297.415 373.8027 297.8145 C 373.3887 298.2139 373.1816 298.7646 373.1816 299.4668 c 373.1816 300.1567 373.3921 300.7041 373.8125 301.1099 C 374.2329 301.5156 374.7681 301.7183 375.4185 301.7183 c 376.3618 301.7183 377.0376 301.3662 377.4448 300.6631 C 376.4102 300.1724 L f *U U /AdobeObjectMatrix (0.961253 0.000000 0.000000 0.961253 6.834157 9.506999) XT Q U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 158.000000 54.000000) XT 0 A *u 1 D 0 O 0 0 0 0 1 1 1 Xa 0 J 0 j 1 w 4 M []0 d 0 XR 389.5518 300.0986 m 389.7944 300.0986 389.978 300.1484 390.1035 300.2485 c 390.2285 300.3486 390.291 300.4961 390.291 300.6914 c 390.291 300.8838 390.2285 301.0303 390.1035 301.1304 C 389.978 301.2324 389.7944 301.2842 389.5518 301.2842 C 388.7007 301.2842 L 388.7007 300.0986 L 389.5518 300.0986 L F 389.604 297.6494 m 389.9131 297.6494 390.1445 297.7109 390.2993 297.833 C 390.4565 297.9551 390.5352 298.1406 390.5352 298.3887 c 390.5352 298.6309 390.4575 298.8125 390.3032 298.9316 C 390.1489 299.0547 389.9155 299.1162 389.604 299.1162 C 388.7007 299.1162 L 388.7007 297.6494 L 389.604 297.6494 L F 0 D 391.0347 299.6636 m 391.3647 299.5737 391.6206 299.4072 391.8018 299.1646 c 391.9829 298.9219 392.0732 298.625 392.0732 298.2715 c 392.0732 297.7324 391.8789 297.3291 391.4897 297.0645 c 391.1011 296.7988 390.5098 296.666 389.7158 296.666 C 387.1626 296.666 L 387.1626 302.2666 L 389.4722 302.2666 L 390.3008 302.2666 390.8999 302.1494 391.27 301.9141 C 391.6431 301.6792 391.8296 301.3027 391.8296 300.7852 c 391.8296 300.5127 391.7617 300.2798 391.626 300.0874 C 391.4897 299.8975 391.293 299.7559 391.0347 299.6636 C F 391.9395 302.2666 m 393.6216 302.2666 L 394.9805 300.2715 L 396.3389 302.2666 L 398.0249 302.2666 L 395.7515 299.0259 L 395.7515 296.666 L 394.2129 296.666 L 394.2129 299.0259 L 391.9395 302.2666 L F *U U /AdobeObjectMatrix (0.987502 0.000000 0.000000 0.933352 -323.900635 -271.876892) XT U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0 G 0 J 0 j 0.5 w 4 M []0 d 0 XR 351.5 292 m 324.5 292 L S 360.5 283 m 360.5 256 L S U u 351.5 307 m 324.5 307 L S 360.5 316 m 360.5 343 L S U u 449.5 307 m 476.5 307 L S 440.5 316 m 440.5 343 L S U u 449.5 292 m 476.5 292 L S 440.5 283 m 440.5 256 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec -Adobe_shading_AI8 /terminate get exec -Adobe_ColorImage_AI6 /terminate get exec -Adobe_cshow /terminate get exec -Adobe_level2_AI5 /terminate get exec -%%EOF \ No newline at end of file diff --git a/doc/paper/CC-by.pdf b/doc/paper/CC-by.pdf deleted file mode 100755 index 7b790d0..0000000 Binary files a/doc/paper/CC-by.pdf and /dev/null differ diff --git a/doc/paper/Makefile b/doc/paper/Makefile deleted file mode 100644 index 8a4bc75..0000000 --- a/doc/paper/Makefile +++ /dev/null @@ -1,35 +0,0 @@ - -LAB_PATH ?= ../lab-windows - -SHELL := bash -.ONESHELL: -.SHELLFLAGS := -eu -o pipefail -c -.DELETE_ON_ERROR: -MAKEFLAGS += --warn-undefined-variables -MAKEFLAGS += --no-builtin-rules - -main_tex ?= rotohsm_paper -brief_tex ?= rotohsm_tech_report - -VERSION_STRING := $(shell git describe --tags --long --dirty) - -all: ${main_tex}.pdf ${brief_tex}.pdf - -%.pdf: %.tex rotohsm.bib version.tex - pdflatex -shell-escape $< - biber $* - pdflatex -shell-escape $< - -version.tex: ${main_tex}.tex ${brief_tex}.tex rotohsm.bib - echo "${VERSION_STRING}" > $@ - -resources/%.pdf: $(LAB_PATH)/%.ipynb - jupyter-nbconvert --to=pdf --output-dir=resources --output=$* --LatexExporter.template_file=resources/nbexport.tplx $^ - -.PHONY: clean -clean: - rm -f ${main_tex}.aux ${main_tex}.bbl ${main_tex}.bcf ${main_tex}.log ${main_tex}.blg - rm -f ${main_tex}.out ${main_tex}.run.xml texput.log - rm -f ${brief_tex}.aux ${brief_tex}.bbl ${brief_tex}.bcf ${brief_tex}.log ${brief_tex}.blg - rm -f ${brief_tex}.out ${brief_tex}.run.xml texput.log - diff --git a/doc/paper/circuits.ipynb b/doc/paper/circuits.ipynb deleted file mode 100644 index 2e78b30..0000000 --- a/doc/paper/circuits.ipynb +++ /dev/null @@ -1,1115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import schemdraw\n", - "from schemdraw import elements as elm" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2020-12-01T15:29:56.159415\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.3, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "<__main__.DiodeOptocoupler at 0x7ff215993c70>" - ] - }, - "execution_count": 123, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class DiodeOptocoupler(schemdraw.elements.compound.ElementCompound):\n", - " def __init__(self, *args, **kwargs):\n", - " unit = 1.5\n", - " super().__init__(*args, unit=unit, **kwargs)\n", - "\n", - " box = kwargs.get('box', True)\n", - " boxfill = kwargs.get('boxfill', False)\n", - " bpad = kwargs.get('boxpad', .2)\n", - " label1, label2 = kwargs.get('label1'), kwargs.get('label2')\n", - " rev1, rev2 = kwargs.get('reverse1', False), kwargs.get('reverse2', False)\n", - "\n", - " D1 = self.add(elm.Diode(d='down', reverse=rev1))\n", - " D2 = self.add(elm.Diode(d='down', reverse=rev2, at=[2, 0]))\n", - " if label1:\n", - " self.segments.append(schemdraw.segments.SegmentText(D1.start + (0, 0.5), label1))\n", - " if label2:\n", - " self.segments.append(schemdraw.segments.SegmentText(D2.start + (0, 0.5), label2))\n", - " \n", - " self.add(elm.Arrow('r', at=[.6, -unit/2 + .2], l=.4, headwidth=.15, headlength=.4))\n", - " self.add(elm.Arrow('r', at=[.6, -unit/2 - .2], l=.4, headwidth=.15, headlength=.4))\n", - "\n", - " bbox = self.get_bbox()\n", - " if box:\n", - " self.add(elm.Rect(\n", - " 'r', at=[0, 0],\n", - " corner1=[bbox.xmin-bpad, bbox.ymin-bpad],\n", - " corner2=[bbox.xmax+bpad, bbox.ymax+bpad],\n", - " fill=boxfill, zorder=0))\n", - "\n", - " A = self.add(elm.Line('r', at=D2.start, l=bpad*2))\n", - " B = self.add(elm.Line('r', at=D2.end, l=bpad*2))\n", - " C = self.add(elm.Line('l', at=D1.start, tox=bbox.xmin-bpad))\n", - " D = self.add(elm.Line('l', at=D1.end, tox=bbox.xmin-bpad))\n", - " self.anchors['anode1'] = C.end\n", - " self.anchors['cathode1'] = D.end\n", - " self.anchors['anode2'] = B.end\n", - " self.anchors['cathode2'] = A.end\n", - "DiodeOptocoupler(box=False, reverse2=True, label2='D2')" - ] - }, - { - "cell_type": "code", - "execution_count": 177, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2020-12-01T15:40:27.785440\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.3, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 177, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d = schemdraw.Drawing()\n", - "V1 = d.add(elm.SourceV(label='5V'))\n", - "d.add(elm.Line(d='right', l=d.unit*2))\n", - "d.add(elm.Resistor(d='down', label='R1'))\n", - "coupler = d.add(DiodeOptocoupler(d='right', box=False, label1='D1', label2='D2', anchor='anode1', reverse2=True))\n", - "d.here = coupler.cathode1\n", - "Q1 = d.add(elm.BjtNpn(d='right', anchor='collector', label='Q1'))\n", - "d.add(elm.Line(xy=Q1.emitter, d='down', l=d.unit*0.25))\n", - "d.add(elm.Line(d='left', tox=V1.start))\n", - "d.add(elm.Line(d='up', toy=V1.start))\n", - "d.add(elm.Resistor(xy=Q1.base, d='left', label='R2'))\n", - "d.add(elm.Dot(open=True, lftlabel='TX in'))\n", - "\n", - "d.add(elm.Line(xy=coupler.cathode2, d='up', toy=V1.end + d.unit*0.5))\n", - "vbus = d.add(elm.Line(d='right', l=d.unit*5))\n", - "\n", - "d.add(elm.Line(xy=coupler.anode2, d='right', l=d.unit*0.5))\n", - "j1 = d.add(elm.Dot())\n", - "d.add(elm.Line(l=d.unit*0.5))\n", - "amp1 = d.add(elm.Opamp(d='right', anchor='in1'))\n", - "\n", - "d.add(elm.Line(xy=j1.xy, d='up', l=d.unit))\n", - "j2 = d.add(elm.Dot())\n", - "\n", - "d.add(elm.Resistor(label='R3', d='right'))\n", - "d.add(elm.Line(l=d.unit*0.5))\n", - "j3 = d.add(elm.Dot())\n", - "d.add(elm.Line(d='down', toy=amp1.out))\n", - "j4 = d.add(elm.Dot())\n", - "d.add(elm.Line('left', tox=amp1.out))\n", - "\n", - "d.add(elm.Line('up', xy=j2.xy, l=d.unit*0.5))\n", - "d.add(elm.Capacitor(label='C1', d='right'))\n", - "d.add(elm.Line(tox=j3.xy))\n", - "d.add(elm.Line(d='down', toy=j3.xy))\n", - "\n", - "d.add(elm.Line(d='left', xy=amp1.in2, l=d.unit*0.2))\n", - "d.add(elm.Line(d='down', l=d.unit*0.5))\n", - "vgnd_bus = d.add(elm.Line(d='right', l=d.unit*5))\n", - "\n", - "d.draw()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/doc/paper/concept_vis_one_axis.pdf b/doc/paper/concept_vis_one_axis.pdf deleted file mode 100644 index ea37280..0000000 Binary files a/doc/paper/concept_vis_one_axis.pdf and /dev/null differ diff --git a/doc/paper/concept_vis_one_axis.svg b/doc/paper/concept_vis_one_axis.svg deleted file mode 100644 index f3e909b..0000000 --- a/doc/paper/concept_vis_one_axis.svg +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 1 - 3 - 2 - - - - - - - - - - - - 4 - diff --git a/doc/paper/goette_inertial_hsms_v1_5_eprint.pdf b/doc/paper/goette_inertial_hsms_v1_5_eprint.pdf deleted file mode 100755 index 8fdb2b9..0000000 Binary files a/doc/paper/goette_inertial_hsms_v1_5_eprint.pdf and /dev/null differ diff --git a/doc/paper/iacrtrans.cls b/doc/paper/iacrtrans.cls deleted file mode 100755 index bf42a75..0000000 --- a/doc/paper/iacrtrans.cls +++ /dev/null @@ -1,448 +0,0 @@ -% IACR Transactions DOCUMENT CLASS -- version 0.24 (26 August 2016) -% Written by Gaetan Leurent gaetan.leurent@inria.fr (2016) -% -% To the extent possible under law, the author(s) have dedicated all -% copyright and related and neighboring rights to this software to the -% public domain worldwide. This software is distributed without any -% warranty. -% -% You should have received a copy of the CC0 Public Domain Dedication -% along with this software. If not, see -% . -% -% -%%% Class options: -% -% [preprint] Preprint (no copyright info) -% [submission] Anonymous submission -% [spthm] Emulate llncs sptheorem and remove automatic \qed in proof -% [nohyperref] Disable automatic loading of hyperref -% [draft] -% -%%% HOWTO use this class -% -%% Title -% \title[short]{Long title} -% -%% Authors/affiliation: -% \author{Alice \and Bob} -% \institute{ABC\\ \email{alice@abc} \and DEF\\ \email{bob@def}} -% -%% Keywords/abstract: -% \keywords{banana \and apple} -% \begin{abstract} -% Lorem ipsum dolor sit amet... -% \end{abstract} -% -%% Warnings -% - please don't use any \pagestyle of \thispagestyle command -% - if you have proof with explicit \qed inside, you should either -% remove \qed symbols, replace them by \qedhere, or add option [spthm] - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{iacrtrans}[2016/08/26 v0.24 IACR Transactions Author Class] - -% Common definitions -\def\publname{IACR Transactions on Cryptographic Hardware and Embedded Systems} -\def\IACR@vol{0} -\def\IACR@no{0} -\def\IACR@fp{1} -\def\IACR@DOI{XXXXXXXX} -\usepackage{lastpage} -\def\IACR@lp{\pageref*{LastPage}} - -\newcommand{\setfirstpage}[1]{\def\IACR@fp{#1}\setcounter{page}{#1}} -\newcommand{\setlastpage}[1]{\def\IACR@lp{#1}} -\newcommand{\setvolume}[1]{\def\IACR@vol{#1}} -\newcommand{\setnumber}[1]{\def\IACR@no{#1}} -\newcommand{\setDOI}[1]{\def\IACR@DOI{#1}} - -% Options -\newif\if@loadhr -\@loadhrtrue -\DeclareOption{nohyperref}{\@loadhrfalse} -\newif\if@floatrow -\@floatrowfalse -\DeclareOption{floatrow}{\@floatrowtrue} -\newif\if@submission -\@submissionfalse -\newif\if@preprint -\@preprintfalse -\DeclareOption{final}{\PassOptionsToClass{\CurrentOption}{article}} % Default -\DeclareOption{preprint}{\@preprinttrue} -\DeclareOption{submission}{\@submissiontrue} -\DeclareOption{draft}{\@preprinttrue\PassOptionsToClass{\CurrentOption}{article}} -\newif\if@spthm -\@spthmfalse -\DeclareOption{spthm}{\@spthmtrue} - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} -\ProcessOptions\relax - -% article class with a4paper -\LoadClass[10pt,twoside]{article}[2007/10/19] - -% Geometry -\RequirePackage[a4paper,hscale=0.65,vscale=0.75,marginratio=1:1]{geometry} - -% Title fonts: bf+sf -\RequirePackage{sectsty} -\allsectionsfont{\sffamily\boldmath} -% Also for descrptions -\renewcommand*\descriptionlabel[1]{\hspace\labelsep - \normalfont\bfseries\sffamily #1} - - -% Title/Author/affiliations -\def\@institute{No institute given.} -\newcommand{\institute}[1]{\gdef\@institute{#1}} -\newcommand{\authorrunning}[1]{\gdef\IACR@runningauthors{#1}} -\newcommand{\titlerunning}[1]{\gdef\IACR@runningtitle{#1}} - -\newcounter{IACR@author@cnt} -\newcounter{IACR@inst@cnt} -\newif\if@IACR@autoinst -\@IACR@autoinsttrue -\def\IACR@author@last{0} - -\renewcommand\maketitle{\par - \begingroup - \renewcommand\thefootnote{\@fnsymbol\c@footnote}% - \long\def\@makefntext##1{\parindent 1em\noindent - \hb@xt@1.8em{% - \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% - \newpage - \global\@topnum\z@ % Prevents figures from going at top of page. - \@maketitle - \thispagestyle{title}\@thanks - \endgroup - \setcounter{footnote}{0}% - \global\let\thanks\relax - \global\let\maketitle\relax - \global\let\@maketitle\relax - \global\let\@thanks\@empty -% \global\let\@author\@empty - \global\let\@date\@empty -% \global\let\@title\@empty - \global\let\title\relax - \global\let\author\relax - \global\let\date\relax - \global\let\and\relax -} -\def\@maketitle{% - % Count authors and affiliations - \setcounter{IACR@author@cnt}{1}% - \setcounter{IACR@inst@cnt}{1}% - \setbox0\hbox{\def\thanks##1{\global\@IACR@autoinstfalse}\def\inst##1{\global\@IACR@autoinstfalse}\def\and{\stepcounter{IACR@author@cnt}}\@author}% - \setbox0\hbox{\def\and{\stepcounter{IACR@inst@cnt}}\@institute}% - \xdef\IACR@author@last{\theIACR@author@cnt}% - \edef\IACR@inst@last{\theIACR@inst@cnt}% - \ifnum\IACR@author@last=\IACR@inst@last\else\@IACR@autoinstfalse\fi - \ifnum\IACR@author@last=1 \@IACR@autoinstfalse\fi - \newpage - \null - \vskip 2em% - \begin{center}% - \let \footnote \thanks - {\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% - {\LARGE \bfseries\sffamily\boldmath \@title\par} - \ifdefined\@subtitle\vskip .5em{\large\sffamily\bfseries\@subtitle\par}\fi}% - \vskip 1.5em% - {\large - \lineskip .5em% - \if@submission - Anonymous Submission - \else - \setcounter{IACR@author@cnt}{1}% - \def\and{\if@IACR@autoinst\inst{\theIACR@author@cnt} \fi - \stepcounter{IACR@author@cnt}% - \ifnum\theIACR@author@cnt=\IACR@author@last\unskip\space and \ignorespaces\else\unskip, \ignorespaces\fi} - \@author\if@IACR@autoinst\inst{\theIACR@author@cnt}\fi - \vskip 1em\par - \small - \setcounter{IACR@author@cnt}{1}% - \def\and{\par\stepcounter{IACR@author@cnt}$^\theIACR@author@cnt$~} - \ifnum\IACR@inst@last>1 $^1$~\fi - \@institute - \fi - }% - \end{center}% - \par - \vskip 1.5em} - -\def\IACR@runningauthors{ - \def\thanks##1{}% - \def\inst##1{}% - \def\fnmsep{}% - \def\\{}% - \def\footnote##1{}% - \setcounter{IACR@author@cnt}{1}% - \def\and{\stepcounter{IACR@author@cnt}% - \ifnum\theIACR@author@cnt=\IACR@author@last\unskip\space and \ignorespaces\else\unskip, \ignorespaces\fi} - \@author} - -\def\IACR@runningtitle{% - \def\thanks##1{}% - \def\fnmsep{}% - \def\\{}% - \def\footnote##1{}% - \@title} - -\def\author{\@ifnextchar[{\IACR@@@author}{\IACR@@author}} -\def\IACR@@@author[#1]#2{\authorrunning{#1}\gdef\@author{#2}} -\def\IACR@@author#1{\gdef\@author{#1}} - -\if@submission -\gdef\@author{Anonymous Submission to \publname} -\renewcommand{\author}[2][]{} -\renewcommand{\authorrunning}[1]{} -\renewcommand{\institute}[2][]{} -\fi - - -\def\title{\@ifnextchar[{\IACR@@@title}{\IACR@@title}} -\def\IACR@@@title[#1]#2{\gdef\@title{#2}\titlerunning{#1}} -\def\IACR@@title#1{\gdef\@title{#1}} - -\newcommand{\subtitle}[1]{\gdef\@subtitle{#1}} - -\newcommand{\inst}[1]{\unskip$^{#1}$} -\def\fnmsep{\unskip$^,$} - - -% Head/foot -\RequirePackage{fancyhdr} -\RequirePackage{graphicx} -\fancypagestyle{title}{% -\fancyhf{} % clear all header and footer fields -\if@submission\else\if@preprint\else -\fancyfoot[L]{\small Licensed under \href{http://creativecommons.org/licenses/by/4.0/}{Creative Commons License CC-BY 4.0.}\\ -\publname{} Vol.~\IACR@vol, No.\IACR@no, pp.\IACR@fp---\IACR@lp, \href{https://doi.org/\IACR@DOI}{DOI:\IACR@DOI}} -\fancyfoot[R]{\includegraphics[height=2ex]{CC-by}} -\if@loadhr - \hypersetup{pdfcopyright={Licensed under Creative Commons License CC-BY 4.0.}} - \hypersetup{pdflicenseurl={http://creativecommons.org/licenses/by/4.0/}} - \hypersetup{pdfsubject={IACR Transactions on Symmetric Cryptology}} - \hypersetup{pdflang=en} -\fi -\fi\fi -\renewcommand{\headrulewidth}{0pt} -\renewcommand{\footrulewidth}{0pt}} -\fancyhf{} % clear all header and footer fields -\fancyhead[RO,LE]{\thepage} -\fancyhead[RE]{\IACR@runningtitle} -\fancyhead[LO]{\IACR@runningauthors} -\renewcommand{\markboth}[2]{} -\pagestyle{fancy} - -\def\subtitle#1{\gdef\@subtitle{#1}} - -%Abstract style, keywords -\def\@IACR@keywords{No keywords given.} - -\def\keywords{\@ifnextchar[{\IACR@@@keywords}{\IACR@@keywords}} -\def\IACR@@@keywords[#1]#2{\gdef\@IACR@PDFkeywords{#1}\gdef\@IACR@keywords{#2}} -\def\IACR@@keywords#1{\gdef\@IACR@keywords{#1}} - -\renewenvironment{abstract}{% - \small\quotation\setlength{\parindent}{0pt}\noindent - \textbf{\textsf{Abstract.}}} - {\smallskip\par\textbf{\textsf{Keywords:}} - \def\and{\unskip\space\textperiodcentered\space\ignorespaces}\@IACR@keywords - \endquotation% - \if@loadhr - %% PDF keywords - \def\and{, }% - \def\thanks##1{}% - \def\footnote##1{}% - \def\inst##1{}% - \def\fnmsep{}% - \def\\{}% - \def\zap@comma@space##1 ,##2{% - ##1% - \ifx##2\@empty\else, \expandafter\zap@comma@space\fi - ##2} - \ifdefined\@IACR@PDFkeywords - \hypersetup{pdfkeywords=\@IACR@PDFkeywords} - \else - \protected@edef\@tmp{\expandafter\@IACR@keywords} - \protected@edef\@tmp{\expandafter\zap@comma@space\@tmp{} ,\@empty} - \hypersetup{pdfkeywords=\@tmp} - \fi - %% PDF author - \def\zap@one,##1{} - \def\zap@last##1,##2{\ifx##1\@empty\else\space and ##1\expandafter\zap@one\fi} - \def\zap@last@comma##1,##2,##3{% - ##1% - \ifx##3\@empty% - \expandafter\zap@last\else - ,\expandafter\zap@last@comma\fi% - ##2,##3} - \def\zap@dbl@space##1 ##2{% - ##1% - \ifx##2\@empty\else\space\expandafter\zap@dbl@space##2\fi} - \protected@edef\@tmp{\expandafter\@author} - % \protected@edef\@tmp{\expandafter\IACR@runningauthors} - \protected@edef\@tmp{\expandafter\zap@last@comma\@tmp,\@empty,\@empty} - \protected@edef\@tmp{\expandafter\zap@comma@space\@tmp{} ,\@empty} - \protected@edef\@tmp{\expandafter\zap@dbl@space\@tmp{} \@empty} - \hypersetup{pdfauthor=\@tmp} - %% PDF title - \hypersetup{pdftitle=\IACR@runningtitle} - \fi -} - - -% Hyperref -\if@loadhr - \RequirePackage{xcolor} - \RequirePackage{etoolbox} - \AtEndPreamble{ - \@ifpackageloaded{hyperref}{}{\usepackage{hyperref}} - \@ifpackageloaded{hyperxmp}{}{\usepackage{hyperxmp}} - \hypersetup{colorlinks=true, - citecolor=black!70!green, - linkcolor=black!70!red} - } - \setcounter{tocdepth}{2} -\fi -% autoref: capitals for Sections, and adding Algorithm -\def\equationautorefname{Equation}% -\def\footnoteautorefname{footnote}% -\def\itemautorefname{item}% -\def\figureautorefname{Figure}% -\def\tableautorefname{Table}% -\def\partautorefname{Part}% -\def\appendixautorefname{Appendix}% -\def\chapterautorefname{Chapter}% -\def\sectionautorefname{Section}% -\def\subsectionautorefname{Subsection}% -\def\subsubsectionautorefname{Subsubsection}% -\def\paragraphautorefname{paragraph}% -\def\subparagraphautorefname{subparagraph}% -\def\FancyVerbLineautorefname{line}% -\def\theoremautorefname{Theorem}% -\def\pageautorefname{page}% -\def\algorithmautorefname{Algorithm} - -% AMS math -\RequirePackage{amsmath,amssymb,amsthm} -\RequirePackage{mathtools} -\theoremstyle{definition} -\newtheorem{definition}{Definition} -\newtheorem{example}{Example} -\newtheorem{exercise}{Exercise} -\newtheorem{property}{Property} -\newtheorem{question}{Question} -\newtheorem{solution}{Solution} - -\theoremstyle{plain} -\newtheorem{theorem}{Theorem} -\newtheorem{proposition}{Proposition} -\newtheorem{problem}{Problem} -\newtheorem{lemma}{Lemma} -\newtheorem{conjecture}{Conjecture} -\newtheorem{corollary}{Corollary} -\newtheorem*{claim}{Claim} - -\theoremstyle{remark} -\newtheorem{remark}{Remark} -\newtheorem{note}{Note} -\newtheorem{case}{Case} - -\theoremstyle{plain} - -%Emulate LLNCS spnewtheorem -\if@spthm -\def\spnewtheorem{\@ifstar{\IACR@spstar}{\IACR@sp}} -\def\IACR@spstar#1#2#3#4{\newtheorem*{#1}{#2}} -\def\IACR@sp#1{\@ifnextchar[{\IACR@sp@b{#1}}{\IACR@sp@a{#1}}} -\def\IACR@sp@a#1#2[#3]#4#5{\newtheorem{#1}{#2}[#3]} -\def\IACR@sp@b#1[#2]#3#4#5{\newtheorem{#1}[#2]{#3}} -\renewcommand{\pushQED}[1]{} -\fi - -% Floats and captions -\if@floatrow -\RequirePackage{floatrow} -\floatsetup[table]{style=Plaintop} -\RequirePackage{caption} -\captionsetup{labelfont={sf,bf}} -\else -\RequirePackage{float} -\newcommand\fs@iacrabove{% - % Swap \abovecaptionskip and \belowcaptionskip - \addtolength\abovecaptionskip{-\belowcaptionskip} - \addtolength\belowcaptionskip{\abovecaptionskip} - \addtolength\abovecaptionskip{-\belowcaptionskip} - \setlength\abovecaptionskip{-\abovecaptionskip} - \fs@plaintop% - \def\@fs@cfont{\sffamily\bfseries}} -\newcommand\fs@iacrbelow{% - \fs@plain% - \def\@fs@cfont{\sffamily\bfseries}} -\floatstyle{iacrabove} -\restylefloat{table} -\floatstyle{iacrbelow} -\restylefloat{figure} -\fi - -% Extra commands -\def\email{\@ifnextchar[{\IACR@@email}{\IACR@email}} -\if@loadhr -\def\IACR@@email[#1]#2{\href{mailto:#1}{\nolinkurl{#2}}} -\def\IACR@email#1{\href{mailto:#1}{\nolinkurl{#1}}} -\else -\RequirePackage{url} -\def\IACR@@email[#1]#2{\url{#2}} -\def\IACR@email#1{\url{#1}} -\fi - -% Line # for submission -\newcommand\linenomathWithnumbersforAMS{% - \ifLineNumbers -%% \ifx\@@par\@@@par\else - \ifnum\interlinepenalty>-\linenopenaltypar - \global\holdinginserts\thr@@ - \advance\interlinepenalty \linenopenalty - \ifhmode % v4.3 - \advance\predisplaypenalty \linenopenalty - \fi -%% \advance\postdisplaypenalty \linenopenalty - \advance\interdisplaylinepenalty \linenopenalty - \fi - \fi - \ignorespaces - } - -\if@submission -\RequirePackage[mathlines]{lineno} -\linenumbers -\def\linenumberfont{\normalfont\tiny\sffamily\color{gray}} - -% Taken from http://phaseportrait.blogspot.fr/2007/08/lineno-and-amsmath-compatibility.html -\newcommand*\patchAmsMathEnvironmentForLineno[1]{% - \expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname - \expandafter\let\csname oldend#1\expandafter\endcsname\csname end#1\endcsname - \renewenvironment{#1}% - {\linenomathWithnumbersforAMS\csname old#1\endcsname}% - {\csname oldend#1\endcsname\endlinenomath}}% -\newcommand*\patchBothAmsMathEnvironmentsForLineno[1]{% - \patchAmsMathEnvironmentForLineno{#1}% - \patchAmsMathEnvironmentForLineno{#1*}}% -\AtBeginDocument{% -%\patchBothAmsMathEnvironmentsForLineno{equation}% -\patchBothAmsMathEnvironmentsForLineno{align}% -\patchBothAmsMathEnvironmentsForLineno{flalign}% -\patchBothAmsMathEnvironmentsForLineno{alignat}% -\patchBothAmsMathEnvironmentsForLineno{gather}% -\patchBothAmsMathEnvironmentsForLineno{multline}% -} -\fi - -% Microtype -\RequirePackage{microtype} - -% Fonts -\usepackage[T1]{fontenc} -\usepackage{lmodern} diff --git a/doc/paper/ihsm_shaft_countermeasures_a.pdf b/doc/paper/ihsm_shaft_countermeasures_a.pdf deleted file mode 100755 index 6f1f857..0000000 Binary files a/doc/paper/ihsm_shaft_countermeasures_a.pdf and /dev/null differ diff --git a/doc/paper/ihsm_shaft_countermeasures_a.svg b/doc/paper/ihsm_shaft_countermeasures_a.svg deleted file mode 100755 index 1c89ced..0000000 --- a/doc/paper/ihsm_shaft_countermeasures_a.svg +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/paper/ihsm_shaft_countermeasures_b.pdf b/doc/paper/ihsm_shaft_countermeasures_b.pdf deleted file mode 100755 index 9ad0f95..0000000 Binary files a/doc/paper/ihsm_shaft_countermeasures_b.pdf and /dev/null differ diff --git a/doc/paper/ihsm_shaft_countermeasures_b.svg b/doc/paper/ihsm_shaft_countermeasures_b.svg deleted file mode 100755 index c6c3e29..0000000 --- a/doc/paper/ihsm_shaft_countermeasures_b.svg +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/paper/ihsm_shaft_countermeasures_c.pdf b/doc/paper/ihsm_shaft_countermeasures_c.pdf deleted file mode 100755 index 5e01be2..0000000 Binary files a/doc/paper/ihsm_shaft_countermeasures_c.pdf and /dev/null differ diff --git a/doc/paper/ihsm_shaft_countermeasures_c.svg b/doc/paper/ihsm_shaft_countermeasures_c.svg deleted file mode 100755 index 715b038..0000000 --- a/doc/paper/ihsm_shaft_countermeasures_c.svg +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/paper/ir_tx_schema.pdf b/doc/paper/ir_tx_schema.pdf deleted file mode 100644 index 0e44ca5..0000000 Binary files a/doc/paper/ir_tx_schema.pdf and /dev/null differ diff --git a/doc/paper/ir_tx_schema.svg b/doc/paper/ir_tx_schema.svg deleted file mode 100644 index 5d54c2b..0000000 --- a/doc/paper/ir_tx_schema.svg +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - 1 - - - 5 - - 3 - - 2 - - 4 - - diff --git a/doc/paper/mesh_gen_viz.pdf b/doc/paper/mesh_gen_viz.pdf deleted file mode 100644 index 7ded2fc..0000000 Binary files a/doc/paper/mesh_gen_viz.pdf and /dev/null differ diff --git a/doc/paper/mesh_gen_viz.svg b/doc/paper/mesh_gen_viz.svg deleted file mode 100644 index 59a31b9..0000000 --- a/doc/paper/mesh_gen_viz.svg +++ /dev/null @@ -1,1547 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - diff --git a/doc/paper/mesh_scan_crop.jpg b/doc/paper/mesh_scan_crop.jpg deleted file mode 100644 index baa8e6c..0000000 Binary files a/doc/paper/mesh_scan_crop.jpg and /dev/null differ diff --git a/doc/paper/photolink_schematic.pdf b/doc/paper/photolink_schematic.pdf deleted file mode 100644 index 3284427..0000000 Binary files a/doc/paper/photolink_schematic.pdf and /dev/null differ diff --git a/doc/paper/photolink_schematic.pro b/doc/paper/photolink_schematic.pro deleted file mode 100644 index 02a2ddf..0000000 --- a/doc/paper/photolink_schematic.pro +++ /dev/null @@ -1,43 +0,0 @@ -update=Tue Dec 1 17:26:36 2020 -version=1 -last_client=eeschema -[general] -version=1 -RootSch= -BoardNm= -[pcbnew] -version=1 -LastNetListRead= -UseCmpFile=1 -PadDrill=0.600000000000 -PadDrillOvalY=0.600000000000 -PadSizeH=1.500000000000 -PadSizeV=1.500000000000 -PcbTextSizeV=1.500000000000 -PcbTextSizeH=1.500000000000 -PcbTextThickness=0.300000000000 -ModuleTextSizeV=1.000000000000 -ModuleTextSizeH=1.000000000000 -ModuleTextSizeThickness=0.150000000000 -SolderMaskClearance=0.000000000000 -SolderMaskMinWidth=0.000000000000 -DrawSegmentWidth=0.200000000000 -BoardOutlineThickness=0.100000000000 -ModuleOutlineThickness=0.150000000000 -[cvpcb] -version=1 -NetIExt=net -[eeschema] -version=1 -LibDir= -[eeschema/libraries] -[schematic_editor] -version=1 -PageLayoutDescrFile= -PlotDirectoryName= -SubpartIdSeparator=0 -SubpartFirstId=65 -NetFmtName= -SpiceAjustPassiveValues=0 -LabSize=50 -ERC_TestSimilarLabels=1 diff --git a/doc/paper/photolink_schematic.sch b/doc/paper/photolink_schematic.sch deleted file mode 100644 index b5c6a64..0000000 --- a/doc/paper/photolink_schematic.sch +++ /dev/null @@ -1,486 +0,0 @@ -EESchema Schematic File Version 4 -EELAYER 30 0 -EELAYER END -$Descr A4 11693 8268 -encoding utf-8 -Sheet 1 1 -Title "" -Date "" -Rev "" -Comp "" -Comment1 "" -Comment2 "" -Comment3 "" -Comment4 "" -$EndDescr -$Comp -L Transistor_BJT:BC847 Q1 -U 1 1 5FC67B72 -P 3450 3300 -F 0 "Q1" H 3641 3300 50 0000 L CNN -F 1 "BC847" H 3641 3255 50 0001 L CNN -F 2 "Package_TO_SOT_SMD:SOT-23" H 3650 3225 50 0001 L CIN -F 3 "http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657" H 3450 3300 50 0001 L CNN - 1 3450 3300 - 1 0 0 -1 -$EndComp -$Comp -L Device:R_Small R1 -U 1 1 5FC6861A -P 3050 3300 -F 0 "R1" V 3246 3300 50 0000 C CNN -F 1 "R_Small" V 3155 3300 50 0000 C CNN -F 2 "" H 3050 3300 50 0001 C CNN -F 3 "~" H 3050 3300 50 0001 C CNN - 1 3050 3300 - 0 -1 -1 0 -$EndComp -Wire Wire Line - 4750 3050 4600 3050 -Wire Wire Line - 3550 2950 3550 3100 -Wire Wire Line - 3150 3300 3250 3300 -$Comp -L power:GND1 #PWR02 -U 1 1 5FC74679 -P 3550 3500 -F 0 "#PWR02" H 3550 3250 50 0001 C CNN -F 1 "GND1" H 3555 3327 50 0000 C CNN -F 2 "" H 3550 3500 50 0001 C CNN -F 3 "" H 3550 3500 50 0001 C CNN - 1 3550 3500 - 1 0 0 -1 -$EndComp -Wire Wire Line - 4750 3250 4650 3250 -Wire Wire Line - 4600 3050 4600 2650 -Wire Wire Line - 4600 2650 4900 2650 -Connection ~ 4600 3050 -Wire Wire Line - 4900 2300 4600 2300 -Wire Wire Line - 4600 2300 4600 2650 -Connection ~ 4600 2650 -Text GLabel 9150 3350 2 50 Input ~ 0 -RX_OUT -Text GLabel 2850 3300 0 50 Input ~ 0 -TX_IN -Wire Wire Line - 2850 3300 2950 3300 -$Comp -L power:+3V3 #PWR01 -U 1 1 5FC80852 -P 3550 2150 -F 0 "#PWR01" H 3550 2000 50 0001 C CNN -F 1 "+3V3" H 3565 2323 50 0000 C CNN -F 2 "" H 3550 2150 50 0001 C CNN -F 3 "" H 3550 2150 50 0001 C CNN - 1 3550 2150 - 1 0 0 -1 -$EndComp -$Comp -L Device:Opamp_Quad_Generic U1 -U 4 1 5FC81BCB -P 5250 4650 -F 0 "U1" H 5250 4375 50 0000 C CNN -F 1 "MCP6494" H 5250 4374 50 0001 C CNN -F 2 "" H 5250 4650 50 0001 C CNN -F 3 "~" H 5250 4650 50 0001 C CNN - 4 5250 4650 - 1 0 0 1 -$EndComp -$Comp -L Device:R R2 -U 1 1 5FC87551 -P 3550 2400 -F 0 "R2" H 3620 2400 50 0000 L CNN -F 1 "R" H 3620 2355 50 0001 L CNN -F 2 "" V 3480 2400 50 0001 C CNN -F 3 "~" H 3550 2400 50 0001 C CNN - 1 3550 2400 - 1 0 0 -1 -$EndComp -$Comp -L Device:Opamp_Quad_Generic U1 -U 2 1 5FC77130 -P 7200 3250 -F 0 "U1" H 7200 2975 50 0000 C CNN -F 1 "MCP6494" H 7200 2974 50 0001 C CNN -F 2 "" H 7200 3250 50 0001 C CNN -F 3 "~" H 7200 3250 50 0001 C CNN - 2 7200 3250 - 1 0 0 1 -$EndComp -$Comp -L Device:Opamp_Quad_Generic U1 -U 1 1 5FC6A2B7 -P 5050 3150 -F 0 "U1" H 5050 2783 50 0000 C CNN -F 1 "MCP6494" H 5050 2874 50 0000 C CNN -F 2 "" H 5050 3150 50 0001 C CNN -F 3 "~" H 5050 3150 50 0001 C CNN - 1 5050 3150 - 1 0 0 1 -$EndComp -Wire Wire Line - 7500 3250 7600 3250 -Wire Wire Line - 3550 2250 3550 2150 -$Comp -L Device:D_ALT LED1 -U 1 1 5FC90B25 -P 3550 2800 -F 0 "LED1" V 3550 3100 50 0000 R CNN -F 1 "D_ALT" V 3505 2720 50 0001 R CNN -F 2 "" H 3550 2800 50 0001 C CNN -F 3 "~" H 3550 2800 50 0001 C CNN - 1 3550 2800 - 0 -1 -1 0 -$EndComp -Wire Wire Line - 3550 2550 3550 2650 -$Comp -L Device:D_ALT PD1 -U 1 1 5FC93B60 -P 4150 2800 -F 0 "PD1" V 4150 2880 50 0000 L CNN -F 1 "D_ALT" V 4105 2720 50 0001 R CNN -F 2 "" H 4150 2800 50 0001 C CNN -F 3 "~" H 4150 2800 50 0001 C CNN - 1 4150 2800 - 0 1 1 0 -$EndComp -Wire Wire Line - 4150 3050 4150 2950 -Wire Wire Line - 4150 3050 4600 3050 -$Comp -L Device:R R3 -U 1 1 5FC9B279 -P 4350 4500 -F 0 "R3" H 4420 4500 50 0000 L CNN -F 1 "R" H 4420 4455 50 0001 L CNN -F 2 "" V 4280 4500 50 0001 C CNN -F 3 "~" H 4350 4500 50 0001 C CNN - 1 4350 4500 - 1 0 0 -1 -$EndComp -$Comp -L Device:R R4 -U 1 1 5FC9B8DC -P 4350 5000 -F 0 "R4" H 4420 5000 50 0000 L CNN -F 1 "R" H 4420 4955 50 0001 L CNN -F 2 "" V 4280 5000 50 0001 C CNN -F 3 "~" H 4350 5000 50 0001 C CNN - 1 4350 5000 - 1 0 0 -1 -$EndComp -$Comp -L Device:C C1 -U 1 1 5FC9BF27 -P 4650 5000 -F 0 "C1" H 4765 5000 50 0000 L CNN -F 1 "C" H 4765 4955 50 0001 L CNN -F 2 "" H 4688 4850 50 0001 C CNN -F 3 "~" H 4650 5000 50 0001 C CNN - 1 4650 5000 - 1 0 0 -1 -$EndComp -Wire Wire Line - 4350 4650 4350 4750 -Wire Wire Line - 4350 4750 4650 4750 -Wire Wire Line - 4650 4750 4650 4850 -Connection ~ 4350 4750 -Wire Wire Line - 4350 4750 4350 4850 -$Comp -L power:GND2 #PWR05 -U 1 1 5FC9F5E3 -P 4350 5300 -F 0 "#PWR05" H 4350 5050 50 0001 C CNN -F 1 "GND2" H 4355 5127 50 0000 C CNN -F 2 "" H 4350 5300 50 0001 C CNN -F 3 "" H 4350 5300 50 0001 C CNN - 1 4350 5300 - 1 0 0 -1 -$EndComp -Wire Wire Line - 4350 5300 4350 5250 -Wire Wire Line - 4650 5150 4650 5250 -Wire Wire Line - 4650 5250 4350 5250 -Connection ~ 4350 5250 -Wire Wire Line - 4350 5250 4350 5150 -$Comp -L power:+3V0 #PWR04 -U 1 1 5FCA206B -P 4350 4250 -F 0 "#PWR04" H 4350 4100 50 0001 C CNN -F 1 "+3V0" H 4365 4423 50 0000 C CNN -F 2 "" H 4350 4250 50 0001 C CNN -F 3 "" H 4350 4250 50 0001 C CNN - 1 4350 4250 - 1 0 0 -1 -$EndComp -Wire Wire Line - 4350 4250 4350 4350 -Wire Wire Line - 4950 4750 4650 4750 -Connection ~ 4650 4750 -Wire Wire Line - 4950 4550 4800 4550 -Wire Wire Line - 4800 4550 4800 4150 -Wire Wire Line - 4800 4150 5700 4150 -Wire Wire Line - 5700 4150 5700 4650 -Wire Wire Line - 5700 4650 5550 4650 -Connection ~ 5700 4650 -$Comp -L Device:R R5 -U 1 1 5FCB3FD4 -P 5050 2650 -F 0 "R5" V 4843 2650 50 0000 C CNN -F 1 "100k" V 4934 2650 50 0000 C CNN -F 2 "" V 4980 2650 50 0001 C CNN -F 3 "~" H 5050 2650 50 0001 C CNN - 1 5050 2650 - 0 1 1 0 -$EndComp -$Comp -L Device:C C2 -U 1 1 5FCB45E4 -P 5050 2300 -F 0 "C2" V 5302 2300 50 0000 C CNN -F 1 "7p" V 5211 2300 50 0000 C CNN -F 2 "" H 5088 2150 50 0001 C CNN -F 3 "~" H 5050 2300 50 0001 C CNN - 1 5050 2300 - 0 -1 -1 0 -$EndComp -Wire Wire Line - 5200 2300 5500 2300 -Wire Wire Line - 5500 2300 5500 2650 -Wire Wire Line - 5500 3150 5350 3150 -$Comp -L Device:R R6 -U 1 1 5FCB92E2 -P 6150 3150 -F 0 "R6" V 5943 3150 50 0000 C CNN -F 1 "1k" V 6034 3150 50 0000 C CNN -F 2 "" V 6080 3150 50 0001 C CNN -F 3 "~" H 6150 3150 50 0001 C CNN - 1 6150 3150 - 0 1 1 0 -$EndComp -$Comp -L Device:R R7 -U 1 1 5FCB995A -P 7200 2700 -F 0 "R7" V 6993 2700 50 0000 C CNN -F 1 "100k" V 7084 2700 50 0000 C CNN -F 2 "" V 7130 2700 50 0001 C CNN -F 3 "~" H 7200 2700 50 0001 C CNN - 1 7200 2700 - 0 1 1 0 -$EndComp -Wire Wire Line - 5600 3150 5500 3150 -Connection ~ 5500 3150 -Wire Wire Line - 7350 2700 7600 2700 -Wire Wire Line - 7600 2700 7600 3250 -Wire Wire Line - 9150 3350 9050 3350 -Wire Wire Line - 5200 2650 5500 2650 -Connection ~ 5500 2650 -Wire Wire Line - 5500 2650 5500 3150 -$Comp -L power:+3V0 #PWR03 -U 1 1 5FCC0528 -P 4150 2150 -F 0 "#PWR03" H 4150 2000 50 0001 C CNN -F 1 "+3V0" H 4165 2323 50 0000 C CNN -F 2 "" H 4150 2150 50 0001 C CNN -F 3 "" H 4150 2150 50 0001 C CNN - 1 4150 2150 - 1 0 0 -1 -$EndComp -Wire Wire Line - 4150 2150 4150 2650 -$Comp -L Graphic:SYM_Arrow_Normal #SYM1 -U 1 1 5FCC452D -P 3850 2775 -F 0 "#SYM1" H 3850 2835 50 0001 C CNN -F 1 "SYM_Arrow_Normal" H 3860 2725 50 0001 C CNN -F 2 "" H 3850 2775 50 0001 C CNN -F 3 "~" H 3850 2775 50 0001 C CNN - 1 3850 2775 - 1 0 0 -1 -$EndComp -$Comp -L Graphic:SYM_Arrow_Normal #SYM2 -U 1 1 5FCC5099 -P 3850 2850 -F 0 "#SYM2" H 3850 2910 50 0001 C CNN -F 1 "SYM_Arrow_Normal" H 3860 2800 50 0001 C CNN -F 2 "" H 3850 2850 50 0001 C CNN -F 3 "~" H 3850 2850 50 0001 C CNN - 1 3850 2850 - 1 0 0 -1 -$EndComp -Wire Notes Line - 3200 3000 4450 3000 -Wire Notes Line - 4450 3000 4450 2600 -Wire Notes Line - 4450 2600 3200 2600 -Wire Notes Line - 3200 2600 3200 3000 -Text Notes 2900 2700 0 50 ~ 0 -IR link -Wire Wire Line - 4650 3750 5950 3750 -Wire Wire Line - 5950 4650 5950 3750 -Wire Wire Line - 5700 4650 5950 4650 -Wire Notes Line - 3850 1550 3850 5700 -Text Notes 3750 1750 2 100 ~ 0 -Stator -Text Notes 3950 1750 0 100 ~ 0 -Rotor -Text Label 5650 3750 2 50 ~ 0 -VGND -Text Notes 5300 1950 2 50 ~ 0 -TIA G=100kΩ -Text Notes 7500 2350 2 50 ~ 0 -Amplifier G=100 -Text Notes 8950 2900 2 50 ~ 0 -Comparator -Text Notes 5650 4000 2 50 ~ 0 -Virtual Ground Buffer -$Comp -L Device:C C3 -U 1 1 5FC76733 -P 5750 3150 -F 0 "C3" V 5900 3150 50 0000 C CNN -F 1 "7p" V 5911 3150 50 0001 C CNN -F 2 "" H 5788 3000 50 0001 C CNN -F 3 "~" H 5750 3150 50 0001 C CNN - 1 5750 3150 - 0 1 1 0 -$EndComp -Wire Wire Line - 6650 3350 6650 3750 -Wire Wire Line - 6650 3350 6900 3350 -Connection ~ 6650 3750 -$Comp -L Device:Opamp_Quad_Generic U1 -U 3 1 5FC7A609 -P 8750 3350 -F 0 "U1" H 8750 3075 50 0000 C CNN -F 1 "MCP6494" H 8750 3074 50 0001 C CNN -F 2 "" H 8750 3350 50 0001 C CNN -F 3 "~" H 8750 3350 50 0001 C CNN - 3 8750 3350 - 1 0 0 1 -$EndComp -$Comp -L Device:C C4 -U 1 1 5FC8AF8D -P 7850 3250 -F 0 "C4" V 8102 3250 50 0000 C CNN -F 1 "7p" V 8011 3250 50 0001 C CNN -F 2 "" H 7888 3100 50 0001 C CNN -F 3 "~" H 7850 3250 50 0001 C CNN - 1 7850 3250 - 0 1 1 0 -$EndComp -$Comp -L Device:R R8 -U 1 1 5FC9BACD -P 6400 3400 -F 0 "R8" V 6300 3400 50 0000 C CNN -F 1 "1k" V 6284 3400 50 0001 C CNN -F 2 "" V 6330 3400 50 0001 C CNN -F 3 "~" H 6400 3400 50 0001 C CNN - 1 6400 3400 - -1 0 0 1 -$EndComp -Wire Wire Line - 5950 3750 6400 3750 -Connection ~ 5950 3750 -Wire Wire Line - 6400 3550 6400 3750 -Connection ~ 6400 3750 -Wire Wire Line - 6400 3750 6650 3750 -Wire Wire Line - 6300 3150 6400 3150 -Wire Wire Line - 6400 3250 6400 3150 -Wire Wire Line - 6400 2700 7050 2700 -Connection ~ 6400 3150 -Wire Wire Line - 6400 3150 6900 3150 -Wire Wire Line - 6400 3150 6400 2700 -Wire Wire Line - 6000 3150 5900 3150 -$Comp -L Device:R R9 -U 1 1 5FCAEC24 -P 8100 3500 -F 0 "R9" V 8000 3500 50 0000 C CNN -F 1 "100k" V 7984 3500 50 0001 C CNN -F 2 "" V 8030 3500 50 0001 C CNN -F 3 "~" H 8100 3500 50 0001 C CNN - 1 8100 3500 - -1 0 0 1 -$EndComp -Wire Wire Line - 7600 3250 7700 3250 -Connection ~ 7600 3250 -Wire Wire Line - 8450 3450 8350 3450 -Wire Wire Line - 8000 3250 8100 3250 -Wire Wire Line - 6650 3750 8100 3750 -Wire Wire Line - 8350 3450 8350 3750 -Wire Wire Line - 8100 3350 8100 3250 -Connection ~ 8100 3250 -Wire Wire Line - 8100 3250 8450 3250 -Connection ~ 8100 3750 -Wire Wire Line - 8100 3750 8350 3750 -Wire Wire Line - 8100 3650 8100 3750 -Wire Wire Line - 4650 3250 4650 3750 -Text Notes 5700 3750 0 50 ~ 0 -1/2 VCC = 1.5V -$EndSCHEMATC diff --git a/doc/paper/photolink_schematic.svg b/doc/paper/photolink_schematic.svg deleted file mode 100644 index a24a7ec..0000000 --- a/doc/paper/photolink_schematic.svg +++ /dev/null @@ -1,3246 +0,0 @@ - - - - - - image/svg+xml - - SVG Picture created as photolink_schematic.svg date 2020/12/01 17:27:56 - - - - - - SVG Picture created as photolink_schematic.svg date 2020/12/01 17:27:56 - Picture generated by Eeschema-SVG - - - - - - - - - GND2 - - - - - - - - - - - - - - - - - - R2 - - - - - - - - - - - - - - - - - - - - - - + - - - - - 5 - - - - - - - - - - 6 - - - 7 - - - - U1B - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - 2 - - - - - + - - - - - 3 - - - - U1A - - - - - - MCP6494 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LED1 - - - - - - - - - - - - - - - - - - - - - R9 - - - - - - - - - - - - - - - - - - - - - - - - - PD1 - - - - - - - - - - - - - - - - - - R3 - - - - - - - - - - - - - - - - - - C1 - - - - - - - - - - - - - - - - - R4 - - - - - - - - - - - - - - - - - - - - - - - - - +3V0 - - - - - - - - - - - - - - - - - - - - - - - - - - +3V0 - - - - - - - - - - - - - - - - - - - R5 - - - - 100k - - - - - - - - - - - - - - - - - - - - - - C2 - - - 7p - - - - - - - - - - - - - - - - - R7 - - - - 100k - - - - - - - - - - - - - - - - - - - - - R6 - - - - 1k - - - - - - - - - - - - - - - - - +3V3 - - - - - - - - - - - - - - - - - - - R1 - - - - - R_Small - - - - - - - - - - - - - - - - - - - - - GND1 - - - - - - - - - - - - - - - - - - - - R8 - - - - - - - - - - - - - - - - - - - C4 - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - Q1 - - - - - - - - - - - - - - - - - - - - - - - + - - - - - 10 - - - - - 8 - - - - - - - - - - 9 - - - - U1C - - - - - - - - - - - - - - - - - - - - - - - + - - - - - 12 - - - - - - - - - - - - 13 - - - - - 14 - - - - - - - U1D - - - - - - - - - - - - - - - - - - - C3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RX_OUT - - - - - - - - - - - - - - - TX_IN - - - - - - - - - - - - - - VGND - - - - - - - 1/2 VCC = 1.5V - - - - - - - - - - - - - - - Virtual Ground Buffer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Comparator - - - - - - - - - - - - - - - - - - - Amplifier G=100 - - - - - - - - - - - - - - - - - - - - - - - - - TIA G=100kΩ - - - - - - - - - - - - - - - - - Rotor - - - - - - - - - Stator - - - - - - - - - - - IR link - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/paper/proto_3d_design.jpg b/doc/paper/proto_3d_design.jpg deleted file mode 100644 index f527828..0000000 Binary files a/doc/paper/proto_3d_design.jpg and /dev/null differ diff --git a/doc/paper/prototype_early_comms_small.jpg b/doc/paper/prototype_early_comms_small.jpg deleted file mode 100644 index 506da48..0000000 Binary files a/doc/paper/prototype_early_comms_small.jpg and /dev/null differ diff --git a/doc/paper/prototype_pic.jpg b/doc/paper/prototype_pic.jpg deleted file mode 100644 index 2200d6d..0000000 Binary files a/doc/paper/prototype_pic.jpg and /dev/null differ diff --git a/doc/paper/prototype_pic2.jpg b/doc/paper/prototype_pic2.jpg deleted file mode 100644 index 7838a75..0000000 Binary files a/doc/paper/prototype_pic2.jpg and /dev/null differ diff --git a/doc/paper/rotohsm.bib b/doc/paper/rotohsm.bib deleted file mode 100644 index c5ba6fe..0000000 --- a/doc/paper/rotohsm.bib +++ /dev/null @@ -1,249 +0,0 @@ -% Encoding: UTF-8 -@comment{x-kbibtex-encoding=utf-8} - -@Book{anderson2020, - author = {Ross Anderson}, - date = {2020-09-16}, - title = {Security Engineering}, - isbn = {978-1-119-64281-7}, -} - -@techreport{smith1998, - author = {Sean Smith and Steve Weingart}, - date = {1998-02-19}, - institution = {IBM T.J. Watson Research Center}, - title = {Building a High-Performance, Programmable Secure Coprocessor}, - url = {ftp://www6.software.ibm.com/software/cryptocards/rc21102.pdf}, - urldate = {2020-09-16} -} - -@article{immler2019, - author = {Vincent Immler and Johannes Obermaier and Kuan Kuan Ng and Fei Xiang Ke and Jin Yu Lee and Yak Peng Lim and Wei Koon Oh and Keng Hoong Wee and Georg Sigl}, - date = {2019}, - doi = {10.13154/tches.v2019.i1.51-96}, - issn = {2569-2925}, - journal = {IACR transactions on cryptographic hardware and embedded systems.}, - journaltitle = {IACR Transactions on Cryptographic Hardware and Embedded Systems}, - publisher = {IACR}, - title = {Secure Physical Enclosures from Covers with Tamper-Resistance}, - url = {https://tches.iacr.org/index.php/TCHES/article/view/7334/6506}, - urldate = {2020-09-16} -} - -@article{obermaier2018, - author = {Johannes Obermaier and Vincent Immler}, - date = {2018}, - doi = {10.1007/s41635-018-0045-2}, - issn = {2509-3428}, - journaltitle = {Journal of Hardware and Systems Security}, - pages = {289–296}, - title = {The Past, Present, and Future of Physical Security Enclosures: From Battery-Backed Monitoring to PUF-Based Inherent Security and Beyond}, - volume = {2}, - year = {2018} -} - -@article{tobisch2020, - author = {Johannes Tobisch and Christian Zenger and Christof Paar}, - date = {2020-03-13}, - journaltitle = {TRUDEVICE 2020: 9th Workshop on Trustworthy Manufacturing and Utilization of Secure Devices}, - title = {Electromagnetic Enclosure PUF for Tamper Proofing Commodity Hardware and otherApplications}, - url = {https://www.emsec.ruhr-uni-bochum.de/media/crypto/veroeffentlichungen/2020/05/13/trudevice_submission_enclosure_puf.pdf}, - urldate = {2020-09-17} -} - -@article{kreft2012, - author = {Heinz Kreft and Wael Adi}, - date = {2012}, - doi = {10.1109/ahs.2012.6268655}, - journaltitle = {2012 NASA/ESA Conference on Adaptive Hardware and Systems (AHS)}, - title = {Cocoon-PUF, a novel mechatronic secure element technology}, - year = {2012} -} - -@Patent{rahman1988, - author = {Mujib Rahman}, - date = {1988-03-10}, - number = {US Patent US4859024A}, - title = {Optical fiber cable with tampering detecting means}, -} - -@www{haines2006, - author = {Lester Haines}, - date = {2006-09-25}, - editor = {The Register}, - title = {US outfit patents 'invisible' UAV: Stealth through persistence of vision}, - url = {https://www.theregister.com/2006/09/25/phantom_sentinel/}, - urldate = {2020-09-17} -} - -@article{frazelle2019, - author = {Jessie Frazelle}, - date = {2019-12-01}, - doi = {10.1145/3380774.3382016}, - journaltitle = {ACM Queue}, - title = {Securing the Boot Process: The hardware root of trust}, - url = {https://dl.acm.org/doi/fullHtml/10.1145/3380774.3382016}, - urldate = {2020-10-22} -} - -@Article{albartus2020, - author = {Nils Albartus and Max Hoffmann and Sebastian Temme and Leonid Azriel and Christof Paar}, - date = {2020}, - title = {{DANA} Universal Dataflow Analysis for Gate-Level Netlist Reverse Engineering}, - doi = {10.13154/tches.v2020.i4.309-336}, - number = {4}, - pages = {309–336}, - volume = {2020}, - bibsource = {dblp computer science bibliography, https://dblp.org}, - biburl = {https://dblp.org/rec/journals/tches/AlbartusHTAP20.bib}, - journal = {{IACR} Transactions on Cryptographic Hardware and Embedded Systems}, - year = {2020}, -} - -@InProceedings{trippel2017, - author = {Timothy Trippel and Ofir Weisse and Wenyuan Xu and Peter Honeyman and Kevin Fu}, - booktitle = {2017 IEEE European symposium on security and privacy}, - title = {WALNUT: Waging doubt on the integrity of MEMS accelerometers with acoustic injection attacks}, - organization = {IEEE}, - pages = {3–18}, - x-fetchedfrom = {Google Scholar}, - year = {2017}, -} - -@WWW{heise2020t2jailbreak, - author = {Leo Becker}, - date = {2020-03-11}, - title = {Jailbreaker nehmen T2-Sicherheitschip von Macs ins Visier}, - url = {https://www.heise.de/mac-and-i/meldung/Jailbreaker-nehmen-T2-Sicherheitschip-von-Macs-ins-Visier-4681131.html}, - organization = {Heise Online}, - publisher = {Heise Online}, -} - -@article{kim2018, - author = {Seung Hyun Kim and Su Chang Lim and others}, - journal = {Annals of Nuclear Energy}, - pages = {845–855}, - publisher = {Elsevier}, - title = {Intelligent intrusion detection system featuring a virtual fence, active intruder detection, classification, tracking, and action recognition}, - volume = {112}, - x-fetchedfrom = {Google Scholar}, - year = {2018} -} - -@Conference{johnson2018, - author = {Scott Johnson and Dominic Rizzo and Parthasarathy Ranganathan and Jon McCune and Richard Ho}, - booktitle = {Hot Chips: A Symposium on High Performance Chips}, - date = {2018}, - title = {Titan: enabling a transparent silicon root of trust for Cloud}, - url = {https://www.hotchips.org/hc30/1conf/1.14_Google_Titan_GoogleFinalTitanHotChips2018.pdf}, - x-fetchedfrom = {Google Scholar}, - year = {2018}, -} - -@TechReport{isaacs2013, - author = {Phil Isaacs and Thomas {Morris Jr} and Michael J Fisher and Keith Cuthbert}, - date = {2013}, - institution = {Surface Mount Technology Association}, - title = {Tamper proof, tamper evident encryption technology}, - booktitle = {Pan Pacific Microelectronics Symposium}, - organization = {Surface Mount Technology Association}, - x-fetchedfrom = {Google Scholar}, - year = {2013}, -} - -@inproceedings{drimer2008, - author = {Saar Drimer and Steven J Murdoch and Ross Anderson}, - booktitle = {2008 IEEE Symposium on Security and Privacy (sp 2008)}, - organization = {IEEE}, - pages = {281–295}, - title = {Thinking inside the box: system-level failures of tamper proofing}, - x-fetchedfrom = {Google Scholar}, - year = {2008} -} - -@WWW{terdiman2013, - author = {Daniel Terdiman}, - date = {2013-07-23}, - title = {Aboard America's Doomsday command and control plane}, - url = {https://www.cnet.com/news/aboard-americas-doomsday-command-and-control-plane}, - organization = {cnet.com}, - month = jul, - publisher = {CNET}, - year = {2013}, -} - -@Thesis{vrijaldenhoven2004, - author = {Serge Vrijaldenhoven}, - date = {2004-10-01}, - institution = {Technische Universiteit Eindhoven}, - title = {Acoustical Physical Uncloneable Functions}, - type = {mathesis}, - url = {https://pure.tue.nl/ws/files/46971492/600055-1.pdf}, -} - -@WWW{dexter2015, - author = {Karsten Nohl and Fabian Bräunlein and dexter}, - date = {2015-12-27}, - title = {Shopshifting: The potential for payment system abuse}, - url = {https://media.ccc.de/v/32c3-7368-shopshifting#t=2452}, - organization = {32C3 Chaos Communication Congress}, -} - -@WWW{newman2020, - author = {Lily Hay Newman}, - date = {2020-10-06}, - title = {Apple's T2 Security Chip Has an Unfixable Flaw}, - url = {https://www.wired.com/story/apple-t2-chip-unfixable-flaw-jailbreak-mac/}, - organization = {Wired Magazine}, -} - -@Article{sh2016, - author = {Maruthi G. S. and Vishwanath Hegde}, - date = {2016}, - journaltitle = {IEEE Sensors Journal}, - title = {Application of MEMS Accelerometer for Detection and Diagnosis of Multiple Faults in the Roller Element Bearings of Three Phase Induction Motor}, - doi = {https://doi.org/10.1109/JSEN.2015.2476561}, - issn = {1558-1748}, - issue = {1}, - url = {https://www.researchgate.net/profile/Vishwanath-Hegde-2/publication/282389149_Application_of_MEMS_Accelerometer_for_Detection_and_Diagnosis_of_Multiple_Faults_in_the_Roller_Element_Bearings_of_Three_Phase_Induction_Motor/links/568bace808aebccc4e1c01fa/Application-of-MEMS-Accelerometer-for-Detection-and-Diagnosis-of-Multiple-Faults-in-the-Roller-Element-Bearings-of-Three-Phase-Induction-Motor.pdf}, - volume = {16}, -} - -@Article{kvk2019, - author = {Ivar Koene and Raine Viitala and Petri Kuosmanen}, - date = {2019}, - journaltitle = {IEEE Access}, - title = {Internet of Things Based Monitoring of Large Rotor Vibration With a Microelectromechanical Systems Accelerometer}, - doi = {https://doi.org/10.1109/ACCESS.2019.2927793}, -} - -@TechReport{adc2019, - author = {Bertrand Campagnie}, - date = {2019}, - institution = {Analog Devices}, - title = {Choose the Right Accelerometer for Predictive Maintenance}, - url = {https://www.analog.com/media/en/technical-documentation/tech-articles/Choose-the-Right-Accelerometer-for-Predictive-Maintenance.pdf}, - urldate = {2021-04-01}, -} - -@PhdThesis{e2013, - author = {Maged Elsaid Elnady}, - date = {2013}, - institution = {University of Manchester}, - title = {On-Shaft Vibration Measurement Using a MEMS Accelerometer for Faults Diagnosis in Rotating Machines}, - url = {https://www.research.manchester.ac.uk/portal/files/54530535/FULL_TEXT.PDF}, - urldate = {2021-04-01}, -} - -@Book{iaea2011, - author = {{{International Atomic Energy Agency}}}, - date = {2011}, - title = {Safeguards, techniques and equipmen.}, - isbn = {978-92-0-118910-3}, - series = {International Nuclear Verification Series}, - url = {https://www-pub.iaea.org/MTCD/Publications/PDF/nvs1_web.pdf}, - urldate = {2021-04-01}, - volume = {1}, -} - -@Comment{jabref-meta: databaseType:biblatex;} diff --git a/doc/paper/rotohsm_paper.pdf b/doc/paper/rotohsm_paper.pdf deleted file mode 100644 index 7ef9489..0000000 Binary files a/doc/paper/rotohsm_paper.pdf and /dev/null differ diff --git a/doc/paper/rotohsm_paper.tex b/doc/paper/rotohsm_paper.tex deleted file mode 100644 index 8c24274..0000000 --- a/doc/paper/rotohsm_paper.tex +++ /dev/null @@ -1,742 +0,0 @@ -\documentclass[nohyperref]{iacrtrans} -\usepackage[T1]{fontenc} -\usepackage[ - backend=biber, - style=numeric, - natbib=true, - url=false, - doi=true, - eprint=false - ]{biblatex} -\addbibresource{rotohsm.bib} -\usepackage{amssymb,amsmath} -\usepackage{eurosym} -\usepackage{wasysym} -\usepackage{amsthm} - -\usepackage[binary-units]{siunitx} -\DeclareSIUnit{\baud}{Bd} -\DeclareSIUnit{\year}{a} -\usepackage{commath} -\usepackage{graphicx,color} -\usepackage{subcaption} -\usepackage{array} -\usepackage{hyperref} - -\renewcommand{\floatpagefraction}{.8} -\newcommand{\degree}{\ensuremath{^\circ}} -\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}} -\newcommand{\partnum}[1]{\texttt{#1}} - -\begin{document} - -\title[Can't Touch This]{Inertial HSMs Thwart Advanced Physical Attacks} -\author{Jan Sebastian Götte \and Björn Scheuermann} -\institute{HIIG\\ \email{ihsm@jaseg.de} \and HU Berlin \\ \email{scheuermann@informatik.hu-berlin.de}} -% FIXME keywords -\keywords{hardware security \and implementation \and smart cards \and electronic commerce} -\maketitle - -\begin{abstract} - In this paper, we introduce a novel countermeasure against physical attacks: Inertial hardware security modules - (iHSMs). Conventional systems have in common that their security requires the crafting of fine sensor structures - that respond to minute manipulations of the monitored security boundary or volume. Our approach is novel in that we - reduce the sensitivity requirement of security meshes and other sensors and increase the complexity of any - manipulations by rotating the security mesh or sensor at high speed---thereby presenting a moving target to an - attacker. Attempts to stop the rotation are easily monitored with commercial MEMS accelerometers and gyroscopes. - Our approach leads to a HSM that can easily be built from off-the-shelf parts by any university electronics lab, yet - offers a level of security that is comparable to commercial HSMs. We have built a proof of concept hardware - prototype that demonstrates solutions to the concept's main engineering challenges. As part of this proof of - concept, we have found that a system using a coarse security mesh made from commercial printed circuit boards and an - automotive high g-force accelerometer already provides a useful level of security. -\end{abstract} - -\section{Introduction} - -While information security technology has matured a great deal in the last half century, physical security not kept up -with the pace of the remainder of this industry. Given the right skills, physical access to a computer still often -allows full compromise. The physical security of modern server hardware hinges on what lock you put on the room it is -in. - -Currently, servers and other computers are rarely physically secured as a whole. Servers sometimes have a simple lid -switch and are put in locked ``cages'' inside guarded facilities. This usually provides a good compromise between -physical security and ease of maintenance. To handle highly sensitive data in applications such as banking or public key -infrastructure, general-purpose and low-security servers are augmented with dedicated, physically secure cryptographic -co-processors such as trusted platform modules (TPMs) or hardware security modules (HSMs). Using a limited amount of -trust in components such as the CPU, the larger system's security can then be reduced to that of its physically secured -TPM~\cite{newman2020,frazelle2019,johnson2018}. -Like smartcards, TPMs rely on a modern IC being hard to tamper with. Shrinking things to the nanoscopic level to secure -them against tampering is a good engineering solution for some years to come. However, in essence this is a type of -security by obscurity: Obscurity here referring to the rarity of the equipment necessary to attack modern -ICs~\cite{albartus2020,anderson2020}. - -In contrast to TPMs and Smartcards, HSMs rely on an active security barrier usually consisting of a fragile foil with -conductive traces. These traces are much larger scale than a smart card IC's microscopic structures, and instead are -designed to be very hard to remove intact. While we are certain that there still are many insights to be gained in both -technologies, we wish to introduce a novel approach to sidestep the manufacturing issues of both and provide radically -better security against physical attacks. Our core observation is that any cheap but coarse HSM technology can be made -much more difficult to attack by moving it very quickly. - -For example, consider an HSM as it is used in online credit card payment processing. Its physical security level is set -by the structure size of its security mesh. An attack on its mesh might involve fine drill bits, needles, wires, glue, -solder and lasers~\cite{drimer2008}. Now consider the same HSM mounted on a large flywheel. In addition to its usual -defenses, this modified HSM is now equipped with an accelerometer that it uses to verify that it is spinning at high -speed. How would an attacker approach this HSM? They would have to either slow down the rotation---which triggers the -accelerometer's monitoring circuit---or they would have to attack the HSM in motion. The HSM literally becomes a moving -target. At slow speeds, rotating the entire attack workbench might be possible---but rotating frames of reference -quickly become inhospitable to human life (see Section~\ref{sec_swivel_chair_attack}). Since non-contact electromagnetic -or optical attacks are more limited in the first place and can be shielded, we have effectively forced the attacker to -use an ``attack robot''. - -This paper contains the following contributions: -\begin{enumerate} - \item We present the \emph{Inertial HSM} concept. Inertial HSMs enable cost effective, small scale production of - highly secure HSMs. - \item We discuss possible tamper sensors for inertial HSMs. - \item We explore the design space of our inertial HSM concept. - \item We present our work on a prototype inertial HSM (Figure~\ref{prototype_picture}). - \item We present an analysis on the viability of using commodity MEMS accelerometers as braking sensors. - % FIXME \item Measurement of the prototype HSM's susceptibility to various types of attack. -\end{enumerate} - -\begin{figure} - \center - \includegraphics[width=12cm]{prototype_pic2.jpg} - \caption{The protoype as we used it to test power transfer and bidirectional communication between stator and rotor. - This picture shows the proof of concept prototype's configuration that we used for accelerometer characterization - (Section~\ref{sec_accel_meas}) without the vertical security mesh struts that connect the circular top and bottom - outer meshes.} - \label{prototype_picture} -\end{figure} - -In Section~\ref{sec_related_work}, we will give an overview of the state of the art in HSM physical security. On this -basis, in Section~\ref{sec_ihsm_construction} we will elaborate the principles of our Inertial HSM approach. We will -analyze its weaknesses in Section~\ref{sec_attacks}. Based on these results we have built a proof of concept hardware -prototype that whose design we will elaborate in Section~\ref{sec_proto}. In Section~\ref{sec_accel_meas} we present our -characterization of an automotive MEMS accelerometer IC as a rotation sensor in this proof of concept prototype. We -conclude this paper with a general evaluation of our design in Section~\ref{sec_conclusion}. - -\section{Related work} -\label{sec_related_work} -% summaries of research papers on HSMs. I have not found any actual prior art on anything involving mechanical motion -% beyond ultrasound. - -In this section, we will briefly explore the history of HSMs and the state of academic research on active tamper -detection. - -HSMs are an old technology that traces back decades in its electronic realization. Today's common approach of monitoring -meandering electrical traces on a fragile foil that is wrapped around the HSM essentially transforms the security -problem into the challenge to manufacture very fine electrical traces on a flexible foil~\cite{isaacs2013, immler2019, -anderson2020}. There has been some research on monitoring the HSM's inside using e.g.\ electromagnetic -radiation~\cite{tobisch2020, kreft2012} or ultrasound~\cite{vrijaldenhoven2004} but none of this research has found -widespread adoption yet. - -HSMs can be compared to physical seals~\cite{anderson2020}. Both are tamper evident devices. The difference is that a -HSM continuously monitors itself whereas a physical seal only serves to record tampering and requires someone to examine -it. This examination can be by eye in the field, but it can also be carried out in a laboratory using complex equipment. -An HSM in principle has to have this examination equipment built-in. - -Physical seals are used in a wide variety of applications, but the most interesting ones from a research point of view -that are recorded in public literature are those used in monitoring of nuclear material under the International Atomic -Energy Authority (IAEA). Most of these seals use the same approach that is used in Physically -Uncloneable Functions (PUFs), though their development predates that of PUFs by several decades. The seal is created in -a way that intentionally causes large, random device to device variations. These variations are precisely recorded at -deployment. At the end of the seal's lifetime, the seal is returned from the field to the lab and closely examined to -check for any deviations from the seal's prior recorded state. The type of variation used in these seals includes random -scratches in metal parts and random blobs of solder (IAEA metal cap seal), randomly cut optical fibers (COBRA seal), the -uncontrollably random distribution of glitter particles in a polymer matrix (COBRA seal prototypes) as well as the -precise three-dimensional surface structure of metal parts at microscopic scales (LMCV)~\cite{iaea2011}. - -The IAEA's equipment portfolio does include electronic seals such as the EOSS. These devices are intended for remote -reading, similar to an HSM. They are constructed from two components: A cable that is surveilled for tampering, and a -monitoring device. The monitoring device itself is in effect an HSM and uses a security mesh foil such as it is used in -commercial HSMs. - -In~\cite{anderson2020}, Anderson gives a comprehensive overview on physical security. An example HSM that they cite is -the IBM 4758 HSM whose details are laid out in depth in~\cite{smith1998}. This HSM is an example of an industry-standard -construction. Although its turn of the century design is now a bit dated, the construction techniques of the physical -security mechanisms have not evolved much in the last two decades. Besides some auxiliary temperature and radiation -sensors to guard against attacks on the built-in SRAM memory, the module's main security barrier uses the traditional -construction of a flexible mesh foil wrapped around the module's core. In~\cite{smith1998}, the authors state that the -module monitors this mesh for short circuits, open circuits and conductivity. The fundamental approach to tamper -detection and construction is similar to other commercial -offerings~\cite{obermaier2018,drimer2008,anderson2020,isaacs2013}. - -Shifting our focus from industry use to the academic state of the art, in~\cite{immler2019}, Immler et al. describe an -HSM based on precise capacitance measurements of a security mesh, creating a PUF from the mesh. In contrast to -traditional meshes, the mesh they use consists of a large number of individual traces (more than 30 in their example). -Their concept promises a very high degree of protection. The main disadvantages of their concept are a limitation in -covered area and component height, as well as the high cost of the advanced analog circuitry required for monitoring. A -core component of their design is that they propose its use as a PUF to allow for protection even when powered off, -similar to a smart card---but the design is not limited to this use. - -In~\cite{tobisch2020}, Tobisch et al.\ describe a construction technique for a hardware security module that is based -around commodity WiFi hardware inside a conductive enclosure. In their design, an RF transmitter transmits a reference -signal into the RF cavity formed by the conductive enclosure. One or more receivers listen for the signal's reflections -and use them to characterize the RF cavity w.r.t.\ phase and frequency response. Their fundamental assumption is that -the RF behavior of the cavity is inscrutable from the outside, and that even a small disturbance anywhere within the -volume of the cavity will cause a significant change in its RF response. A core component of the work of Tobisch et -al.~\cite{tobisch2020}\ is that they use commodity WiFi hardware to reduce the cost of the HSM's sensing circuitry. The -resulting system is likely both much cheaper and capable of protecting a much larger security envelope than designs -using finely patterned foil security meshes such as~\cite{immler2019}, at the cost of worse and less predictable -security guarantees. Where~\cite{tobisch2020} use electromagnetic radiation, Vrijaldenhoven -in~\cite{vrijaldenhoven2004} uses ultrasound waves travelling on a surface acoustic wave (SAW) device to a similar end. - -While Tobisch et al.~\cite{tobisch2020}\ approach the sensing frontend cost as their primary optimization target, the -prior work of Kreft and Adi~\cite{kreft2012} considers sensing quality. Their target is an HSM that envelopes a volume -barely larger than a single chip. They theorize how an array of distributed RF transceivers can measure the physical -properties of a potting compound that has been loaded with RF-reflective grains. In their concept, the RF response -characterized by these transceivers is shaped by the precise three-dimensional distribution of RF-reflective grains -within the potting compound. - -To the best of our knowledge, we are the the first to propose a mechanically moving HSM security barrier as part of a -hardware security module. Most academic research concentrates on the issue of creating new, more sensitive security -barriers for HSMs~\cite{immler2019} while commercial vendors concentrate on means to certify and cheaply manufacture -these security barriers~\cite{drimer2008}. Our concept instead focuses on the issue of taking any existing, cheap -low performance security barrier and transforming it into a marginally more expensive but high performance one. The -closest to a mechanical HSM that we were able to find during our research is an 1988 patent~\cite{rahman1988} that -describes a mechanism to detect tampering along a communication cable by enclosing the cable inside a conduit filled -with pressurized gas. - -\subsection{Patent literature} -During development, we performed several hours of research on prior art for the inertial HSM concept. Yet, we could not -find any mentions of similar concepts either in academic literature or in patents. Thus, while we cannot give any -guarantees, we seem likely to be the inventors of this idea and we are fairly sure it is not covered by any patents or -other restrictions at this point in time. - -Since the concept is primarily attractive for small-scale production and since cheaper mass-production alternatives are -already commercially available, we have decided against applying for a patent and we wish to make it available to the -general public without any restrictions on its use. We invite you build on our work as you wish and to base your own -work on our publications without any fees or commercial restrictions. Where possible, we ask you to cite this paper and -attribute the inertial HSM concept to its authors. - -\section{Inertial HSM construction and operation} -\label{sec_ihsm_construction} - -Mechanical motion has been proposed as a means of making things harder to see with the human eye~\cite{haines2006} and -is routinely used in military applications to make things harder to hit~\cite{terdiman2013} but we seem to be the first -to use it in tamper detection. - -The core questions in the design of an inertial HSM are the following: - -\begin{enumerate} - \item What \textbf{type of motion} to use, such as rotation, pendulum motion, or linear motion. - \item How to construct the \textbf{tamper detection sensor}. - \item How to \textbf{detect braking} of the IHSM's movement. - \item The \textbf{mechanical layout} of the system. -\end{enumerate} - -We will approach these questions one by one in the following subsections. - -\subsection{Inertial HSM motion} -\label{sec_ihsm_motion} - -First, there are several ways that we can approach motion. There is periodic, aperiodic and continuous motion. There is -also linear motion as well as rotation. We can also vary the degree of electronic control in this motion. The main -constraints we have on the HSM's motion pattern are that it needs to be (almost) continuous so as to not expose any weak -spots during instantaneous standstill of the HSM. Additionally, for space efficiency the HSM has to stay within a -confined space. This means that linear motion would have to be periodic, like that of a pendulum. Such periodic linear -motion will have to quickly reverse direction at its apex so the device is not stationary long enough for this to become -a weak spot. - -In contrast to linear motion, rotation is space-efficient and can be continuous if the axis of rotation is inside the -device. In case it has a fixed axis, rotation will expose a weak spot at the axis of rotation where the surface's -tangential velocity is low. Faster rotation can lessen the security impact of this fact at the expense of power -consumption and mechanical stress, but it can never eliminate it. This effect can be alleviated in two ways: Either by -adding additional tamper protection at the axis, or by having the HSM perform a compound rotation that has no fixed -axis. - -Large centrifugal acceleration at high speeds poses the engineering challenge of preventing rapid unscheduled -disassembly of the device, but it also creates an obstacle to any attacker trying to manipulate the device in what we -call a \emph{swivel chair attack} (see Section~\ref{sec_swivel_chair_attack}). An attacker trying to follow the motion -would have to rotate around the same axis. By choosing a suitable rotation frequency we can prevent an attacker from -following the devices motion since doing so would subject them to impractically large centrifugal forces. Essentially, -this limits the approximate maximum size and mass of an attacker based on an assumption on tolerable centrifugal force. - -In this paper we focus on rotating IHSMs for simplicity of construction. For our initial research, we are focusing on -systems that have a fixed axis of rotation due to their simple construction but we do wish to note the challenge of -hardening the shaft against tampering that any production device would have to tackle. - -\subsection{Tamper detection mesh construction} - -Once we have decided how our IHSM's security barrier should move, what remains is the actual implementation -of that security barrier. There are two movements that we have observed that are key to our work. On the one hand, there -is the widespread industry use of delicate tamper sensing mesh membranes. The usage of such membranes in systems -deployed in the field for a variety of use cases from low security payment processing devices to high security -certificate management at a minimum tells us that a properly implemented mesh \emph{can} provide a practical level of -security. On the other hand, in contrast to this industry focus, academic research has largely focused on ways to -fabricate enclosures that embed characteristics of a Physically Uncloneable Function. By using stochastic properties of -the enclosure material to form a PUF, such academic designs effectively leverage signal processing techniques to improve -the system's security level by a significant margin. - -In our research, we focus on security meshes as our IHSM's tamper sensors. Most of the cost in commercial security mesh -implementations lies in the advanced manufacturing techniques and special materials necessary to achieve a sensitive -mesh at fine structure sizes. The foundation of an IHSM security is that by moving the mesh even a primitive, coarse -mesh made e.g.\ from mesh traces on a PCB becomes very hard to attack in practice. This allows us to use a simple -construction made up from low-cost components. Additionally, the use of a mesh allows us to only spin the mesh itself -and its monitoring circuit and keep the payload inside the mesh stationary. Tamper sensing technologies that use the -entire volume of the HSM such as RF-based systems do not allow for this degree of freedom in their design: They would -require the entire IHSM to spin, including its payload, which would entail costly and complex systems for data and power -transfer from the outside to the payload. - -\subsection{Braking detection} - -The security mesh is a critical component in the IHSM's defense against physical attacks, but its monitoring is only one -half of this defense. The other half consists of a reliable and sensitive braking detection system. This system must be -able to quickly detect any slowing of the IHSM's rotation. Ideally, a sufficiently sensitive sensor should be able to -measure any external force applied to the IHSM's rotor and should already trigger a response at the first signs of a -manipulation attempt. - -While the obvious choice to monitor rotation would be a tachometer such as a magnetic or opitical sensor attached to the -IHSM's shaft, this would be a poor choice in our application. Both optical and magnetic sensors are susceptible to -contact-less interference from outside. A different option would be to use feedback from the motor driver electronics. -When using a BLDC motor, the driver electronics precisely know the rotor's position at all times. The issue with this -approach is that depending on construction, it might invite attacks at the mechanical interface between mesh and the -motor's shaft. If an attacker can decouple the mesh from the motor e.g.\ by drilling, laser ablation or electrical -discharge machining (EDM) on the motor's shaft, the motor could keep spinning at its nominal frequency while the mesh is -already standing still. - -Instead of a stator-side sensor like a magnetic tachometer or feedback from the BLDC controller, an accelerometer placed -inside the spinning mesh monitoring circuit would be a good component to serve as an IHSM's tamper sensor. Modern, fully -intergrated MEMS accelerometers are very precise. By comparing acceleration measurements against a model of the device's -mechanical motion, deviations can quickly be detected. This limits an attacker's ability to tamper with the device's -motion. It may also allow remote monitoring of the device's mechanical components such as bearings: MEMS accelerometers -are fast enough to capture vibrations, which can be used as an early warning sign of failing mechanical -components~\cite{kvk2019,sh2016,adc2019,e2013}. - -In a spinning IHSM, an accelerometer mounted at a known radius with its axis pointing radially will measure centrifugal -acceleration. Centrifugal acceleration rises linearly with radius, and with the square of frequency: $a=\omega^2 r$. For -a given target speed of rotation, the accelerometer's location has to be carefully chosen to maximize dynamic range. A -key point here is that for rotation speeds between $500$ and $\SI{1000}{rpm}$, centrifugal acceleration already becomes -very large at a radius of just a few $\si{\centi\meter}$. At $\SI{1000}{rpm}\approx\SI{17}{\hertz}$ at a -$\SI{10}{\centi\meter}$ radius acceleration already is above $\SI{1000}{\meter\per\second}$ or $100\,g$. While -beneficial for security, this large acceleration leads to two practical constraints. First, off-axis performance of -commercial accelerometers is usually in the order of $\SI{1}{\percent}$ so this large acceleration will feed through -into all accelerometer axes, even those that are tangential to the rotation. Second, we either have to place the -accelerometer close to the axis or we are limited to a small selection of high-$g$ accelerometers mostly used in -automotive applications. - -To evaluate the feasibility of accelerometers as tamper sensors we can use a simple benchmark: Let us assume that an -IHSM is spinning at $\SI{1000}{rpm}$ and that we wish to detect any attempt to brake it below $\SI{500}{rpm}$. The -difference in centrifugal acceleration that our accelerometer will have to detect then is a factor of -$\frac{\omega_2^2}{\omega_1^2}=4$. If we choose our accelerometer's location to maximize its dynamic range, any -commercial MEMS accelerometer should suffice for this degree of accuracy even over long timespans. For rapid -deceleration, commercial accelerometers will be much more sensitive as effects of long-term drift can be ignored. If we -wish to also detect very slow deceleration, we have to take into account the accelerometer's drift characteristics. - -In Section~\ref{sec_accel_meas} below we conduct an empirical evaluation of a commercial automotive high-$g$ MEMS -accelerometer for braking detection in our prototype IHSM. - -\subsection{Mechanical layout} - -With our IHSM's components taken care of, what remains to be decided is how to put together these individual components -into a complete device. A basic spinning HSM might look like shown in Figure~\ref{fig_schema_one_axis}. Shown are the -axis of rotation, an accelerometer on the rotating part that is used to detect braking, the protected payload and the -area covered by the rotating tamper detection mesh. A key observation is that we only have to move the tamper -protection mesh, not the entire contents of the HSM. The HSM's payload and with it most of the HSM's mass can be -stationary. This reduces the moment of inertia of the moving part. This basic schema accepts a weak spot at the point -where the shaft penetrates the spinning mesh. This trade-off makes for a simple mechanical construction and allows -power and data connections to the stationary payload through a hollow shaft. - -\begin{figure} - \center - \includegraphics{concept_vis_one_axis.pdf} - \caption{Concept of a simple spinning Inertial HSM. 1 - Shaft. 2 - Security mesh. 3 - Payload. 4 - - Accelerometer. 5 - Shaft penetrating security mesh.} - \label{fig_schema_one_axis} -\end{figure} - -The spinning mesh must be designed to cover the entire surface of the payload, but it suffices if it sweeps over every -part of the payload once per rotation. This means we can design longitudinal gaps into the mesh that allow outside air -to flow through to the payload. In traditional boundary-sensing HSMs, cooling of the payload processor is a serious -issue since any air duct or heat pipe would have to penetrate the HSM's security boundary. This problem can only be -solved with complex and costly siphon-style constructions, so in commercial systems heat conduction is used -exclusively~\cite{isaacs2013}. This limits the maximum power dissipation of the payload and thus its processing power. -Using longitudinal gaps in the mesh, our setup allows direct air cooling of regular heatsinks. This unlocks much more -powerful processing capabilities that greatly increase the maximum possible power dissipation of the payload. In an -evolution of our design, the spinning mesh could even be designed to \emph{be} a cooling fan. - -\section{Attacks} -\label{sec_attacks} - -After outlining the basic mechanical design of an inertial HSM above, in this section we will detail possible ways to -attack it. At the core of an IHSM's defenses is the same security mesh or other technology as it is used in traditional -HSMs. This means that in the end an attacker will have to perform the same steps they would have to perform to attack a -traditional HSM. Only, they will either have to perform these attack steps with a tool that follows the HSMs rotation -at high speed or they will first have to defeat the braking sensor. Attacking the IHSM in motion may require specialized -mechanical tools, CNC actuators or even a contactless attack using a laser, plasma jet or water jet. - -\subsection{The Swivel Chair Attack} -\label{sec_swivel_chair_attack} - -First we will consider the most basic of all attacks: A human attacker holding a soldering iron trying to rotate -themselves along with the mesh using a very fast swivel chair. Let us pessimistically assume that this co-rotating -attacker has their center of mass on the axis of rotation. The attacker's body is likely on the order of -$\SI{200}{\milli\meter}$ wide along its shortest axis, resulting in a minimum radius from axis of rotation to surface of -about $\SI{100}{\milli\meter}$. Wikipedia lists horizontal g forces in the order of $\SI{20}{g}$ as the upper end of the -range tolerable by humans for seconds at a time or longer. We thus set our target acceleration to -$\SI{100}{g}\;\approx\;\SI{1000}{\meter\per\second^2}$, a safety factor of $5$ past that range. Centrifugal -acceleration is $a=\omega^2 r$. In our example this results in a minimum angular velocity of $f_\text{min} = -\frac{1}{2\pi}\sqrt{\frac{a}{r}} = \frac{1}{2\pi}\sqrt{\frac{\SI{1000}{\meter\per\second^2}}{\SI{100}{\milli\meter}}} -\approx \SI{16}{\hertz} \approx \SI{1000}{rpm}$. From this we can conclude that even at moderate speeds of -$\SI{1000}{rpm}$ and above, a manual attack is no longer possible and any attack would have to be carried out using some -kind of mechanical tool. - -\subsection{Mechanical weak spots} - -The tamper defense of an IHSM rests on the security mesh moving too fast to tamper. Depending on the type of motion -used, the meshes speed may vary by location and over time. Our example configuration of a rotating mesh can keep moving -continuously, so it does not have any time-dependent weak spots. It does however have a weak spot at its axis of -rotation, at the point where the shaft penetrates the mesh. The meshes tangential velocity decreases close to the shaft, -and the shaft itself may allow an attacker to insert tools such as probes into the device through the opening it -creates. This issue is related to the issue conventional HSMs also face with their power and data connections. In -conventional HSMs, power and data are routed into the enclosure through the PCB or flat flex cables sandwiched in -between security mesh foil layers. In traditional HSMs this interface rarely is a mechanical weak spot since they use a -thin mesh substrate and create a meandering path by folding the interconnect substrate/security mesh layers several -times. In inertial HSMs, careful engineering is necessary to achieve the same effect. Figure~\ref{shaft_cm} shows -variations of the shaft interface with increasing complexity. - -\begin{figure} - \begin{subfigure}[t]{0.3\textwidth} - \center - \includegraphics[width=4cm]{ihsm_shaft_countermeasures_a.pdf} - \caption{Cross-sectional view of the basic configuration with no special protection of the shaft. Red: Moving - mesh -- Black: Stationary part.} - \label{shaft_cm_a} - \end{subfigure} - \hfill - \begin{subfigure}[t]{0.3\textwidth} - \center - \includegraphics[width=4cm]{ihsm_shaft_countermeasures_b.pdf} - \caption{An internal counter-rotating disc greatly decreases the space available to attackers at the expense of - another moving part and a second moving monitoring circuit.} - \label{shaft_cm_a} - \end{subfigure} - \hfill - \begin{subfigure}[t]{0.3\textwidth} - \center - \includegraphics[width=4cm]{ihsm_shaft_countermeasures_c.pdf} - \caption{A second moving tamper detection mesh also enables more complex topographies.} - \label{shaft_cm_a} - \end{subfigure} - \caption{Mechanical countermeasures to attacks through or close to the shaft of a fixed-axis rotating IHSM.} - \label{shaft_cm} -\end{figure} - -\subsection{Attacking the mesh in motion} - -To disable the mesh itself, an attacker can choose two paths. One is to attack the mesh itself, for example by bridging -its traces. The other option is to tamper with the monitoring circuit to prevent a damaged mesh from triggering an -alarm~\cite{dexter2015}. Attacks in both locations are electronic attacks, i.e.\ they require electrical contact to -parts of the circuit. Traditionally, this contact is made by soldering a wire or by placing a probe such as a thin -needle. We consider this type of attack hard to perform on an object spinning at high speed. Possible remaining attack -avenues may be to rotate an attack tool in sync with the mesh, or to use a laser or ion beam fired at the mesh to cut -traces or carbonize parts of the substrate to create electrical connections. Encapsulating the mesh in a potting -compound and shielding it with a metal enclosure as is common in traditional HSMs will significantly increase the -complexity of such attacks. - -\subsection{Attacks on the rotation sensor} - -Instead of attacking the mesh in motion, an attacker may also try to first stop the rotor. To succeed, they would need -to falsify the rotor's MEMS accelerometer measurements. We can disregard electronic attacks on the sensor or the -monitoring microcontroller because they would be no easier than attacking the mesh traces. What remains would be -physical attacks of the accelerometer's sensing mechanism. -MEMS accelerometers usually use a cantilever design in which a proof mass moves a cantilever whose precise position is -measured electronically. A topic of recent academic interest have been acoustic attacks tampering with these -mechanics~\cite{trippel2017}, but such attacks do not yield sufficient control to precisely falsify sensor readings. -A possible more invasive attack may be to first decapsulate the sensor MEMS using laser ablation synchronized with the -device's rotation. Then, a fast-setting glue such as a cyanoacrylate could be deposited on the MEMS, locking the -mechanism in place. This type of attack can be mitigated by mounting the accelerometer in a shielded location inside the -security envelope and by varying the rate of rotation over time. - -\subsection{Attacks on the alarm circuit} - -Besides trying to deactivate the tamper detection mesh, an electronic attack could also target the alarm circuitry -inside the stationary payload, or the communication link between rotor and payload. The link can be secured using a -cryptographically secured protocol like one would use for wireless radio links along with a high-frequency heartbeat -message. The alarm circuitry has to be designed such that it is entirely contained within the HSM's security envelope. -Like in conventional HSMs, it has to be built to either tolerate or detect environmental attacks using sensors for -temperature, ionizing radiation, laser radiation, supply voltage variations, ultrasound or other vibration and gases or -liquids. If a wireless link is used between the IHSM's rotor and stator, this link must be cryptographically secured. -To prevent replay attacks link latency must continuously be measured, so this link must be bidirectional. -% If it were unidirectional, an attacker could -% act as a Man-in-the-Middle and replay the mesh's authenticated ``no alarm'' signal at slightly below real-time speed -% (say at $\SI{99}{\percent}$ speed). The receiver would not be able to distinguish between this attack and ordinary -% deviations in the transmitter's local clock frequency. Thus, after some time the attacker can simply stop the rotor and -% break the mesh while replaying the leftover recorded ``no alarm'' signal. Given the frequency stability of commercial -% crystals, this would yield the attacker several seconds of undisturbed attack time per hour of recording time. - -\subsection{Fast and violent attacks} - -A variation of the above attacks on the alarm circuitry is to simply destroy the part of the HSM that erases data in -response to tampering before it can perform its job using a tool such as a large hammer or a gun. To mitigate this type -of attack, the HSM must be engineered to be either tough or brittle: Tough enough that the tamper response circuitry -will reliably withstand any attack for long enough to carry out its function or brittle in a way that during any attack, -the payload is reliably destroyed before the tamper response circuitry. - -\section{Proof of Concept Prototype implementation} -\label{sec_proto} - -As we elaborated above, the mechanical component of an IHSM significantly increases the complexity of any attack even -when implemented using only common, off-the-shelf parts. In view of this amplification of design security we have -decided to validate our theoretical studies by implementing a proof of concept prototype IHSM -(Figure~\ref{prototype_picture}). The main engineering challenges we set out to solve in this proof of concept prototype -were: - -\begin{enumerate} - \item A mechanical design suitable for rapid prototyping that can withstand at least $\SI{500}{rpm}$. - \item The Automatic generation of security mesh PCB layouts for quick adaption to new form factors. - \item Non-contact power transmission from stator to rotor. - \item Non-contact bidirectional data communication between stator and rotor. -\end{enumerate} - -We will outline our findings on these challenges one by one in the following paragraphs. - -\subsection{Mechanical design} - -We sized our proof of concept prototype to have sufficient payload space for up to two full-size Raspberry Pi boards to -approximate a traditional HSM's processing capabilities. We use printed circuit boards as the main structural material -for the rotating part, and 2020 aluminium extrusion for its mounting frame. Figure~\ref{fig_proto_mesh} shows the -rotor's mechanical PCB designs. The design uses a $\SI{6}{\milli\meter}$ brass tube as its shaft, which is already -sufficiently narrow to pose a challenge to an attacker. The rotor is driven by a small hobby quadcopter motor. Our -prototype incorporates a functional PCB security mesh. As we observed previously, this mesh only needs to cover every -part of the system once per revolution, so we designed the longituninal PCBs as narrow strips to save weight. - -\subsection{PCB security mesh generation} - -% FIXME censor link in peer-review version! -Our proof-of-concept security mesh covers a total of five interlocking mesh PCBs (Figure~\ref{mesh_gen_sample}). A sixth -PCB contains the monitoring circuit and connects to these mesh PCBs. To speed up design iterations, we automated the -generation of this security mesh through a plugin for the KiCAD EDA -suite\footnote{\url{https://blog.jaseg.de/posts/kicad-mesh-plugin/}}. Figure~\ref{mesh_gen_viz} visualizes the mesh -generation process. First, the target area is overlaid with a grid. Then, the algorithm produces a randomized tree -covering the grid. Finally, individual mesh traces are traced according to a depth-first search through this tree. -We consider the quality of the plugin's output sufficient for practical applications. Together with FreeCAD's KiCAD -StepUp plugin, this results in an efficient toolchain from mechanical CAD design to production-ready PCB files. - -\begin{figure} - \begin{subfigure}{0.35\textwidth} - \center - \includegraphics[height=7cm]{proto_3d_design.jpg} - \caption{The 3D CAD design of the proof of concept prototype.} - \end{subfigure} - \hfill - \begin{subfigure}{0.6\textwidth} - \includegraphics[width=8cm]{rotor_stator.jpg} - \center - \caption{Assembled mechanical prototype rotor (left) and stator (right) PCB components.} - \end{subfigure} - \caption{Our proof of concept prototype IHSM's PCB security mesh design} - \label{fig_proto_mesh} -\end{figure} - -\begin{figure} - \begin{subfigure}{\textwidth} - \center - \includegraphics[width=9cm]{mesh_gen_viz.pdf} - \caption{Overview of the automatic security mesh generation process. 1 - Example target area. 2 - Grid overlay. - 3 - Grid cells outside of the target area are removed. 4 - A random tree covering the remaining cells is - generated. 5 - The mesh traces are traced along a depth-first walk of the tree. 6 - Result.} - \label{mesh_gen_viz} - \end{subfigure} - \begin{subfigure}{\textwidth} - \center - \includegraphics[width=6cm]{mesh_scan_crop.jpg} - \caption{Detail of a PCB produced with a generated mesh.} - \label{mesh_gen_sample} - \end{subfigure} - \caption{Our automatic security mesh generation process} - \label{mesh_gen_fig} -\end{figure} - -\subsection{Power transmission from stator to rotor} - -The spinning mesh has its own autonomous monitoring circuit. This spinning monitoring circuit needs both power and data -connectivity to the stator. To design the power link, we first have to estimate the monitoring circuit's power -consumption. We base our calculation on the (conservative) assumption that the spinning mesh sensor should send its -tamper status to the static monitoring circuit at least once every $T_\text{tx} = \SI{10}{\milli\second}$. At -$\SI{100}{\kilo\baud}$, a transmission of a one-byte message in standard UART framing would take -$\SI{100}{\micro\second}$ and yield an $\SI{1}{\percent}$ duty cycle. If we assume an optical or RF transmitter that -requires $\SI{10}{\milli\ampere}$ of active current, this yields an average operating current of -$\SI{100}{\micro\ampere}$. Reserving another $\SI{100}{\micro\ampere}$ for the monitoring circuit itself we arrive at an -energy consumption of $\SI{1.7}{\ampere\hour}$ per year. - -This annual energy consumption is close to the capacity of a single CR123A lithium primary cell. Thus, by either using -several such cells or by optimizing power consumption several years of battery life could easily be reached. In our -proof of concept prototype we decided against using a battery to reduce rotor mass and balancing issues. - -We also decided against mechanically complex solutions such as slip rings or electronically complex ones such as -inductive power transfer. Instead, we chose a simple setup consisting of a stationary lamp pointing at several solar -cells on the rotor. At the monitoring circuit's low power consumption power transfer efficiency is irrelevant, so this -solution is practical. Our system uses six series-connected solar cells mounted on the end of the cylindrical rotor -that are fed into a large $\SI{33}{\micro\farad}$ ceramic buffer capacitor through a Schottky diode. This solution -provides around $\SI{3.0}{\volt}$ at several tens of $\si{\milli\ampere}$ to the payload when illuminated using either -a $\SI{60}{\watt}$ incandescent light bulb or a flicker-free LED studio light of similar brightness\footnote{LED lights -intended for room lighting exhibit significant flicker that can cause the monitoring circuit to reset. Incandescent -lighting requires some care in shielding the data link from the light bulb's considerable infrared output.}. - -\subsection{Data transmission between stator and rotor} - -Besides power transfer from stator to rotor, we need a reliable, bidirectional data link to transmit mesh status and a -low-latency heartbeat signal. We chose to transport an $\SI{115}{\kilo\baud}$ UART signal through a simple IR link for a -quick and robust solution. The link's transmitter directly drives a standard narrow viewing angle IR led through a -transistor. The receiver has an IR PIN photodiode reverse-biased at $\frac{1}{2}V_\text{CC}$ feeding into an -\texttt{MCP6494} general purpose opamp configured as an $\SI{100}{\kilo\ohm}$ transimpedance amplifier. As shown in -Figure \ref{photolink_schematic}, the output of this TIA is amplified one more time before being squared up by a -comparator. Our design trades off stator-side power consumption for a reduction in rotor-side power consumption by -using a narrow-angle IR led and photodiode on the rotor, and wide-angle components at a higher LED current on the -stator. Figure~\ref{ir_tx_schema} shows the physical arrangement of both links. The links face opposite one another and -are shielded from one another by the motor's body in the center of the PCB. - -% We used an \texttt{MCP6494} quad CMOS op-amp. At a specified $\SI{2}{\milli\ampere}$ current -% consumption it is within our rotor's power budget, and its Gain Bandwidth Product of $\SI{7.5}{\mega\hertz}$ yields a -% useful transimpedance in the photodiode-facing TIA stage. - -\begin{figure} - \begin{subfigure}{0.3\textwidth} - \includegraphics[width=4.5cm]{ir_tx_schema.pdf} - \caption{Basic layout, view along axis of rotation. 1 - - Rotor base PCB. 2 - Stator IR link PCB. 3 - Motor. 4 - receiver PIN photodiode. 5 - transmitter IR LED.} - \label{ir_tx_schema} - \end{subfigure} - \hfill - \begin{subfigure}{0.65\textwidth} - \includegraphics[width=9cm]{photolink_schematic.pdf} - \caption{Schematic with sample component values. C2 is highly dependent on the photodiode characteristics and - stray capacitances.} - \label{photolink_schematic} - \end{subfigure} - \caption{IR data link implementation} -\end{figure} - -\subsection{Evaluation} - -The compoleted proof of concept hardware worked as intended. Both rotating power and data links worked well. As we -expected, the mechanical design vibrated at higher speeds but despite these unintended vibrations we were able reach -speeds in excess of $\SI{1000}{rpm}$ by clamping the device to the workbench. Even at high speeds, both the power link -and the data links continued to function without issue. - -\section{Using MEMS accelerometers for braking detection} -\label{sec_accel_meas} - -Using the proof of concept prototype from the previous section, we performed an evaluation of an \partnum{AIS1120} -commercial automotive MEMS accelerometer as a braking sensor. The device is mounted inside our prototype at a radius of -$\SI{55}{\milli\meter}$ from the axis of rotation to the center of the device's package. The \partnum{AIS1120} provides -a measurement range of $\pm 120\,g$. At its 14-bit resolution, one LSB corresponds to $15\,\mathrm{m}g$. - -Our prototype IHSM uses a motor controller intended for use in RC quadcopters. In our experimental setup, we manually -control this motor controller through an RC servo tester. In our experiments we externally measured the device's speed -of rotation using a magnet fixed to the rotor and a reed switch held close. The reed switch output is digitized using an -USB logic analyzer at a sampling rate of $\SI{100}{\mega\hertz}$. We calculcate rotation frequency as a -$\SI{1}{\second}$ running average over debounced interval lengths of this captured signal\footnote{A regular frequency -counter or commercial tachometer would have been easier, but neither was available in our limited COVID-19 home office -lab.}. - -The accelerometer is controlled from the \partnum{STM32} microcontroller on the rotor of our IHSM prototype platform. -Timed by an external quartz, the microcontroller samples accelerometer readings at $\SI{10}{\hertz}$. Readings are -accumulated in a small memory buffer, which is continuously transmitted out through the prototype platform's infrared -link. Data is packetized with a sequence number indicating the buffer's position in the data stream and a CRC-32 -checksum for error detection. On the host, a Python script stores all packets received with a valid checksum in an -SQLite database. - -Data analysis is done separately from data capture. An analysis IPython Notebook reads captured packets and reassembles -the continuous sample stream based on the packets' sequence numbers. The low $\SI{10}{\hertz}$ sampling rate and high -$\SI{115}{\kilo Bd}$ transmission speed lead to a large degree of redundancy with gaps in the data stream being rare. -This allowed us to avoid writing retransmission logic or data interpolation. - -Figure~\ref{fig-acc-steps} shows an entire run of the experiment. During this run, we started with the rotor at -standstill, then manually increased its speed of rotation in steps. Areas shaded gray are intervals where we manually -adjust the rotors speed. The unshaded areas in between are intervals when the rotor speed is steady. -Figure~\ref{fig-acc-stacked} shows a magnified view of these periods of steady rotor speed. In both graphs, orange -lines indicate centrifugal acceleration as calculated from rotor speed measurements. Visually, we can see that -measurements and theory closely match. Our frequency measurements are accurate and the main source of error are the -accelerometer's intrinsic errors as well as error in its placement due to construction tolerances. - -The accelerometer's primary intrinsic errors are offset error and scale error. Offset error is a fixed additive offset -to all measurements. Scale error is an error proportional to a measurements value that results from a deviation between -the device's specified and actual sensitivity. We correct for both errors by first extracting all stable intervals from -the time series, then fitting a linear function to the measured data. Offset error is this linear function's intercept, -and scale error is its slope. We then apply this correction to all captured data before plotting and later analysis. -Despite its simplicity, this approach already leads to a good match of measurements and theory modulo a small part of -the device's offset remaining. At high speeds of rotation this remaining offset does not have an appreciable impact, but -due to the quadratic nature of centrifugal acceleration at low speeds it causes a large relative error of up to -$\SI{10}{\percent}$ at $\SI{95}{rpm}$. - -After offset and scale correction, we applied a low-pass filter to our data. The graphs show both raw and filtered data. -Raw data contains significant harmonic content. This content is due to vibrations in our prototype as well as gravity -since we tested our proof of concept prototype lying down, with its shaft pointing sideways. FFT analysis shows that -this harmonic content is a clean intermodulation product of the accelerometers sampling rate and the speed of rotation -with no other visible artifacts. - -Figure~\ref{fig-acc-theory} shows a plot of our measurement results against frequency. Data points are shown in dark -blue, and theoretical behavior is shown in orange. From our measurements we can conclude that an accelerometer is a good -choice for an IHSM's braking sensor. A simple threshold set according to the sensor's calculated expected centrifugal -force should be sufficient to reliably detect manipulation attempts without resulting in false positives. Periodic -controlled changes in the IHSM's speed of rotation allow an offset and scale calibration of the accelerometer on the -fly, without stopping the rotor. - -\begin{figure} - \center - \includegraphics[width=0.7\textwidth]{../../prototype/sensor-analysis/fig-acc-theory-meas-run50.pdf} - \caption{Centrifugal acceleration versus angular frequency in theory and in our experiments. Experimental - measurements are shown after correction for device-specific offset and scale error. Our measurements - showed good agreement with our theoretical results. Above \SI{300}{rpm}, the relative acceleration error was consistently - below $\SI{0.5}{\percent}$. Below $\SI{300}{rpm}$, the residual offset error that remains after our first-order - corrections has a strong impact ($0.05\,g$ absolute or $8\%$ relative at $\SI{95}{rpm}$.)} - \label{fig-acc-theory} -\end{figure} - -\begin{figure} - \begin{subfigure}{0.5\textwidth} - \center - \includegraphics[width=1.1\textwidth]{../../prototype/sensor-analysis/fig-acc-trace-steps-run50.pdf} - \caption{Raw recording of accelerometer measurements during one experiment run. Shaded areas indicate time - intervals when we manually adjusted speed.} - \label{fig-acc-steps} - \end{subfigure} - \hfill - \begin{subfigure}{0.45\textwidth} - \center - \includegraphics[width=1.1\textwidth]{../../prototype/sensor-analysis/fig-acc-trace-stacked-run50.pdf} - \caption{Valid measurements cropped out from \ref{fig-acc-steps} for various frequencies. Intermodulation - artifacts from the accelerometer's $\SI{10}{\hertz}$ sampling frequency and the $\SI{3}{\hertz}$ to - $\SI{18}{\hertz}$ rotation frequency due to gravity and device vibration are clearly visible.} - \label{fig-acc-stacked} - \end{subfigure} - \label{fig-acc-traces} - \caption{Traces of acceleration measurements during one experiment run.} -\end{figure} - -\section{Conclusion} -\label{sec_conclusion} - -In this paper we introduced Inertial Hardware Security Modules (iHSMs), a novel concept for the construction of advanced -hardware security modules from simple components. We analyzed the concept for its security properties and highlighted -its ability to significantly strengthen otherwise weak tamper detection barriers. We validated our design by creating a -proof of concept hardware prototype. In this prototype we have demonstrated practical solutions to the major electronics -design challenges: Data and power transfer through a rotating joint, and mechanized mesh generation. We have used our -prototype to perform several experiments to validate the rotary power and data links and the onboard accelerometer. Our -measurements have shown that our proof-of-concept solar cell power link works well and that our simple IR data link -already is sufficiently reliable for telemetry. Our experiments with an \partnum{AIS1120} automotive MEMS accelerometer -showed that this part is well-suited for braking detection in the range of rotation speed relevant to the IHSM scenario. - -Overall, our findings validate the viability of IHSMs as an evolutionary step beyond traditional HSM technology. IHSMs -offer a high level of security beyond what traditional techniques can offer even when built from simple components. They -allow the construction of devices secure against a wide range of practical attacks in small quantities and without -specialized tools. The rotating mesh allows longitudinal gaps, which enables new applications that are impossible with -traditional HSMs. Such gaps can be used to integrate a fan for air cooling into the HSM, allowing the use of powerful -computing hardware inside the HSM. We hope that this simple construction will stimulate academic research into (more) -secure hardware. - -\printbibliography[heading=bibintoc] - - -%%% FIXME remove appendix and work into text. - -\center{ - \center{This is version \texttt{\input{version.tex}\unskip} of this paper, generated on \today. The git repository - can be found at:} - - \center{\url{https://git.jaseg.de/rotohsm.git}} -} -\end{document} diff --git a/doc/paper/rotohsm_tech_report.pdf b/doc/paper/rotohsm_tech_report.pdf deleted file mode 100644 index b5cbade..0000000 Binary files a/doc/paper/rotohsm_tech_report.pdf and /dev/null differ diff --git a/doc/paper/rotohsm_tech_report.tex b/doc/paper/rotohsm_tech_report.tex deleted file mode 100644 index e9d571f..0000000 --- a/doc/paper/rotohsm_tech_report.tex +++ /dev/null @@ -1,300 +0,0 @@ -\documentclass[10pt,journal,a4paper]{IEEEtran} -\usepackage[english]{babel} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} -\usepackage[ - backend=biber, - style=numeric, - natbib=true, - url=false, - doi=true, - eprint=false - ]{biblatex} -\addbibresource{rotohsm.bib} -\usepackage{amssymb,amsmath} -\usepackage{listings} -\usepackage{eurosym} -\usepackage{wasysym} -\usepackage{amsthm} -\usepackage{tabularx} -\usepackage{multirow} -\usepackage{multicol} -\usepackage{tikz} -\usepackage{mathtools} -\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} -\DeclarePairedDelimiter{\paren}{(}{)} - -\usetikzlibrary{arrows} -\usetikzlibrary{chains} -\usetikzlibrary{backgrounds} -\usetikzlibrary{calc} -\usetikzlibrary{decorations.markings} -\usetikzlibrary{decorations.pathreplacing} -\usetikzlibrary{fit} -\usetikzlibrary{patterns} -\usetikzlibrary{positioning} -\usetikzlibrary{shapes} - -\usepackage[binary-units]{siunitx} -\DeclareSIUnit{\baud}{Bd} -\DeclareSIUnit{\year}{a} -\usepackage{hyperref} -\usepackage{tabularx} -\usepackage{commath} -\usepackage{graphicx,color} -\usepackage{ccicons} -\usepackage{subcaption} -\usepackage{float} -\usepackage{footmisc} -\usepackage{array} -\usepackage[underline=false]{pgf-umlsd} -\usetikzlibrary{calc} -%\usepackage[pdftex]{graphicx,color} -\usepackage{epstopdf} -\usepackage{pdfpages} -\usepackage{minted} % pygmentized source code - -\renewcommand{\floatpagefraction}{.8} -\newcommand{\degree}{\ensuremath{^\circ}} -\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}} - -\usepackage{fancyhdr} -\fancyhf{} -\fancyfoot[C]{\thepage} -\newcommand{\includenotebook}[2]{ - \fancyhead[C]{Included Jupyter notebook: #1} - \includepdf[pages=1, - pagecommand={\thispagestyle{fancy}\section{#1}\label{#2_notebook}} - ]{resources/#2.pdf} - \includepdf[pages=2-, - pagecommand={\thispagestyle{fancy}} - ]{resources/#2.pdf} -} - -\begin{document} - -\title{Tech Report: Inerial HSMs Thwart Advanced Physical Attacks} -\author{\IEEEauthorblockN{ - Jan Sebastian Götte\IEEEauthorrefmark{1}\IEEEauthorrefmark{2} \and - Björn Scheuermann\IEEEauthorrefmark{1}\IEEEauthorrefmark{2} - }\\ - \IEEEauthorblockA{ - \IEEEauthorrefmark{1}Alexander von Humboldt Institut für Internet und Gesellschaft (HIIG)\\ - \IEEEauthorrefmark{2}Humboldt-Universität zu Berlin\\ - \texttt{\textbf{\small goette@jaseg.de}}, \texttt{\textbf{\small scheuermann@informatik.hu-berlin.de}} - } -} -\date{2021-01-05} -\maketitle - -\section*{Abstract} - -In this tech report, we introduce a novel countermeasure against physical attacks: Inertial hardware security modules -(iHSMs). Conventional systems have in common that they try to detect attacks by crafting sensors responding to -increasingly minute manipulations of the monitored security boundary or volume. Our approach is novel in that we reduce -the sensitivity requirement of security meshes and other sensors and increase the complexity of any manipulations by -rotating the security mesh or sensor at high speed---thereby presenting a moving target to an attacker. Attempts to stop -the rotation are easily monitored with commercial MEMS accelerometers and gyroscopes. Our approach leads to a HSM that -can easily be built from off-the-shelf parts by any university electronics lab, yet offers a level of security that is -comparable to commercial HSMs. - -This tech report is the abridged version of our forthcoming paper. - -\section{Introduction} - -While information security technology has matured a great deal in the last half century, physical security has barely -changed. Given the right skills, physical access to a computer still often means full compromise. The physical -security of modern server hardware hinges on what lock you put on the room it is in. - -Currently, servers and other computers are rarely physically secured as a whole. Servers sometimes have a simple lid -switch and are put in locked ``cages'' inside guarded facilities. This usually provides a good compromise between -physical security and ease of maintenance. To handle highly sensitive data in applications such as banking or public key -infrastructure, general-purpose and low-security servers are augmented with dedicated, physically secure cryptographic -co-processors such as trusted platform modules (TPMs) or hardware security modules (HSMs). Using a limited amount of -trust in components such as the CPU, the larger system's security can then be reduced to that of its physically secured -TPM~\cite{newman2020,frazelle2019,johnson2018}. - -Like smartcards, TPMs rely on a modern IC being hard to tamper with. Shrinking things to the nanoscopic level to secure -them against tampering is a good engineering solution for some years to come. However, in essence this is a type of -security by obscurity: Obscurity here referring to the rarity of the equipment necessary to attack modern -ICs~\cite{albartus2020,anderson2020}. - -HSMs rely on a fragile foil with much larger-scale conductive traces being hard to remove intact. While we are certain -that there still are many insights to be gained in both technologies, we wish to introduce a novel approach to sidestep -the manufacturing issues of both and provide radically better security against physical attacks. Our core observation -is that any cheap but coarse HSM technology can be made much more difficult to attack by moving it very quickly. - -For example, consider an HSM as it is used in online credit card payment processing. Its physical security level is set -by the structure size of its security mesh. An attack on its mesh might involve fine drill bits, needles, wires, glue, -solder and lasers~\cite{drimer2008}. Now consider the same HSM mounted on a large flywheel. In addition to its usual -defenses the HSM is now equipped with an accelerometer that it uses to verify that it is spinning at high speed. How -would an attacker approach this HSM? They would have to either slow down the rotation---which triggers the -accelerometer---or they would have to attack the HSM in motion. The HSM literally becomes a moving target. At slow -speeds, rotating the entire attack workbench might be possible but rotating frames of reference quickly become -inhospitable to human life. Since non-contact electromagnetic or optical attacks are more limited in the first place and -can be shielded, we have effectively forced the attacker to use an attack robot. - -In Section~\ref{sec_related_work}, we will give an overview of the state of the art in the physical security of HSMs. On -this basis, in Section~\ref{sec_ihsm_construction} we will elaborate the principles of our inertial HSM approach. We -conclude this paper with a general evaluation of our concept in Section~\ref{sec_conclusion}. - -\section{Related work} -\label{sec_related_work} -% summaries of research papers on HSMs. I have not found any actual prior art on anything involving mechanical motion -% beyond ultrasound. - -In this section, we will briefly explore the history of HSMs and the state of academic research on active tamper -detection. - -HSMs are an old technology tracing back decades in their electronic realization. Today's common approach of monitoring -meandering electrical traces on a fragile foil that is wrapped around the HSM essentially transforms the security -problem into the challenge to manufacture very fine electrical traces on a flexible foil~\cite{isaacs2013, immler2019, -anderson2020}. There has been some research on monitoring the HSM's inside using e.g.\ electromagnetic -radiation~\cite{tobisch2020, kreft2012} or ultrasound~\cite{vrijaldenhoven2004} but none of this research -has found widespread adoption yet. - -In~\cite{anderson2020}, Anderson gives a comprehensive overview on physical security. An example they cite is the IBM -4758 HSM whose details are laid out in depth in~\cite{smith1998}. This HSM is an example of an industry-standard -construction. Although its turn of the century design is now a bit dated, the construction techniques of the physical -security mechanisms have not evolved much in the last two decades. Besides auxiliary temperature and radiation sensors -to guard against attacks on the built-in SRAM memory, the module's main security barrier uses the traditional -construction of a flexible mesh wrapped around the module's core. In~\cite{smith1998}, the authors state the module -monitors this mesh for short circuits, open circuits and conductivity. The fundamental approach to tamper detection and -construction is similar to other commercial offerings~\cite{obermaier2018,drimer2008,anderson2020,isaacs2013}. - -To the best of our knowledge, we are the the first to propose a mechanically moving HSM security barrier as part of a -hardware security module. Most academic research concentrates on the issue of creating new, more sensitive security -barriers for HSMs~\cite{immler2019} while commercial vendors concentrate on means to certify and cheaply manufacture -these security barriers~\cite{drimer2008}. Our concept instead focuses on the issue of taking any existing, cheap -low-performance security barrier and transforming it into a marginally more expensive but high-performance one. The -closest to a mechanical HSM that we were able to find during our research is an 1988 patent~\cite{rahman1988} that -describes a mechanism to detect tampering along a communication cable by enclosing the cable inside a conduit filled -with pressurized gas. - -\section{Inertial HSM construction and operation} -\label{sec_ihsm_construction} - -Mechanical motion has been proposed as a means of making things harder to see with the human eye~\cite{haines2006} and is -routinely used in military applications to make things harder to hit~\cite{terdiman2013} but we seem to be the first to -use it in tamper detection. If we consider different ways of moving an HSM to make it harder to tamper with, we find -that making it spin has several advantages. - -First, the HSM has to move fairly fast. If any point of the HSM's tamper sensing mesh moves slow enough for a human to -follow, it becomes a weak spot. E.g.\ in a linear pendulum motion, the pendulum becomes stationary at its apex. Second, -a spinning HSM is compact compared to alternatives like an HSM on wheels. Finally, rotation leads to easily predictable -accelerometer measurements. A beneficial side-effect of spinning the HSM is that if the axis of rotation is within the -HSM itself, an attacker trying to follow the motion would have to rotate around the same axis. Their tangential linear -velocity would rise linearly with the radius from the axis of rotation, which allows us to limit the approximate maximum -size and mass of an attacker using an assumption on tolerable centrifugal force. In this consideration the axis of -rotation is a weak spot, but that can be mitigated using multiple nested layers of protection. - -\begin{figure} - \center - \includegraphics{concept_vis_one_axis.pdf} - \caption{Concept of a simple spinning inertial HSM. 1 - Shaft. 2 - Security mesh. 3 - Payload. 4 - - Accelerometer. 5 - Shaft penetrating security mesh.} - \label{fig_schema_one_axis} -\end{figure} - -In a rotating reference frame, centrifugal force is proportional to the square of angular velocity and proportional to -distance from the axis of rotation. We can exploit this fact to create a sensor that detects any disturbance of the -rotation by placing a linear accelerometer at some distance from the axis of rotation. During constant rotation, after -subtracting gravity both acceleration tangential to the rotation and along the axis of rotation will be zero. -Centrifugal acceleration will be constant. - -Large centrifugal acceleration at high speeds poses the engineering challenge of preventing the whole thing from flying -apart, but it also creates an obstacle to any attacker trying to manipulate the sensor. We do not need to move the -entire contents of the HSM. It suffices if we move the tamper detection barrier around a stationary payload. This -reduces the moment of inertia of the moving part and it means we can use cables for payload power and data. Even at -moderate speeds above $\SI{500}{rpm}$, an attack would have to be carried out using a robot. - -\subsection{Mechanical layout} - -Thinking about the concrete construction of our mechanical HSM, the first challenge is mounting both mesh and payload on -a single shaft. The simplest way we found to mount a stationary payload inside of a spinning security mesh is a hollow -shaft. The payload can be mounted on a fixed rod threaded through this hollow shaft along with wires for power and -data. The shaft is a weak spot of the system, but this weak spot can be alleviated through either careful construction -or a second layer of rotating meshes with a different axis of rotation. Configurations that do not use a hollow-shaft -motor are possible, but may require additional bearings to keep the stator from vibrating. - -The next design choice we have to make is the physical structure of the security mesh. The spinning mesh must be -designed to cover the entire surface of the payload, but compared to a traditional HSM it suffices if it sweeps over -every part of the payload once per rotation. This means we can design longitudinal gaps into the mesh that allow outside -air to flow through to the payload. In traditional boundary-sensing HSMs, cooling of the payload processor is a serious -issue since any air duct or heat pipe would have to penetrate the HSM's security boundary. This problem can only be -solved with complex and costly siphon-style constructions, so in commercial systems heat conduction is used -exclusively~\cite{isaacs2013}. This limits the maximum power dissipation of the payload and thus its processing power. -Our setup allows direct air cooling of regular heatsinks. This greatly increases the maximum possible power dissipation -of the payload and unlocks much more powerful processing capabilities. In an evolution of our design, the spinning mesh -could even be designed to \emph{be} a cooling fan. - -\subsection{Spinning mesh power and data transmission} - -On the electrical side, the idea of a security mesh spinning at more than $\SI{500}{rpm}$ leaves us with a few -implementation challenges. Since the spinning mesh must be monitored for breaks or short circuits continuously, we need -both a power supply for the spinning monitoring circuit and a data link to the stator. - -We think that a bright lamp shining at a rotating solar panel is a good starting point. In contrast to e.g.\ slip -rings, this setup is mechanically durable at high speeds and it also provides reasonable output power. A battery may not -provide a useful lifetime without power-optimization. Likewise, an energy harvesting setup may not provide enough -current to supply peak demand. - -Since the monitoring circuit uses little current, power transfer efficiency is not important. On the other hand, cost -may be a concern in a production device. Here it may prove worthwhile to replace the solar cell setup with an extra -winding on the rotor of the BLDC motor driving the spinning mesh. This motor is likely to be a custom part, so adding -an extra winding is unlikely to increase cost significantly. More traditional inductive power transfer may also be an -option if it can be integrated into the mechanical design. - -\begin{figure} - \center - \includegraphics{ir_tx_schema.pdf} - \caption{Example of a bidirectional IR communication link between rotor and stator, view along axis of rotation. 1 - - Rotor base plate. 2 - Stator base plate. 3 - Motor. 4 - receiver PIN photodiode. 5 - transmitter IR LED.} - \label{ir_tx_schema} -\end{figure} - -Besides power, the data link between spinning mesh and payload is critical to the HSM's design. This link is used to -transmit the occassional status report along with a low-latency alarm trigger (``heartbeat'') signal from mesh to payload. -A simple infrared optical link as shown in Figure~\ref{ir_tx_schema} may be a good solution for this purpose. - -\section{Conclusion} - -\label{sec_conclusion} To conclude, in this tech report we introduced inertial hardware security modules (iHSMs), a -novel concept for the construction of highly secure hardware security modules from inexpensive, commonly available -parts. We elaborated the engineering considerations underlying a practical implementation of this concept. - -Inertial HSMs offer a high level of security beyond what traditional techniques can offer. They allow the construction -of devices secure against a wide range of practical attacks at prototype quantities and without specialized tools. We -hope that this simple construction will stimulate academic research into secure hardware. - -\printbibliography[heading=bibintoc] -\appendix - -\subsection{Patents and licensing} -During development, we performed several hours of research on prior art for the inertial HSM concept. Yet, we could not -find any mentions of similar concepts either in academic literature or in patents. Thus, we are likely the inventors of -this idea and we are fairly sure it is not covered by any patents or other restrictions at this point in time. - -Since the concept is primarily attractive for small-scale production and since cheaper mass-production alternatives are -already commercially available, we have decided against applying for a patent and we wish to make it available to the -general public without any restrictions on its use. This paper itself is licensed CC-BY-SA (see below). As for the -inertial HSM concept, we invite you to use it as you wish and to base your own work on our publications without any fees -or commercial restrictions. Where possible, we ask you to cite this paper and attribute the inertial HSM concept to its -authors. - -\center{ - \center{\ccbysa} - - \center{This work is licensed under a Creative-Commons ``Attribution-ShareAlike 4.0 International'' license. The - full text of the license can be found at:} - - \center{\url{https://creativecommons.org/licenses/by-sa/4.0/}} - - \center{For alternative licensing options, source files, questions or comments please contact the authors.} - - \center{This is version \texttt{\input{version.tex}\unskip} generated on \today. Once the full paper has been - published, this project's git repository will be available at:} - - \center{\url{https://git.jaseg.de/rotohsm.git}} -} -\end{document} diff --git a/doc/paper/rotor_stator.jpg b/doc/paper/rotor_stator.jpg deleted file mode 100644 index 904052b..0000000 Binary files a/doc/paper/rotor_stator.jpg and /dev/null differ diff --git a/paper/.gitignore b/paper/.gitignore new file mode 100644 index 0000000..c49262e --- /dev/null +++ b/paper/.gitignore @@ -0,0 +1,10 @@ +*.out +*.bbl +*.aux +*.toc +*.blg +*.bcf +*.log +*.run.xml + +version.tex diff --git a/paper/CC-by.eps b/paper/CC-by.eps new file mode 100755 index 0000000..ae05c8b --- /dev/null +++ b/paper/CC-by.eps @@ -0,0 +1,2727 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (by.eps) %%CreationDate: 3/27/08 4:25 PM %%BoundingBox: 360 291 441 307 %%HiResBoundingBox: 360.4727 291.9463 440.5146 306.9878 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 360.5 292 440.5 307 %AI3_TemplateBox: 400.5 299.5 400.5 299.5 %AI3_TileBox: 112 -56 688 678 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 800 600 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: -381 756 1 1566 923 26 0 0 73 75 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %AI7_Thumbnail: 128 24 8 %%BeginData: 3634 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C4527FD80F82752522752525227FD07522752525227FD075227525252 %27FD5D52F8F8F852FD7CFF52F8F852FFFD087D52F8F8F852A8FD07FF5227 %F8F827FD077DFD58F827FF27F8F852FF7D7D7D83FD047DF8F8F8A8FD0AFF %A852F8F827A87D7D7D837D52FD57F827FF52F8F852FFFD077DF8F8F8A8FD %0DFF52F8F827A77D7D7D837DFD58F8FF52F8F852FF7D837D7D7DA827F8F8 %A8FD0FFF52F8F852A87D7D7DA852FD56F827FF52F8F852FFFD057D52F8F8 %52FD08FFA8FD07FFA8F8F827FD067DFD04F8277D527D525227F8277D5227 %F8F8F8525252FD41F8FF52F8F852FF7D837D837D52F827FD04FF7D52527D %FFFFFF7D27527DFFFFFF52F8F87D7D837DA77D27F8F8F852FD06FF7D27FF %FFA8F8F852FFFF7DFD40F827FF52F8F852FFFD057DF8F852FFFFFF27FD04 %F852A827FD04F827FFFFA8F8F852837D7D7DA82DF8F8F852FFFF52F87DFF %FFF852FFFF52F8A8FF7DFD42F8FF52F8F852FF7D7D7DA77DF8F87DFFFF52 %F8F8A8A827527DF827A8FF2752FFFFFF27F8527D837D7D7D58F8F8F852FF %FF27F87DFFFF27F8A8FFFFA8FFFF27FD41F827FF52F8F852FFFD057DF8F8 %7DFFFF27F87DFD04FF27F852FD07FFF8F82783FD047D52F8F8F827FD06FF %52F8F8F8FD04FF52FD43F8FF27F8F852FF7D837DA858F8F8A8FFFF27F852 %FD04FF52F87DFD07FF27F8527D837D837D7DF8F8F852FFFF7DA8A8FFA827 %F8F827FFFFA8FD43F827FF52F8F852FFFD057DF8F87DFFFF52F827A8FF27 %5252F8F8A8A82727FFFFFFF8F82783FD047D52F8F8F827FFFF27F827FFFF %7DF8F827A8FF52FD44F8FF52F8F852FF7D837D7D7D27F852FFFFA827FD04 %F827FF27FD04F827FFFFA8F8F8587D7D7D837D52F8F8F852FFFF522752FF %FF7DF8F827FFFF7DFD43F827FF52F8F852FFFD057D27F8F8FFFFFFA85227 %527DFFFFFF5227277DFFFFFF7DF8F852FD047D8327F8F8F852FD07FFF8F8 %F827FFFF52FD44F8FF52F8F852FF7D837D837D7DF8F852FD11FFF8F827A8 %7D837DA87D27F8F8F827FD067DFD05F87D7D52FD43F827FF52F8F852FFFD %067D27F8F87DFD0FFF27F8F858FD057D52FD57F8FF52F8F852FF7D7D7D83 %7D8358F8F827A8FD0DFF52F8F8527D7D7D837D7DFD57F827FF52F8F852FF %FD077D52F8F8F87DFD0AFFA827F8F827FD057D8327FD58F8FF27F8F852FF %7D837DA87D837DA85227F8F852A8FD07FF7DF8F8F8277DA87D837DA85827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827FF52 %F8F852FD0CFFA8FFA8FD07FFA8FFA8FD63FF52F8F827FD7C5227FD80F8F8 %%EndData %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 0 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 26 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + (AI8_CMYK_CustomColor) + 6 packedarray + } bind def + /findrgbcustomcolor + { + (AI8_RGB_CustomColor) + 5 packedarray + } bind def + /setcustomcolor + { + exch + aload pop dup + (AI8_CMYK_CustomColor) eq + { + pop pop + 4 + { + 4 index mul + 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + { + dup (AI8_RGB_CustomColor) eq + { + pop pop + 3 + { + 1 exch sub + 3 index mul + 1 exch sub + 3 1 roll + } repeat + 4 -1 roll pop + setrgbcolor + } + { + pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } ifelse + } ifelse + } + def + } if + /setAIseparationgray + { + false setoverprint + 0 setgray + /setseparationgray where{ + pop setseparationgray + }{ + /setcolorspace where{ + pop + [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace + 1 exch sub setcolor + }{ + setgray + }ifelse + }ifelse + } def + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 53 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin +/initialize { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 { + dup type /arraytype eq { + dup xcheck { + bind + } if + } if + pop pop + } forall +} def +/terminate { end } def +currentdict /Adobe_ColorImage_AI6_Vars known not { + /Adobe_ColorImage_AI6_Vars 41 dict def +} if +Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /_newproc null def + /_proc1 null def + /_proc2 null def + /sourcearray 4 array def + /_ptispace null def + /_ptiname null def + /_pti0 0 def + /_pti1 0 def + /_ptiproc null def + /_ptiscale 0 def + /_pticomps 0 def + /_ptibuf 0 string def + /_gtigray 0 def + /_cticmyk null def + /_rtirgb null def + /XIEnable true def + /XIType 0 def + /XIEncoding 0 def + /XICompression 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIRowBytes 0 def + /XIFile null def + /XIBuffer1 null def + /XIBuffer2 null def + /XIBuffer3 null def + /XIDataProc null def + /XIColorSpace /DeviceGray def + /XIColorValues 0 def + /XIPlateList false def +end +/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def +/ci6image systemdict /image get def +/ci6curtransfer systemdict /currenttransfer get def +/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def +/ci6foureq { + 4 index ne { + pop pop pop false + }{ + 4 index ne { + pop pop false + }{ + 4 index ne { + pop false + }{ + 4 index eq + } ifelse + } ifelse + } ifelse +} def +/ci6testplate { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /setcmykcolor where { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + 1 0 0 0 ci6foureq { + /plateindex 0 def + }{ + 0 1 0 0 ci6foureq { + /plateindex 1 def + }{ + 0 0 1 0 ci6foureq { + /plateindex 2 def + }{ + 0 0 0 1 ci6foureq { + /plateindex 3 def + }{ + 0 0 0 0 ci6foureq { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end +} def +/ci6concatprocs { + /packedarray where { + pop dup type /packedarraytype eq 2 index type + /packedarraytype eq or + }{ + false + } ifelse + { + /_proc2 exch cvlit def + /_proc1 exch cvlit def + _proc1 aload pop + _proc2 aload pop + _proc1 length + _proc2 length add + packedarray cvx + }{ + /_proc2 exch cvlit def + /_proc1 exch cvlit def + /_newproc _proc1 length _proc2 length add array def + _newproc 0 _proc1 putinterval + _newproc _proc1 length _proc2 putinterval + _newproc cvx + } ifelse +} def +/ci6istint { + type /arraytype eq +} def +/ci6isspot { + dup type /arraytype eq { + dup length 1 sub get /Separation eq + }{ + pop false + } ifelse +} def +/ci6spotname { + dup ci6isspot {dup length 2 sub get}{pop ()} ifelse +} def +/ci6altspace { + aload pop pop pop ci6colormake +} def +/ci6numcomps { + dup /DeviceGray eq { + pop 1 + }{ + dup /DeviceRGB eq { + pop 3 + }{ + /DeviceCMYK eq { + 4 + }{ + 1 + } ifelse + } ifelse + } ifelse +} def +/ci6marksplate { + dup /DeviceGray eq { + pop plateindex 3 eq + }{ + dup /DeviceRGB eq { + pop plateindex 5 ne + }{ + dup /DeviceCMYK eq { + pop plateindex 5 ne + }{ + dup ci6isspot { + /findcmykcustomcolor where { + pop + dup length 2 sub get + 0.1 0.1 0.1 0.1 5 -1 roll + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop plateindex 5 ne + } ifelse + }{ + pop plateindex 5 ne + } ifelse + } ifelse + } ifelse + } ifelse +} def +/ci6colormake { + dup ci6numcomps + exch 1 index 2 add 1 roll + dup 1 eq {pop}{array astore} ifelse + exch +} def +/ci6colorexpand { + dup ci6spotname exch + dup ci6istint { + ci6altspace + exch 4 1 roll + }{ + 1 3 1 roll + } ifelse +} def +/ci6colortint { + dup /DeviceGray eq { + 3 1 roll 1 exch sub mul 1 exch sub exch + }{ + dup /DeviceRGB eq { + 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch + }{ + dup /DeviceCMYK eq { + 3 1 roll {1 index mul exch} forall pop 4 array astore exch + }{ + 3 1 roll mul exch + } ifelse + } ifelse + } ifelse +} def +/ci6colortocmyk { + dup /DeviceGray eq { + pop 1 exch sub 0 0 0 4 -1 roll 4 array astore + }{ + dup /DeviceRGB eq { + pop aload pop _rgbtocmyk 4 array astore + }{ + dup /DeviceCMYK eq { + pop + }{ + ci6altspace ci6colortint ci6colortocmyk + } ifelse + } ifelse + } ifelse +} def +/ci6makeimagedict { + 7 dict begin + /ImageType 1 def + /Decode exch def + /DataSource exch def + /ImageMatrix exch def + /BitsPerComponent exch def + /Height exch def + /Width exch def + currentdict end +} def +/ci6stringinvert { + 0 1 2 index length 1 sub { + dup 2 index exch get 255 exch sub 2 index 3 1 roll put + } for +} def +/ci6stringknockout { + 0 1 2 index length 1 sub { + 255 2 index 3 1 roll put + } for +} def +/ci6stringapply { + 0 1 4 index length 1 sub { + dup + 4 index exch get + 3 index 3 1 roll + 3 index exec + } for + pop exch pop +} def +/ci6walkrgbstring { + 0 3 index + dup length 1 sub 0 3 3 -1 roll { + 3 getinterval {} forall + 5 index exec + 3 index + } for + + 5 {pop} repeat +} def +/ci6walkcmykstring +{ + 0 3 index + dup length 1 sub 0 4 3 -1 roll { + 4 getinterval {} forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + +} def +/ci6putrgbtograystr +{ + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add +} def +/ci6putcmyktograystr +{ + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add +} def +/ci6rgbtograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putrgbtograystr load exch + ci6walkrgbstring + end +} def +/ci6cmyktograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putcmyktograystr load exch + ci6walkcmykstring + end +} def +/ci6separatecmykproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + + XIBuffer3 + + 0 2 index + + plateindex 4 2 index length 1 sub { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + pop pop exch pop + end +} def + +/ci6compositeimage { + dup 1 eq { + pop pop image + }{ + /ci6colorimage load null ne { + ci6colorimage + }{ + 3 1 roll pop + sourcearray 0 3 -1 roll put + 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load + image + } ifelse + } ifelse +} def +/ci6knockoutimage { + gsave + 0 ci6curtransfer exec 1 ci6curtransfer exec + eq { + 0 ci6curtransfer exec 0.5 lt + }{ + 0 ci6curtransfer exec 1 ci6curtransfer exec gt + } ifelse + {{pop 0}}{{pop 1}} ifelse + systemdict /settransfer get exec + ci6compositeimage + grestore +} def +/ci6drawimage { + ci6testplate -1 eq { + pop ci6compositeimage + }{ + dup type /arraytype eq { + dup length plateindex gt {plateindex get}{pop false} ifelse + }{ + { + true + }{ + dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse + } ifelse + } ifelse + { + dup 1 eq { + pop pop ci6image + }{ + dup 3 eq { + ci6compositeimage + }{ + pop pop + sourcearray 0 3 -1 roll put + /ci6separatecmykproc load + ci6image + } ifelse + } ifelse + }{ + ci6curoverprint { + 7 {pop} repeat + }{ + ci6knockoutimage + } ifelse + } ifelse + } ifelse +} def +/ci6proctintimage { + /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store + /_pticomps _ptispace ci6numcomps store + /_ptiscale _pti1 _pti0 sub store + level2? { + _ptiname length 0 gt version cvr 2012 ge and { + [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace + [_pti0 _pti1] ci6makeimagedict ci6image + }{ + [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace + [0 255] ci6makeimagedict ci6image + } ifelse + }{ + _pticomps 1 eq { + { + dup + { + 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put + } ci6stringapply + } ci6concatprocs ci6image + }{ + { + dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse + _ptibuf { + exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc + _pticomps 2 add -2 roll + _pticomps 1 sub -1 0 { + 1 index add 2 index exch + 5 -1 roll + 255 mul cvi put + } for + pop pop + } ci6stringapply + } ci6concatprocs false _pticomps + /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse + } ifelse + } ifelse +} def +/ci6graytintimage { + /_gtigray 5 -1 roll store + {1 _gtigray sub mul 1 exch sub} 4 1 roll + /DeviceGray ci6proctintimage +} def +/ci6cmyktintimage { + /_cticmyk 5 -1 roll store + {_cticmyk {1 index mul exch} forall pop} 4 1 roll + /DeviceCMYK ci6proctintimage +} def +/ci6rgbtintimage { + /_rtirgb 5 -1 roll store + {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll + /DeviceRGB ci6proctintimage +} def +/ci6tintimage { + ci6testplate -1 eq { + ci6colorexpand + 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll + dup /DeviceGray eq { + pop ci6graytintimage + }{ + dup /DeviceRGB eq { + pop ci6rgbtintimage + }{ + pop ci6cmyktintimage + } ifelse + } ifelse + }{ + dup ci6marksplate { + plateindex 5 lt { + ci6colortocmyk plateindex get + dup 0 eq ci6curoverprint and { + 7 {pop} repeat + }{ + 1 exch sub + exch {1 0}{0 1} ifelse () ci6graytintimage + } ifelse + }{ + pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage + } ifelse + }{ + ci6curoverprint { + 8 {pop} repeat + }{ + pop pop pop + {pop 1} 0 1 () /DeviceGray ci6proctintimage + } ifelse + } ifelse + } ifelse +} def +/XINullImage { +} def +/XIImageMask { + XIImageWidth XIImageHeight false + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + imagemask +} def +/XIImageTint { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + XIType 3 eq XIColorValues XIColorSpace ci6tintimage +} def +/XIImage { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + false XIChannelCount XIPlateList ci6drawimage +} def +/XG { + pop pop +} def +/XF { + 13 {pop} repeat +} def +/Xh { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + /XIImageHeight exch def + /XIImageWidth exch def + /XIImageMatrix exch def + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + /_lp /null ddef + _fc + /_lp /imagemask ddef + end +} def +/XH { + Adobe_ColorImage_AI6_Vars begin + grestore + end +} def +/XIEnable { + Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put +} def +/XC { + Adobe_ColorImage_AI6_Vars begin + ci6colormake + /XIColorSpace exch def + /XIColorValues exch def + end +} def +/XIPlates { + Adobe_ColorImage_AI6_Vars begin + /XIPlateList exch def + end +} def +/XI +{ + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + cvi dup + 256 idiv /XICompression exch store + 256 mod /XIEncoding exch store + pop pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + XIBitsPerPixel 1 eq { + XIImageWidth 8 div ceiling cvi + }{ + XIImageWidth XIChannelCount mul + } ifelse + /XIRowBytes exch def + XIEnable { + /XIBuffer3 XIImageWidth string def + XICompression 0 eq { + /XIBuffer1 XIRowBytes string def + XIEncoding 0 eq { + {currentfile XIBuffer1 readhexstring pop} + }{ + {currentfile XIBuffer1 readstring pop} + } ifelse + }{ + /XIBuffer1 256 string def + /XIBuffer2 XIRowBytes string def + {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} + /ASCII85Decode filter /DCTDecode filter + /XIFile exch def + {XIFile XIBuffer2 readstring pop} + } ifelse + /XIDataProc exch def + + XIType 1 ne { + 0 setgray + } if + XIType 1 eq { + XIImageMask + }{ + XIType 2 eq XIType 3 eq or { + XIImageTint + }{ + XIImage + } ifelse + } ifelse + }{ + XINullImage + } ifelse + /XIPlateList false def + grestore + end +} def +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 +%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) +%%Version: 1.3 0 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin +put +/_?cmyk false def +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_lineorientation 0 def +/_charorientation 0 def +/_yokoorientation 0 def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_shift [0 0] def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fontSize 0 def +/_fontAscent 0 def +/_fontDescent 0 def +/_fontHeight 0 def +/_fontRotateAdjust 0 def +/Ss 256 string def +Ss 0 (fonts/) putinterval +/_cnt 0 def +/_scale [1 1] def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_hfname 100 string def +/_hffound false def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_rgbf 3 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_rgbs 3 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/_lobyte 0 def +/_hibyte 0 def +/_cproc null def +/_cscript 0 def +/_hvax 0 def +/_hvay 0 def +/_hvwb 0 def +/_hvcx 0 def +/_hvcy 0 def +/_bitfont null def +/_bitlobyte 0 def +/_bithibyte 0 def +/_bitkey null def +/_bitdata null def +/_bitindex 0 def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 100 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + /_aicmykps where {pop /_?cmyk _aicmykps def}if + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/hswj +{ + dup stringwidth 3 2 roll + { + _hvwb eq { exch _hvcx add exch _hvcy add } if + exch _hvax add exch _hvay add + } cforall +} def +/vswj +{ + 0 0 3 -1 roll + { + dup 255 le + _charorientation 1 eq + and + { + dup cstring stringwidth 5 2 roll + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + 4 -1 roll sub exch + 3 -1 roll sub exch + } + { + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + _fontHeight sub + } ifelse + } cforall +} def +/swj +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hswj } { vswj } ifelse +} def +/sw +{ + 0 0 0 6 3 roll swj +} def +/vjss +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + gsave + 2 index false charpath + 6 index setmatrix stroke + grestore + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjss +{ + 4 1 roll + { + dup cstring + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jss +{ + _lineorientation 0 eq { hjss } { vjss } ifelse +} def +/ss +{ + 0 0 0 7 3 roll jss +} def +/vjsp +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + false charpath + currentpoint + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + 2 index false charpath + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjsp +{ + 4 1 roll + { + dup cstring + false charpath + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jsp +{ + matrix currentmatrix + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/sp +{ + matrix currentmatrix + 0 0 0 7 3 roll + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/_rgbtocmyk +{ + 3 + { + 1 exch sub 3 1 roll + } repeat + 3 copy 1 4 1 roll + 3 + { + 3 index 2 copy gt + { + exch + } if + pop 4 1 roll + } repeat + pop pop pop + 4 1 roll + 3 + { + 3 index sub + 3 1 roll + } repeat + 4 -1 roll +} def +/setrgbfill +{ + _rgbf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _rgbf aload pop setrgbcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/setrgbstroke +{ + _rgbs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _rgbs aload pop setrgbcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xa +{ + _?cmyk { + 3 npop k + }{ + setrgbfill 4 npop + } ifelse +} def +/XA +{ + _?cmyk { + 3 npop K + }{ + setrgbstroke 4 npop + } ifelse +} def +/Xs +{ + /_gf exch ddef + 5 npop + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setAIseparationgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XS +{ + /_gs exch ddef + 5 npop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setAIseparationgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xx +{ + exch + /_gf exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XX +{ + exch + /_gs exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/XK +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + K + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + XA + } ifelse +} def +/Xk +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + k + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + Xa + } ifelse +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/Xt { + pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + endString eq { + cleartomark stop + } if + }ifelse + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + }ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 6 npop + 7 2 roll + 5 npop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 4 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setrgbcolor +{ + 3 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +/XP +{ + 4 npop +} bind def +/XD +{ + pop +} bind def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_cshow 2.0 8 +%%Title: (Writing System Operators) +%%Version: 2.0 8 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 14 dict dup begin put +/initialize +{ + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_cshow begin +} def +/terminate +{ +currentdict Adobe_cshow eq + { + end + } if +} def +/cforall +{ + /_lobyte 0 ddef + /_hibyte 0 ddef + /_cproc exch ddef + /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef + { + /_lobyte exch ddef + _hibyte 0 eq + _cscript 1 eq + _lobyte 129 ge _lobyte 159 le and + _lobyte 224 ge _lobyte 252 le and or and + _cscript 2 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 3 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 25 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript -1 eq + or or or or and + { + /_hibyte _lobyte ddef + } + { + _hibyte 256 mul _lobyte add + _cproc + /_hibyte 0 ddef + } ifelse + } forall +} def +/cstring +{ + dup 256 lt + { + (s) dup 0 4 3 roll put + } + { + dup 256 idiv exch 256 mod + (hl) dup dup 0 6 5 roll put 1 4 3 roll put + } ifelse +} def +/clength +{ + 0 exch + { 256 lt { 1 } { 2 } ifelse add } cforall +} def +/hawidthshow +{ + { + dup cstring + show + _hvax _hvay rmoveto + _hvwb eq { _hvcx _hvcy rmoveto } if + } cforall +} def +/vawidthshow +{ + { + dup 255 le + _charorientation 1 eq + and + { + -90 rotate + 0 _fontRotateAdjust rmoveto + cstring + _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow + 0 _fontRotateAdjust neg rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + exch _hvay sub exch _hvax sub + 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if + 3 2 roll + cstring + dup stringwidth pop 2 div neg _fontAscent neg rmoveto + show + moveto + } ifelse + } cforall +} def +/hvawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse +} def +/hvwidthshow +{ + 0 0 3 -1 roll hvawidthshow +} def +/hvashow +{ + 0 0 0 6 -3 roll hvawidthshow +} def +/hvshow +{ + 0 0 0 0 0 6 -1 roll hvawidthshow +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_shading_AI8 1.0 0 +%%Title: (Adobe Illustrator 8 Shading Procset) +%%Version: 1.0 0 +%%CreationDate: (12/17/97) () +%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /Adobe_shading_AI8 10 dict dup begin put +/initialize { + Adobe_shading_AI8 begin + Adobe_shading_AI8 bdprocs + Mesh /initialize get exec +} def +/terminate { + currentdict Adobe_shading_AI8 eq { + end + } if +} def +/bdprocs { + { + dup xcheck 1 index type /arraytype eq and { + bind + } if + pop pop + } forall +} def +/X! {pop} def +/X# {pop pop} def +/Mesh 40 dict def +Mesh begin +/initialize { + Mesh bdprocs + Mesh begin + /emulate? /AI8MeshEmulation where { + pop AI8MeshEmulation + }{ + systemdict /shfill known not + } ifelse def + end +} def +/bd { + shadingdict begin +} def +/paint { + emulate? { + end + }{ + /_lp /none ddef _fc /_lp /none ddef + + /AIColorSpace AIColorSpace tocolorspace store + /ColorSpace AIColorSpace topsspace store + + version_ge_3010.106 not systemdict /setsmoothness known and { + 0.0001 setsmoothness + } if + + composite? { + /DataSource getdatasrc def + Matrix concat + currentdict end + shfill + }{ + AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { + end + }{ + /ColorSpace /DeviceGray store + /Decode [0 1 0 1 0 1] store + /DataSource getplatesrc def + Matrix concat + currentdict end + shfill + } ifelse + } ifelse + } ifelse +} def +/shadingdict 12 dict def +shadingdict begin + /ShadingType 6 def + /BitsPerCoordinate 16 def + /BitsPerComponent 8 def + /BitsPerFlag 8 def +end +/datafile null def +/databuf 256 string def +/dataptr 0 def +/srcspace null def +/srcchannels 0 def +/dstchannels 0 def +/dstplate 0 def +/srctodstcolor null def +/getplatesrc { + /srcspace AIColorSpace store + /srcchannels AIColorSpace getnchannels store + /dstchannels 1 store + /dstplate getplateindex store + /srctodstcolor srcspace makesmarks { + dstplate 4 eq { + {1 exch sub} + }{ + {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} + } ifelse + }{ + {srcchannels {pop} repeat 1} + } ifelse store + /datafile getdatasrc store + /rdpatch168 load DataLength () /SubFileDecode filter +} def +/getdatasrc { + /rdcmntline load /ASCII85Decode filter +} def +/rdpatch168 { + /dataptr 0 store + 49 rdcount + 4 { + dup {pop srcchannels getint8} if + dup {pop srctodstcolor dstchannels putint8 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdpatch3216 { + /dataptr 0 store + 97 rdcount + 4 { + dup {pop srcchannels getint16} if + dup {pop srctodstcolor dstchannels putint16 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdcount { + dup 0 gt { + datafile databuf dataptr 4 -1 roll getinterval readstring + exch length dataptr add /dataptr exch store + }{ + true + } ifelse +} def +/getint8 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 255 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint8 { + dup dataptr add /dataptr exch store + dataptr exch + { + 1 sub exch + 255 mul cvi + databuf 2 index + 3 -1 roll put + } repeat + pop +} def +/getint16 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 256 mul datafile read} if + dup {pop add 65535 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint16 { + dup 2 mul dataptr add /dataptr exch store + dataptr exch + { + 2 sub exch + 65535 mul cvi dup + 256 idiv databuf 3 index 3 -1 roll put + 256 mod databuf 2 index 1 add 3 -1 roll put + } repeat + pop +} def +/srcbuf 256 string def +/rdcmntline { + currentfile srcbuf readline pop + (%) anchorsearch {pop} if +} def +/getplateindex { + 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall +} def +/aicsarray 4 array def +/aicsaltvals 4 array def +/aicsaltcolr aicsaltvals def +/tocolorspace { + dup type /arraytype eq { + mark exch aload pop + aicsarray 0 3 -1 roll put + aicsarray 1 3 -1 roll put + dup aicsarray 2 3 -1 roll put + gettintxform aicsarray 3 3 -1 roll put + counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store + aicsaltcolr astore pop pop + aicsarray + } if +} def +/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def +/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def +/gettintxform { + /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load +} def +/getnchannels { + dup type /arraytype eq {0 get} if + colorspacedict exch get begin Channels end +} def +/makesmarks { + composite? { + pop true + }{ + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin MarksPlate end + } ifelse +} def +/markingplate { + composite? { + pop true + }{ + dup type /arraytype eq { + dup length getplateindex gt {getplateindex get}{pop false} ifelse + } if + } ifelse +} def +/tocmyk { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToCMYK end +} def +/topsspace { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToPSSpace end +} def +/colorspacedict 5 dict dup begin + /DeviceGray 4 dict dup begin + /Channels 1 def + /MarksPlate {pop black?} def + /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def + /ToPSSpace {} def + end def + /DeviceRGB 4 dict dup begin + /Channels 3 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop _rgbtocmyk} def + /ToPSSpace {} def + end def + /DeviceCMYK 4 dict dup begin + /Channels 4 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop} def + /ToPSSpace {} def + end def + /Separation 4 dict dup begin + /Channels 1 def + /MarksPlate { + /findcmykcustomcolor where { + pop dup 1 exch ToCMYK 5 -1 roll 1 get + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace {} def + end def + /Process 4 dict dup begin + /Channels 1 def + /MarksPlate { + isCMYKSep? { + 1 exch ToCMYK 4 array astore getplateindex get 0 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace { + 4 array copy dup 0 /Separation put + } def + end def +end def +/isoverprint { + /currentoverprint where {pop currentoverprint}{_of} ifelse +} def +/version_ge_3010.106 { + version {cvr} stopped { + pop + false + }{ + 3010.106 ge + } ifelse +} def +end +end +defaultpacking setpacking +%%EndResource +%%EndProlog %%BeginSetup userdict /_useSmoothShade false put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec +Adobe_cshow /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_shading_AI8 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (svg2279) Ln 0 A u U u u u 0 O 0 0 0 0 1 1 1 Xa 0 R 0.74902 0.678431 0.670588 0.901961 0 0 0 XA 0 J 0 j 1.04162 w 4 M []0 d 0 XR 360.9937 306.4668 m 439.9941 306.4668 L 439.9941 292.4668 L 360.9937 292.4668 L 360.9937 306.4668 L b 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 1 w 362.4751 305.0669 m 438.5127 305.0669 L 438.5127 293.8672 L 362.4751 293.8672 L 362.4751 305.0669 L f 1 D 0.345098 0.239216 0.309804 0 0.670588 0.694118 0.666667 Xa 362.4751 305.0547 m 362.4751 293.8545 L 382.5557 293.8545 L 383.8477 295.4883 384.7197 297.3867 384.7197 299.4546 c 384.7197 301.5088 383.8628 303.4282 382.5864 305.0547 C 362.4751 305.0547 L f q 0 D 362.6411 305.0669 m 382.2085 305.0669 L 382.2085 293.8672 L 362.6411 293.8672 L 362.6411 305.0669 L h W n u 0 O 0 0 0 0 1 1 1 Xa 379.79 299.4668 m 379.792 295.9746 376.7988 293.1426 373.1045 293.1406 c 369.4106 293.1387 366.4136 295.9668 366.4116 299.459 c 366.4116 299.4614 366.4116 299.4639 366.4116 299.4668 c 366.4092 302.9585 369.4023 305.791 373.0967 305.793 C 376.791 305.7949 379.7876 302.9658 379.79 299.4741 c 379.79 299.4717 379.79 299.4692 379.79 299.4668 c f *u 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 378.5386 304.6162 m 380.0215 303.2144 380.7637 301.4976 380.7637 299.4668 c 380.7637 297.4355 380.0347 295.7373 378.5767 294.3711 C 377.0293 292.9326 375.2012 292.2129 373.0913 292.2129 c 371.0068 292.2129 369.21 292.9268 367.7012 294.3535 C 366.1919 295.7793 365.4375 297.4844 365.4375 299.4668 c 365.4375 301.4492 366.1919 303.166 367.7012 304.6162 C 369.1714 306.019 370.9683 306.7202 373.0913 306.7202 c 375.2397 306.7202 377.0552 306.019 378.5386 304.6162 C f 1 D 368.6997 303.6733 m 367.4453 302.4761 366.8188 301.0737 366.8188 299.4648 c 366.8188 297.8564 367.4395 296.4658 368.6802 295.293 C 369.9214 294.1201 371.3994 293.5332 373.1138 293.5332 c 374.8281 293.5332 376.3184 294.126 377.585 295.3105 C 378.7876 296.4121 379.3892 297.7959 379.3892 299.4648 c 379.3892 301.1211 378.7778 302.5273 377.5562 303.6821 C 376.3345 304.8369 374.8535 305.4146 373.1138 305.4146 c 371.3735 305.4146 369.9019 304.834 368.6997 303.6733 C f 0 D 372 300.1724 m 371.8081 300.5674 371.5215 300.7646 371.1387 300.7646 c 370.4624 300.7646 370.1245 300.3345 370.1245 299.4741 c 370.1245 298.6133 370.4624 298.1836 371.1387 298.1836 c 371.5854 298.1836 371.9043 298.3926 372.0957 298.8125 C 373.0332 298.3408 L 372.5864 297.5898 371.916 297.2148 371.022 297.2148 c 370.3325 297.2148 369.7803 297.415 369.3657 297.8145 C 368.9502 298.2139 368.7432 298.7646 368.7432 299.4668 c 368.7432 300.1567 368.957 300.7041 369.3848 301.1099 C 369.8125 301.5156 370.3452 301.7183 370.9839 301.7183 c 371.9287 301.7183 372.6055 301.3662 373.0146 300.6631 C 372 300.1724 L f 376.4102 300.1724 m 376.2183 300.5674 375.9375 300.7646 375.5669 300.7646 c 374.877 300.7646 374.5317 300.3345 374.5317 299.4741 c 374.5317 298.6133 374.877 298.1836 375.5669 298.1836 c 376.0142 298.1836 376.3271 298.3926 376.5059 298.8125 C 377.4644 298.3408 L 377.0186 297.5898 376.3491 297.2148 375.4565 297.2148 c 374.7681 297.2148 374.2173 297.415 373.8027 297.8145 C 373.3887 298.2139 373.1816 298.7646 373.1816 299.4668 c 373.1816 300.1567 373.3921 300.7041 373.8125 301.1099 C 374.2329 301.5156 374.7681 301.7183 375.4185 301.7183 c 376.3618 301.7183 377.0376 301.3662 377.4448 300.6631 C 376.4102 300.1724 L f *U U /AdobeObjectMatrix (0.961253 0.000000 0.000000 0.961253 6.834157 9.506999) XT Q U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 158.000000 54.000000) XT 0 A *u 1 D 0 O 0 0 0 0 1 1 1 Xa 0 J 0 j 1 w 4 M []0 d 0 XR 389.5518 300.0986 m 389.7944 300.0986 389.978 300.1484 390.1035 300.2485 c 390.2285 300.3486 390.291 300.4961 390.291 300.6914 c 390.291 300.8838 390.2285 301.0303 390.1035 301.1304 C 389.978 301.2324 389.7944 301.2842 389.5518 301.2842 C 388.7007 301.2842 L 388.7007 300.0986 L 389.5518 300.0986 L F 389.604 297.6494 m 389.9131 297.6494 390.1445 297.7109 390.2993 297.833 C 390.4565 297.9551 390.5352 298.1406 390.5352 298.3887 c 390.5352 298.6309 390.4575 298.8125 390.3032 298.9316 C 390.1489 299.0547 389.9155 299.1162 389.604 299.1162 C 388.7007 299.1162 L 388.7007 297.6494 L 389.604 297.6494 L F 0 D 391.0347 299.6636 m 391.3647 299.5737 391.6206 299.4072 391.8018 299.1646 c 391.9829 298.9219 392.0732 298.625 392.0732 298.2715 c 392.0732 297.7324 391.8789 297.3291 391.4897 297.0645 c 391.1011 296.7988 390.5098 296.666 389.7158 296.666 C 387.1626 296.666 L 387.1626 302.2666 L 389.4722 302.2666 L 390.3008 302.2666 390.8999 302.1494 391.27 301.9141 C 391.6431 301.6792 391.8296 301.3027 391.8296 300.7852 c 391.8296 300.5127 391.7617 300.2798 391.626 300.0874 C 391.4897 299.8975 391.293 299.7559 391.0347 299.6636 C F 391.9395 302.2666 m 393.6216 302.2666 L 394.9805 300.2715 L 396.3389 302.2666 L 398.0249 302.2666 L 395.7515 299.0259 L 395.7515 296.666 L 394.2129 296.666 L 394.2129 299.0259 L 391.9395 302.2666 L F *U U /AdobeObjectMatrix (0.987502 0.000000 0.000000 0.933352 -323.900635 -271.876892) XT U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0 G 0 J 0 j 0.5 w 4 M []0 d 0 XR 351.5 292 m 324.5 292 L S 360.5 283 m 360.5 256 L S U u 351.5 307 m 324.5 307 L S 360.5 316 m 360.5 343 L S U u 449.5 307 m 476.5 307 L S 440.5 316 m 440.5 343 L S U u 449.5 292 m 476.5 292 L S 440.5 283 m 440.5 256 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec +Adobe_shading_AI8 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_cshow /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF \ No newline at end of file diff --git a/paper/CC-by.pdf b/paper/CC-by.pdf new file mode 100755 index 0000000..7b790d0 Binary files /dev/null and b/paper/CC-by.pdf differ diff --git a/paper/Makefile b/paper/Makefile new file mode 100644 index 0000000..8a4bc75 --- /dev/null +++ b/paper/Makefile @@ -0,0 +1,35 @@ + +LAB_PATH ?= ../lab-windows + +SHELL := bash +.ONESHELL: +.SHELLFLAGS := -eu -o pipefail -c +.DELETE_ON_ERROR: +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + +main_tex ?= rotohsm_paper +brief_tex ?= rotohsm_tech_report + +VERSION_STRING := $(shell git describe --tags --long --dirty) + +all: ${main_tex}.pdf ${brief_tex}.pdf + +%.pdf: %.tex rotohsm.bib version.tex + pdflatex -shell-escape $< + biber $* + pdflatex -shell-escape $< + +version.tex: ${main_tex}.tex ${brief_tex}.tex rotohsm.bib + echo "${VERSION_STRING}" > $@ + +resources/%.pdf: $(LAB_PATH)/%.ipynb + jupyter-nbconvert --to=pdf --output-dir=resources --output=$* --LatexExporter.template_file=resources/nbexport.tplx $^ + +.PHONY: clean +clean: + rm -f ${main_tex}.aux ${main_tex}.bbl ${main_tex}.bcf ${main_tex}.log ${main_tex}.blg + rm -f ${main_tex}.out ${main_tex}.run.xml texput.log + rm -f ${brief_tex}.aux ${brief_tex}.bbl ${brief_tex}.bcf ${brief_tex}.log ${brief_tex}.blg + rm -f ${brief_tex}.out ${brief_tex}.run.xml texput.log + diff --git a/paper/circuits.ipynb b/paper/circuits.ipynb new file mode 100644 index 0000000..2e78b30 --- /dev/null +++ b/paper/circuits.ipynb @@ -0,0 +1,1115 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import schemdraw\n", + "from schemdraw import elements as elm" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2020-12-01T15:29:56.159415\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.3.3, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "<__main__.DiodeOptocoupler at 0x7ff215993c70>" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class DiodeOptocoupler(schemdraw.elements.compound.ElementCompound):\n", + " def __init__(self, *args, **kwargs):\n", + " unit = 1.5\n", + " super().__init__(*args, unit=unit, **kwargs)\n", + "\n", + " box = kwargs.get('box', True)\n", + " boxfill = kwargs.get('boxfill', False)\n", + " bpad = kwargs.get('boxpad', .2)\n", + " label1, label2 = kwargs.get('label1'), kwargs.get('label2')\n", + " rev1, rev2 = kwargs.get('reverse1', False), kwargs.get('reverse2', False)\n", + "\n", + " D1 = self.add(elm.Diode(d='down', reverse=rev1))\n", + " D2 = self.add(elm.Diode(d='down', reverse=rev2, at=[2, 0]))\n", + " if label1:\n", + " self.segments.append(schemdraw.segments.SegmentText(D1.start + (0, 0.5), label1))\n", + " if label2:\n", + " self.segments.append(schemdraw.segments.SegmentText(D2.start + (0, 0.5), label2))\n", + " \n", + " self.add(elm.Arrow('r', at=[.6, -unit/2 + .2], l=.4, headwidth=.15, headlength=.4))\n", + " self.add(elm.Arrow('r', at=[.6, -unit/2 - .2], l=.4, headwidth=.15, headlength=.4))\n", + "\n", + " bbox = self.get_bbox()\n", + " if box:\n", + " self.add(elm.Rect(\n", + " 'r', at=[0, 0],\n", + " corner1=[bbox.xmin-bpad, bbox.ymin-bpad],\n", + " corner2=[bbox.xmax+bpad, bbox.ymax+bpad],\n", + " fill=boxfill, zorder=0))\n", + "\n", + " A = self.add(elm.Line('r', at=D2.start, l=bpad*2))\n", + " B = self.add(elm.Line('r', at=D2.end, l=bpad*2))\n", + " C = self.add(elm.Line('l', at=D1.start, tox=bbox.xmin-bpad))\n", + " D = self.add(elm.Line('l', at=D1.end, tox=bbox.xmin-bpad))\n", + " self.anchors['anode1'] = C.end\n", + " self.anchors['cathode1'] = D.end\n", + " self.anchors['anode2'] = B.end\n", + " self.anchors['cathode2'] = A.end\n", + "DiodeOptocoupler(box=False, reverse2=True, label2='D2')" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2020-12-01T15:40:27.785440\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.3.3, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 177, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d = schemdraw.Drawing()\n", + "V1 = d.add(elm.SourceV(label='5V'))\n", + "d.add(elm.Line(d='right', l=d.unit*2))\n", + "d.add(elm.Resistor(d='down', label='R1'))\n", + "coupler = d.add(DiodeOptocoupler(d='right', box=False, label1='D1', label2='D2', anchor='anode1', reverse2=True))\n", + "d.here = coupler.cathode1\n", + "Q1 = d.add(elm.BjtNpn(d='right', anchor='collector', label='Q1'))\n", + "d.add(elm.Line(xy=Q1.emitter, d='down', l=d.unit*0.25))\n", + "d.add(elm.Line(d='left', tox=V1.start))\n", + "d.add(elm.Line(d='up', toy=V1.start))\n", + "d.add(elm.Resistor(xy=Q1.base, d='left', label='R2'))\n", + "d.add(elm.Dot(open=True, lftlabel='TX in'))\n", + "\n", + "d.add(elm.Line(xy=coupler.cathode2, d='up', toy=V1.end + d.unit*0.5))\n", + "vbus = d.add(elm.Line(d='right', l=d.unit*5))\n", + "\n", + "d.add(elm.Line(xy=coupler.anode2, d='right', l=d.unit*0.5))\n", + "j1 = d.add(elm.Dot())\n", + "d.add(elm.Line(l=d.unit*0.5))\n", + "amp1 = d.add(elm.Opamp(d='right', anchor='in1'))\n", + "\n", + "d.add(elm.Line(xy=j1.xy, d='up', l=d.unit))\n", + "j2 = d.add(elm.Dot())\n", + "\n", + "d.add(elm.Resistor(label='R3', d='right'))\n", + "d.add(elm.Line(l=d.unit*0.5))\n", + "j3 = d.add(elm.Dot())\n", + "d.add(elm.Line(d='down', toy=amp1.out))\n", + "j4 = d.add(elm.Dot())\n", + "d.add(elm.Line('left', tox=amp1.out))\n", + "\n", + "d.add(elm.Line('up', xy=j2.xy, l=d.unit*0.5))\n", + "d.add(elm.Capacitor(label='C1', d='right'))\n", + "d.add(elm.Line(tox=j3.xy))\n", + "d.add(elm.Line(d='down', toy=j3.xy))\n", + "\n", + "d.add(elm.Line(d='left', xy=amp1.in2, l=d.unit*0.2))\n", + "d.add(elm.Line(d='down', l=d.unit*0.5))\n", + "vgnd_bus = d.add(elm.Line(d='right', l=d.unit*5))\n", + "\n", + "d.draw()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/paper/concept_vis_one_axis.pdf b/paper/concept_vis_one_axis.pdf new file mode 100644 index 0000000..ea37280 Binary files /dev/null and b/paper/concept_vis_one_axis.pdf differ diff --git a/paper/concept_vis_one_axis.svg b/paper/concept_vis_one_axis.svg new file mode 100644 index 0000000..f3e909b --- /dev/null +++ b/paper/concept_vis_one_axis.svg @@ -0,0 +1,344 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 1 + 3 + 2 + + + + + + + + + + + + 4 + diff --git a/paper/goette_inertial_hsms_v1_5_eprint.pdf b/paper/goette_inertial_hsms_v1_5_eprint.pdf new file mode 100755 index 0000000..8fdb2b9 Binary files /dev/null and b/paper/goette_inertial_hsms_v1_5_eprint.pdf differ diff --git a/paper/iacrtrans.cls b/paper/iacrtrans.cls new file mode 100755 index 0000000..bf42a75 --- /dev/null +++ b/paper/iacrtrans.cls @@ -0,0 +1,448 @@ +% IACR Transactions DOCUMENT CLASS -- version 0.24 (26 August 2016) +% Written by Gaetan Leurent gaetan.leurent@inria.fr (2016) +% +% To the extent possible under law, the author(s) have dedicated all +% copyright and related and neighboring rights to this software to the +% public domain worldwide. This software is distributed without any +% warranty. +% +% You should have received a copy of the CC0 Public Domain Dedication +% along with this software. If not, see +% . +% +% +%%% Class options: +% +% [preprint] Preprint (no copyright info) +% [submission] Anonymous submission +% [spthm] Emulate llncs sptheorem and remove automatic \qed in proof +% [nohyperref] Disable automatic loading of hyperref +% [draft] +% +%%% HOWTO use this class +% +%% Title +% \title[short]{Long title} +% +%% Authors/affiliation: +% \author{Alice \and Bob} +% \institute{ABC\\ \email{alice@abc} \and DEF\\ \email{bob@def}} +% +%% Keywords/abstract: +% \keywords{banana \and apple} +% \begin{abstract} +% Lorem ipsum dolor sit amet... +% \end{abstract} +% +%% Warnings +% - please don't use any \pagestyle of \thispagestyle command +% - if you have proof with explicit \qed inside, you should either +% remove \qed symbols, replace them by \qedhere, or add option [spthm] + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{iacrtrans}[2016/08/26 v0.24 IACR Transactions Author Class] + +% Common definitions +\def\publname{IACR Transactions on Cryptographic Hardware and Embedded Systems} +\def\IACR@vol{0} +\def\IACR@no{0} +\def\IACR@fp{1} +\def\IACR@DOI{XXXXXXXX} +\usepackage{lastpage} +\def\IACR@lp{\pageref*{LastPage}} + +\newcommand{\setfirstpage}[1]{\def\IACR@fp{#1}\setcounter{page}{#1}} +\newcommand{\setlastpage}[1]{\def\IACR@lp{#1}} +\newcommand{\setvolume}[1]{\def\IACR@vol{#1}} +\newcommand{\setnumber}[1]{\def\IACR@no{#1}} +\newcommand{\setDOI}[1]{\def\IACR@DOI{#1}} + +% Options +\newif\if@loadhr +\@loadhrtrue +\DeclareOption{nohyperref}{\@loadhrfalse} +\newif\if@floatrow +\@floatrowfalse +\DeclareOption{floatrow}{\@floatrowtrue} +\newif\if@submission +\@submissionfalse +\newif\if@preprint +\@preprintfalse +\DeclareOption{final}{\PassOptionsToClass{\CurrentOption}{article}} % Default +\DeclareOption{preprint}{\@preprinttrue} +\DeclareOption{submission}{\@submissiontrue} +\DeclareOption{draft}{\@preprinttrue\PassOptionsToClass{\CurrentOption}{article}} +\newif\if@spthm +\@spthmfalse +\DeclareOption{spthm}{\@spthmtrue} + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} +\ProcessOptions\relax + +% article class with a4paper +\LoadClass[10pt,twoside]{article}[2007/10/19] + +% Geometry +\RequirePackage[a4paper,hscale=0.65,vscale=0.75,marginratio=1:1]{geometry} + +% Title fonts: bf+sf +\RequirePackage{sectsty} +\allsectionsfont{\sffamily\boldmath} +% Also for descrptions +\renewcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries\sffamily #1} + + +% Title/Author/affiliations +\def\@institute{No institute given.} +\newcommand{\institute}[1]{\gdef\@institute{#1}} +\newcommand{\authorrunning}[1]{\gdef\IACR@runningauthors{#1}} +\newcommand{\titlerunning}[1]{\gdef\IACR@runningtitle{#1}} + +\newcounter{IACR@author@cnt} +\newcounter{IACR@inst@cnt} +\newif\if@IACR@autoinst +\@IACR@autoinsttrue +\def\IACR@author@last{0} + +\renewcommand\maketitle{\par + \begingroup + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hb@xt@1.8em{% + \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \thispagestyle{title}\@thanks + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty +% \global\let\@author\@empty + \global\let\@date\@empty +% \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax +} +\def\@maketitle{% + % Count authors and affiliations + \setcounter{IACR@author@cnt}{1}% + \setcounter{IACR@inst@cnt}{1}% + \setbox0\hbox{\def\thanks##1{\global\@IACR@autoinstfalse}\def\inst##1{\global\@IACR@autoinstfalse}\def\and{\stepcounter{IACR@author@cnt}}\@author}% + \setbox0\hbox{\def\and{\stepcounter{IACR@inst@cnt}}\@institute}% + \xdef\IACR@author@last{\theIACR@author@cnt}% + \edef\IACR@inst@last{\theIACR@inst@cnt}% + \ifnum\IACR@author@last=\IACR@inst@last\else\@IACR@autoinstfalse\fi + \ifnum\IACR@author@last=1 \@IACR@autoinstfalse\fi + \newpage + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks + {\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + {\LARGE \bfseries\sffamily\boldmath \@title\par} + \ifdefined\@subtitle\vskip .5em{\large\sffamily\bfseries\@subtitle\par}\fi}% + \vskip 1.5em% + {\large + \lineskip .5em% + \if@submission + Anonymous Submission + \else + \setcounter{IACR@author@cnt}{1}% + \def\and{\if@IACR@autoinst\inst{\theIACR@author@cnt} \fi + \stepcounter{IACR@author@cnt}% + \ifnum\theIACR@author@cnt=\IACR@author@last\unskip\space and \ignorespaces\else\unskip, \ignorespaces\fi} + \@author\if@IACR@autoinst\inst{\theIACR@author@cnt}\fi + \vskip 1em\par + \small + \setcounter{IACR@author@cnt}{1}% + \def\and{\par\stepcounter{IACR@author@cnt}$^\theIACR@author@cnt$~} + \ifnum\IACR@inst@last>1 $^1$~\fi + \@institute + \fi + }% + \end{center}% + \par + \vskip 1.5em} + +\def\IACR@runningauthors{ + \def\thanks##1{}% + \def\inst##1{}% + \def\fnmsep{}% + \def\\{}% + \def\footnote##1{}% + \setcounter{IACR@author@cnt}{1}% + \def\and{\stepcounter{IACR@author@cnt}% + \ifnum\theIACR@author@cnt=\IACR@author@last\unskip\space and \ignorespaces\else\unskip, \ignorespaces\fi} + \@author} + +\def\IACR@runningtitle{% + \def\thanks##1{}% + \def\fnmsep{}% + \def\\{}% + \def\footnote##1{}% + \@title} + +\def\author{\@ifnextchar[{\IACR@@@author}{\IACR@@author}} +\def\IACR@@@author[#1]#2{\authorrunning{#1}\gdef\@author{#2}} +\def\IACR@@author#1{\gdef\@author{#1}} + +\if@submission +\gdef\@author{Anonymous Submission to \publname} +\renewcommand{\author}[2][]{} +\renewcommand{\authorrunning}[1]{} +\renewcommand{\institute}[2][]{} +\fi + + +\def\title{\@ifnextchar[{\IACR@@@title}{\IACR@@title}} +\def\IACR@@@title[#1]#2{\gdef\@title{#2}\titlerunning{#1}} +\def\IACR@@title#1{\gdef\@title{#1}} + +\newcommand{\subtitle}[1]{\gdef\@subtitle{#1}} + +\newcommand{\inst}[1]{\unskip$^{#1}$} +\def\fnmsep{\unskip$^,$} + + +% Head/foot +\RequirePackage{fancyhdr} +\RequirePackage{graphicx} +\fancypagestyle{title}{% +\fancyhf{} % clear all header and footer fields +\if@submission\else\if@preprint\else +\fancyfoot[L]{\small Licensed under \href{http://creativecommons.org/licenses/by/4.0/}{Creative Commons License CC-BY 4.0.}\\ +\publname{} Vol.~\IACR@vol, No.\IACR@no, pp.\IACR@fp---\IACR@lp, \href{https://doi.org/\IACR@DOI}{DOI:\IACR@DOI}} +\fancyfoot[R]{\includegraphics[height=2ex]{CC-by}} +\if@loadhr + \hypersetup{pdfcopyright={Licensed under Creative Commons License CC-BY 4.0.}} + \hypersetup{pdflicenseurl={http://creativecommons.org/licenses/by/4.0/}} + \hypersetup{pdfsubject={IACR Transactions on Symmetric Cryptology}} + \hypersetup{pdflang=en} +\fi +\fi\fi +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt}} +\fancyhf{} % clear all header and footer fields +\fancyhead[RO,LE]{\thepage} +\fancyhead[RE]{\IACR@runningtitle} +\fancyhead[LO]{\IACR@runningauthors} +\renewcommand{\markboth}[2]{} +\pagestyle{fancy} + +\def\subtitle#1{\gdef\@subtitle{#1}} + +%Abstract style, keywords +\def\@IACR@keywords{No keywords given.} + +\def\keywords{\@ifnextchar[{\IACR@@@keywords}{\IACR@@keywords}} +\def\IACR@@@keywords[#1]#2{\gdef\@IACR@PDFkeywords{#1}\gdef\@IACR@keywords{#2}} +\def\IACR@@keywords#1{\gdef\@IACR@keywords{#1}} + +\renewenvironment{abstract}{% + \small\quotation\setlength{\parindent}{0pt}\noindent + \textbf{\textsf{Abstract.}}} + {\smallskip\par\textbf{\textsf{Keywords:}} + \def\and{\unskip\space\textperiodcentered\space\ignorespaces}\@IACR@keywords + \endquotation% + \if@loadhr + %% PDF keywords + \def\and{, }% + \def\thanks##1{}% + \def\footnote##1{}% + \def\inst##1{}% + \def\fnmsep{}% + \def\\{}% + \def\zap@comma@space##1 ,##2{% + ##1% + \ifx##2\@empty\else, \expandafter\zap@comma@space\fi + ##2} + \ifdefined\@IACR@PDFkeywords + \hypersetup{pdfkeywords=\@IACR@PDFkeywords} + \else + \protected@edef\@tmp{\expandafter\@IACR@keywords} + \protected@edef\@tmp{\expandafter\zap@comma@space\@tmp{} ,\@empty} + \hypersetup{pdfkeywords=\@tmp} + \fi + %% PDF author + \def\zap@one,##1{} + \def\zap@last##1,##2{\ifx##1\@empty\else\space and ##1\expandafter\zap@one\fi} + \def\zap@last@comma##1,##2,##3{% + ##1% + \ifx##3\@empty% + \expandafter\zap@last\else + ,\expandafter\zap@last@comma\fi% + ##2,##3} + \def\zap@dbl@space##1 ##2{% + ##1% + \ifx##2\@empty\else\space\expandafter\zap@dbl@space##2\fi} + \protected@edef\@tmp{\expandafter\@author} + % \protected@edef\@tmp{\expandafter\IACR@runningauthors} + \protected@edef\@tmp{\expandafter\zap@last@comma\@tmp,\@empty,\@empty} + \protected@edef\@tmp{\expandafter\zap@comma@space\@tmp{} ,\@empty} + \protected@edef\@tmp{\expandafter\zap@dbl@space\@tmp{} \@empty} + \hypersetup{pdfauthor=\@tmp} + %% PDF title + \hypersetup{pdftitle=\IACR@runningtitle} + \fi +} + + +% Hyperref +\if@loadhr + \RequirePackage{xcolor} + \RequirePackage{etoolbox} + \AtEndPreamble{ + \@ifpackageloaded{hyperref}{}{\usepackage{hyperref}} + \@ifpackageloaded{hyperxmp}{}{\usepackage{hyperxmp}} + \hypersetup{colorlinks=true, + citecolor=black!70!green, + linkcolor=black!70!red} + } + \setcounter{tocdepth}{2} +\fi +% autoref: capitals for Sections, and adding Algorithm +\def\equationautorefname{Equation}% +\def\footnoteautorefname{footnote}% +\def\itemautorefname{item}% +\def\figureautorefname{Figure}% +\def\tableautorefname{Table}% +\def\partautorefname{Part}% +\def\appendixautorefname{Appendix}% +\def\chapterautorefname{Chapter}% +\def\sectionautorefname{Section}% +\def\subsectionautorefname{Subsection}% +\def\subsubsectionautorefname{Subsubsection}% +\def\paragraphautorefname{paragraph}% +\def\subparagraphautorefname{subparagraph}% +\def\FancyVerbLineautorefname{line}% +\def\theoremautorefname{Theorem}% +\def\pageautorefname{page}% +\def\algorithmautorefname{Algorithm} + +% AMS math +\RequirePackage{amsmath,amssymb,amsthm} +\RequirePackage{mathtools} +\theoremstyle{definition} +\newtheorem{definition}{Definition} +\newtheorem{example}{Example} +\newtheorem{exercise}{Exercise} +\newtheorem{property}{Property} +\newtheorem{question}{Question} +\newtheorem{solution}{Solution} + +\theoremstyle{plain} +\newtheorem{theorem}{Theorem} +\newtheorem{proposition}{Proposition} +\newtheorem{problem}{Problem} +\newtheorem{lemma}{Lemma} +\newtheorem{conjecture}{Conjecture} +\newtheorem{corollary}{Corollary} +\newtheorem*{claim}{Claim} + +\theoremstyle{remark} +\newtheorem{remark}{Remark} +\newtheorem{note}{Note} +\newtheorem{case}{Case} + +\theoremstyle{plain} + +%Emulate LLNCS spnewtheorem +\if@spthm +\def\spnewtheorem{\@ifstar{\IACR@spstar}{\IACR@sp}} +\def\IACR@spstar#1#2#3#4{\newtheorem*{#1}{#2}} +\def\IACR@sp#1{\@ifnextchar[{\IACR@sp@b{#1}}{\IACR@sp@a{#1}}} +\def\IACR@sp@a#1#2[#3]#4#5{\newtheorem{#1}{#2}[#3]} +\def\IACR@sp@b#1[#2]#3#4#5{\newtheorem{#1}[#2]{#3}} +\renewcommand{\pushQED}[1]{} +\fi + +% Floats and captions +\if@floatrow +\RequirePackage{floatrow} +\floatsetup[table]{style=Plaintop} +\RequirePackage{caption} +\captionsetup{labelfont={sf,bf}} +\else +\RequirePackage{float} +\newcommand\fs@iacrabove{% + % Swap \abovecaptionskip and \belowcaptionskip + \addtolength\abovecaptionskip{-\belowcaptionskip} + \addtolength\belowcaptionskip{\abovecaptionskip} + \addtolength\abovecaptionskip{-\belowcaptionskip} + \setlength\abovecaptionskip{-\abovecaptionskip} + \fs@plaintop% + \def\@fs@cfont{\sffamily\bfseries}} +\newcommand\fs@iacrbelow{% + \fs@plain% + \def\@fs@cfont{\sffamily\bfseries}} +\floatstyle{iacrabove} +\restylefloat{table} +\floatstyle{iacrbelow} +\restylefloat{figure} +\fi + +% Extra commands +\def\email{\@ifnextchar[{\IACR@@email}{\IACR@email}} +\if@loadhr +\def\IACR@@email[#1]#2{\href{mailto:#1}{\nolinkurl{#2}}} +\def\IACR@email#1{\href{mailto:#1}{\nolinkurl{#1}}} +\else +\RequirePackage{url} +\def\IACR@@email[#1]#2{\url{#2}} +\def\IACR@email#1{\url{#1}} +\fi + +% Line # for submission +\newcommand\linenomathWithnumbersforAMS{% + \ifLineNumbers +%% \ifx\@@par\@@@par\else + \ifnum\interlinepenalty>-\linenopenaltypar + \global\holdinginserts\thr@@ + \advance\interlinepenalty \linenopenalty + \ifhmode % v4.3 + \advance\predisplaypenalty \linenopenalty + \fi +%% \advance\postdisplaypenalty \linenopenalty + \advance\interdisplaylinepenalty \linenopenalty + \fi + \fi + \ignorespaces + } + +\if@submission +\RequirePackage[mathlines]{lineno} +\linenumbers +\def\linenumberfont{\normalfont\tiny\sffamily\color{gray}} + +% Taken from http://phaseportrait.blogspot.fr/2007/08/lineno-and-amsmath-compatibility.html +\newcommand*\patchAmsMathEnvironmentForLineno[1]{% + \expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname + \expandafter\let\csname oldend#1\expandafter\endcsname\csname end#1\endcsname + \renewenvironment{#1}% + {\linenomathWithnumbersforAMS\csname old#1\endcsname}% + {\csname oldend#1\endcsname\endlinenomath}}% +\newcommand*\patchBothAmsMathEnvironmentsForLineno[1]{% + \patchAmsMathEnvironmentForLineno{#1}% + \patchAmsMathEnvironmentForLineno{#1*}}% +\AtBeginDocument{% +%\patchBothAmsMathEnvironmentsForLineno{equation}% +\patchBothAmsMathEnvironmentsForLineno{align}% +\patchBothAmsMathEnvironmentsForLineno{flalign}% +\patchBothAmsMathEnvironmentsForLineno{alignat}% +\patchBothAmsMathEnvironmentsForLineno{gather}% +\patchBothAmsMathEnvironmentsForLineno{multline}% +} +\fi + +% Microtype +\RequirePackage{microtype} + +% Fonts +\usepackage[T1]{fontenc} +\usepackage{lmodern} diff --git a/paper/ihsm_shaft_countermeasures_a.pdf b/paper/ihsm_shaft_countermeasures_a.pdf new file mode 100755 index 0000000..6f1f857 Binary files /dev/null and b/paper/ihsm_shaft_countermeasures_a.pdf differ diff --git a/paper/ihsm_shaft_countermeasures_a.svg b/paper/ihsm_shaft_countermeasures_a.svg new file mode 100755 index 0000000..1c89ced --- /dev/null +++ b/paper/ihsm_shaft_countermeasures_a.svg @@ -0,0 +1,160 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/paper/ihsm_shaft_countermeasures_b.pdf b/paper/ihsm_shaft_countermeasures_b.pdf new file mode 100755 index 0000000..9ad0f95 Binary files /dev/null and b/paper/ihsm_shaft_countermeasures_b.pdf differ diff --git a/paper/ihsm_shaft_countermeasures_b.svg b/paper/ihsm_shaft_countermeasures_b.svg new file mode 100755 index 0000000..c6c3e29 --- /dev/null +++ b/paper/ihsm_shaft_countermeasures_b.svg @@ -0,0 +1,174 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/paper/ihsm_shaft_countermeasures_c.pdf b/paper/ihsm_shaft_countermeasures_c.pdf new file mode 100755 index 0000000..5e01be2 Binary files /dev/null and b/paper/ihsm_shaft_countermeasures_c.pdf differ diff --git a/paper/ihsm_shaft_countermeasures_c.svg b/paper/ihsm_shaft_countermeasures_c.svg new file mode 100755 index 0000000..715b038 --- /dev/null +++ b/paper/ihsm_shaft_countermeasures_c.svg @@ -0,0 +1,246 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/paper/ir_tx_schema.pdf b/paper/ir_tx_schema.pdf new file mode 100644 index 0000000..0e44ca5 Binary files /dev/null and b/paper/ir_tx_schema.pdf differ diff --git a/paper/ir_tx_schema.svg b/paper/ir_tx_schema.svg new file mode 100644 index 0000000..5d54c2b --- /dev/null +++ b/paper/ir_tx_schema.svg @@ -0,0 +1,340 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 5 + + 3 + + 2 + + 4 + + diff --git a/paper/mesh_gen_viz.pdf b/paper/mesh_gen_viz.pdf new file mode 100644 index 0000000..7ded2fc Binary files /dev/null and b/paper/mesh_gen_viz.pdf differ diff --git a/paper/mesh_gen_viz.svg b/paper/mesh_gen_viz.svg new file mode 100644 index 0000000..59a31b9 --- /dev/null +++ b/paper/mesh_gen_viz.svg @@ -0,0 +1,1547 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + diff --git a/paper/mesh_scan_crop.jpg b/paper/mesh_scan_crop.jpg new file mode 100644 index 0000000..baa8e6c Binary files /dev/null and b/paper/mesh_scan_crop.jpg differ diff --git a/paper/photolink_schematic.pdf b/paper/photolink_schematic.pdf new file mode 100644 index 0000000..3284427 Binary files /dev/null and b/paper/photolink_schematic.pdf differ diff --git a/paper/photolink_schematic.pro b/paper/photolink_schematic.pro new file mode 100644 index 0000000..02a2ddf --- /dev/null +++ b/paper/photolink_schematic.pro @@ -0,0 +1,43 @@ +update=Tue Dec 1 17:26:36 2020 +version=1 +last_client=eeschema +[general] +version=1 +RootSch= +BoardNm= +[pcbnew] +version=1 +LastNetListRead= +UseCmpFile=1 +PadDrill=0.600000000000 +PadDrillOvalY=0.600000000000 +PadSizeH=1.500000000000 +PadSizeV=1.500000000000 +PcbTextSizeV=1.500000000000 +PcbTextSizeH=1.500000000000 +PcbTextThickness=0.300000000000 +ModuleTextSizeV=1.000000000000 +ModuleTextSizeH=1.000000000000 +ModuleTextSizeThickness=0.150000000000 +SolderMaskClearance=0.000000000000 +SolderMaskMinWidth=0.000000000000 +DrawSegmentWidth=0.200000000000 +BoardOutlineThickness=0.100000000000 +ModuleOutlineThickness=0.150000000000 +[cvpcb] +version=1 +NetIExt=net +[eeschema] +version=1 +LibDir= +[eeschema/libraries] +[schematic_editor] +version=1 +PageLayoutDescrFile= +PlotDirectoryName= +SubpartIdSeparator=0 +SubpartFirstId=65 +NetFmtName= +SpiceAjustPassiveValues=0 +LabSize=50 +ERC_TestSimilarLabels=1 diff --git a/paper/photolink_schematic.sch b/paper/photolink_schematic.sch new file mode 100644 index 0000000..b5c6a64 --- /dev/null +++ b/paper/photolink_schematic.sch @@ -0,0 +1,486 @@ +EESchema Schematic File Version 4 +EELAYER 30 0 +EELAYER END +$Descr A4 11693 8268 +encoding utf-8 +Sheet 1 1 +Title "" +Date "" +Rev "" +Comp "" +Comment1 "" +Comment2 "" +Comment3 "" +Comment4 "" +$EndDescr +$Comp +L Transistor_BJT:BC847 Q1 +U 1 1 5FC67B72 +P 3450 3300 +F 0 "Q1" H 3641 3300 50 0000 L CNN +F 1 "BC847" H 3641 3255 50 0001 L CNN +F 2 "Package_TO_SOT_SMD:SOT-23" H 3650 3225 50 0001 L CIN +F 3 "http://www.infineon.com/dgdl/Infineon-BC847SERIES_BC848SERIES_BC849SERIES_BC850SERIES-DS-v01_01-en.pdf?fileId=db3a304314dca389011541d4630a1657" H 3450 3300 50 0001 L CNN + 1 3450 3300 + 1 0 0 -1 +$EndComp +$Comp +L Device:R_Small R1 +U 1 1 5FC6861A +P 3050 3300 +F 0 "R1" V 3246 3300 50 0000 C CNN +F 1 "R_Small" V 3155 3300 50 0000 C CNN +F 2 "" H 3050 3300 50 0001 C CNN +F 3 "~" H 3050 3300 50 0001 C CNN + 1 3050 3300 + 0 -1 -1 0 +$EndComp +Wire Wire Line + 4750 3050 4600 3050 +Wire Wire Line + 3550 2950 3550 3100 +Wire Wire Line + 3150 3300 3250 3300 +$Comp +L power:GND1 #PWR02 +U 1 1 5FC74679 +P 3550 3500 +F 0 "#PWR02" H 3550 3250 50 0001 C CNN +F 1 "GND1" H 3555 3327 50 0000 C CNN +F 2 "" H 3550 3500 50 0001 C CNN +F 3 "" H 3550 3500 50 0001 C CNN + 1 3550 3500 + 1 0 0 -1 +$EndComp +Wire Wire Line + 4750 3250 4650 3250 +Wire Wire Line + 4600 3050 4600 2650 +Wire Wire Line + 4600 2650 4900 2650 +Connection ~ 4600 3050 +Wire Wire Line + 4900 2300 4600 2300 +Wire Wire Line + 4600 2300 4600 2650 +Connection ~ 4600 2650 +Text GLabel 9150 3350 2 50 Input ~ 0 +RX_OUT +Text GLabel 2850 3300 0 50 Input ~ 0 +TX_IN +Wire Wire Line + 2850 3300 2950 3300 +$Comp +L power:+3V3 #PWR01 +U 1 1 5FC80852 +P 3550 2150 +F 0 "#PWR01" H 3550 2000 50 0001 C CNN +F 1 "+3V3" H 3565 2323 50 0000 C CNN +F 2 "" H 3550 2150 50 0001 C CNN +F 3 "" H 3550 2150 50 0001 C CNN + 1 3550 2150 + 1 0 0 -1 +$EndComp +$Comp +L Device:Opamp_Quad_Generic U1 +U 4 1 5FC81BCB +P 5250 4650 +F 0 "U1" H 5250 4375 50 0000 C CNN +F 1 "MCP6494" H 5250 4374 50 0001 C CNN +F 2 "" H 5250 4650 50 0001 C CNN +F 3 "~" H 5250 4650 50 0001 C CNN + 4 5250 4650 + 1 0 0 1 +$EndComp +$Comp +L Device:R R2 +U 1 1 5FC87551 +P 3550 2400 +F 0 "R2" H 3620 2400 50 0000 L CNN +F 1 "R" H 3620 2355 50 0001 L CNN +F 2 "" V 3480 2400 50 0001 C CNN +F 3 "~" H 3550 2400 50 0001 C CNN + 1 3550 2400 + 1 0 0 -1 +$EndComp +$Comp +L Device:Opamp_Quad_Generic U1 +U 2 1 5FC77130 +P 7200 3250 +F 0 "U1" H 7200 2975 50 0000 C CNN +F 1 "MCP6494" H 7200 2974 50 0001 C CNN +F 2 "" H 7200 3250 50 0001 C CNN +F 3 "~" H 7200 3250 50 0001 C CNN + 2 7200 3250 + 1 0 0 1 +$EndComp +$Comp +L Device:Opamp_Quad_Generic U1 +U 1 1 5FC6A2B7 +P 5050 3150 +F 0 "U1" H 5050 2783 50 0000 C CNN +F 1 "MCP6494" H 5050 2874 50 0000 C CNN +F 2 "" H 5050 3150 50 0001 C CNN +F 3 "~" H 5050 3150 50 0001 C CNN + 1 5050 3150 + 1 0 0 1 +$EndComp +Wire Wire Line + 7500 3250 7600 3250 +Wire Wire Line + 3550 2250 3550 2150 +$Comp +L Device:D_ALT LED1 +U 1 1 5FC90B25 +P 3550 2800 +F 0 "LED1" V 3550 3100 50 0000 R CNN +F 1 "D_ALT" V 3505 2720 50 0001 R CNN +F 2 "" H 3550 2800 50 0001 C CNN +F 3 "~" H 3550 2800 50 0001 C CNN + 1 3550 2800 + 0 -1 -1 0 +$EndComp +Wire Wire Line + 3550 2550 3550 2650 +$Comp +L Device:D_ALT PD1 +U 1 1 5FC93B60 +P 4150 2800 +F 0 "PD1" V 4150 2880 50 0000 L CNN +F 1 "D_ALT" V 4105 2720 50 0001 R CNN +F 2 "" H 4150 2800 50 0001 C CNN +F 3 "~" H 4150 2800 50 0001 C CNN + 1 4150 2800 + 0 1 1 0 +$EndComp +Wire Wire Line + 4150 3050 4150 2950 +Wire Wire Line + 4150 3050 4600 3050 +$Comp +L Device:R R3 +U 1 1 5FC9B279 +P 4350 4500 +F 0 "R3" H 4420 4500 50 0000 L CNN +F 1 "R" H 4420 4455 50 0001 L CNN +F 2 "" V 4280 4500 50 0001 C CNN +F 3 "~" H 4350 4500 50 0001 C CNN + 1 4350 4500 + 1 0 0 -1 +$EndComp +$Comp +L Device:R R4 +U 1 1 5FC9B8DC +P 4350 5000 +F 0 "R4" H 4420 5000 50 0000 L CNN +F 1 "R" H 4420 4955 50 0001 L CNN +F 2 "" V 4280 5000 50 0001 C CNN +F 3 "~" H 4350 5000 50 0001 C CNN + 1 4350 5000 + 1 0 0 -1 +$EndComp +$Comp +L Device:C C1 +U 1 1 5FC9BF27 +P 4650 5000 +F 0 "C1" H 4765 5000 50 0000 L CNN +F 1 "C" H 4765 4955 50 0001 L CNN +F 2 "" H 4688 4850 50 0001 C CNN +F 3 "~" H 4650 5000 50 0001 C CNN + 1 4650 5000 + 1 0 0 -1 +$EndComp +Wire Wire Line + 4350 4650 4350 4750 +Wire Wire Line + 4350 4750 4650 4750 +Wire Wire Line + 4650 4750 4650 4850 +Connection ~ 4350 4750 +Wire Wire Line + 4350 4750 4350 4850 +$Comp +L power:GND2 #PWR05 +U 1 1 5FC9F5E3 +P 4350 5300 +F 0 "#PWR05" H 4350 5050 50 0001 C CNN +F 1 "GND2" H 4355 5127 50 0000 C CNN +F 2 "" H 4350 5300 50 0001 C CNN +F 3 "" H 4350 5300 50 0001 C CNN + 1 4350 5300 + 1 0 0 -1 +$EndComp +Wire Wire Line + 4350 5300 4350 5250 +Wire Wire Line + 4650 5150 4650 5250 +Wire Wire Line + 4650 5250 4350 5250 +Connection ~ 4350 5250 +Wire Wire Line + 4350 5250 4350 5150 +$Comp +L power:+3V0 #PWR04 +U 1 1 5FCA206B +P 4350 4250 +F 0 "#PWR04" H 4350 4100 50 0001 C CNN +F 1 "+3V0" H 4365 4423 50 0000 C CNN +F 2 "" H 4350 4250 50 0001 C CNN +F 3 "" H 4350 4250 50 0001 C CNN + 1 4350 4250 + 1 0 0 -1 +$EndComp +Wire Wire Line + 4350 4250 4350 4350 +Wire Wire Line + 4950 4750 4650 4750 +Connection ~ 4650 4750 +Wire Wire Line + 4950 4550 4800 4550 +Wire Wire Line + 4800 4550 4800 4150 +Wire Wire Line + 4800 4150 5700 4150 +Wire Wire Line + 5700 4150 5700 4650 +Wire Wire Line + 5700 4650 5550 4650 +Connection ~ 5700 4650 +$Comp +L Device:R R5 +U 1 1 5FCB3FD4 +P 5050 2650 +F 0 "R5" V 4843 2650 50 0000 C CNN +F 1 "100k" V 4934 2650 50 0000 C CNN +F 2 "" V 4980 2650 50 0001 C CNN +F 3 "~" H 5050 2650 50 0001 C CNN + 1 5050 2650 + 0 1 1 0 +$EndComp +$Comp +L Device:C C2 +U 1 1 5FCB45E4 +P 5050 2300 +F 0 "C2" V 5302 2300 50 0000 C CNN +F 1 "7p" V 5211 2300 50 0000 C CNN +F 2 "" H 5088 2150 50 0001 C CNN +F 3 "~" H 5050 2300 50 0001 C CNN + 1 5050 2300 + 0 -1 -1 0 +$EndComp +Wire Wire Line + 5200 2300 5500 2300 +Wire Wire Line + 5500 2300 5500 2650 +Wire Wire Line + 5500 3150 5350 3150 +$Comp +L Device:R R6 +U 1 1 5FCB92E2 +P 6150 3150 +F 0 "R6" V 5943 3150 50 0000 C CNN +F 1 "1k" V 6034 3150 50 0000 C CNN +F 2 "" V 6080 3150 50 0001 C CNN +F 3 "~" H 6150 3150 50 0001 C CNN + 1 6150 3150 + 0 1 1 0 +$EndComp +$Comp +L Device:R R7 +U 1 1 5FCB995A +P 7200 2700 +F 0 "R7" V 6993 2700 50 0000 C CNN +F 1 "100k" V 7084 2700 50 0000 C CNN +F 2 "" V 7130 2700 50 0001 C CNN +F 3 "~" H 7200 2700 50 0001 C CNN + 1 7200 2700 + 0 1 1 0 +$EndComp +Wire Wire Line + 5600 3150 5500 3150 +Connection ~ 5500 3150 +Wire Wire Line + 7350 2700 7600 2700 +Wire Wire Line + 7600 2700 7600 3250 +Wire Wire Line + 9150 3350 9050 3350 +Wire Wire Line + 5200 2650 5500 2650 +Connection ~ 5500 2650 +Wire Wire Line + 5500 2650 5500 3150 +$Comp +L power:+3V0 #PWR03 +U 1 1 5FCC0528 +P 4150 2150 +F 0 "#PWR03" H 4150 2000 50 0001 C CNN +F 1 "+3V0" H 4165 2323 50 0000 C CNN +F 2 "" H 4150 2150 50 0001 C CNN +F 3 "" H 4150 2150 50 0001 C CNN + 1 4150 2150 + 1 0 0 -1 +$EndComp +Wire Wire Line + 4150 2150 4150 2650 +$Comp +L Graphic:SYM_Arrow_Normal #SYM1 +U 1 1 5FCC452D +P 3850 2775 +F 0 "#SYM1" H 3850 2835 50 0001 C CNN +F 1 "SYM_Arrow_Normal" H 3860 2725 50 0001 C CNN +F 2 "" H 3850 2775 50 0001 C CNN +F 3 "~" H 3850 2775 50 0001 C CNN + 1 3850 2775 + 1 0 0 -1 +$EndComp +$Comp +L Graphic:SYM_Arrow_Normal #SYM2 +U 1 1 5FCC5099 +P 3850 2850 +F 0 "#SYM2" H 3850 2910 50 0001 C CNN +F 1 "SYM_Arrow_Normal" H 3860 2800 50 0001 C CNN +F 2 "" H 3850 2850 50 0001 C CNN +F 3 "~" H 3850 2850 50 0001 C CNN + 1 3850 2850 + 1 0 0 -1 +$EndComp +Wire Notes Line + 3200 3000 4450 3000 +Wire Notes Line + 4450 3000 4450 2600 +Wire Notes Line + 4450 2600 3200 2600 +Wire Notes Line + 3200 2600 3200 3000 +Text Notes 2900 2700 0 50 ~ 0 +IR link +Wire Wire Line + 4650 3750 5950 3750 +Wire Wire Line + 5950 4650 5950 3750 +Wire Wire Line + 5700 4650 5950 4650 +Wire Notes Line + 3850 1550 3850 5700 +Text Notes 3750 1750 2 100 ~ 0 +Stator +Text Notes 3950 1750 0 100 ~ 0 +Rotor +Text Label 5650 3750 2 50 ~ 0 +VGND +Text Notes 5300 1950 2 50 ~ 0 +TIA G=100kΩ +Text Notes 7500 2350 2 50 ~ 0 +Amplifier G=100 +Text Notes 8950 2900 2 50 ~ 0 +Comparator +Text Notes 5650 4000 2 50 ~ 0 +Virtual Ground Buffer +$Comp +L Device:C C3 +U 1 1 5FC76733 +P 5750 3150 +F 0 "C3" V 5900 3150 50 0000 C CNN +F 1 "7p" V 5911 3150 50 0001 C CNN +F 2 "" H 5788 3000 50 0001 C CNN +F 3 "~" H 5750 3150 50 0001 C CNN + 1 5750 3150 + 0 1 1 0 +$EndComp +Wire Wire Line + 6650 3350 6650 3750 +Wire Wire Line + 6650 3350 6900 3350 +Connection ~ 6650 3750 +$Comp +L Device:Opamp_Quad_Generic U1 +U 3 1 5FC7A609 +P 8750 3350 +F 0 "U1" H 8750 3075 50 0000 C CNN +F 1 "MCP6494" H 8750 3074 50 0001 C CNN +F 2 "" H 8750 3350 50 0001 C CNN +F 3 "~" H 8750 3350 50 0001 C CNN + 3 8750 3350 + 1 0 0 1 +$EndComp +$Comp +L Device:C C4 +U 1 1 5FC8AF8D +P 7850 3250 +F 0 "C4" V 8102 3250 50 0000 C CNN +F 1 "7p" V 8011 3250 50 0001 C CNN +F 2 "" H 7888 3100 50 0001 C CNN +F 3 "~" H 7850 3250 50 0001 C CNN + 1 7850 3250 + 0 1 1 0 +$EndComp +$Comp +L Device:R R8 +U 1 1 5FC9BACD +P 6400 3400 +F 0 "R8" V 6300 3400 50 0000 C CNN +F 1 "1k" V 6284 3400 50 0001 C CNN +F 2 "" V 6330 3400 50 0001 C CNN +F 3 "~" H 6400 3400 50 0001 C CNN + 1 6400 3400 + -1 0 0 1 +$EndComp +Wire Wire Line + 5950 3750 6400 3750 +Connection ~ 5950 3750 +Wire Wire Line + 6400 3550 6400 3750 +Connection ~ 6400 3750 +Wire Wire Line + 6400 3750 6650 3750 +Wire Wire Line + 6300 3150 6400 3150 +Wire Wire Line + 6400 3250 6400 3150 +Wire Wire Line + 6400 2700 7050 2700 +Connection ~ 6400 3150 +Wire Wire Line + 6400 3150 6900 3150 +Wire Wire Line + 6400 3150 6400 2700 +Wire Wire Line + 6000 3150 5900 3150 +$Comp +L Device:R R9 +U 1 1 5FCAEC24 +P 8100 3500 +F 0 "R9" V 8000 3500 50 0000 C CNN +F 1 "100k" V 7984 3500 50 0001 C CNN +F 2 "" V 8030 3500 50 0001 C CNN +F 3 "~" H 8100 3500 50 0001 C CNN + 1 8100 3500 + -1 0 0 1 +$EndComp +Wire Wire Line + 7600 3250 7700 3250 +Connection ~ 7600 3250 +Wire Wire Line + 8450 3450 8350 3450 +Wire Wire Line + 8000 3250 8100 3250 +Wire Wire Line + 6650 3750 8100 3750 +Wire Wire Line + 8350 3450 8350 3750 +Wire Wire Line + 8100 3350 8100 3250 +Connection ~ 8100 3250 +Wire Wire Line + 8100 3250 8450 3250 +Connection ~ 8100 3750 +Wire Wire Line + 8100 3750 8350 3750 +Wire Wire Line + 8100 3650 8100 3750 +Wire Wire Line + 4650 3250 4650 3750 +Text Notes 5700 3750 0 50 ~ 0 +1/2 VCC = 1.5V +$EndSCHEMATC diff --git a/paper/photolink_schematic.svg b/paper/photolink_schematic.svg new file mode 100644 index 0000000..a24a7ec --- /dev/null +++ b/paper/photolink_schematic.svg @@ -0,0 +1,3246 @@ + + + + + + image/svg+xml + + SVG Picture created as photolink_schematic.svg date 2020/12/01 17:27:56 + + + + + + SVG Picture created as photolink_schematic.svg date 2020/12/01 17:27:56 + Picture generated by Eeschema-SVG + + + + + + + + + GND2 + + + + + + + + + + + + + + + + + + R2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + - + + + + 6 + + + 7 + + + + U1B + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + - + + + + 2 + + + + + + + + + + + 3 + + + + U1A + + + + + + MCP6494 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LED1 + + + + + + + + + + + + + + + + + + + + + R9 + + + + + + + + + + + + + + + + + + + + + + + + + PD1 + + + + + + + + + + + + + + + + + + R3 + + + + + + + + + + + + + + + + + + C1 + + + + + + + + + + + + + + + + + R4 + + + + + + + + + + + + + + + + + + + + + + + + + +3V0 + + + + + + + + + + + + + + + + + + + + + + + + + + +3V0 + + + + + + + + + + + + + + + + + + + R5 + + + + 100k + + + + + + + + + + + + + + + + + + + + + + C2 + + + 7p + + + + + + + + + + + + + + + + + R7 + + + + 100k + + + + + + + + + + + + + + + + + + + + + R6 + + + + 1k + + + + + + + + + + + + + + + + + +3V3 + + + + + + + + + + + + + + + + + + + R1 + + + + + R_Small + + + + + + + + + + + + + + + + + + + + + GND1 + + + + + + + + + + + + + + + + + + + + R8 + + + + + + + + + + + + + + + + + + + C4 + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + 8 + + + + + - + + + + 9 + + + + U1C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + + + + + + + - + + + + 13 + + + + + 14 + + + + + + + U1D + + + + + + + + + + + + + + + + + + + C3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RX_OUT + + + + + + + + + + + + + + + TX_IN + + + + + + + + + + + + + + VGND + + + + + + + 1/2 VCC = 1.5V + + + + + + + + + + + + + + + Virtual Ground Buffer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Comparator + + + + + + + + + + + + + + + + + + + Amplifier G=100 + + + + + + + + + + + + + + + + + + + + + + + + + TIA G=100kΩ + + + + + + + + + + + + + + + + + Rotor + + + + + + + + + Stator + + + + + + + + + + + IR link + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/paper/proto_3d_design.jpg b/paper/proto_3d_design.jpg new file mode 100644 index 0000000..f527828 Binary files /dev/null and b/paper/proto_3d_design.jpg differ diff --git a/paper/prototype_early_comms_small.jpg b/paper/prototype_early_comms_small.jpg new file mode 100644 index 0000000..506da48 Binary files /dev/null and b/paper/prototype_early_comms_small.jpg differ diff --git a/paper/prototype_pic.jpg b/paper/prototype_pic.jpg new file mode 100644 index 0000000..2200d6d Binary files /dev/null and b/paper/prototype_pic.jpg differ diff --git a/paper/prototype_pic2.jpg b/paper/prototype_pic2.jpg new file mode 100644 index 0000000..7838a75 Binary files /dev/null and b/paper/prototype_pic2.jpg differ diff --git a/paper/rotohsm.bib b/paper/rotohsm.bib new file mode 100644 index 0000000..c5ba6fe --- /dev/null +++ b/paper/rotohsm.bib @@ -0,0 +1,249 @@ +% Encoding: UTF-8 +@comment{x-kbibtex-encoding=utf-8} + +@Book{anderson2020, + author = {Ross Anderson}, + date = {2020-09-16}, + title = {Security Engineering}, + isbn = {978-1-119-64281-7}, +} + +@techreport{smith1998, + author = {Sean Smith and Steve Weingart}, + date = {1998-02-19}, + institution = {IBM T.J. Watson Research Center}, + title = {Building a High-Performance, Programmable Secure Coprocessor}, + url = {ftp://www6.software.ibm.com/software/cryptocards/rc21102.pdf}, + urldate = {2020-09-16} +} + +@article{immler2019, + author = {Vincent Immler and Johannes Obermaier and Kuan Kuan Ng and Fei Xiang Ke and Jin Yu Lee and Yak Peng Lim and Wei Koon Oh and Keng Hoong Wee and Georg Sigl}, + date = {2019}, + doi = {10.13154/tches.v2019.i1.51-96}, + issn = {2569-2925}, + journal = {IACR transactions on cryptographic hardware and embedded systems.}, + journaltitle = {IACR Transactions on Cryptographic Hardware and Embedded Systems}, + publisher = {IACR}, + title = {Secure Physical Enclosures from Covers with Tamper-Resistance}, + url = {https://tches.iacr.org/index.php/TCHES/article/view/7334/6506}, + urldate = {2020-09-16} +} + +@article{obermaier2018, + author = {Johannes Obermaier and Vincent Immler}, + date = {2018}, + doi = {10.1007/s41635-018-0045-2}, + issn = {2509-3428}, + journaltitle = {Journal of Hardware and Systems Security}, + pages = {289–296}, + title = {The Past, Present, and Future of Physical Security Enclosures: From Battery-Backed Monitoring to PUF-Based Inherent Security and Beyond}, + volume = {2}, + year = {2018} +} + +@article{tobisch2020, + author = {Johannes Tobisch and Christian Zenger and Christof Paar}, + date = {2020-03-13}, + journaltitle = {TRUDEVICE 2020: 9th Workshop on Trustworthy Manufacturing and Utilization of Secure Devices}, + title = {Electromagnetic Enclosure PUF for Tamper Proofing Commodity Hardware and otherApplications}, + url = {https://www.emsec.ruhr-uni-bochum.de/media/crypto/veroeffentlichungen/2020/05/13/trudevice_submission_enclosure_puf.pdf}, + urldate = {2020-09-17} +} + +@article{kreft2012, + author = {Heinz Kreft and Wael Adi}, + date = {2012}, + doi = {10.1109/ahs.2012.6268655}, + journaltitle = {2012 NASA/ESA Conference on Adaptive Hardware and Systems (AHS)}, + title = {Cocoon-PUF, a novel mechatronic secure element technology}, + year = {2012} +} + +@Patent{rahman1988, + author = {Mujib Rahman}, + date = {1988-03-10}, + number = {US Patent US4859024A}, + title = {Optical fiber cable with tampering detecting means}, +} + +@www{haines2006, + author = {Lester Haines}, + date = {2006-09-25}, + editor = {The Register}, + title = {US outfit patents 'invisible' UAV: Stealth through persistence of vision}, + url = {https://www.theregister.com/2006/09/25/phantom_sentinel/}, + urldate = {2020-09-17} +} + +@article{frazelle2019, + author = {Jessie Frazelle}, + date = {2019-12-01}, + doi = {10.1145/3380774.3382016}, + journaltitle = {ACM Queue}, + title = {Securing the Boot Process: The hardware root of trust}, + url = {https://dl.acm.org/doi/fullHtml/10.1145/3380774.3382016}, + urldate = {2020-10-22} +} + +@Article{albartus2020, + author = {Nils Albartus and Max Hoffmann and Sebastian Temme and Leonid Azriel and Christof Paar}, + date = {2020}, + title = {{DANA} Universal Dataflow Analysis for Gate-Level Netlist Reverse Engineering}, + doi = {10.13154/tches.v2020.i4.309-336}, + number = {4}, + pages = {309–336}, + volume = {2020}, + bibsource = {dblp computer science bibliography, https://dblp.org}, + biburl = {https://dblp.org/rec/journals/tches/AlbartusHTAP20.bib}, + journal = {{IACR} Transactions on Cryptographic Hardware and Embedded Systems}, + year = {2020}, +} + +@InProceedings{trippel2017, + author = {Timothy Trippel and Ofir Weisse and Wenyuan Xu and Peter Honeyman and Kevin Fu}, + booktitle = {2017 IEEE European symposium on security and privacy}, + title = {WALNUT: Waging doubt on the integrity of MEMS accelerometers with acoustic injection attacks}, + organization = {IEEE}, + pages = {3–18}, + x-fetchedfrom = {Google Scholar}, + year = {2017}, +} + +@WWW{heise2020t2jailbreak, + author = {Leo Becker}, + date = {2020-03-11}, + title = {Jailbreaker nehmen T2-Sicherheitschip von Macs ins Visier}, + url = {https://www.heise.de/mac-and-i/meldung/Jailbreaker-nehmen-T2-Sicherheitschip-von-Macs-ins-Visier-4681131.html}, + organization = {Heise Online}, + publisher = {Heise Online}, +} + +@article{kim2018, + author = {Seung Hyun Kim and Su Chang Lim and others}, + journal = {Annals of Nuclear Energy}, + pages = {845–855}, + publisher = {Elsevier}, + title = {Intelligent intrusion detection system featuring a virtual fence, active intruder detection, classification, tracking, and action recognition}, + volume = {112}, + x-fetchedfrom = {Google Scholar}, + year = {2018} +} + +@Conference{johnson2018, + author = {Scott Johnson and Dominic Rizzo and Parthasarathy Ranganathan and Jon McCune and Richard Ho}, + booktitle = {Hot Chips: A Symposium on High Performance Chips}, + date = {2018}, + title = {Titan: enabling a transparent silicon root of trust for Cloud}, + url = {https://www.hotchips.org/hc30/1conf/1.14_Google_Titan_GoogleFinalTitanHotChips2018.pdf}, + x-fetchedfrom = {Google Scholar}, + year = {2018}, +} + +@TechReport{isaacs2013, + author = {Phil Isaacs and Thomas {Morris Jr} and Michael J Fisher and Keith Cuthbert}, + date = {2013}, + institution = {Surface Mount Technology Association}, + title = {Tamper proof, tamper evident encryption technology}, + booktitle = {Pan Pacific Microelectronics Symposium}, + organization = {Surface Mount Technology Association}, + x-fetchedfrom = {Google Scholar}, + year = {2013}, +} + +@inproceedings{drimer2008, + author = {Saar Drimer and Steven J Murdoch and Ross Anderson}, + booktitle = {2008 IEEE Symposium on Security and Privacy (sp 2008)}, + organization = {IEEE}, + pages = {281–295}, + title = {Thinking inside the box: system-level failures of tamper proofing}, + x-fetchedfrom = {Google Scholar}, + year = {2008} +} + +@WWW{terdiman2013, + author = {Daniel Terdiman}, + date = {2013-07-23}, + title = {Aboard America's Doomsday command and control plane}, + url = {https://www.cnet.com/news/aboard-americas-doomsday-command-and-control-plane}, + organization = {cnet.com}, + month = jul, + publisher = {CNET}, + year = {2013}, +} + +@Thesis{vrijaldenhoven2004, + author = {Serge Vrijaldenhoven}, + date = {2004-10-01}, + institution = {Technische Universiteit Eindhoven}, + title = {Acoustical Physical Uncloneable Functions}, + type = {mathesis}, + url = {https://pure.tue.nl/ws/files/46971492/600055-1.pdf}, +} + +@WWW{dexter2015, + author = {Karsten Nohl and Fabian Bräunlein and dexter}, + date = {2015-12-27}, + title = {Shopshifting: The potential for payment system abuse}, + url = {https://media.ccc.de/v/32c3-7368-shopshifting#t=2452}, + organization = {32C3 Chaos Communication Congress}, +} + +@WWW{newman2020, + author = {Lily Hay Newman}, + date = {2020-10-06}, + title = {Apple's T2 Security Chip Has an Unfixable Flaw}, + url = {https://www.wired.com/story/apple-t2-chip-unfixable-flaw-jailbreak-mac/}, + organization = {Wired Magazine}, +} + +@Article{sh2016, + author = {Maruthi G. S. and Vishwanath Hegde}, + date = {2016}, + journaltitle = {IEEE Sensors Journal}, + title = {Application of MEMS Accelerometer for Detection and Diagnosis of Multiple Faults in the Roller Element Bearings of Three Phase Induction Motor}, + doi = {https://doi.org/10.1109/JSEN.2015.2476561}, + issn = {1558-1748}, + issue = {1}, + url = {https://www.researchgate.net/profile/Vishwanath-Hegde-2/publication/282389149_Application_of_MEMS_Accelerometer_for_Detection_and_Diagnosis_of_Multiple_Faults_in_the_Roller_Element_Bearings_of_Three_Phase_Induction_Motor/links/568bace808aebccc4e1c01fa/Application-of-MEMS-Accelerometer-for-Detection-and-Diagnosis-of-Multiple-Faults-in-the-Roller-Element-Bearings-of-Three-Phase-Induction-Motor.pdf}, + volume = {16}, +} + +@Article{kvk2019, + author = {Ivar Koene and Raine Viitala and Petri Kuosmanen}, + date = {2019}, + journaltitle = {IEEE Access}, + title = {Internet of Things Based Monitoring of Large Rotor Vibration With a Microelectromechanical Systems Accelerometer}, + doi = {https://doi.org/10.1109/ACCESS.2019.2927793}, +} + +@TechReport{adc2019, + author = {Bertrand Campagnie}, + date = {2019}, + institution = {Analog Devices}, + title = {Choose the Right Accelerometer for Predictive Maintenance}, + url = {https://www.analog.com/media/en/technical-documentation/tech-articles/Choose-the-Right-Accelerometer-for-Predictive-Maintenance.pdf}, + urldate = {2021-04-01}, +} + +@PhdThesis{e2013, + author = {Maged Elsaid Elnady}, + date = {2013}, + institution = {University of Manchester}, + title = {On-Shaft Vibration Measurement Using a MEMS Accelerometer for Faults Diagnosis in Rotating Machines}, + url = {https://www.research.manchester.ac.uk/portal/files/54530535/FULL_TEXT.PDF}, + urldate = {2021-04-01}, +} + +@Book{iaea2011, + author = {{{International Atomic Energy Agency}}}, + date = {2011}, + title = {Safeguards, techniques and equipmen.}, + isbn = {978-92-0-118910-3}, + series = {International Nuclear Verification Series}, + url = {https://www-pub.iaea.org/MTCD/Publications/PDF/nvs1_web.pdf}, + urldate = {2021-04-01}, + volume = {1}, +} + +@Comment{jabref-meta: databaseType:biblatex;} diff --git a/paper/rotohsm_paper.pdf b/paper/rotohsm_paper.pdf new file mode 100644 index 0000000..7ef9489 Binary files /dev/null and b/paper/rotohsm_paper.pdf differ diff --git a/paper/rotohsm_paper.tex b/paper/rotohsm_paper.tex new file mode 100644 index 0000000..8c24274 --- /dev/null +++ b/paper/rotohsm_paper.tex @@ -0,0 +1,742 @@ +\documentclass[nohyperref]{iacrtrans} +\usepackage[T1]{fontenc} +\usepackage[ + backend=biber, + style=numeric, + natbib=true, + url=false, + doi=true, + eprint=false + ]{biblatex} +\addbibresource{rotohsm.bib} +\usepackage{amssymb,amsmath} +\usepackage{eurosym} +\usepackage{wasysym} +\usepackage{amsthm} + +\usepackage[binary-units]{siunitx} +\DeclareSIUnit{\baud}{Bd} +\DeclareSIUnit{\year}{a} +\usepackage{commath} +\usepackage{graphicx,color} +\usepackage{subcaption} +\usepackage{array} +\usepackage{hyperref} + +\renewcommand{\floatpagefraction}{.8} +\newcommand{\degree}{\ensuremath{^\circ}} +\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}} +\newcommand{\partnum}[1]{\texttt{#1}} + +\begin{document} + +\title[Can't Touch This]{Inertial HSMs Thwart Advanced Physical Attacks} +\author{Jan Sebastian Götte \and Björn Scheuermann} +\institute{HIIG\\ \email{ihsm@jaseg.de} \and HU Berlin \\ \email{scheuermann@informatik.hu-berlin.de}} +% FIXME keywords +\keywords{hardware security \and implementation \and smart cards \and electronic commerce} +\maketitle + +\begin{abstract} + In this paper, we introduce a novel countermeasure against physical attacks: Inertial hardware security modules + (iHSMs). Conventional systems have in common that their security requires the crafting of fine sensor structures + that respond to minute manipulations of the monitored security boundary or volume. Our approach is novel in that we + reduce the sensitivity requirement of security meshes and other sensors and increase the complexity of any + manipulations by rotating the security mesh or sensor at high speed---thereby presenting a moving target to an + attacker. Attempts to stop the rotation are easily monitored with commercial MEMS accelerometers and gyroscopes. + Our approach leads to a HSM that can easily be built from off-the-shelf parts by any university electronics lab, yet + offers a level of security that is comparable to commercial HSMs. We have built a proof of concept hardware + prototype that demonstrates solutions to the concept's main engineering challenges. As part of this proof of + concept, we have found that a system using a coarse security mesh made from commercial printed circuit boards and an + automotive high g-force accelerometer already provides a useful level of security. +\end{abstract} + +\section{Introduction} + +While information security technology has matured a great deal in the last half century, physical security not kept up +with the pace of the remainder of this industry. Given the right skills, physical access to a computer still often +allows full compromise. The physical security of modern server hardware hinges on what lock you put on the room it is +in. + +Currently, servers and other computers are rarely physically secured as a whole. Servers sometimes have a simple lid +switch and are put in locked ``cages'' inside guarded facilities. This usually provides a good compromise between +physical security and ease of maintenance. To handle highly sensitive data in applications such as banking or public key +infrastructure, general-purpose and low-security servers are augmented with dedicated, physically secure cryptographic +co-processors such as trusted platform modules (TPMs) or hardware security modules (HSMs). Using a limited amount of +trust in components such as the CPU, the larger system's security can then be reduced to that of its physically secured +TPM~\cite{newman2020,frazelle2019,johnson2018}. +Like smartcards, TPMs rely on a modern IC being hard to tamper with. Shrinking things to the nanoscopic level to secure +them against tampering is a good engineering solution for some years to come. However, in essence this is a type of +security by obscurity: Obscurity here referring to the rarity of the equipment necessary to attack modern +ICs~\cite{albartus2020,anderson2020}. + +In contrast to TPMs and Smartcards, HSMs rely on an active security barrier usually consisting of a fragile foil with +conductive traces. These traces are much larger scale than a smart card IC's microscopic structures, and instead are +designed to be very hard to remove intact. While we are certain that there still are many insights to be gained in both +technologies, we wish to introduce a novel approach to sidestep the manufacturing issues of both and provide radically +better security against physical attacks. Our core observation is that any cheap but coarse HSM technology can be made +much more difficult to attack by moving it very quickly. + +For example, consider an HSM as it is used in online credit card payment processing. Its physical security level is set +by the structure size of its security mesh. An attack on its mesh might involve fine drill bits, needles, wires, glue, +solder and lasers~\cite{drimer2008}. Now consider the same HSM mounted on a large flywheel. In addition to its usual +defenses, this modified HSM is now equipped with an accelerometer that it uses to verify that it is spinning at high +speed. How would an attacker approach this HSM? They would have to either slow down the rotation---which triggers the +accelerometer's monitoring circuit---or they would have to attack the HSM in motion. The HSM literally becomes a moving +target. At slow speeds, rotating the entire attack workbench might be possible---but rotating frames of reference +quickly become inhospitable to human life (see Section~\ref{sec_swivel_chair_attack}). Since non-contact electromagnetic +or optical attacks are more limited in the first place and can be shielded, we have effectively forced the attacker to +use an ``attack robot''. + +This paper contains the following contributions: +\begin{enumerate} + \item We present the \emph{Inertial HSM} concept. Inertial HSMs enable cost effective, small scale production of + highly secure HSMs. + \item We discuss possible tamper sensors for inertial HSMs. + \item We explore the design space of our inertial HSM concept. + \item We present our work on a prototype inertial HSM (Figure~\ref{prototype_picture}). + \item We present an analysis on the viability of using commodity MEMS accelerometers as braking sensors. + % FIXME \item Measurement of the prototype HSM's susceptibility to various types of attack. +\end{enumerate} + +\begin{figure} + \center + \includegraphics[width=12cm]{prototype_pic2.jpg} + \caption{The protoype as we used it to test power transfer and bidirectional communication between stator and rotor. + This picture shows the proof of concept prototype's configuration that we used for accelerometer characterization + (Section~\ref{sec_accel_meas}) without the vertical security mesh struts that connect the circular top and bottom + outer meshes.} + \label{prototype_picture} +\end{figure} + +In Section~\ref{sec_related_work}, we will give an overview of the state of the art in HSM physical security. On this +basis, in Section~\ref{sec_ihsm_construction} we will elaborate the principles of our Inertial HSM approach. We will +analyze its weaknesses in Section~\ref{sec_attacks}. Based on these results we have built a proof of concept hardware +prototype that whose design we will elaborate in Section~\ref{sec_proto}. In Section~\ref{sec_accel_meas} we present our +characterization of an automotive MEMS accelerometer IC as a rotation sensor in this proof of concept prototype. We +conclude this paper with a general evaluation of our design in Section~\ref{sec_conclusion}. + +\section{Related work} +\label{sec_related_work} +% summaries of research papers on HSMs. I have not found any actual prior art on anything involving mechanical motion +% beyond ultrasound. + +In this section, we will briefly explore the history of HSMs and the state of academic research on active tamper +detection. + +HSMs are an old technology that traces back decades in its electronic realization. Today's common approach of monitoring +meandering electrical traces on a fragile foil that is wrapped around the HSM essentially transforms the security +problem into the challenge to manufacture very fine electrical traces on a flexible foil~\cite{isaacs2013, immler2019, +anderson2020}. There has been some research on monitoring the HSM's inside using e.g.\ electromagnetic +radiation~\cite{tobisch2020, kreft2012} or ultrasound~\cite{vrijaldenhoven2004} but none of this research has found +widespread adoption yet. + +HSMs can be compared to physical seals~\cite{anderson2020}. Both are tamper evident devices. The difference is that a +HSM continuously monitors itself whereas a physical seal only serves to record tampering and requires someone to examine +it. This examination can be by eye in the field, but it can also be carried out in a laboratory using complex equipment. +An HSM in principle has to have this examination equipment built-in. + +Physical seals are used in a wide variety of applications, but the most interesting ones from a research point of view +that are recorded in public literature are those used in monitoring of nuclear material under the International Atomic +Energy Authority (IAEA). Most of these seals use the same approach that is used in Physically +Uncloneable Functions (PUFs), though their development predates that of PUFs by several decades. The seal is created in +a way that intentionally causes large, random device to device variations. These variations are precisely recorded at +deployment. At the end of the seal's lifetime, the seal is returned from the field to the lab and closely examined to +check for any deviations from the seal's prior recorded state. The type of variation used in these seals includes random +scratches in metal parts and random blobs of solder (IAEA metal cap seal), randomly cut optical fibers (COBRA seal), the +uncontrollably random distribution of glitter particles in a polymer matrix (COBRA seal prototypes) as well as the +precise three-dimensional surface structure of metal parts at microscopic scales (LMCV)~\cite{iaea2011}. + +The IAEA's equipment portfolio does include electronic seals such as the EOSS. These devices are intended for remote +reading, similar to an HSM. They are constructed from two components: A cable that is surveilled for tampering, and a +monitoring device. The monitoring device itself is in effect an HSM and uses a security mesh foil such as it is used in +commercial HSMs. + +In~\cite{anderson2020}, Anderson gives a comprehensive overview on physical security. An example HSM that they cite is +the IBM 4758 HSM whose details are laid out in depth in~\cite{smith1998}. This HSM is an example of an industry-standard +construction. Although its turn of the century design is now a bit dated, the construction techniques of the physical +security mechanisms have not evolved much in the last two decades. Besides some auxiliary temperature and radiation +sensors to guard against attacks on the built-in SRAM memory, the module's main security barrier uses the traditional +construction of a flexible mesh foil wrapped around the module's core. In~\cite{smith1998}, the authors state that the +module monitors this mesh for short circuits, open circuits and conductivity. The fundamental approach to tamper +detection and construction is similar to other commercial +offerings~\cite{obermaier2018,drimer2008,anderson2020,isaacs2013}. + +Shifting our focus from industry use to the academic state of the art, in~\cite{immler2019}, Immler et al. describe an +HSM based on precise capacitance measurements of a security mesh, creating a PUF from the mesh. In contrast to +traditional meshes, the mesh they use consists of a large number of individual traces (more than 30 in their example). +Their concept promises a very high degree of protection. The main disadvantages of their concept are a limitation in +covered area and component height, as well as the high cost of the advanced analog circuitry required for monitoring. A +core component of their design is that they propose its use as a PUF to allow for protection even when powered off, +similar to a smart card---but the design is not limited to this use. + +In~\cite{tobisch2020}, Tobisch et al.\ describe a construction technique for a hardware security module that is based +around commodity WiFi hardware inside a conductive enclosure. In their design, an RF transmitter transmits a reference +signal into the RF cavity formed by the conductive enclosure. One or more receivers listen for the signal's reflections +and use them to characterize the RF cavity w.r.t.\ phase and frequency response. Their fundamental assumption is that +the RF behavior of the cavity is inscrutable from the outside, and that even a small disturbance anywhere within the +volume of the cavity will cause a significant change in its RF response. A core component of the work of Tobisch et +al.~\cite{tobisch2020}\ is that they use commodity WiFi hardware to reduce the cost of the HSM's sensing circuitry. The +resulting system is likely both much cheaper and capable of protecting a much larger security envelope than designs +using finely patterned foil security meshes such as~\cite{immler2019}, at the cost of worse and less predictable +security guarantees. Where~\cite{tobisch2020} use electromagnetic radiation, Vrijaldenhoven +in~\cite{vrijaldenhoven2004} uses ultrasound waves travelling on a surface acoustic wave (SAW) device to a similar end. + +While Tobisch et al.~\cite{tobisch2020}\ approach the sensing frontend cost as their primary optimization target, the +prior work of Kreft and Adi~\cite{kreft2012} considers sensing quality. Their target is an HSM that envelopes a volume +barely larger than a single chip. They theorize how an array of distributed RF transceivers can measure the physical +properties of a potting compound that has been loaded with RF-reflective grains. In their concept, the RF response +characterized by these transceivers is shaped by the precise three-dimensional distribution of RF-reflective grains +within the potting compound. + +To the best of our knowledge, we are the the first to propose a mechanically moving HSM security barrier as part of a +hardware security module. Most academic research concentrates on the issue of creating new, more sensitive security +barriers for HSMs~\cite{immler2019} while commercial vendors concentrate on means to certify and cheaply manufacture +these security barriers~\cite{drimer2008}. Our concept instead focuses on the issue of taking any existing, cheap +low performance security barrier and transforming it into a marginally more expensive but high performance one. The +closest to a mechanical HSM that we were able to find during our research is an 1988 patent~\cite{rahman1988} that +describes a mechanism to detect tampering along a communication cable by enclosing the cable inside a conduit filled +with pressurized gas. + +\subsection{Patent literature} +During development, we performed several hours of research on prior art for the inertial HSM concept. Yet, we could not +find any mentions of similar concepts either in academic literature or in patents. Thus, while we cannot give any +guarantees, we seem likely to be the inventors of this idea and we are fairly sure it is not covered by any patents or +other restrictions at this point in time. + +Since the concept is primarily attractive for small-scale production and since cheaper mass-production alternatives are +already commercially available, we have decided against applying for a patent and we wish to make it available to the +general public without any restrictions on its use. We invite you build on our work as you wish and to base your own +work on our publications without any fees or commercial restrictions. Where possible, we ask you to cite this paper and +attribute the inertial HSM concept to its authors. + +\section{Inertial HSM construction and operation} +\label{sec_ihsm_construction} + +Mechanical motion has been proposed as a means of making things harder to see with the human eye~\cite{haines2006} and +is routinely used in military applications to make things harder to hit~\cite{terdiman2013} but we seem to be the first +to use it in tamper detection. + +The core questions in the design of an inertial HSM are the following: + +\begin{enumerate} + \item What \textbf{type of motion} to use, such as rotation, pendulum motion, or linear motion. + \item How to construct the \textbf{tamper detection sensor}. + \item How to \textbf{detect braking} of the IHSM's movement. + \item The \textbf{mechanical layout} of the system. +\end{enumerate} + +We will approach these questions one by one in the following subsections. + +\subsection{Inertial HSM motion} +\label{sec_ihsm_motion} + +First, there are several ways that we can approach motion. There is periodic, aperiodic and continuous motion. There is +also linear motion as well as rotation. We can also vary the degree of electronic control in this motion. The main +constraints we have on the HSM's motion pattern are that it needs to be (almost) continuous so as to not expose any weak +spots during instantaneous standstill of the HSM. Additionally, for space efficiency the HSM has to stay within a +confined space. This means that linear motion would have to be periodic, like that of a pendulum. Such periodic linear +motion will have to quickly reverse direction at its apex so the device is not stationary long enough for this to become +a weak spot. + +In contrast to linear motion, rotation is space-efficient and can be continuous if the axis of rotation is inside the +device. In case it has a fixed axis, rotation will expose a weak spot at the axis of rotation where the surface's +tangential velocity is low. Faster rotation can lessen the security impact of this fact at the expense of power +consumption and mechanical stress, but it can never eliminate it. This effect can be alleviated in two ways: Either by +adding additional tamper protection at the axis, or by having the HSM perform a compound rotation that has no fixed +axis. + +Large centrifugal acceleration at high speeds poses the engineering challenge of preventing rapid unscheduled +disassembly of the device, but it also creates an obstacle to any attacker trying to manipulate the device in what we +call a \emph{swivel chair attack} (see Section~\ref{sec_swivel_chair_attack}). An attacker trying to follow the motion +would have to rotate around the same axis. By choosing a suitable rotation frequency we can prevent an attacker from +following the devices motion since doing so would subject them to impractically large centrifugal forces. Essentially, +this limits the approximate maximum size and mass of an attacker based on an assumption on tolerable centrifugal force. + +In this paper we focus on rotating IHSMs for simplicity of construction. For our initial research, we are focusing on +systems that have a fixed axis of rotation due to their simple construction but we do wish to note the challenge of +hardening the shaft against tampering that any production device would have to tackle. + +\subsection{Tamper detection mesh construction} + +Once we have decided how our IHSM's security barrier should move, what remains is the actual implementation +of that security barrier. There are two movements that we have observed that are key to our work. On the one hand, there +is the widespread industry use of delicate tamper sensing mesh membranes. The usage of such membranes in systems +deployed in the field for a variety of use cases from low security payment processing devices to high security +certificate management at a minimum tells us that a properly implemented mesh \emph{can} provide a practical level of +security. On the other hand, in contrast to this industry focus, academic research has largely focused on ways to +fabricate enclosures that embed characteristics of a Physically Uncloneable Function. By using stochastic properties of +the enclosure material to form a PUF, such academic designs effectively leverage signal processing techniques to improve +the system's security level by a significant margin. + +In our research, we focus on security meshes as our IHSM's tamper sensors. Most of the cost in commercial security mesh +implementations lies in the advanced manufacturing techniques and special materials necessary to achieve a sensitive +mesh at fine structure sizes. The foundation of an IHSM security is that by moving the mesh even a primitive, coarse +mesh made e.g.\ from mesh traces on a PCB becomes very hard to attack in practice. This allows us to use a simple +construction made up from low-cost components. Additionally, the use of a mesh allows us to only spin the mesh itself +and its monitoring circuit and keep the payload inside the mesh stationary. Tamper sensing technologies that use the +entire volume of the HSM such as RF-based systems do not allow for this degree of freedom in their design: They would +require the entire IHSM to spin, including its payload, which would entail costly and complex systems for data and power +transfer from the outside to the payload. + +\subsection{Braking detection} + +The security mesh is a critical component in the IHSM's defense against physical attacks, but its monitoring is only one +half of this defense. The other half consists of a reliable and sensitive braking detection system. This system must be +able to quickly detect any slowing of the IHSM's rotation. Ideally, a sufficiently sensitive sensor should be able to +measure any external force applied to the IHSM's rotor and should already trigger a response at the first signs of a +manipulation attempt. + +While the obvious choice to monitor rotation would be a tachometer such as a magnetic or opitical sensor attached to the +IHSM's shaft, this would be a poor choice in our application. Both optical and magnetic sensors are susceptible to +contact-less interference from outside. A different option would be to use feedback from the motor driver electronics. +When using a BLDC motor, the driver electronics precisely know the rotor's position at all times. The issue with this +approach is that depending on construction, it might invite attacks at the mechanical interface between mesh and the +motor's shaft. If an attacker can decouple the mesh from the motor e.g.\ by drilling, laser ablation or electrical +discharge machining (EDM) on the motor's shaft, the motor could keep spinning at its nominal frequency while the mesh is +already standing still. + +Instead of a stator-side sensor like a magnetic tachometer or feedback from the BLDC controller, an accelerometer placed +inside the spinning mesh monitoring circuit would be a good component to serve as an IHSM's tamper sensor. Modern, fully +intergrated MEMS accelerometers are very precise. By comparing acceleration measurements against a model of the device's +mechanical motion, deviations can quickly be detected. This limits an attacker's ability to tamper with the device's +motion. It may also allow remote monitoring of the device's mechanical components such as bearings: MEMS accelerometers +are fast enough to capture vibrations, which can be used as an early warning sign of failing mechanical +components~\cite{kvk2019,sh2016,adc2019,e2013}. + +In a spinning IHSM, an accelerometer mounted at a known radius with its axis pointing radially will measure centrifugal +acceleration. Centrifugal acceleration rises linearly with radius, and with the square of frequency: $a=\omega^2 r$. For +a given target speed of rotation, the accelerometer's location has to be carefully chosen to maximize dynamic range. A +key point here is that for rotation speeds between $500$ and $\SI{1000}{rpm}$, centrifugal acceleration already becomes +very large at a radius of just a few $\si{\centi\meter}$. At $\SI{1000}{rpm}\approx\SI{17}{\hertz}$ at a +$\SI{10}{\centi\meter}$ radius acceleration already is above $\SI{1000}{\meter\per\second}$ or $100\,g$. While +beneficial for security, this large acceleration leads to two practical constraints. First, off-axis performance of +commercial accelerometers is usually in the order of $\SI{1}{\percent}$ so this large acceleration will feed through +into all accelerometer axes, even those that are tangential to the rotation. Second, we either have to place the +accelerometer close to the axis or we are limited to a small selection of high-$g$ accelerometers mostly used in +automotive applications. + +To evaluate the feasibility of accelerometers as tamper sensors we can use a simple benchmark: Let us assume that an +IHSM is spinning at $\SI{1000}{rpm}$ and that we wish to detect any attempt to brake it below $\SI{500}{rpm}$. The +difference in centrifugal acceleration that our accelerometer will have to detect then is a factor of +$\frac{\omega_2^2}{\omega_1^2}=4$. If we choose our accelerometer's location to maximize its dynamic range, any +commercial MEMS accelerometer should suffice for this degree of accuracy even over long timespans. For rapid +deceleration, commercial accelerometers will be much more sensitive as effects of long-term drift can be ignored. If we +wish to also detect very slow deceleration, we have to take into account the accelerometer's drift characteristics. + +In Section~\ref{sec_accel_meas} below we conduct an empirical evaluation of a commercial automotive high-$g$ MEMS +accelerometer for braking detection in our prototype IHSM. + +\subsection{Mechanical layout} + +With our IHSM's components taken care of, what remains to be decided is how to put together these individual components +into a complete device. A basic spinning HSM might look like shown in Figure~\ref{fig_schema_one_axis}. Shown are the +axis of rotation, an accelerometer on the rotating part that is used to detect braking, the protected payload and the +area covered by the rotating tamper detection mesh. A key observation is that we only have to move the tamper +protection mesh, not the entire contents of the HSM. The HSM's payload and with it most of the HSM's mass can be +stationary. This reduces the moment of inertia of the moving part. This basic schema accepts a weak spot at the point +where the shaft penetrates the spinning mesh. This trade-off makes for a simple mechanical construction and allows +power and data connections to the stationary payload through a hollow shaft. + +\begin{figure} + \center + \includegraphics{concept_vis_one_axis.pdf} + \caption{Concept of a simple spinning Inertial HSM. 1 - Shaft. 2 - Security mesh. 3 - Payload. 4 - + Accelerometer. 5 - Shaft penetrating security mesh.} + \label{fig_schema_one_axis} +\end{figure} + +The spinning mesh must be designed to cover the entire surface of the payload, but it suffices if it sweeps over every +part of the payload once per rotation. This means we can design longitudinal gaps into the mesh that allow outside air +to flow through to the payload. In traditional boundary-sensing HSMs, cooling of the payload processor is a serious +issue since any air duct or heat pipe would have to penetrate the HSM's security boundary. This problem can only be +solved with complex and costly siphon-style constructions, so in commercial systems heat conduction is used +exclusively~\cite{isaacs2013}. This limits the maximum power dissipation of the payload and thus its processing power. +Using longitudinal gaps in the mesh, our setup allows direct air cooling of regular heatsinks. This unlocks much more +powerful processing capabilities that greatly increase the maximum possible power dissipation of the payload. In an +evolution of our design, the spinning mesh could even be designed to \emph{be} a cooling fan. + +\section{Attacks} +\label{sec_attacks} + +After outlining the basic mechanical design of an inertial HSM above, in this section we will detail possible ways to +attack it. At the core of an IHSM's defenses is the same security mesh or other technology as it is used in traditional +HSMs. This means that in the end an attacker will have to perform the same steps they would have to perform to attack a +traditional HSM. Only, they will either have to perform these attack steps with a tool that follows the HSMs rotation +at high speed or they will first have to defeat the braking sensor. Attacking the IHSM in motion may require specialized +mechanical tools, CNC actuators or even a contactless attack using a laser, plasma jet or water jet. + +\subsection{The Swivel Chair Attack} +\label{sec_swivel_chair_attack} + +First we will consider the most basic of all attacks: A human attacker holding a soldering iron trying to rotate +themselves along with the mesh using a very fast swivel chair. Let us pessimistically assume that this co-rotating +attacker has their center of mass on the axis of rotation. The attacker's body is likely on the order of +$\SI{200}{\milli\meter}$ wide along its shortest axis, resulting in a minimum radius from axis of rotation to surface of +about $\SI{100}{\milli\meter}$. Wikipedia lists horizontal g forces in the order of $\SI{20}{g}$ as the upper end of the +range tolerable by humans for seconds at a time or longer. We thus set our target acceleration to +$\SI{100}{g}\;\approx\;\SI{1000}{\meter\per\second^2}$, a safety factor of $5$ past that range. Centrifugal +acceleration is $a=\omega^2 r$. In our example this results in a minimum angular velocity of $f_\text{min} = +\frac{1}{2\pi}\sqrt{\frac{a}{r}} = \frac{1}{2\pi}\sqrt{\frac{\SI{1000}{\meter\per\second^2}}{\SI{100}{\milli\meter}}} +\approx \SI{16}{\hertz} \approx \SI{1000}{rpm}$. From this we can conclude that even at moderate speeds of +$\SI{1000}{rpm}$ and above, a manual attack is no longer possible and any attack would have to be carried out using some +kind of mechanical tool. + +\subsection{Mechanical weak spots} + +The tamper defense of an IHSM rests on the security mesh moving too fast to tamper. Depending on the type of motion +used, the meshes speed may vary by location and over time. Our example configuration of a rotating mesh can keep moving +continuously, so it does not have any time-dependent weak spots. It does however have a weak spot at its axis of +rotation, at the point where the shaft penetrates the mesh. The meshes tangential velocity decreases close to the shaft, +and the shaft itself may allow an attacker to insert tools such as probes into the device through the opening it +creates. This issue is related to the issue conventional HSMs also face with their power and data connections. In +conventional HSMs, power and data are routed into the enclosure through the PCB or flat flex cables sandwiched in +between security mesh foil layers. In traditional HSMs this interface rarely is a mechanical weak spot since they use a +thin mesh substrate and create a meandering path by folding the interconnect substrate/security mesh layers several +times. In inertial HSMs, careful engineering is necessary to achieve the same effect. Figure~\ref{shaft_cm} shows +variations of the shaft interface with increasing complexity. + +\begin{figure} + \begin{subfigure}[t]{0.3\textwidth} + \center + \includegraphics[width=4cm]{ihsm_shaft_countermeasures_a.pdf} + \caption{Cross-sectional view of the basic configuration with no special protection of the shaft. Red: Moving + mesh -- Black: Stationary part.} + \label{shaft_cm_a} + \end{subfigure} + \hfill + \begin{subfigure}[t]{0.3\textwidth} + \center + \includegraphics[width=4cm]{ihsm_shaft_countermeasures_b.pdf} + \caption{An internal counter-rotating disc greatly decreases the space available to attackers at the expense of + another moving part and a second moving monitoring circuit.} + \label{shaft_cm_a} + \end{subfigure} + \hfill + \begin{subfigure}[t]{0.3\textwidth} + \center + \includegraphics[width=4cm]{ihsm_shaft_countermeasures_c.pdf} + \caption{A second moving tamper detection mesh also enables more complex topographies.} + \label{shaft_cm_a} + \end{subfigure} + \caption{Mechanical countermeasures to attacks through or close to the shaft of a fixed-axis rotating IHSM.} + \label{shaft_cm} +\end{figure} + +\subsection{Attacking the mesh in motion} + +To disable the mesh itself, an attacker can choose two paths. One is to attack the mesh itself, for example by bridging +its traces. The other option is to tamper with the monitoring circuit to prevent a damaged mesh from triggering an +alarm~\cite{dexter2015}. Attacks in both locations are electronic attacks, i.e.\ they require electrical contact to +parts of the circuit. Traditionally, this contact is made by soldering a wire or by placing a probe such as a thin +needle. We consider this type of attack hard to perform on an object spinning at high speed. Possible remaining attack +avenues may be to rotate an attack tool in sync with the mesh, or to use a laser or ion beam fired at the mesh to cut +traces or carbonize parts of the substrate to create electrical connections. Encapsulating the mesh in a potting +compound and shielding it with a metal enclosure as is common in traditional HSMs will significantly increase the +complexity of such attacks. + +\subsection{Attacks on the rotation sensor} + +Instead of attacking the mesh in motion, an attacker may also try to first stop the rotor. To succeed, they would need +to falsify the rotor's MEMS accelerometer measurements. We can disregard electronic attacks on the sensor or the +monitoring microcontroller because they would be no easier than attacking the mesh traces. What remains would be +physical attacks of the accelerometer's sensing mechanism. +MEMS accelerometers usually use a cantilever design in which a proof mass moves a cantilever whose precise position is +measured electronically. A topic of recent academic interest have been acoustic attacks tampering with these +mechanics~\cite{trippel2017}, but such attacks do not yield sufficient control to precisely falsify sensor readings. +A possible more invasive attack may be to first decapsulate the sensor MEMS using laser ablation synchronized with the +device's rotation. Then, a fast-setting glue such as a cyanoacrylate could be deposited on the MEMS, locking the +mechanism in place. This type of attack can be mitigated by mounting the accelerometer in a shielded location inside the +security envelope and by varying the rate of rotation over time. + +\subsection{Attacks on the alarm circuit} + +Besides trying to deactivate the tamper detection mesh, an electronic attack could also target the alarm circuitry +inside the stationary payload, or the communication link between rotor and payload. The link can be secured using a +cryptographically secured protocol like one would use for wireless radio links along with a high-frequency heartbeat +message. The alarm circuitry has to be designed such that it is entirely contained within the HSM's security envelope. +Like in conventional HSMs, it has to be built to either tolerate or detect environmental attacks using sensors for +temperature, ionizing radiation, laser radiation, supply voltage variations, ultrasound or other vibration and gases or +liquids. If a wireless link is used between the IHSM's rotor and stator, this link must be cryptographically secured. +To prevent replay attacks link latency must continuously be measured, so this link must be bidirectional. +% If it were unidirectional, an attacker could +% act as a Man-in-the-Middle and replay the mesh's authenticated ``no alarm'' signal at slightly below real-time speed +% (say at $\SI{99}{\percent}$ speed). The receiver would not be able to distinguish between this attack and ordinary +% deviations in the transmitter's local clock frequency. Thus, after some time the attacker can simply stop the rotor and +% break the mesh while replaying the leftover recorded ``no alarm'' signal. Given the frequency stability of commercial +% crystals, this would yield the attacker several seconds of undisturbed attack time per hour of recording time. + +\subsection{Fast and violent attacks} + +A variation of the above attacks on the alarm circuitry is to simply destroy the part of the HSM that erases data in +response to tampering before it can perform its job using a tool such as a large hammer or a gun. To mitigate this type +of attack, the HSM must be engineered to be either tough or brittle: Tough enough that the tamper response circuitry +will reliably withstand any attack for long enough to carry out its function or brittle in a way that during any attack, +the payload is reliably destroyed before the tamper response circuitry. + +\section{Proof of Concept Prototype implementation} +\label{sec_proto} + +As we elaborated above, the mechanical component of an IHSM significantly increases the complexity of any attack even +when implemented using only common, off-the-shelf parts. In view of this amplification of design security we have +decided to validate our theoretical studies by implementing a proof of concept prototype IHSM +(Figure~\ref{prototype_picture}). The main engineering challenges we set out to solve in this proof of concept prototype +were: + +\begin{enumerate} + \item A mechanical design suitable for rapid prototyping that can withstand at least $\SI{500}{rpm}$. + \item The Automatic generation of security mesh PCB layouts for quick adaption to new form factors. + \item Non-contact power transmission from stator to rotor. + \item Non-contact bidirectional data communication between stator and rotor. +\end{enumerate} + +We will outline our findings on these challenges one by one in the following paragraphs. + +\subsection{Mechanical design} + +We sized our proof of concept prototype to have sufficient payload space for up to two full-size Raspberry Pi boards to +approximate a traditional HSM's processing capabilities. We use printed circuit boards as the main structural material +for the rotating part, and 2020 aluminium extrusion for its mounting frame. Figure~\ref{fig_proto_mesh} shows the +rotor's mechanical PCB designs. The design uses a $\SI{6}{\milli\meter}$ brass tube as its shaft, which is already +sufficiently narrow to pose a challenge to an attacker. The rotor is driven by a small hobby quadcopter motor. Our +prototype incorporates a functional PCB security mesh. As we observed previously, this mesh only needs to cover every +part of the system once per revolution, so we designed the longituninal PCBs as narrow strips to save weight. + +\subsection{PCB security mesh generation} + +% FIXME censor link in peer-review version! +Our proof-of-concept security mesh covers a total of five interlocking mesh PCBs (Figure~\ref{mesh_gen_sample}). A sixth +PCB contains the monitoring circuit and connects to these mesh PCBs. To speed up design iterations, we automated the +generation of this security mesh through a plugin for the KiCAD EDA +suite\footnote{\url{https://blog.jaseg.de/posts/kicad-mesh-plugin/}}. Figure~\ref{mesh_gen_viz} visualizes the mesh +generation process. First, the target area is overlaid with a grid. Then, the algorithm produces a randomized tree +covering the grid. Finally, individual mesh traces are traced according to a depth-first search through this tree. +We consider the quality of the plugin's output sufficient for practical applications. Together with FreeCAD's KiCAD +StepUp plugin, this results in an efficient toolchain from mechanical CAD design to production-ready PCB files. + +\begin{figure} + \begin{subfigure}{0.35\textwidth} + \center + \includegraphics[height=7cm]{proto_3d_design.jpg} + \caption{The 3D CAD design of the proof of concept prototype.} + \end{subfigure} + \hfill + \begin{subfigure}{0.6\textwidth} + \includegraphics[width=8cm]{rotor_stator.jpg} + \center + \caption{Assembled mechanical prototype rotor (left) and stator (right) PCB components.} + \end{subfigure} + \caption{Our proof of concept prototype IHSM's PCB security mesh design} + \label{fig_proto_mesh} +\end{figure} + +\begin{figure} + \begin{subfigure}{\textwidth} + \center + \includegraphics[width=9cm]{mesh_gen_viz.pdf} + \caption{Overview of the automatic security mesh generation process. 1 - Example target area. 2 - Grid overlay. + 3 - Grid cells outside of the target area are removed. 4 - A random tree covering the remaining cells is + generated. 5 - The mesh traces are traced along a depth-first walk of the tree. 6 - Result.} + \label{mesh_gen_viz} + \end{subfigure} + \begin{subfigure}{\textwidth} + \center + \includegraphics[width=6cm]{mesh_scan_crop.jpg} + \caption{Detail of a PCB produced with a generated mesh.} + \label{mesh_gen_sample} + \end{subfigure} + \caption{Our automatic security mesh generation process} + \label{mesh_gen_fig} +\end{figure} + +\subsection{Power transmission from stator to rotor} + +The spinning mesh has its own autonomous monitoring circuit. This spinning monitoring circuit needs both power and data +connectivity to the stator. To design the power link, we first have to estimate the monitoring circuit's power +consumption. We base our calculation on the (conservative) assumption that the spinning mesh sensor should send its +tamper status to the static monitoring circuit at least once every $T_\text{tx} = \SI{10}{\milli\second}$. At +$\SI{100}{\kilo\baud}$, a transmission of a one-byte message in standard UART framing would take +$\SI{100}{\micro\second}$ and yield an $\SI{1}{\percent}$ duty cycle. If we assume an optical or RF transmitter that +requires $\SI{10}{\milli\ampere}$ of active current, this yields an average operating current of +$\SI{100}{\micro\ampere}$. Reserving another $\SI{100}{\micro\ampere}$ for the monitoring circuit itself we arrive at an +energy consumption of $\SI{1.7}{\ampere\hour}$ per year. + +This annual energy consumption is close to the capacity of a single CR123A lithium primary cell. Thus, by either using +several such cells or by optimizing power consumption several years of battery life could easily be reached. In our +proof of concept prototype we decided against using a battery to reduce rotor mass and balancing issues. + +We also decided against mechanically complex solutions such as slip rings or electronically complex ones such as +inductive power transfer. Instead, we chose a simple setup consisting of a stationary lamp pointing at several solar +cells on the rotor. At the monitoring circuit's low power consumption power transfer efficiency is irrelevant, so this +solution is practical. Our system uses six series-connected solar cells mounted on the end of the cylindrical rotor +that are fed into a large $\SI{33}{\micro\farad}$ ceramic buffer capacitor through a Schottky diode. This solution +provides around $\SI{3.0}{\volt}$ at several tens of $\si{\milli\ampere}$ to the payload when illuminated using either +a $\SI{60}{\watt}$ incandescent light bulb or a flicker-free LED studio light of similar brightness\footnote{LED lights +intended for room lighting exhibit significant flicker that can cause the monitoring circuit to reset. Incandescent +lighting requires some care in shielding the data link from the light bulb's considerable infrared output.}. + +\subsection{Data transmission between stator and rotor} + +Besides power transfer from stator to rotor, we need a reliable, bidirectional data link to transmit mesh status and a +low-latency heartbeat signal. We chose to transport an $\SI{115}{\kilo\baud}$ UART signal through a simple IR link for a +quick and robust solution. The link's transmitter directly drives a standard narrow viewing angle IR led through a +transistor. The receiver has an IR PIN photodiode reverse-biased at $\frac{1}{2}V_\text{CC}$ feeding into an +\texttt{MCP6494} general purpose opamp configured as an $\SI{100}{\kilo\ohm}$ transimpedance amplifier. As shown in +Figure \ref{photolink_schematic}, the output of this TIA is amplified one more time before being squared up by a +comparator. Our design trades off stator-side power consumption for a reduction in rotor-side power consumption by +using a narrow-angle IR led and photodiode on the rotor, and wide-angle components at a higher LED current on the +stator. Figure~\ref{ir_tx_schema} shows the physical arrangement of both links. The links face opposite one another and +are shielded from one another by the motor's body in the center of the PCB. + +% We used an \texttt{MCP6494} quad CMOS op-amp. At a specified $\SI{2}{\milli\ampere}$ current +% consumption it is within our rotor's power budget, and its Gain Bandwidth Product of $\SI{7.5}{\mega\hertz}$ yields a +% useful transimpedance in the photodiode-facing TIA stage. + +\begin{figure} + \begin{subfigure}{0.3\textwidth} + \includegraphics[width=4.5cm]{ir_tx_schema.pdf} + \caption{Basic layout, view along axis of rotation. 1 + - Rotor base PCB. 2 - Stator IR link PCB. 3 - Motor. 4 - receiver PIN photodiode. 5 - transmitter IR LED.} + \label{ir_tx_schema} + \end{subfigure} + \hfill + \begin{subfigure}{0.65\textwidth} + \includegraphics[width=9cm]{photolink_schematic.pdf} + \caption{Schematic with sample component values. C2 is highly dependent on the photodiode characteristics and + stray capacitances.} + \label{photolink_schematic} + \end{subfigure} + \caption{IR data link implementation} +\end{figure} + +\subsection{Evaluation} + +The compoleted proof of concept hardware worked as intended. Both rotating power and data links worked well. As we +expected, the mechanical design vibrated at higher speeds but despite these unintended vibrations we were able reach +speeds in excess of $\SI{1000}{rpm}$ by clamping the device to the workbench. Even at high speeds, both the power link +and the data links continued to function without issue. + +\section{Using MEMS accelerometers for braking detection} +\label{sec_accel_meas} + +Using the proof of concept prototype from the previous section, we performed an evaluation of an \partnum{AIS1120} +commercial automotive MEMS accelerometer as a braking sensor. The device is mounted inside our prototype at a radius of +$\SI{55}{\milli\meter}$ from the axis of rotation to the center of the device's package. The \partnum{AIS1120} provides +a measurement range of $\pm 120\,g$. At its 14-bit resolution, one LSB corresponds to $15\,\mathrm{m}g$. + +Our prototype IHSM uses a motor controller intended for use in RC quadcopters. In our experimental setup, we manually +control this motor controller through an RC servo tester. In our experiments we externally measured the device's speed +of rotation using a magnet fixed to the rotor and a reed switch held close. The reed switch output is digitized using an +USB logic analyzer at a sampling rate of $\SI{100}{\mega\hertz}$. We calculcate rotation frequency as a +$\SI{1}{\second}$ running average over debounced interval lengths of this captured signal\footnote{A regular frequency +counter or commercial tachometer would have been easier, but neither was available in our limited COVID-19 home office +lab.}. + +The accelerometer is controlled from the \partnum{STM32} microcontroller on the rotor of our IHSM prototype platform. +Timed by an external quartz, the microcontroller samples accelerometer readings at $\SI{10}{\hertz}$. Readings are +accumulated in a small memory buffer, which is continuously transmitted out through the prototype platform's infrared +link. Data is packetized with a sequence number indicating the buffer's position in the data stream and a CRC-32 +checksum for error detection. On the host, a Python script stores all packets received with a valid checksum in an +SQLite database. + +Data analysis is done separately from data capture. An analysis IPython Notebook reads captured packets and reassembles +the continuous sample stream based on the packets' sequence numbers. The low $\SI{10}{\hertz}$ sampling rate and high +$\SI{115}{\kilo Bd}$ transmission speed lead to a large degree of redundancy with gaps in the data stream being rare. +This allowed us to avoid writing retransmission logic or data interpolation. + +Figure~\ref{fig-acc-steps} shows an entire run of the experiment. During this run, we started with the rotor at +standstill, then manually increased its speed of rotation in steps. Areas shaded gray are intervals where we manually +adjust the rotors speed. The unshaded areas in between are intervals when the rotor speed is steady. +Figure~\ref{fig-acc-stacked} shows a magnified view of these periods of steady rotor speed. In both graphs, orange +lines indicate centrifugal acceleration as calculated from rotor speed measurements. Visually, we can see that +measurements and theory closely match. Our frequency measurements are accurate and the main source of error are the +accelerometer's intrinsic errors as well as error in its placement due to construction tolerances. + +The accelerometer's primary intrinsic errors are offset error and scale error. Offset error is a fixed additive offset +to all measurements. Scale error is an error proportional to a measurements value that results from a deviation between +the device's specified and actual sensitivity. We correct for both errors by first extracting all stable intervals from +the time series, then fitting a linear function to the measured data. Offset error is this linear function's intercept, +and scale error is its slope. We then apply this correction to all captured data before plotting and later analysis. +Despite its simplicity, this approach already leads to a good match of measurements and theory modulo a small part of +the device's offset remaining. At high speeds of rotation this remaining offset does not have an appreciable impact, but +due to the quadratic nature of centrifugal acceleration at low speeds it causes a large relative error of up to +$\SI{10}{\percent}$ at $\SI{95}{rpm}$. + +After offset and scale correction, we applied a low-pass filter to our data. The graphs show both raw and filtered data. +Raw data contains significant harmonic content. This content is due to vibrations in our prototype as well as gravity +since we tested our proof of concept prototype lying down, with its shaft pointing sideways. FFT analysis shows that +this harmonic content is a clean intermodulation product of the accelerometers sampling rate and the speed of rotation +with no other visible artifacts. + +Figure~\ref{fig-acc-theory} shows a plot of our measurement results against frequency. Data points are shown in dark +blue, and theoretical behavior is shown in orange. From our measurements we can conclude that an accelerometer is a good +choice for an IHSM's braking sensor. A simple threshold set according to the sensor's calculated expected centrifugal +force should be sufficient to reliably detect manipulation attempts without resulting in false positives. Periodic +controlled changes in the IHSM's speed of rotation allow an offset and scale calibration of the accelerometer on the +fly, without stopping the rotor. + +\begin{figure} + \center + \includegraphics[width=0.7\textwidth]{../../prototype/sensor-analysis/fig-acc-theory-meas-run50.pdf} + \caption{Centrifugal acceleration versus angular frequency in theory and in our experiments. Experimental + measurements are shown after correction for device-specific offset and scale error. Our measurements + showed good agreement with our theoretical results. Above \SI{300}{rpm}, the relative acceleration error was consistently + below $\SI{0.5}{\percent}$. Below $\SI{300}{rpm}$, the residual offset error that remains after our first-order + corrections has a strong impact ($0.05\,g$ absolute or $8\%$ relative at $\SI{95}{rpm}$.)} + \label{fig-acc-theory} +\end{figure} + +\begin{figure} + \begin{subfigure}{0.5\textwidth} + \center + \includegraphics[width=1.1\textwidth]{../../prototype/sensor-analysis/fig-acc-trace-steps-run50.pdf} + \caption{Raw recording of accelerometer measurements during one experiment run. Shaded areas indicate time + intervals when we manually adjusted speed.} + \label{fig-acc-steps} + \end{subfigure} + \hfill + \begin{subfigure}{0.45\textwidth} + \center + \includegraphics[width=1.1\textwidth]{../../prototype/sensor-analysis/fig-acc-trace-stacked-run50.pdf} + \caption{Valid measurements cropped out from \ref{fig-acc-steps} for various frequencies. Intermodulation + artifacts from the accelerometer's $\SI{10}{\hertz}$ sampling frequency and the $\SI{3}{\hertz}$ to + $\SI{18}{\hertz}$ rotation frequency due to gravity and device vibration are clearly visible.} + \label{fig-acc-stacked} + \end{subfigure} + \label{fig-acc-traces} + \caption{Traces of acceleration measurements during one experiment run.} +\end{figure} + +\section{Conclusion} +\label{sec_conclusion} + +In this paper we introduced Inertial Hardware Security Modules (iHSMs), a novel concept for the construction of advanced +hardware security modules from simple components. We analyzed the concept for its security properties and highlighted +its ability to significantly strengthen otherwise weak tamper detection barriers. We validated our design by creating a +proof of concept hardware prototype. In this prototype we have demonstrated practical solutions to the major electronics +design challenges: Data and power transfer through a rotating joint, and mechanized mesh generation. We have used our +prototype to perform several experiments to validate the rotary power and data links and the onboard accelerometer. Our +measurements have shown that our proof-of-concept solar cell power link works well and that our simple IR data link +already is sufficiently reliable for telemetry. Our experiments with an \partnum{AIS1120} automotive MEMS accelerometer +showed that this part is well-suited for braking detection in the range of rotation speed relevant to the IHSM scenario. + +Overall, our findings validate the viability of IHSMs as an evolutionary step beyond traditional HSM technology. IHSMs +offer a high level of security beyond what traditional techniques can offer even when built from simple components. They +allow the construction of devices secure against a wide range of practical attacks in small quantities and without +specialized tools. The rotating mesh allows longitudinal gaps, which enables new applications that are impossible with +traditional HSMs. Such gaps can be used to integrate a fan for air cooling into the HSM, allowing the use of powerful +computing hardware inside the HSM. We hope that this simple construction will stimulate academic research into (more) +secure hardware. + +\printbibliography[heading=bibintoc] + + +%%% FIXME remove appendix and work into text. + +\center{ + \center{This is version \texttt{\input{version.tex}\unskip} of this paper, generated on \today. The git repository + can be found at:} + + \center{\url{https://git.jaseg.de/rotohsm.git}} +} +\end{document} diff --git a/paper/rotohsm_tech_report.pdf b/paper/rotohsm_tech_report.pdf new file mode 100644 index 0000000..b5cbade Binary files /dev/null and b/paper/rotohsm_tech_report.pdf differ diff --git a/paper/rotohsm_tech_report.tex b/paper/rotohsm_tech_report.tex new file mode 100644 index 0000000..e9d571f --- /dev/null +++ b/paper/rotohsm_tech_report.tex @@ -0,0 +1,300 @@ +\documentclass[10pt,journal,a4paper]{IEEEtran} +\usepackage[english]{babel} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[ + backend=biber, + style=numeric, + natbib=true, + url=false, + doi=true, + eprint=false + ]{biblatex} +\addbibresource{rotohsm.bib} +\usepackage{amssymb,amsmath} +\usepackage{listings} +\usepackage{eurosym} +\usepackage{wasysym} +\usepackage{amsthm} +\usepackage{tabularx} +\usepackage{multirow} +\usepackage{multicol} +\usepackage{tikz} +\usepackage{mathtools} +\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} +\DeclarePairedDelimiter{\paren}{(}{)} + +\usetikzlibrary{arrows} +\usetikzlibrary{chains} +\usetikzlibrary{backgrounds} +\usetikzlibrary{calc} +\usetikzlibrary{decorations.markings} +\usetikzlibrary{decorations.pathreplacing} +\usetikzlibrary{fit} +\usetikzlibrary{patterns} +\usetikzlibrary{positioning} +\usetikzlibrary{shapes} + +\usepackage[binary-units]{siunitx} +\DeclareSIUnit{\baud}{Bd} +\DeclareSIUnit{\year}{a} +\usepackage{hyperref} +\usepackage{tabularx} +\usepackage{commath} +\usepackage{graphicx,color} +\usepackage{ccicons} +\usepackage{subcaption} +\usepackage{float} +\usepackage{footmisc} +\usepackage{array} +\usepackage[underline=false]{pgf-umlsd} +\usetikzlibrary{calc} +%\usepackage[pdftex]{graphicx,color} +\usepackage{epstopdf} +\usepackage{pdfpages} +\usepackage{minted} % pygmentized source code + +\renewcommand{\floatpagefraction}{.8} +\newcommand{\degree}{\ensuremath{^\circ}} +\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}} + +\usepackage{fancyhdr} +\fancyhf{} +\fancyfoot[C]{\thepage} +\newcommand{\includenotebook}[2]{ + \fancyhead[C]{Included Jupyter notebook: #1} + \includepdf[pages=1, + pagecommand={\thispagestyle{fancy}\section{#1}\label{#2_notebook}} + ]{resources/#2.pdf} + \includepdf[pages=2-, + pagecommand={\thispagestyle{fancy}} + ]{resources/#2.pdf} +} + +\begin{document} + +\title{Tech Report: Inerial HSMs Thwart Advanced Physical Attacks} +\author{\IEEEauthorblockN{ + Jan Sebastian Götte\IEEEauthorrefmark{1}\IEEEauthorrefmark{2} \and + Björn Scheuermann\IEEEauthorrefmark{1}\IEEEauthorrefmark{2} + }\\ + \IEEEauthorblockA{ + \IEEEauthorrefmark{1}Alexander von Humboldt Institut für Internet und Gesellschaft (HIIG)\\ + \IEEEauthorrefmark{2}Humboldt-Universität zu Berlin\\ + \texttt{\textbf{\small goette@jaseg.de}}, \texttt{\textbf{\small scheuermann@informatik.hu-berlin.de}} + } +} +\date{2021-01-05} +\maketitle + +\section*{Abstract} + +In this tech report, we introduce a novel countermeasure against physical attacks: Inertial hardware security modules +(iHSMs). Conventional systems have in common that they try to detect attacks by crafting sensors responding to +increasingly minute manipulations of the monitored security boundary or volume. Our approach is novel in that we reduce +the sensitivity requirement of security meshes and other sensors and increase the complexity of any manipulations by +rotating the security mesh or sensor at high speed---thereby presenting a moving target to an attacker. Attempts to stop +the rotation are easily monitored with commercial MEMS accelerometers and gyroscopes. Our approach leads to a HSM that +can easily be built from off-the-shelf parts by any university electronics lab, yet offers a level of security that is +comparable to commercial HSMs. + +This tech report is the abridged version of our forthcoming paper. + +\section{Introduction} + +While information security technology has matured a great deal in the last half century, physical security has barely +changed. Given the right skills, physical access to a computer still often means full compromise. The physical +security of modern server hardware hinges on what lock you put on the room it is in. + +Currently, servers and other computers are rarely physically secured as a whole. Servers sometimes have a simple lid +switch and are put in locked ``cages'' inside guarded facilities. This usually provides a good compromise between +physical security and ease of maintenance. To handle highly sensitive data in applications such as banking or public key +infrastructure, general-purpose and low-security servers are augmented with dedicated, physically secure cryptographic +co-processors such as trusted platform modules (TPMs) or hardware security modules (HSMs). Using a limited amount of +trust in components such as the CPU, the larger system's security can then be reduced to that of its physically secured +TPM~\cite{newman2020,frazelle2019,johnson2018}. + +Like smartcards, TPMs rely on a modern IC being hard to tamper with. Shrinking things to the nanoscopic level to secure +them against tampering is a good engineering solution for some years to come. However, in essence this is a type of +security by obscurity: Obscurity here referring to the rarity of the equipment necessary to attack modern +ICs~\cite{albartus2020,anderson2020}. + +HSMs rely on a fragile foil with much larger-scale conductive traces being hard to remove intact. While we are certain +that there still are many insights to be gained in both technologies, we wish to introduce a novel approach to sidestep +the manufacturing issues of both and provide radically better security against physical attacks. Our core observation +is that any cheap but coarse HSM technology can be made much more difficult to attack by moving it very quickly. + +For example, consider an HSM as it is used in online credit card payment processing. Its physical security level is set +by the structure size of its security mesh. An attack on its mesh might involve fine drill bits, needles, wires, glue, +solder and lasers~\cite{drimer2008}. Now consider the same HSM mounted on a large flywheel. In addition to its usual +defenses the HSM is now equipped with an accelerometer that it uses to verify that it is spinning at high speed. How +would an attacker approach this HSM? They would have to either slow down the rotation---which triggers the +accelerometer---or they would have to attack the HSM in motion. The HSM literally becomes a moving target. At slow +speeds, rotating the entire attack workbench might be possible but rotating frames of reference quickly become +inhospitable to human life. Since non-contact electromagnetic or optical attacks are more limited in the first place and +can be shielded, we have effectively forced the attacker to use an attack robot. + +In Section~\ref{sec_related_work}, we will give an overview of the state of the art in the physical security of HSMs. On +this basis, in Section~\ref{sec_ihsm_construction} we will elaborate the principles of our inertial HSM approach. We +conclude this paper with a general evaluation of our concept in Section~\ref{sec_conclusion}. + +\section{Related work} +\label{sec_related_work} +% summaries of research papers on HSMs. I have not found any actual prior art on anything involving mechanical motion +% beyond ultrasound. + +In this section, we will briefly explore the history of HSMs and the state of academic research on active tamper +detection. + +HSMs are an old technology tracing back decades in their electronic realization. Today's common approach of monitoring +meandering electrical traces on a fragile foil that is wrapped around the HSM essentially transforms the security +problem into the challenge to manufacture very fine electrical traces on a flexible foil~\cite{isaacs2013, immler2019, +anderson2020}. There has been some research on monitoring the HSM's inside using e.g.\ electromagnetic +radiation~\cite{tobisch2020, kreft2012} or ultrasound~\cite{vrijaldenhoven2004} but none of this research +has found widespread adoption yet. + +In~\cite{anderson2020}, Anderson gives a comprehensive overview on physical security. An example they cite is the IBM +4758 HSM whose details are laid out in depth in~\cite{smith1998}. This HSM is an example of an industry-standard +construction. Although its turn of the century design is now a bit dated, the construction techniques of the physical +security mechanisms have not evolved much in the last two decades. Besides auxiliary temperature and radiation sensors +to guard against attacks on the built-in SRAM memory, the module's main security barrier uses the traditional +construction of a flexible mesh wrapped around the module's core. In~\cite{smith1998}, the authors state the module +monitors this mesh for short circuits, open circuits and conductivity. The fundamental approach to tamper detection and +construction is similar to other commercial offerings~\cite{obermaier2018,drimer2008,anderson2020,isaacs2013}. + +To the best of our knowledge, we are the the first to propose a mechanically moving HSM security barrier as part of a +hardware security module. Most academic research concentrates on the issue of creating new, more sensitive security +barriers for HSMs~\cite{immler2019} while commercial vendors concentrate on means to certify and cheaply manufacture +these security barriers~\cite{drimer2008}. Our concept instead focuses on the issue of taking any existing, cheap +low-performance security barrier and transforming it into a marginally more expensive but high-performance one. The +closest to a mechanical HSM that we were able to find during our research is an 1988 patent~\cite{rahman1988} that +describes a mechanism to detect tampering along a communication cable by enclosing the cable inside a conduit filled +with pressurized gas. + +\section{Inertial HSM construction and operation} +\label{sec_ihsm_construction} + +Mechanical motion has been proposed as a means of making things harder to see with the human eye~\cite{haines2006} and is +routinely used in military applications to make things harder to hit~\cite{terdiman2013} but we seem to be the first to +use it in tamper detection. If we consider different ways of moving an HSM to make it harder to tamper with, we find +that making it spin has several advantages. + +First, the HSM has to move fairly fast. If any point of the HSM's tamper sensing mesh moves slow enough for a human to +follow, it becomes a weak spot. E.g.\ in a linear pendulum motion, the pendulum becomes stationary at its apex. Second, +a spinning HSM is compact compared to alternatives like an HSM on wheels. Finally, rotation leads to easily predictable +accelerometer measurements. A beneficial side-effect of spinning the HSM is that if the axis of rotation is within the +HSM itself, an attacker trying to follow the motion would have to rotate around the same axis. Their tangential linear +velocity would rise linearly with the radius from the axis of rotation, which allows us to limit the approximate maximum +size and mass of an attacker using an assumption on tolerable centrifugal force. In this consideration the axis of +rotation is a weak spot, but that can be mitigated using multiple nested layers of protection. + +\begin{figure} + \center + \includegraphics{concept_vis_one_axis.pdf} + \caption{Concept of a simple spinning inertial HSM. 1 - Shaft. 2 - Security mesh. 3 - Payload. 4 - + Accelerometer. 5 - Shaft penetrating security mesh.} + \label{fig_schema_one_axis} +\end{figure} + +In a rotating reference frame, centrifugal force is proportional to the square of angular velocity and proportional to +distance from the axis of rotation. We can exploit this fact to create a sensor that detects any disturbance of the +rotation by placing a linear accelerometer at some distance from the axis of rotation. During constant rotation, after +subtracting gravity both acceleration tangential to the rotation and along the axis of rotation will be zero. +Centrifugal acceleration will be constant. + +Large centrifugal acceleration at high speeds poses the engineering challenge of preventing the whole thing from flying +apart, but it also creates an obstacle to any attacker trying to manipulate the sensor. We do not need to move the +entire contents of the HSM. It suffices if we move the tamper detection barrier around a stationary payload. This +reduces the moment of inertia of the moving part and it means we can use cables for payload power and data. Even at +moderate speeds above $\SI{500}{rpm}$, an attack would have to be carried out using a robot. + +\subsection{Mechanical layout} + +Thinking about the concrete construction of our mechanical HSM, the first challenge is mounting both mesh and payload on +a single shaft. The simplest way we found to mount a stationary payload inside of a spinning security mesh is a hollow +shaft. The payload can be mounted on a fixed rod threaded through this hollow shaft along with wires for power and +data. The shaft is a weak spot of the system, but this weak spot can be alleviated through either careful construction +or a second layer of rotating meshes with a different axis of rotation. Configurations that do not use a hollow-shaft +motor are possible, but may require additional bearings to keep the stator from vibrating. + +The next design choice we have to make is the physical structure of the security mesh. The spinning mesh must be +designed to cover the entire surface of the payload, but compared to a traditional HSM it suffices if it sweeps over +every part of the payload once per rotation. This means we can design longitudinal gaps into the mesh that allow outside +air to flow through to the payload. In traditional boundary-sensing HSMs, cooling of the payload processor is a serious +issue since any air duct or heat pipe would have to penetrate the HSM's security boundary. This problem can only be +solved with complex and costly siphon-style constructions, so in commercial systems heat conduction is used +exclusively~\cite{isaacs2013}. This limits the maximum power dissipation of the payload and thus its processing power. +Our setup allows direct air cooling of regular heatsinks. This greatly increases the maximum possible power dissipation +of the payload and unlocks much more powerful processing capabilities. In an evolution of our design, the spinning mesh +could even be designed to \emph{be} a cooling fan. + +\subsection{Spinning mesh power and data transmission} + +On the electrical side, the idea of a security mesh spinning at more than $\SI{500}{rpm}$ leaves us with a few +implementation challenges. Since the spinning mesh must be monitored for breaks or short circuits continuously, we need +both a power supply for the spinning monitoring circuit and a data link to the stator. + +We think that a bright lamp shining at a rotating solar panel is a good starting point. In contrast to e.g.\ slip +rings, this setup is mechanically durable at high speeds and it also provides reasonable output power. A battery may not +provide a useful lifetime without power-optimization. Likewise, an energy harvesting setup may not provide enough +current to supply peak demand. + +Since the monitoring circuit uses little current, power transfer efficiency is not important. On the other hand, cost +may be a concern in a production device. Here it may prove worthwhile to replace the solar cell setup with an extra +winding on the rotor of the BLDC motor driving the spinning mesh. This motor is likely to be a custom part, so adding +an extra winding is unlikely to increase cost significantly. More traditional inductive power transfer may also be an +option if it can be integrated into the mechanical design. + +\begin{figure} + \center + \includegraphics{ir_tx_schema.pdf} + \caption{Example of a bidirectional IR communication link between rotor and stator, view along axis of rotation. 1 + - Rotor base plate. 2 - Stator base plate. 3 - Motor. 4 - receiver PIN photodiode. 5 - transmitter IR LED.} + \label{ir_tx_schema} +\end{figure} + +Besides power, the data link between spinning mesh and payload is critical to the HSM's design. This link is used to +transmit the occassional status report along with a low-latency alarm trigger (``heartbeat'') signal from mesh to payload. +A simple infrared optical link as shown in Figure~\ref{ir_tx_schema} may be a good solution for this purpose. + +\section{Conclusion} + +\label{sec_conclusion} To conclude, in this tech report we introduced inertial hardware security modules (iHSMs), a +novel concept for the construction of highly secure hardware security modules from inexpensive, commonly available +parts. We elaborated the engineering considerations underlying a practical implementation of this concept. + +Inertial HSMs offer a high level of security beyond what traditional techniques can offer. They allow the construction +of devices secure against a wide range of practical attacks at prototype quantities and without specialized tools. We +hope that this simple construction will stimulate academic research into secure hardware. + +\printbibliography[heading=bibintoc] +\appendix + +\subsection{Patents and licensing} +During development, we performed several hours of research on prior art for the inertial HSM concept. Yet, we could not +find any mentions of similar concepts either in academic literature or in patents. Thus, we are likely the inventors of +this idea and we are fairly sure it is not covered by any patents or other restrictions at this point in time. + +Since the concept is primarily attractive for small-scale production and since cheaper mass-production alternatives are +already commercially available, we have decided against applying for a patent and we wish to make it available to the +general public without any restrictions on its use. This paper itself is licensed CC-BY-SA (see below). As for the +inertial HSM concept, we invite you to use it as you wish and to base your own work on our publications without any fees +or commercial restrictions. Where possible, we ask you to cite this paper and attribute the inertial HSM concept to its +authors. + +\center{ + \center{\ccbysa} + + \center{This work is licensed under a Creative-Commons ``Attribution-ShareAlike 4.0 International'' license. The + full text of the license can be found at:} + + \center{\url{https://creativecommons.org/licenses/by-sa/4.0/}} + + \center{For alternative licensing options, source files, questions or comments please contact the authors.} + + \center{This is version \texttt{\input{version.tex}\unskip} generated on \today. Once the full paper has been + published, this project's git repository will be available at:} + + \center{\url{https://git.jaseg.de/rotohsm.git}} +} +\end{document} diff --git a/paper/rotor_stator.jpg b/paper/rotor_stator.jpg new file mode 100644 index 0000000..904052b Binary files /dev/null and b/paper/rotor_stator.jpg differ -- cgit