This tutorial covers:
wbkit
)Evaluate the circuit on an input $x^{(1)} = (0, 0, 1)$ and record all input/intermediate/output values:
Repeat for another plaintext $x^{(2)} = (0, 1, 0)$, append intermediate values to each node's history.
Repeat for another plaintext $x^{(3)} = (1, 1, 1)$.
from binteger import Bin
from circkit.boolean import OptBooleanCircuit as BooleanCircuit
from wbkit.ciphers.aes import BitAES
C = BooleanCircuit(name="AES")
key = b"abcdefghABCDEFGH"
plaintext = b"0123456789abcdef"
pt = C.add_inputs(128)
ct, k10 = BitAES(pt, Bin(key).tuple, rounds=10)
C.add_output(ct)
C.in_place_remove_unused_nodes()
C.print_stats()
ct = C.evaluate(Bin(plaintext).tuple)
AES(OptBooleanCircuit): | 128 inputs, 128 outputs, 31273 nodes | XOR:19284 (61.66%), AND:6240 (19.95%), NOT:5621 (17.97%), INPUT:128 (0.41%)
Using circkit
directly:
(useful for small experimetns, too slow/heavy for mass tracing)
C.trace(Bin(plaintext).tuple)
{<OptBooleanCircuit:INPUT[name=x0_0]#0 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_1]#1 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_2]#2 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_3]#3 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_4]#4 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_5]#5 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_6]#6 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_7]#7 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_8]#8 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_9]#9 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_10]#10 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_11]#11 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_12]#12 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_13]#13 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_14]#14 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_15]#15 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_16]#16 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_17]#17 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_18]#18 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_19]#19 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_20]#20 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_21]#21 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_22]#22 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_23]#23 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_24]#24 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_25]#25 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_26]#26 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_27]#27 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_28]#28 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_29]#29 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_30]#30 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_31]#31 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_32]#32 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_33]#33 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_34]#34 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_35]#35 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_36]#36 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_37]#37 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_38]#38 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_39]#39 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_40]#40 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_41]#41 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_42]#42 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_43]#43 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_44]#44 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_45]#45 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_46]#46 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_47]#47 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_48]#48 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_49]#49 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_50]#50 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_51]#51 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_52]#52 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_53]#53 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_54]#54 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_55]#55 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_56]#56 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_57]#57 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_58]#58 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_59]#59 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_60]#60 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_61]#61 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_62]#62 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_63]#63 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_64]#64 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_65]#65 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_66]#66 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_67]#67 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_68]#68 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_69]#69 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_70]#70 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_71]#71 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_72]#72 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_73]#73 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_74]#74 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_75]#75 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_76]#76 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_77]#77 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_78]#78 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_79]#79 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_80]#80 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_81]#81 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_82]#82 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_83]#83 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_84]#84 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_85]#85 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_86]#86 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_87]#87 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_88]#88 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_89]#89 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_90]#90 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_91]#91 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_92]#92 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_93]#93 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_94]#94 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_95]#95 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_96]#96 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_97]#97 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_98]#98 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_99]#99 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_100]#100 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_101]#101 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_102]#102 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_103]#103 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_104]#104 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_105]#105 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_106]#106 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_107]#107 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_108]#108 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_109]#109 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_110]#110 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_111]#111 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_112]#112 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_113]#113 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_114]#114 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_115]#115 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_116]#116 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_117]#117 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_118]#118 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_119]#119 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_120]#120 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_121]#121 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_122]#122 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_123]#123 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_124]#124 ()>: 0, <OptBooleanCircuit:INPUT[name=x0_125]#125 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_126]#126 ()>: 1, <OptBooleanCircuit:INPUT[name=x0_127]#127 ()>: 0, <OptBooleanCircuit:NOT#130 (1)>: 1, <OptBooleanCircuit:NOT#131 (2)>: 0, <OptBooleanCircuit:NOT#132 (7)>: 1, <OptBooleanCircuit:NOT#133 (33)>: 1, <OptBooleanCircuit:NOT#134 (34)>: 0, <OptBooleanCircuit:NOT#135 (37)>: 0, <OptBooleanCircuit:NOT#136 (39)>: 1, <OptBooleanCircuit:NOT#137 (65)>: 1, <OptBooleanCircuit:NOT#138 (71)>: 1, <OptBooleanCircuit:NOT#139 (97)>: 0, <OptBooleanCircuit:NOT#140 (101)>: 1, <OptBooleanCircuit:NOT#141 (103)>: 0, <OptBooleanCircuit:NOT#142 (9)>: 1, <OptBooleanCircuit:NOT#143 (10)>: 0, <OptBooleanCircuit:NOT#144 (14)>: 1, <OptBooleanCircuit:NOT#145 (41)>: 1, <OptBooleanCircuit:NOT#146 (42)>: 0, <OptBooleanCircuit:NOT#147 (45)>: 0, <OptBooleanCircuit:NOT#148 (46)>: 1, <OptBooleanCircuit:NOT#149 (73)>: 1, <OptBooleanCircuit:NOT#150 (78)>: 1, <OptBooleanCircuit:NOT#151 (105)>: 0, <OptBooleanCircuit:NOT#152 (109)>: 0, <OptBooleanCircuit:NOT#153 (110)>: 1, <OptBooleanCircuit:NOT#154 (17)>: 1, <OptBooleanCircuit:NOT#155 (18)>: 0, <OptBooleanCircuit:NOT#156 (22)>: 0, <OptBooleanCircuit:NOT#157 (23)>: 1, <OptBooleanCircuit:NOT#158 (49)>: 1, <OptBooleanCircuit:NOT#159 (50)>: 0, <OptBooleanCircuit:NOT#160 (53)>: 0, <OptBooleanCircuit:NOT#161 (54)>: 0, <OptBooleanCircuit:NOT#162 (55)>: 1, <OptBooleanCircuit:NOT#163 (81)>: 0, <OptBooleanCircuit:NOT#164 (86)>: 1, <OptBooleanCircuit:NOT#165 (87)>: 0, <OptBooleanCircuit:NOT#166 (113)>: 0, <OptBooleanCircuit:NOT#167 (117)>: 0, <OptBooleanCircuit:NOT#168 (118)>: 1, <OptBooleanCircuit:NOT#169 (119)>: 0, <OptBooleanCircuit:NOT#170 (25)>: 1, <OptBooleanCircuit:NOT#171 (26)>: 0, <OptBooleanCircuit:NOT#172 (29)>: 1, <OptBooleanCircuit:NOT#173 (57)>: 1, <OptBooleanCircuit:NOT#174 (58)>: 0, <OptBooleanCircuit:NOT#175 (60)>: 1, <OptBooleanCircuit:NOT#176 (89)>: 0, <OptBooleanCircuit:NOT#177 (93)>: 1, <OptBooleanCircuit:NOT#178 (121)>: 0, <OptBooleanCircuit:NOT#179 (124)>: 1, <OptBooleanCircuit:XOR#180 (0,131)>: 0, <OptBooleanCircuit:NOT#181 (3)>: 0, <OptBooleanCircuit:XOR#182 (0,181)>: 0, <OptBooleanCircuit:XOR#183 (130,132)>: 0, <OptBooleanCircuit:NOT#184 (183)>: 1, <OptBooleanCircuit:XOR#185 (131,184)>: 1, <OptBooleanCircuit:XOR#186 (3,185)>: 0, <OptBooleanCircuit:XOR#187 (4,132)>: 1, <OptBooleanCircuit:XOR#188 (5,180)>: 0, <OptBooleanCircuit:XOR#189 (6,183)>: 0, <OptBooleanCircuit:XOR#190 (4,189)>: 0, <OptBooleanCircuit:NOT#191 (189)>: 1, <OptBooleanCircuit:XOR#192 (188,191)>: 1, <OptBooleanCircuit:XOR#193 (6,185)>: 1, <OptBooleanCircuit:XOR#194 (180,184)>: 1, <OptBooleanCircuit:XOR#195 (6,182)>: 0, <OptBooleanCircuit:XOR#196 (195,187)>: 1, <OptBooleanCircuit:NOT#197 (190)>: 1, <OptBooleanCircuit:XOR#198 (5,197)>: 1, <OptBooleanCircuit:NOT#205 (198)>: 0, <OptBooleanCircuit:NOT#206 (185)>: 0, <OptBooleanCircuit:NOT#207 (196)>: 0, <OptBooleanCircuit:NOT#208 (194)>: 0, <OptBooleanCircuit:NOT#209 (193)>: 0, <OptBooleanCircuit:NOT#210 (186)>: 1, <OptBooleanCircuit:NOT#211 (192)>: 0, <OptBooleanCircuit:XOR#212 (210,208)>: 1, <OptBooleanCircuit:XOR#213 (211,209)>: 0, <OptBooleanCircuit:XOR#214 (132,205)>: 1, <OptBooleanCircuit:XOR#215 (207,206)>: 0, <OptBooleanCircuit:XOR#216 (209,208)>: 0, <OptBooleanCircuit:XOR#217 (211,210)>: 1, <OptBooleanCircuit:XOR#218 (213,212)>: 1, <OptBooleanCircuit:XOR#219 (206,205)>: 0, <OptBooleanCircuit:XOR#220 (207,132)>: 1, <OptBooleanCircuit:XOR#221 (215,214)>: 1, <OptBooleanCircuit:AND#222 (217,220)>: 1, <OptBooleanCircuit:AND#223 (212,214)>: 1, <OptBooleanCircuit:AND#224 (218,221)>: 1, <OptBooleanCircuit:AND#225 (194,198)>: 1, <OptBooleanCircuit:AND#226 (216,219)>: 0, <OptBooleanCircuit:XOR#227 (225,226)>: 1, <OptBooleanCircuit:AND#228 (213,215)>: 0, <OptBooleanCircuit:XOR#229 (227,228)>: 1, <OptBooleanCircuit:NOT#230 (223)>: 0, <OptBooleanCircuit:XOR#231 (229,230)>: 1, <OptBooleanCircuit:NOT#232 (216)>: 1, <OptBooleanCircuit:NOT#233 (219)>: 1, <OptBooleanCircuit:AND#234 (232,233)>: 1, <OptBooleanCircuit:AND#235 (209,206)>: 0, <OptBooleanCircuit:NOT#236 (235)>: 1, <OptBooleanCircuit:XOR#237 (234,236)>: 0, <OptBooleanCircuit:XOR#238 (237,223)>: 1, <OptBooleanCircuit:XOR#239 (238,224)>: 0, <OptBooleanCircuit:NOT#240 (213)>: 1, <OptBooleanCircuit:NOT#241 (215)>: 1, <OptBooleanCircuit:AND#242 (240,241)>: 1, <OptBooleanCircuit:AND#243 (210,132)>: 1, <OptBooleanCircuit:NOT#244 (243)>: 0, <OptBooleanCircuit:XOR#245 (242,244)>: 1, <OptBooleanCircuit:XOR#246 (245,222)>: 0, <OptBooleanCircuit:XOR#247 (246,223)>: 1, <OptBooleanCircuit:NOT#248 (212)>: 0, <OptBooleanCircuit:NOT#249 (214)>: 0, <OptBooleanCircuit:AND#250 (248,249)>: 0, <OptBooleanCircuit:AND#251 (211,207)>: 0, <OptBooleanCircuit:NOT#252 (251)>: 1, <OptBooleanCircuit:XOR#253 (250,252)>: 1, <OptBooleanCircuit:XOR#254 (253,222)>: 0, <OptBooleanCircuit:XOR#255 (254,224)>: 1, <OptBooleanCircuit:XOR#256 (255,247)>: 0, <OptBooleanCircuit:XOR#257 (239,231)>: 1, <OptBooleanCircuit:AND#258 (256,257)>: 0, <OptBooleanCircuit:AND#259 (255,239)>: 0, <OptBooleanCircuit:XOR#260 (259,258)>: 0, <OptBooleanCircuit:AND#261 (247,231)>: 1, <OptBooleanCircuit:XOR#262 (261,258)>: 1, <OptBooleanCircuit:XOR#263 (247,231)>: 0, <OptBooleanCircuit:XOR#264 (255,239)>: 1, <OptBooleanCircuit:XOR#265 (263,264)>: 1, <OptBooleanCircuit:XOR#266 (262,265)>: 0, <OptBooleanCircuit:XOR#267 (260,264)>: 1, <OptBooleanCircuit:XOR#278 (266,267)>: 1, <OptBooleanCircuit:AND#279 (278,257)>: 1, <OptBooleanCircuit:AND#280 (266,239)>: 0, <OptBooleanCircuit:XOR#281 (280,279)>: 1, <OptBooleanCircuit:AND#282 (267,231)>: 1, <OptBooleanCircuit:XOR#283 (282,279)>: 0, <OptBooleanCircuit:AND#284 (278,256)>: 0, <OptBooleanCircuit:AND#285 (266,255)>: 0, <OptBooleanCircuit:XOR#286 (285,284)>: 0, <OptBooleanCircuit:AND#287 (267,247)>: 1, <OptBooleanCircuit:XOR#288 (287,284)>: 1, <OptBooleanCircuit:XOR#289 (283,288)>: 1, <OptBooleanCircuit:XOR#290 (281,286)>: 1, <OptBooleanCircuit:XOR#291 (286,288)>: 1, <OptBooleanCircuit:XOR#292 (281,283)>: 1, <OptBooleanCircuit:XOR#293 (290,289)>: 0, <OptBooleanCircuit:AND#294 (292,220)>: 1, <OptBooleanCircuit:AND#295 (281,207)>: 0, <OptBooleanCircuit:XOR#296 (295,294)>: 1, <OptBooleanCircuit:AND#297 (283,132)>: 0, <OptBooleanCircuit:XOR#298 (297,294)>: 1, <OptBooleanCircuit:AND#299 (291,219)>: 0, <OptBooleanCircuit:AND#300 (286,206)>: 0, <OptBooleanCircuit:XOR#301 (300,299)>: 0, <OptBooleanCircuit:AND#302 (288,205)>: 0, <OptBooleanCircuit:XOR#303 (302,299)>: 0, <OptBooleanCircuit:AND#304 (289,214)>: 1, <OptBooleanCircuit:AND#305 (293,221)>: 0, <OptBooleanCircuit:XOR#306 (305,304)>: 1, <OptBooleanCircuit:AND#307 (290,215)>: 0, <OptBooleanCircuit:XOR#308 (307,304)>: 1, <OptBooleanCircuit:XOR#309 (303,308)>: 1, <OptBooleanCircuit:XOR#310 (301,306)>: 1, <OptBooleanCircuit:XOR#311 (298,308)>: 0, <OptBooleanCircuit:XOR#312 (296,306)>: 0, <OptBooleanCircuit:AND#313 (292,217)>: 1, <OptBooleanCircuit:AND#314 (281,211)>: 0, <OptBooleanCircuit:XOR#315 (314,313)>: 1, <OptBooleanCircuit:AND#316 (283,210)>: 0, <OptBooleanCircuit:XOR#317 (316,313)>: 1, <OptBooleanCircuit:AND#318 (291,216)>: 0, <OptBooleanCircuit:AND#319 (286,209)>: 0, <OptBooleanCircuit:XOR#320 (319,318)>: 0, <OptBooleanCircuit:AND#321 (288,208)>: 0, <OptBooleanCircuit:XOR#322 (321,318)>: 0, <OptBooleanCircuit:AND#323 (289,212)>: 1, <OptBooleanCircuit:AND#324 (293,218)>: 0, <OptBooleanCircuit:XOR#325 (324,323)>: 1, <OptBooleanCircuit:AND#326 (290,213)>: 0, <OptBooleanCircuit:XOR#327 (326,323)>: 1, <OptBooleanCircuit:XOR#328 (322,327)>: 1, <OptBooleanCircuit:XOR#329 (320,325)>: 1, <OptBooleanCircuit:XOR#330 (317,327)>: 0, <OptBooleanCircuit:XOR#331 (315,325)>: 0, <OptBooleanCircuit:XOR#332 (312,331)>: 0, <OptBooleanCircuit:XOR#333 (311,309)>: 1, <OptBooleanCircuit:XOR#334 (311,328)>: 1, <OptBooleanCircuit:NOT#335 (331)>: 1, <OptBooleanCircuit:XOR#336 (310,335)>: 0, <OptBooleanCircuit:NOT#337 (332)>: 1, <OptBooleanCircuit:XOR#338 (310,337)>: 0, <OptBooleanCircuit:NOT#339 (329)>: 0, <OptBooleanCircuit:XOR#340 (310,339)>: 1, <OptBooleanCircuit:NOT#341 (340)>: 0, <OptBooleanCircuit:XOR#342 (309,341)>: 1, <OptBooleanCircuit:XOR#343 (330,336)>: 0, <OptBooleanCircuit:XOR#344 (329,333)>: 0, <OptBooleanCircuit:XOR#346 (333,338)>: 1, <OptBooleanCircuit:XOR#347 (334,343)>: 1, <OptBooleanCircuit:NOT#353 (342)>: 0, <OptBooleanCircuit:NOT#356 (344)>: 1, <OptBooleanCircuit:NOT#357 (347)>: 0, <OptBooleanCircuit:NOT#358 (346)>: 0, <OptBooleanCircuit:NOT#359 (338)>: 1, <OptBooleanCircuit:NOT#360 (334)>: 0, <OptBooleanCircuit:NOT#361 (336)>: 1, <OptBooleanCircuit:XOR#362 (32,134)>: 0, <OptBooleanCircuit:NOT#363 (35)>: 0, <OptBooleanCircuit:XOR#364 (32,363)>: 0, <OptBooleanCircuit:XOR#365 (133,136)>: 0, <OptBooleanCircuit:NOT#366 (365)>: 1, <OptBooleanCircuit:XOR#367 (134,366)>: 1, <OptBooleanCircuit:XOR#368 (35,367)>: 0, <OptBooleanCircuit:XOR#369 (36,136)>: 1, <OptBooleanCircuit:XOR#370 (135,362)>: 0, <OptBooleanCircuit:XOR#371 (38,365)>: 0, <OptBooleanCircuit:XOR#372 (36,371)>: 0, <OptBooleanCircuit:NOT#373 (371)>: 1, <OptBooleanCircuit:XOR#374 (370,373)>: 1, <OptBooleanCircuit:XOR#375 (38,367)>: 1, <OptBooleanCircuit:XOR#376 (362,366)>: 1, <OptBooleanCircuit:XOR#377 (38,364)>: 0, <OptBooleanCircuit:XOR#378 (377,369)>: 1, <OptBooleanCircuit:NOT#379 (372)>: 1, <OptBooleanCircuit:XOR#380 (135,379)>: 1, <OptBooleanCircuit:NOT#387 (380)>: 0, <OptBooleanCircuit:NOT#388 (367)>: 0, <OptBooleanCircuit:NOT#389 (378)>: 0, <OptBooleanCircuit:NOT#390 (376)>: 0, <OptBooleanCircuit:NOT#391 (375)>: 0, <OptBooleanCircuit:NOT#392 (368)>: 1, <OptBooleanCircuit:NOT#393 (374)>: 0, <OptBooleanCircuit:XOR#394 (392,390)>: 1, <OptBooleanCircuit:XOR#395 (393,391)>: 0, <OptBooleanCircuit:XOR#396 (136,387)>: 1, <OptBooleanCircuit:XOR#397 (389,388)>: 0, <OptBooleanCircuit:XOR#398 (391,390)>: 0, <OptBooleanCircuit:XOR#399 (393,392)>: 1, <OptBooleanCircuit:XOR#400 (395,394)>: 1, <OptBooleanCircuit:XOR#401 (388,387)>: 0, <OptBooleanCircuit:XOR#402 (389,136)>: 1, <OptBooleanCircuit:XOR#403 (397,396)>: 1, <OptBooleanCircuit:AND#404 (399,402)>: 1, <OptBooleanCircuit:AND#405 (394,396)>: 1, <OptBooleanCircuit:AND#406 (400,403)>: 1, <OptBooleanCircuit:AND#407 (376,380)>: 1, <OptBooleanCircuit:AND#408 (398,401)>: 0, <OptBooleanCircuit:XOR#409 (407,408)>: 1, <OptBooleanCircuit:AND#410 (395,397)>: 0, <OptBooleanCircuit:XOR#411 (409,410)>: 1, <OptBooleanCircuit:NOT#412 (405)>: 0, <OptBooleanCircuit:XOR#413 (411,412)>: 1, <OptBooleanCircuit:NOT#414 (398)>: 1, <OptBooleanCircuit:NOT#415 (401)>: 1, <OptBooleanCircuit:AND#416 (414,415)>: 1, <OptBooleanCircuit:AND#417 (391,388)>: 0, <OptBooleanCircuit:NOT#418 (417)>: 1, <OptBooleanCircuit:XOR#419 (416,418)>: 0, <OptBooleanCircuit:XOR#420 (419,405)>: 1, <OptBooleanCircuit:XOR#421 (420,406)>: 0, <OptBooleanCircuit:NOT#422 (395)>: 1, <OptBooleanCircuit:NOT#423 (397)>: 1, <OptBooleanCircuit:AND#424 (422,423)>: 1, <OptBooleanCircuit:AND#425 (392,136)>: 1, <OptBooleanCircuit:NOT#426 (425)>: 0, <OptBooleanCircuit:XOR#427 (424,426)>: 1, <OptBooleanCircuit:XOR#428 (427,404)>: 0, <OptBooleanCircuit:XOR#429 (428,405)>: 1, <OptBooleanCircuit:NOT#430 (394)>: 0, <OptBooleanCircuit:NOT#431 (396)>: 0, <OptBooleanCircuit:AND#432 (430,431)>: 0, <OptBooleanCircuit:AND#433 (393,389)>: 0, <OptBooleanCircuit:NOT#434 (433)>: 1, <OptBooleanCircuit:XOR#435 (432,434)>: 1, <OptBooleanCircuit:XOR#436 (435,404)>: 0, <OptBooleanCircuit:XOR#437 (436,406)>: 1, <OptBooleanCircuit:XOR#438 (437,429)>: 0, <OptBooleanCircuit:XOR#439 (421,413)>: 1, <OptBooleanCircuit:AND#440 (438,439)>: 0, <OptBooleanCircuit:AND#441 (437,421)>: 0, <OptBooleanCircuit:XOR#442 (441,440)>: 0, <OptBooleanCircuit:AND#443 (429,413)>: 1, <OptBooleanCircuit:XOR#444 (443,440)>: 1, <OptBooleanCircuit:XOR#445 (429,413)>: 0, <OptBooleanCircuit:XOR#446 (437,421)>: 1, <OptBooleanCircuit:XOR#447 (445,446)>: 1, <OptBooleanCircuit:XOR#448 (444,447)>: 0, <OptBooleanCircuit:XOR#449 (442,446)>: 1, <OptBooleanCircuit:XOR#460 (448,449)>: 1, <OptBooleanCircuit:AND#461 (460,439)>: 1, <OptBooleanCircuit:AND#462 (448,421)>: 0, <OptBooleanCircuit:XOR#463 (462,461)>: 1, <OptBooleanCircuit:AND#464 (449,413)>: 1, <OptBooleanCircuit:XOR#465 (464,461)>: 0, <OptBooleanCircuit:AND#466 (460,438)>: 0, <OptBooleanCircuit:AND#467 (448,437)>: 0, <OptBooleanCircuit:XOR#468 (467,466)>: 0, <OptBooleanCircuit:AND#469 (449,429)>: 1, <OptBooleanCircuit:XOR#470 (469,466)>: 1, <OptBooleanCircuit:XOR#471 (465,470)>: 1, <OptBooleanCircuit:XOR#472 (463,468)>: 1, <OptBooleanCircuit:XOR#473 (468,470)>: 1, <OptBooleanCircuit:XOR#474 (463,465)>: 1, <OptBooleanCircuit:XOR#475 (472,471)>: 0, <OptBooleanCircuit:AND#476 (474,402)>: 1, <OptBooleanCircuit:AND#477 (463,389)>: 0, <OptBooleanCircuit:XOR#478 (477,476)>: 1, <OptBooleanCircuit:AND#479 (465,136)>: 0, <OptBooleanCircuit:XOR#480 (479,476)>: 1, <OptBooleanCircuit:AND#481 (473,401)>: 0, <OptBooleanCircuit:AND#482 (468,388)>: 0, <OptBooleanCircuit:XOR#483 (482,481)>: 0, <OptBooleanCircuit:AND#484 (470,387)>: 0, <OptBooleanCircuit:XOR#485 (484,481)>: 0, <OptBooleanCircuit:AND#486 (471,396)>: 1, <OptBooleanCircuit:AND#487 (475,403)>: 0, <OptBooleanCircuit:XOR#488 (487,486)>: 1, <OptBooleanCircuit:AND#489 (472,397)>: 0, <OptBooleanCircuit:XOR#490 (489,486)>: 1, <OptBooleanCircuit:XOR#491 (485,490)>: 1, <OptBooleanCircuit:XOR#492 (483,488)>: 1, <OptBooleanCircuit:XOR#493 (480,490)>: 0, <OptBooleanCircuit:XOR#494 (478,488)>: 0, <OptBooleanCircuit:AND#495 (474,399)>: 1, <OptBooleanCircuit:AND#496 (463,393)>: 0, <OptBooleanCircuit:XOR#497 (496,495)>: 1, <OptBooleanCircuit:AND#498 (465,392)>: 0, <OptBooleanCircuit:XOR#499 (498,495)>: 1, <OptBooleanCircuit:AND#500 (473,398)>: 0, <OptBooleanCircuit:AND#501 (468,391)>: 0, <OptBooleanCircuit:XOR#502 (501,500)>: 0, <OptBooleanCircuit:AND#503 (470,390)>: 0, <OptBooleanCircuit:XOR#504 (503,500)>: 0, <OptBooleanCircuit:AND#505 (471,394)>: 1, <OptBooleanCircuit:AND#506 (475,400)>: 0, <OptBooleanCircuit:XOR#507 (506,505)>: 1, <OptBooleanCircuit:AND#508 (472,395)>: 0, <OptBooleanCircuit:XOR#509 (508,505)>: 1, <OptBooleanCircuit:XOR#510 (504,509)>: 1, <OptBooleanCircuit:XOR#511 (502,507)>: 1, <OptBooleanCircuit:XOR#512 (499,509)>: 0, <OptBooleanCircuit:XOR#513 (497,507)>: 0, <OptBooleanCircuit:XOR#514 (494,513)>: 0, <OptBooleanCircuit:XOR#515 (493,491)>: 1, <OptBooleanCircuit:XOR#516 (493,510)>: 1, <OptBooleanCircuit:NOT#517 (513)>: 1, <OptBooleanCircuit:XOR#518 (492,517)>: 0, <OptBooleanCircuit:NOT#519 (514)>: 1, <OptBooleanCircuit:XOR#520 (492,519)>: 0, <OptBooleanCircuit:NOT#521 (511)>: 0, <OptBooleanCircuit:XOR#522 (492,521)>: 1, <OptBooleanCircuit:NOT#523 (522)>: 0, <OptBooleanCircuit:XOR#524 (491,523)>: 1, <OptBooleanCircuit:XOR#525 (512,518)>: 0, <OptBooleanCircuit:XOR#526 (511,515)>: 0, <OptBooleanCircuit:XOR#528 (515,520)>: 1, <OptBooleanCircuit:XOR#529 (516,525)>: 1, <OptBooleanCircuit:NOT#535 (524)>: 0, <OptBooleanCircuit:NOT#538 (526)>: 1, <OptBooleanCircuit:NOT#539 (529)>: 0, <OptBooleanCircuit:NOT#540 (528)>: 0, <OptBooleanCircuit:NOT#541 (520)>: 1, <OptBooleanCircuit:NOT#542 (516)>: 0, <OptBooleanCircuit:NOT#543 (518)>: 1, <OptBooleanCircuit:XOR#544 (64,66)>: 1, <OptBooleanCircuit:NOT#545 (67)>: 0, <OptBooleanCircuit:XOR#546 (64,545)>: 0, <OptBooleanCircuit:XOR#547 (137,138)>: 0, <OptBooleanCircuit:NOT#548 (547)>: 1, <OptBooleanCircuit:XOR#549 (66,548)>: 0, <OptBooleanCircuit:XOR#550 (67,549)>: 1, <OptBooleanCircuit:XOR#551 (68,138)>: 0, <OptBooleanCircuit:XOR#552 (69,544)>: 1, <OptBooleanCircuit:XOR#553 (70,547)>: 0, <OptBooleanCircuit:XOR#554 (68,553)>: 1, <OptBooleanCircuit:NOT#555 (553)>: 1, <OptBooleanCircuit:XOR#556 (552,555)>: 0, <OptBooleanCircuit:XOR#557 (70,549)>: 0, <OptBooleanCircuit:XOR#558 (544,548)>: 0, <OptBooleanCircuit:XOR#559 (70,546)>: 0, <OptBooleanCircuit:XOR#560 (559,551)>: 0, <OptBooleanCircuit:NOT#561 (554)>: 0, <OptBooleanCircuit:XOR#562 (69,561)>: 0, <OptBooleanCircuit:NOT#569 (562)>: 1, <OptBooleanCircuit:NOT#570 (549)>: 1, <OptBooleanCircuit:NOT#571 (560)>: 1, <OptBooleanCircuit:NOT#572 (558)>: 1, <OptBooleanCircuit:NOT#573 (557)>: 1, <OptBooleanCircuit:NOT#574 (550)>: 0, <OptBooleanCircuit:NOT#575 (556)>: 1, <OptBooleanCircuit:XOR#576 (574,572)>: 1, <OptBooleanCircuit:XOR#577 (575,573)>: 0, <OptBooleanCircuit:XOR#578 (138,569)>: 0, <OptBooleanCircuit:XOR#579 (571,570)>: 0, <OptBooleanCircuit:XOR#580 (573,572)>: 0, <OptBooleanCircuit:XOR#581 (575,574)>: 1, <OptBooleanCircuit:XOR#582 (577,576)>: 1, <OptBooleanCircuit:XOR#583 (570,569)>: 0, <OptBooleanCircuit:XOR#584 (571,138)>: 0, <OptBooleanCircuit:XOR#585 (579,578)>: 0, <OptBooleanCircuit:AND#586 (581,584)>: 0, <OptBooleanCircuit:AND#587 (576,578)>: 0, <OptBooleanCircuit:AND#588 (582,585)>: 0, <OptBooleanCircuit:AND#589 (558,562)>: 0, <OptBooleanCircuit:AND#590 (580,583)>: 0, <OptBooleanCircuit:XOR#591 (589,590)>: 0, <OptBooleanCircuit:AND#592 (577,579)>: 0, <OptBooleanCircuit:XOR#593 (591,592)>: 0, <OptBooleanCircuit:NOT#594 (587)>: 1, <OptBooleanCircuit:XOR#595 (593,594)>: 1, <OptBooleanCircuit:NOT#596 (580)>: 1, <OptBooleanCircuit:NOT#597 (583)>: 1, <OptBooleanCircuit:AND#598 (596,597)>: 1, <OptBooleanCircuit:AND#599 (573,570)>: 1, <OptBooleanCircuit:NOT#600 (599)>: 0, <OptBooleanCircuit:XOR#601 (598,600)>: 1, <OptBooleanCircuit:XOR#602 (601,587)>: 1, <OptBooleanCircuit:XOR#603 (602,588)>: 1, <OptBooleanCircuit:NOT#604 (577)>: 1, <OptBooleanCircuit:NOT#605 (579)>: 1, <OptBooleanCircuit:AND#606 (604,605)>: 1, <OptBooleanCircuit:AND#607 (574,138)>: 0, <OptBooleanCircuit:NOT#608 (607)>: 1, <OptBooleanCircuit:XOR#609 (606,608)>: 0, <OptBooleanCircuit:XOR#610 (609,586)>: 0, <OptBooleanCircuit:XOR#611 (610,587)>: 0, <OptBooleanCircuit:NOT#612 (576)>: 0, <OptBooleanCircuit:NOT#613 (578)>: 1, <OptBooleanCircuit:AND#614 (612,613)>: 0, <OptBooleanCircuit:AND#615 (575,571)>: 1, <OptBooleanCircuit:NOT#616 (615)>: 0, <OptBooleanCircuit:XOR#617 (614,616)>: 0, <OptBooleanCircuit:XOR#618 (617,586)>: 0, <OptBooleanCircuit:XOR#619 (618,588)>: 0, <OptBooleanCircuit:XOR#620 (619,611)>: 0, <OptBooleanCircuit:XOR#621 (603,595)>: 0, <OptBooleanCircuit:AND#622 (620,621)>: 0, <OptBooleanCircuit:AND#623 (619,603)>: 0, <OptBooleanCircuit:XOR#624 (623,622)>: 0, <OptBooleanCircuit:AND#625 (611,595)>: 0, <OptBooleanCircuit:XOR#626 (625,622)>: 0, <OptBooleanCircuit:XOR#627 (611,595)>: 1, <OptBooleanCircuit:XOR#628 (619,603)>: 1, <OptBooleanCircuit:XOR#629 (627,628)>: 0, <OptBooleanCircuit:XOR#630 (626,629)>: 0, <OptBooleanCircuit:XOR#631 (624,628)>: 1, <OptBooleanCircuit:XOR#642 (630,631)>: 1, <OptBooleanCircuit:AND#643 (642,621)>: 0, <OptBooleanCircuit:AND#644 (630,603)>: 0, <OptBooleanCircuit:XOR#645 (644,643)>: 0, <OptBooleanCircuit:AND#646 (631,595)>: 1, <OptBooleanCircuit:XOR#647 (646,643)>: 1, <OptBooleanCircuit:AND#648 (642,620)>: 0, <OptBooleanCircuit:AND#649 (630,619)>: 0, <OptBooleanCircuit:XOR#650 (649,648)>: 0, <OptBooleanCircuit:AND#651 (631,611)>: 0, <OptBooleanCircuit:XOR#652 (651,648)>: 0, <OptBooleanCircuit:XOR#653 (647,652)>: 1, <OptBooleanCircuit:XOR#654 (645,650)>: 0, <OptBooleanCircuit:XOR#655 (650,652)>: 0, <OptBooleanCircuit:XOR#656 (645,647)>: 1, <OptBooleanCircuit:XOR#657 (654,653)>: 1, <OptBooleanCircuit:AND#658 (656,584)>: 0, <OptBooleanCircuit:AND#659 (645,571)>: 0, <OptBooleanCircuit:XOR#660 (659,658)>: 0, <OptBooleanCircuit:AND#661 (647,138)>: 1, <OptBooleanCircuit:XOR#662 (661,658)>: 1, <OptBooleanCircuit:AND#663 (655,583)>: 0, <OptBooleanCircuit:AND#664 (650,570)>: 0, <OptBooleanCircuit:XOR#665 (664,663)>: 0, <OptBooleanCircuit:AND#666 (652,569)>: 0, <OptBooleanCircuit:XOR#667 (666,663)>: 0, <OptBooleanCircuit:AND#668 (653,578)>: 0, <OptBooleanCircuit:AND#669 (657,585)>: 0, <OptBooleanCircuit:XOR#670 (669,668)>: 0, <OptBooleanCircuit:AND#671 (654,579)>: 0, <OptBooleanCircuit:XOR#672 (671,668)>: 0, <OptBooleanCircuit:XOR#673 (667,672)>: 0, <OptBooleanCircuit:XOR#674 (665,670)>: 0, <OptBooleanCircuit:XOR#675 (662,672)>: 1, <OptBooleanCircuit:XOR#676 (660,670)>: 0, <OptBooleanCircuit:AND#677 (656,581)>: 1, <OptBooleanCircuit:AND#678 (645,575)>: 0, <OptBooleanCircuit:XOR#679 (678,677)>: 1, <OptBooleanCircuit:AND#680 (647,574)>: 0, <OptBooleanCircuit:XOR#681 (680,677)>: 1, <OptBooleanCircuit:AND#682 (655,580)>: 0, <OptBooleanCircuit:AND#683 (650,573)>: 0, <OptBooleanCircuit:XOR#684 (683,682)>: 0, <OptBooleanCircuit:AND#685 (652,572)>: 0, <OptBooleanCircuit:XOR#686 (685,682)>: 0, <OptBooleanCircuit:AND#687 (653,576)>: 1, <OptBooleanCircuit:AND#688 (657,582)>: 1, <OptBooleanCircuit:XOR#689 (688,687)>: 0, <OptBooleanCircuit:AND#690 (654,577)>: 0, <OptBooleanCircuit:XOR#691 (690,687)>: 1, <OptBooleanCircuit:XOR#692 (686,691)>: 1, <OptBooleanCircuit:XOR#693 (684,689)>: 0, <OptBooleanCircuit:XOR#694 (681,691)>: 0, <OptBooleanCircuit:XOR#695 (679,689)>: 1, <OptBooleanCircuit:XOR#696 (676,695)>: 1, <OptBooleanCircuit:XOR#697 (675,673)>: 1, <OptBooleanCircuit:XOR#698 (675,692)>: 0, <OptBooleanCircuit:NOT#699 (695)>: 0, <OptBooleanCircuit:XOR#700 (674,699)>: 0, <OptBooleanCircuit:NOT#701 (696)>: 0, <OptBooleanCircuit:XOR#702 (674,701)>: 0, <OptBooleanCircuit:NOT#703 (693)>: 1, <OptBooleanCircuit:XOR#704 (674,703)>: 1, <OptBooleanCircuit:NOT#705 (704)>: 0, <OptBooleanCircuit:XOR#706 (673,705)>: 0, <OptBooleanCircuit:XOR#707 (694,700)>: 0, <OptBooleanCircuit:XOR#708 (693,697)>: 1, <OptBooleanCircuit:XOR#710 (697,702)>: 1, <OptBooleanCircuit:XOR#711 (698,707)>: 0, <OptBooleanCircuit:NOT#717 (706)>: 1, <OptBooleanCircuit:NOT#720 (708)>: 0, <OptBooleanCircuit:NOT#721 (711)>: 1, <OptBooleanCircuit:NOT#722 (710)>: 0, <OptBooleanCircuit:NOT#723 (702)>: 1, <OptBooleanCircuit:NOT#724 (698)>: 1, <OptBooleanCircuit:NOT#725 (700)>: 1, <OptBooleanCircuit:XOR#726 (96,98)>: 1, <OptBooleanCircuit:NOT#727 (99)>: 1, <OptBooleanCircuit:XOR#728 (96,727)>: 1, <OptBooleanCircuit:XOR#729 (139,141)>: 0, <OptBooleanCircuit:NOT#730 (729)>: 1, <OptBooleanCircuit:XOR#731 (98,730)>: 0, <OptBooleanCircuit:XOR#732 (99,731)>: 0, <OptBooleanCircuit:XOR#733 (100,141)>: 0, <OptBooleanCircuit:XOR#734 (140,726)>: 0, <OptBooleanCircuit:XOR#735 (102,729)>: 1, <OptBooleanCircuit:XOR#736 (100,735)>: 1, <OptBooleanCircuit:NOT#737 (735)>: 0, <OptBooleanCircuit:XOR#738 (734,737)>: 0, <OptBooleanCircuit:XOR#739 (102,731)>: 1, <OptBooleanCircuit:XOR#740 (726,730)>: 0, <OptBooleanCircuit:XOR#741 (102,728)>: 0, <OptBooleanCircuit:XOR#742 (741,733)>: 0, <OptBooleanCircuit:NOT#743 (736)>: 0, <OptBooleanCircuit:XOR#744 (140,743)>: 1, <OptBooleanCircuit:NOT#751 (744)>: 0, <OptBooleanCircuit:NOT#752 (731)>: 1, <OptBooleanCircuit:NOT#753 (742)>: 1, <OptBooleanCircuit:NOT#754 (740)>: 1, <OptBooleanCircuit:NOT#755 (739)>: 0, <OptBooleanCircuit:NOT#756 (732)>: 1, <OptBooleanCircuit:NOT#757 (738)>: 1, <OptBooleanCircuit:XOR#758 (756,754)>: 0, <OptBooleanCircuit:XOR#759 (757,755)>: 1, <OptBooleanCircuit:XOR#760 (141,751)>: 0, <OptBooleanCircuit:XOR#761 (753,752)>: 0, <OptBooleanCircuit:XOR#762 (755,754)>: 1, <OptBooleanCircuit:XOR#763 (757,756)>: 0, <OptBooleanCircuit:XOR#764 (759,758)>: 1, <OptBooleanCircuit:XOR#765 (752,751)>: 1, <OptBooleanCircuit:XOR#766 (753,141)>: 1, <OptBooleanCircuit:XOR#767 (761,760)>: 0, <OptBooleanCircuit:AND#768 (763,766)>: 0, <OptBooleanCircuit:AND#769 (758,760)>: 0, <OptBooleanCircuit:AND#770 (764,767)>: 0, <OptBooleanCircuit:AND#771 (740,744)>: 0, <OptBooleanCircuit:AND#772 (762,765)>: 1, <OptBooleanCircuit:XOR#773 (771,772)>: 1, <OptBooleanCircuit:AND#774 (759,761)>: 0, <OptBooleanCircuit:XOR#775 (773,774)>: 1, <OptBooleanCircuit:NOT#776 (769)>: 1, <OptBooleanCircuit:XOR#777 (775,776)>: 0, <OptBooleanCircuit:NOT#778 (762)>: 0, <OptBooleanCircuit:NOT#779 (765)>: 0, <OptBooleanCircuit:AND#780 (778,779)>: 0, <OptBooleanCircuit:AND#781 (755,752)>: 0, <OptBooleanCircuit:NOT#782 (781)>: 1, <OptBooleanCircuit:XOR#783 (780,782)>: 1, <OptBooleanCircuit:XOR#784 (783,769)>: 1, <OptBooleanCircuit:XOR#785 (784,770)>: 1, <OptBooleanCircuit:NOT#786 (759)>: 0, <OptBooleanCircuit:NOT#787 (761)>: 1, <OptBooleanCircuit:AND#788 (786,787)>: 0, <OptBooleanCircuit:AND#789 (756,141)>: 0, <OptBooleanCircuit:NOT#790 (789)>: 1, <OptBooleanCircuit:XOR#791 (788,790)>: 1, <OptBooleanCircuit:XOR#792 (791,768)>: 1, <OptBooleanCircuit:XOR#793 (792,769)>: 1, <OptBooleanCircuit:NOT#794 (758)>: 1, <OptBooleanCircuit:NOT#795 (760)>: 1, <OptBooleanCircuit:AND#796 (794,795)>: 1, <OptBooleanCircuit:AND#797 (757,753)>: 1, <OptBooleanCircuit:NOT#798 (797)>: 0, <OptBooleanCircuit:XOR#799 (796,798)>: 1, <OptBooleanCircuit:XOR#800 (799,768)>: 1, <OptBooleanCircuit:XOR#801 (800,770)>: 1, <OptBooleanCircuit:XOR#802 (801,793)>: 0, <OptBooleanCircuit:XOR#803 (785,777)>: 1, <OptBooleanCircuit:AND#804 (802,803)>: 0, <OptBooleanCircuit:AND#805 (801,785)>: 1, <OptBooleanCircuit:XOR#806 (805,804)>: 1, <OptBooleanCircuit:AND#807 (793,777)>: 0, <OptBooleanCircuit:XOR#808 (807,804)>: 0, <OptBooleanCircuit:XOR#809 (793,777)>: 1, <OptBooleanCircuit:XOR#810 (801,785)>: 0, <OptBooleanCircuit:XOR#811 (809,810)>: 1, <OptBooleanCircuit:XOR#812 (808,811)>: 1, <OptBooleanCircuit:XOR#813 (806,810)>: 1, <OptBooleanCircuit:XOR#824 (812,813)>: 0, <OptBooleanCircuit:AND#825 (824,803)>: 0, <OptBooleanCircuit:AND#826 (812,785)>: 1, <OptBooleanCircuit:XOR#827 (826,825)>: 1, <OptBooleanCircuit:AND#828 (813,777)>: 0, <OptBooleanCircuit:XOR#829 (828,825)>: 0, <OptBooleanCircuit:AND#830 (824,802)>: 0, <OptBooleanCircuit:AND#831 (812,801)>: 1, <OptBooleanCircuit:XOR#832 (831,830)>: 1, <OptBooleanCircuit:AND#833 (813,793)>: 1, <OptBooleanCircuit:XOR#834 (833,830)>: 1, <OptBooleanCircuit:XOR#835 (829,834)>: 1, <OptBooleanCircuit:XOR#836 (827,832)>: 0, <OptBooleanCircuit:XOR#837 (832,834)>: 0, <OptBooleanCircuit:XOR#838 (827,829)>: 1, <OptBooleanCircuit:XOR#839 (836,835)>: 1, <OptBooleanCircuit:AND#840 (838,766)>: 1, <OptBooleanCircuit:AND#841 (827,753)>: 1, <OptBooleanCircuit:XOR#842 (841,840)>: 0, <OptBooleanCircuit:AND#843 (829,141)>: 0, <OptBooleanCircuit:XOR#844 (843,840)>: 1, <OptBooleanCircuit:AND#845 (837,765)>: 0, <OptBooleanCircuit:AND#846 (832,752)>: 1, <OptBooleanCircuit:XOR#847 (846,845)>: 1, <OptBooleanCircuit:AND#848 (834,751)>: 0, <OptBooleanCircuit:XOR#849 (848,845)>: 0, <OptBooleanCircuit:AND#850 (835,760)>: 0, <OptBooleanCircuit:AND#851 (839,767)>: 0, <OptBooleanCircuit:XOR#852 (851,850)>: 0, <OptBooleanCircuit:AND#853 (836,761)>: 0, <OptBooleanCircuit:XOR#854 (853,850)>: 0, <OptBooleanCircuit:XOR#855 (849,854)>: 0, <OptBooleanCircuit:XOR#856 (847,852)>: 1, <OptBooleanCircuit:XOR#857 (844,854)>: 1, <OptBooleanCircuit:XOR#858 (842,852)>: 0, <OptBooleanCircuit:AND#859 (838,763)>: 0, <OptBooleanCircuit:AND#860 (827,757)>: 1, <OptBooleanCircuit:XOR#861 (860,859)>: 1, <OptBooleanCircuit:AND#862 (829,756)>: 0, <OptBooleanCircuit:XOR#863 (862,859)>: 0, <OptBooleanCircuit:AND#864 (837,762)>: 0, <OptBooleanCircuit:AND#865 (832,755)>: 0, <OptBooleanCircuit:XOR#866 (865,864)>: 0, <OptBooleanCircuit:AND#867 (834,754)>: 1, <OptBooleanCircuit:XOR#868 (867,864)>: 1, <OptBooleanCircuit:AND#869 (835,758)>: 0, <OptBooleanCircuit:AND#870 (839,764)>: 1, <OptBooleanCircuit:XOR#871 (870,869)>: 1, <OptBooleanCircuit:AND#872 (836,759)>: 0, <OptBooleanCircuit:XOR#873 (872,869)>: 0, <OptBooleanCircuit:XOR#874 (868,873)>: 1, <OptBooleanCircuit:XOR#875 (866,871)>: 1, <OptBooleanCircuit:XOR#876 (863,873)>: 0, <OptBooleanCircuit:XOR#877 (861,871)>: 0, <OptBooleanCircuit:XOR#878 (858,877)>: 0, <OptBooleanCircuit:XOR#879 (857,855)>: 1, <OptBooleanCircuit:XOR#880 (857,874)>: 0, <OptBooleanCircuit:NOT#881 (877)>: 1, <OptBooleanCircuit:XOR#882 (856,881)>: 0, <OptBooleanCircuit:NOT#883 (878)>: 1, <OptBooleanCircuit:XOR#884 (856,883)>: 0, <OptBooleanCircuit:NOT#885 (875)>: 0, <OptBooleanCircuit:XOR#886 (856,885)>: 1, <OptBooleanCircuit:NOT#887 (886)>: 0, <OptBooleanCircuit:XOR#888 (855,887)>: 0, <OptBooleanCircuit:XOR#889 (876,882)>: 0, <OptBooleanCircuit:XOR#890 (875,879)>: 0, <OptBooleanCircuit:XOR#892 (879,884)>: 1, <OptBooleanCircuit:XOR#893 (880,889)>: 0, <OptBooleanCircuit:NOT#899 (888)>: 1, <OptBooleanCircuit:NOT#902 (890)>: 1, <OptBooleanCircuit:NOT#903 (893)>: 1, <OptBooleanCircuit:NOT#904 (892)>: 0, <OptBooleanCircuit:NOT#905 (884)>: 1, <OptBooleanCircuit:NOT#906 (880)>: 1, <OptBooleanCircuit:NOT#907 (882)>: 1, <OptBooleanCircuit:XOR#908 (8,143)>: 0, <OptBooleanCircuit:NOT#909 (11)>: 0, <OptBooleanCircuit:XOR#910 (8,909)>: 0, <OptBooleanCircuit:XOR#911 (142,15)>: 0, <OptBooleanCircuit:NOT#912 (911)>: 1, <OptBooleanCircuit:XOR#913 (143,912)>: 1, <OptBooleanCircuit:XOR#914 (11,913)>: 0, <OptBooleanCircuit:XOR#915 (12,15)>: 1, <OptBooleanCircuit:XOR#916 (13,908)>: 0, <OptBooleanCircuit:XOR#917 (144,911)>: 1, <OptBooleanCircuit:XOR#918 (12,917)>: 1, <OptBooleanCircuit:NOT#919 (917)>: 0, <OptBooleanCircuit:XOR#920 (916,919)>: 0, <OptBooleanCircuit:XOR#921 (144,913)>: 0, <OptBooleanCircuit:XOR#922 (908,912)>: 1, <OptBooleanCircuit:XOR#923 (144,910)>: 1, <OptBooleanCircuit:XOR#924 (923,915)>: 0, <OptBooleanCircuit:NOT#926 (918)>: 0, <OptBooleanCircuit:XOR#927 (13,926)>: 0, <OptBooleanCircuit:NOT#934 (927)>: 1, <OptBooleanCircuit:NOT#935 (913)>: 0, <OptBooleanCircuit:NOT#936 (924)>: 1, <OptBooleanCircuit:NOT#937 (922)>: 0, <OptBooleanCircuit:NOT#938 (921)>: 1, <OptBooleanCircuit:NOT#939 (914)>: 1, <OptBooleanCircuit:NOT#940 (920)>: 1, <OptBooleanCircuit:XOR#941 (939,937)>: 1, <OptBooleanCircuit:XOR#942 (940,938)>: 0, <OptBooleanCircuit:XOR#943 (15,934)>: 0, <OptBooleanCircuit:XOR#944 (936,935)>: 1, <OptBooleanCircuit:XOR#945 (938,937)>: 1, <OptBooleanCircuit:XOR#946 (940,939)>: 0, <OptBooleanCircuit:XOR#947 (942,941)>: 1, <OptBooleanCircuit:XOR#948 (935,934)>: 1, <OptBooleanCircuit:XOR#949 (936,15)>: 0, <OptBooleanCircuit:XOR#950 (944,943)>: 1, <OptBooleanCircuit:AND#951 (946,949)>: 0, <OptBooleanCircuit:AND#952 (941,943)>: 0, <OptBooleanCircuit:AND#953 (947,950)>: 1, <OptBooleanCircuit:AND#954 (922,927)>: 0, <OptBooleanCircuit:AND#955 (945,948)>: 1, <OptBooleanCircuit:XOR#956 (954,955)>: 1, <OptBooleanCircuit:AND#957 (942,944)>: 0, <OptBooleanCircuit:XOR#958 (956,957)>: 1, <OptBooleanCircuit:NOT#959 (952)>: 1, <OptBooleanCircuit:XOR#960 (958,959)>: 0, <OptBooleanCircuit:NOT#961 (945)>: 0, <OptBooleanCircuit:NOT#962 (948)>: 0, <OptBooleanCircuit:AND#963 (961,962)>: 0, <OptBooleanCircuit:AND#964 (938,935)>: 0, <OptBooleanCircuit:NOT#965 (964)>: 1, <OptBooleanCircuit:XOR#966 (963,965)>: 1, <OptBooleanCircuit:XOR#967 (966,952)>: 1, <OptBooleanCircuit:XOR#968 (967,953)>: 0, <OptBooleanCircuit:NOT#969 (942)>: 1, <OptBooleanCircuit:NOT#970 (944)>: 0, <OptBooleanCircuit:AND#971 (969,970)>: 0, <OptBooleanCircuit:AND#972 (939,15)>: 1, <OptBooleanCircuit:NOT#973 (972)>: 0, <OptBooleanCircuit:XOR#974 (971,973)>: 0, <OptBooleanCircuit:XOR#975 (974,951)>: 0, <OptBooleanCircuit:XOR#976 (975,952)>: 0, <OptBooleanCircuit:NOT#977 (941)>: 0, <OptBooleanCircuit:NOT#978 (943)>: 1, <OptBooleanCircuit:AND#979 (977,978)>: 0, <OptBooleanCircuit:AND#980 (940,936)>: 1, <OptBooleanCircuit:NOT#981 (980)>: 0, <OptBooleanCircuit:XOR#982 (979,981)>: 0, <OptBooleanCircuit:XOR#983 (982,951)>: 0, <OptBooleanCircuit:XOR#984 (983,953)>: 1, <OptBooleanCircuit:XOR#985 (984,976)>: 1, <OptBooleanCircuit:XOR#986 (968,960)>: 0, <OptBooleanCircuit:AND#987 (985,986)>: 0, <OptBooleanCircuit:AND#988 (984,968)>: 0, <OptBooleanCircuit:XOR#989 (988,987)>: 0, <OptBooleanCircuit:AND#990 (976,960)>: 0, <OptBooleanCircuit:XOR#991 (990,987)>: 0, <OptBooleanCircuit:XOR#992 (976,960)>: 0, <OptBooleanCircuit:XOR#993 (984,968)>: 1, <OptBooleanCircuit:XOR#994 (992,993)>: 1, <OptBooleanCircuit:XOR#995 (991,994)>: 1, <OptBooleanCircuit:XOR#996 (989,993)>: 1, <OptBooleanCircuit:XOR#1007 (995,996)>: 0, <OptBooleanCircuit:AND#1008 (1007,986)>: 0, <OptBooleanCircuit:AND#1009 (995,968)>: 0, <OptBooleanCircuit:XOR#1010 (1009,1008)>: 0, <OptBooleanCircuit:AND#1011 (996,960)>: 0, <OptBooleanCircuit:XOR#1012 (1011,1008)>: 0, <OptBooleanCircuit:AND#1013 (1007,985)>: 0, <OptBooleanCircuit:AND#1014 (995,984)>: 1, <OptBooleanCircuit:XOR#1015 (1014,1013)>: 1, <OptBooleanCircuit:AND#1016 (996,976)>: 0, <OptBooleanCircuit:XOR#1017 (1016,1013)>: 0, <OptBooleanCircuit:XOR#1018 (1012,1017)>: 0, <OptBooleanCircuit:XOR#1019 (1010,1015)>: 1, <OptBooleanCircuit:XOR#1020 (1015,1017)>: 1, <OptBooleanCircuit:XOR#1021 (1010,1012)>: 0, <OptBooleanCircuit:XOR#1022 (1019,1018)>: 1, <OptBooleanCircuit:AND#1023 (1021,949)>: 0, <OptBooleanCircuit:AND#1024 (1010,936)>: 0, <OptBooleanCircuit:XOR#1025 (1024,1023)>: 0, <OptBooleanCircuit:AND#1026 (1012,15)>: 0, <OptBooleanCircuit:XOR#1027 (1026,1023)>: 0, <OptBooleanCircuit:AND#1028 (1020,948)>: 1, <OptBooleanCircuit:AND#1029 (1015,935)>: 0, <OptBooleanCircuit:XOR#1030 (1029,1028)>: 1, <OptBooleanCircuit:AND#1031 (1017,934)>: 0, <OptBooleanCircuit:XOR#1032 (1031,1028)>: 1, <OptBooleanCircuit:AND#1033 (1018,943)>: 0, <OptBooleanCircuit:AND#1034 (1022,950)>: 1, <OptBooleanCircuit:XOR#1035 (1034,1033)>: 1, <OptBooleanCircuit:AND#1036 (1019,944)>: 1, <OptBooleanCircuit:XOR#1037 (1036,1033)>: 1, <OptBooleanCircuit:XOR#1038 (1032,1037)>: 0, <OptBooleanCircuit:XOR#1039 (1030,1035)>: 0, <OptBooleanCircuit:XOR#1040 (1027,1037)>: 1, <OptBooleanCircuit:XOR#1041 (1025,1035)>: 1, <OptBooleanCircuit:AND#1042 (1021,946)>: 0, <OptBooleanCircuit:AND#1043 (1010,940)>: 0, <OptBooleanCircuit:XOR#1044 (1043,1042)>: 0, <OptBooleanCircuit:AND#1045 (1012,939)>: 0, <OptBooleanCircuit:XOR#1046 (1045,1042)>: 0, <OptBooleanCircuit:AND#1047 (1020,945)>: 1, <OptBooleanCircuit:AND#1048 (1015,938)>: 1, <OptBooleanCircuit:XOR#1049 (1048,1047)>: 0, <OptBooleanCircuit:AND#1050 (1017,937)>: 0, <OptBooleanCircuit:XOR#1051 (1050,1047)>: 1, <OptBooleanCircuit:AND#1052 (1018,941)>: 0, <OptBooleanCircuit:AND#1053 (1022,947)>: 1, <OptBooleanCircuit:XOR#1054 (1053,1052)>: 1, <OptBooleanCircuit:AND#1055 (1019,942)>: 0, <OptBooleanCircuit:XOR#1056 (1055,1052)>: 0, <OptBooleanCircuit:XOR#1057 (1051,1056)>: 1, <OptBooleanCircuit:XOR#1058 (1049,1054)>: 1, <OptBooleanCircuit:XOR#1059 (1046,1056)>: 0, <OptBooleanCircuit:XOR#1060 (1044,1054)>: 1, <OptBooleanCircuit:XOR#1061 (1041,1060)>: 0, <OptBooleanCircuit:XOR#1062 (1040,1038)>: 1, <OptBooleanCircuit:XOR#1063 (1040,1057)>: 0, <OptBooleanCircuit:NOT#1064 (1060)>: 0, <OptBooleanCircuit:XOR#1065 (1039,1064)>: 0, <OptBooleanCircuit:NOT#1066 (1061)>: 1, <OptBooleanCircuit:XOR#1067 (1039,1066)>: 1, <OptBooleanCircuit:NOT#1068 (1058)>: 0, <OptBooleanCircuit:XOR#1069 (1039,1068)>: 0, <OptBooleanCircuit:NOT#1070 (1069)>: 1, <OptBooleanCircuit:XOR#1071 (1038,1070)>: 1, <OptBooleanCircuit:XOR#1072 (1059,1065)>: 0, <OptBooleanCircuit:XOR#1073 (1058,1062)>: 0, <OptBooleanCircuit:XOR#1075 (1062,1067)>: 0, <OptBooleanCircuit:XOR#1076 (1063,1072)>: 0, <OptBooleanCircuit:NOT#1082 (1071)>: 0, <OptBooleanCircuit:NOT#1085 (1073)>: 1, <OptBooleanCircuit:NOT#1086 (1076)>: 1, <OptBooleanCircuit:NOT#1087 (1075)>: 1, <OptBooleanCircuit:NOT#1088 (1067)>: 0, <OptBooleanCircuit:NOT#1089 (1063)>: 1, <OptBooleanCircuit:NOT#1090 (1065)>: 1, <OptBooleanCircuit:XOR#1091 (40,146)>: 0, <OptBooleanCircuit:NOT#1092 (43)>: 0, <OptBooleanCircuit:XOR#1093 (40,1092)>: 0, <OptBooleanCircuit:XOR#1094 (145,47)>: 0, <OptBooleanCircuit:NOT#1095 (1094)>: 1, <OptBooleanCircuit:XOR#1096 (146,1095)>: 1, <OptBooleanCircuit:XOR#1097 (43,1096)>: 0, <OptBooleanCircuit:XOR#1098 (44,47)>: 1, <OptBooleanCircuit:XOR#1099 (147,1091)>: 0, <OptBooleanCircuit:XOR#1100 (148,1094)>: 1, <OptBooleanCircuit:XOR#1101 (44,1100)>: 1, <OptBooleanCircuit:NOT#1102 (1100)>: 0, <OptBooleanCircuit:XOR#1103 (1099,1102)>: 0, <OptBooleanCircuit:XOR#1104 (148,1096)>: 0, <OptBooleanCircuit:XOR#1105 (1091,1095)>: 1, <OptBooleanCircuit:XOR#1106 (148,1093)>: 1, <OptBooleanCircuit:XOR#1107 (1106,1098)>: 0, <OptBooleanCircuit:NOT#1109 (1101)>: 0, <OptBooleanCircuit:XOR#1110 (147,1109)>: 0, <OptBooleanCircuit:NOT#1117 (1110)>: 1, <OptBooleanCircuit:NOT#1118 (1096)>: 0, <OptBooleanCircuit:NOT#1119 (1107)>: 1, <OptBooleanCircuit:NOT#1120 (1105)>: 0, <OptBooleanCircuit:NOT#1121 (1104)>: 1, <OptBooleanCircuit:NOT#1122 (1097)>: 1, <OptBooleanCircuit:NOT#1123 (1103)>: 1, <OptBooleanCircuit:XOR#1124 (1122,1120)>: 1, <OptBooleanCircuit:XOR#1125 (1123,1121)>: 0, <OptBooleanCircuit:XOR#1126 (47,1117)>: 0, <OptBooleanCircuit:XOR#1127 (1119,1118)>: 1, <OptBooleanCircuit:XOR#1128 (1121,1120)>: 1, <OptBooleanCircuit:XOR#1129 (1123,1122)>: 0, ...}
To do fast recording, we serialize the circuit into an internal binary format, into a file:
from wbkit.serialize import RawSerializer
RawSerializer().serialize_to_file(C, "circuits/aes10_clear.bin")
Now, we can use a fast C-based circuit tracer provided by wbkit
:
from wbkit.fastcircuit import FastCircuit
plaintext = b"0123456789abcdef"
FC = FastCircuit("circuits/aes10_clear.bin")
ciphertext = FC.compute_one(plaintext, trace_filename="traces/test")
ciphertext.hex()
'54b03463c5b5a1d45efb4e91637ba51f'
The key feature is bit-sliced batch tracing: using 64-bit CPU registers we can trace 64 executions (inputs) of a Boolean circuit at once. This makes massive tracing much faster.
ciphertexts = FC.compute_batch(
[b"my_plaintext_abc", b"anotherPlaintext"] * 4,
trace_filename="traces/test2"
)
ciphertexts
[b'\xa4\x02\xbcLb\x16\xc9\xcf\x07!\xe2+\xd1\xfb\x177', b'>\xdbt\xc3\x8b\x93\xf4\xbf\xb2\x1dZ1\xb7S\x04\xc1', b'\xa4\x02\xbcLb\x16\xc9\xcf\x07!\xe2+\xd1\xfb\x177', b'>\xdbt\xc3\x8b\x93\xf4\xbf\xb2\x1dZ1\xb7S\x04\xc1', b'\xa4\x02\xbcLb\x16\xc9\xcf\x07!\xe2+\xd1\xfb\x177', b'>\xdbt\xc3\x8b\x93\xf4\xbf\xb2\x1dZ1\xb7S\x04\xc1', b'\xa4\x02\xbcLb\x16\xc9\xcf\x07!\xe2+\xd1\xfb\x177', b'>\xdbt\xc3\x8b\x93\xf4\xbf\xb2\x1dZ1\xb7S\x04\xc1']
with open("traces/test2", "rb") as f:
print(f.read(32).hex())
000000000055ff00ff0000550000aa0000aaff00ff00aaff00aa00000000ffaa
Since we serialized the circuit to a file, we can use the command-line tracing tool from wbkit
. It also splits the batches into single-trace files and manages random plaintexts/ciphertexts:
> time ../tools/trace.py circuits/aes10_clear.bin 256 traces/
Tracing circuits/aes10_clear.bin on 256 traces
Saving to traces//aes10_clear/
splitting 0
...
splitting 3
> ls -al traces/aes10_clear/ | tail -20
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0249.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0249.pt
-rw-rw-r-- 1 user user 3894 Sep 14 13:21 0250.bin
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0250.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0250.pt
-rw-rw-r-- 1 user user 3894 Sep 14 13:21 0251.bin
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0251.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0251.pt
-rw-rw-r-- 1 user user 3894 Sep 14 13:21 0252.bin
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0252.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0252.pt
-rw-rw-r-- 1 user user 3894 Sep 14 13:21 0253.bin
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0253.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0253.pt
-rw-rw-r-- 1 user user 3894 Sep 14 13:21 0254.bin
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0254.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0254.pt
-rw-rw-r-- 1 user user 3894 Sep 14 13:21 0255.bin
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0255.ct
-rw-rw-r-- 1 user user 16 Sep 14 13:21 0255.pt
Create 256 traces for each of the following circuits (serialized in Tutorial 2):
circuits/aes2_clear.bin
circuits/aes2_isw2.bin
circuits/aes2_isw3.bin
circuits/aes2_minq.bin