A bit of refactoring and a start at calibration part of pairing
This commit is contained in:
parent
7368cd8d4f
commit
bf2a590813
14 changed files with 1548 additions and 1102 deletions
430
blobs.py
Normal file
430
blobs.py
Normal file
|
|
@ -0,0 +1,430 @@
|
|||
|
||||
from util import unhex
|
||||
|
||||
reset_blob=unhex('''
|
||||
06020000013920c0cdd8e7e68d6ef897ee686fbf657f83b9514341e1d3c0835a28c9cd1ccd0016644f74d
|
||||
d02a73b85d95f4d352417cee76ba0bca3ce474159c62ade3e10797715a13f15a292f5d57c6d46cf8f5ef6
|
||||
587a3c55244f2258ffd08b351dc14af0da36121ba0aa4f1147ffd0cccdc1d6dc1d5fa7adb9841ff79c753
|
||||
e2528dc27344be84a2655ab01039c74999b90a7f008f626791d68a76a57b07180129bad2c0a67daf6a3a5
|
||||
ebadd6a429fc087b1e68f1e6535290b7f94e9a9800330d866c5a67b4e974029164f8c6fca8d93c86211ac
|
||||
47d96fe386faf206f92f4afd32d3a90c4287377e8896aa9ae930543864539df833345d0a1869169d69100
|
||||
8510c91dc1a0ec138669c2efb812c7b9b7f201891cdebe9c80eb671ac8a854bdcb9990cc23950f9f1dda0
|
||||
d0119b8c5c2d8446310e8599efd248075bad6613ceb13f0310ceab6ad17b18c8a245c26363ba7a7f24f17
|
||||
972861c6a96e728d1be81a68d66418ee2dbdc00d240bde29c781069f93a06dff89ba4039b980d3c9c2a26
|
||||
a7f41a02a4b9f1c0e0f75f0a59c5c5003d2e90a209cd9f8bdf69414262e238dbe8e1bacf6c880f59843dd
|
||||
8111293e24e99c964538842dcb0b4a8cab6d227cbfe0647cea763496425152aed507b2228e79c8e9bcaaf
|
||||
6380c1d2e7f56c5563706cb5da5b238371ca4b2627ca00f9bc9d71cd73ccf02f02f42e856f9e8defa0195
|
||||
c8647cb1a0a63e6996a1b5906080851f1648cd061a585ddda05fc8f37a99a0dac92dfabbfade8f89157cf
|
||||
11d356782689838c358f4790480fd341c993ae4cc8a8c93cf11578c0571e0c3c8a4964286eac3fae27507
|
||||
d9fb2ee961953d86574e6e5f6d38cf2507a714adbc221867bd701bdffae0b27ce47ae8d06685e534342d1
|
||||
1aef07f2c998fffe8673c2806e8384738b8f4ba401d417cabe088ed2fa09c42e97af72f878753ffc50b87
|
||||
fd292662f421bc6cc8da131957c84f4ce4b69266065d35d3ab91362b13edac27231ea1b6485faa6644c64
|
||||
6747b86341b6d031f6a52b6ad855396b7b8cf9485f50365cdce203355bf2fceebfa59b266772ff2578bb5
|
||||
03f92ca35ca2bc046d63aeb4fbb0f477ef41c65d10c5cdcff5de10afa9e7bc08b026f0fa649629f259c5c
|
||||
2978d26dfc2cbf48f59616ada4bf2fc7a7219fc37d9f5026709e7b472b6f97f78d47e1c5a6af8e23aebb8
|
||||
a88f64f005abc93251aeb8561b0d855941b33ac608413405381fecd0154db93812843f15b8e5e118ba7a7
|
||||
cdc051ef203a7721b769abb3c17c704eb0acf6a2cde267776dfb1ff8d82ba2341d0346cd80cd4480767a3
|
||||
d0edb643c1d9045f24096bd1fc324c03efc0977736725b2770998ea920c19a1fa9add474714a5b7a2a318
|
||||
7e94cf1a3492814ad145a7b204e0b3d35dc4cab2424a891f76160ba722a25bf9906bb3a476250b756249c
|
||||
aed3c4d52c4046012da280ec71898e8e393559979a74432f1df2692616c761c676a0260c7e4042bba7387
|
||||
d3c683d4e08454c7f509b7960a1db2a1cf007538a38a1e39b0a0310c9b77fbf21ab2b3f2e76f3ec9084c6
|
||||
f47f4fb2fc1dbcab40a9d1f6c8e404126193d26ed98270824611c4840087893b3204837e282bf29623080
|
||||
439336435e801de053cebb066bc7a440a3f34fafc2bb7252c5dd846af3404e93f1172ebe2b7861e09d58b
|
||||
cbee0400df8fe627adc42be2860a33d40748bab2f34262ee32409bced9cf8fea90bc32d247dc2787d7289
|
||||
65373063851a991c63c480b67cd301a9c312037c72ffc04120a09b1413756d4e5bb0bccb550c6cf76e2c6
|
||||
35c8498f4e653beee2fb683db0466280bbd297838a8d1f2459a58db77446020cd20b82a52ee5cbf0aa908
|
||||
14a199ae61dca69d0bc90986a2c26b8d65357e3925774a3876ed0eb80124a0bed4c2c0bc632e1b3c1a812
|
||||
2b54b023b05e846d78172b97424ff607b67c2c11f21ceadf82020129e62fb0918e85b623134f4e5e18870
|
||||
42b632662a3d33c6effa4a967e09a4d988dd084fde8c9d4b39dd0e6521b8e2d376807adbb5b86d914eca2
|
||||
38a349d9b0fb23b64668bdfd45f6a735523a31878e4975a42ebe2d3c920f550881818c8139cda34df3669
|
||||
b89aa5fc8b3bad460de2d76d431435c83b6fc0efbaaaa84818e990be36b72826f00f1f2b97d63b680d83d
|
||||
03f2ac5325f8dfc5d460abcbf27ed4ff205542702974eb9bfba456401786578efd93d69ec76a41df43798
|
||||
76891e39acdce7a32e94811157d48829f46b5755d9721d935c73a28423080bc8a48882b4439e92ac68413
|
||||
6a52b078e06a730596eacab8768d0784b0fca63f8a247f2523ea5d4679a8957af6b314594681759ede769
|
||||
76937c5f99c7fc9326579d90fe7a7fe0d512858e3221b50c4e1d9ff16f38d49c52a524ef895dab24059ac
|
||||
7a2b9dc24e59d8b38e4958d51fc309deecf987dd79697fe6ccf955e06bbd0ebe69aa18df39b452ff9ebe8
|
||||
f2f761c1be272141ebe65d0a625b5f1398ac2ae129ee5c1e520beeb492748f9364742978249470be45279
|
||||
11bd9aafbcbfa5e90a56ce40e42b995c82f6c5df51cfedc41a6963475e2d39641e2d7ac624d184aaec303
|
||||
465d4441b1b0acfccf9b45cc3e1825a01be94e93ee16918793a809cef222480377558ee18bc2801e31f24
|
||||
3d609ead015a0a6cec743f7dd0d951a7e0bf56d45ef20177373972602417024412c2adef44b881da42138
|
||||
5286c9e31fcf98b8f8ee10a9ee2730429579825ac159bdee29d1c4cdb9073427d0924174d04818b6586d2
|
||||
d2ac5318156b6139bec3b1959d0d1a8b46603f0ae9862214fff30c133d463cdabf875ef841e01976ad06c
|
||||
bf74c9987839e8a0e41b6a2411e542a061b23bf5b261df7a0cc844c510c102b4e03fbc44c44e998a51699
|
||||
907d252e91e3e89c0728f5db0b868ff2c55fc53d9230dd0dcd01086379a8821a0cb2b7dfb90b25a8c452f
|
||||
285185457827dea2f5b3cf1138e23e9a8d23ba1f2234d233c0c7f0595471e7e3a62d8fbb8a5fb900a3cf0
|
||||
3ee4943e4a4ba5b51200f02a6217ec29d7d5177ba395c77540b7111c5428ab069613c7e17094c5d798049
|
||||
3ce2d945393f3fc11765629597817499cf6585635a3db8d6471af509380224dc04b574891ebce80cb7ea4
|
||||
d0789ffd7b76637fd460ee701b60be9174eeb51f96c6811a4e4dc55ee545a9d9d23b80059084616521742
|
||||
d9b7a47d60b77dd0ed12f10327553448655ed7b7a9d7366854d908a4c762fe9048e4e4a3776f2e22f90de
|
||||
014643101de4715754efd62762500c6de90435fcde78e9fb864045cf8749b93907baeb4f47230547e78be
|
||||
a0e01d918426c3c7a3bdbbf2b54394c44273aaf163306450505862af4778f667d7c34a894c8824effe124
|
||||
b9993690d1519015566849652d86e158830465fd1fab08e4cf5cfff1f437ae0c713abe1b8e1fd15b1a796
|
||||
3751504ea02e4ff1469300a689d4ca4d796be229b4cc041296f9672bb2383442d492eaee0a17d174ac699
|
||||
4d2c1b1a117e54da2bef43347129d94bf4ea029271564f05fc3f607bac5e06e741ed5e9d51a2efafec05d
|
||||
7926c693bed05ee0bc81c1b6aa6d57f58b01aad2d69613c201e86312bdd2e8117eded970e298c096c52ae
|
||||
d21fd7f8aa03e3bf3d280fe3b3ca4e49dbfc90dbdfcae59ba03eb38458cd01f6637843526881b8df0b019
|
||||
e90e2b05bb4154dbac69e82ef4d8f83343fa2b0f10f71f1f0c314f41ca366c296fc41830ab1998829cf55
|
||||
01d8afa090b8803aa1ef94dc8a06c231ebb3e42cabaedc50fdc40832091307b4dc46398c890d71863522a
|
||||
927e1d90cb72d38afbc74ffe8813ab36a168822b5caf7550af92824061d076b5e1f628b6e4a36849c5182
|
||||
58905e734a2dd53258df37305a16c0b844dec711800a822dbf691327b7fac815cef33d59363d56c246d04
|
||||
e877ba09c4fc1aa70937d46adea4b1ba418695a7b86c0d9332b71d44b2dd8c88c93a8efc264b1c29820bb
|
||||
5b66b397136d9715961dbf7d5b59508015b2938edb1938e68f4e354eb7dd60b08b4460c05d1f291e56aca
|
||||
32bf30a59b1d849993750498df7be8101d38cb2781cb52a640dfd09ad469bdaa069eb37b7462343819ce2
|
||||
024bcdd1940f97eec044f7fe41793fda6edf53acc92d2883fdb144de0baa6fff19c59b3b5a673a6be202d
|
||||
8afb436fc6bcf3a5bce2ec9919a9d2f4aafcf2f83698d56fa43efa7b07fd1074b915344d6ce24ffdea58e
|
||||
b3afd95d911187b1070cf1c97a80ec5a5d609869e262b347f24b7e33404e6daa06c89d45db644cc6e29df
|
||||
41198bc8ef699415629b91b6ba52e5cccfc367654ba4fc0c7c6f40a2d9ce519c84a6315dc6e951f828b1f
|
||||
5d3a7c6e7e4a3271dc21c82329a163315a763c25710dbc33f9b79db33eeeaecfb8345d503fdb069160451
|
||||
67cd5451c5feb5358b07b085cb710f348150c92948aef7eca1bf4f51cb31b7429d28ad544cfd325691524
|
||||
ea5a13fb276967ff78719eae6c735d37d7206ba951cf115210ee0c3a0b07268c57a926a4ef8dbd8423190
|
||||
8d15ca9a2f1b519ee982a539eea6e874a6b04cbb65c62ceeb44d7ccf14791bdf5f056bae592830688f03a
|
||||
67d92a8b6b8ab6c40c651eb4e2366fb31434475068839466fff8e5279cbafa713b8d51dcf68001363dad4
|
||||
ac42946ebd79493fca1a868398063193b4f0aca3a5af2fabf868813b91f8f13ebff3430d31ea0d4f43ed3
|
||||
f4b620cd555e685d4ada88cd1df2dc108e1c6202531b63deeb47fc56cf5034a31f6009dbc21ba392464ce
|
||||
c0f410756705d402dc05572236c291eca7f2de1315b9d120f5e90272d2643ee4f941b387b3dda516de4a9
|
||||
a09b3407ceceb015206edd6ef6449fd3304fca2f306e455c6daee470edb19732b76c1982ca03e325d8563
|
||||
c7531abdbe99e8a7742a9802afe43bc46fd795d46052b527d1125f65427c60e6bbfe5e4d391c391a62118
|
||||
ae1ce651622ea9f2a6f4f6a57271b35bc907ded5ee7026adc8f77f50168b75741984e9cc788acc8ff4de7
|
||||
a1aa976466a45948d8b40e3a9ce32ecae381c3376692012456b76ff9b58d70b277e564a2edae34b459476
|
||||
08e660eed03c3d2f4f7112a0bc7b9628d86694f8dd1fb5d9ad8c62c957c1640aad6d0106b1c9d089cfd1c
|
||||
30f155a1e84a2a809f08e212b8b06a81543f2fbded09620782bf8e2bc70461b45a567727c74c1703a23b2
|
||||
3d3014db6a05a368ff9acc84d4fde73f1763603bdcd899b61cb3bcebb900268c93fbd0f12f702661d7582
|
||||
b188ae01922c95dce32d0469e30386774afcf89e4f107a949ba6dedd17d828e480ac653c07ea30f780879
|
||||
be572bdad635c0f9f87d88360b5023e58b661f35df98b7b1a0b1779179e614281147d9c6a4f0853e4d435
|
||||
432b4d6be3879315e2c4fce0ba32a9be43fac22b4f12a97caeba8ba4770c89447dbd902287ffabfa3d270
|
||||
64a45060a2fa458e950f34569ca4cbfdee9b3ff6391bc5a0903e66f5b99526fe75c10a8ab4fa9a100948d
|
||||
71ab96d51e3076e84ac00460eb493b418130f6ff92c0c0a2bba39a14b3f5f003583f481abf35d39dba4ef
|
||||
e41712a6eb1f8021f18d206993c685d806a8c8415cbbc15332ceabeaa8d8f0de9af037c1128fa0207ae5e
|
||||
915c79276e23252fa8255448feb00d79931948967db93f8c95336237761d2eb9cde0eb3ddbf2b0e698136
|
||||
7ac6c5843902670a5bb3a7fb3cc338f7b498cc07db6454e7c8c9b2035e1e21fb1046693a39fe27fc04a38
|
||||
0a209c7ce67c238bb227a9bee07407a9fe65b0914976af513ed2f9964574bf24162940269f8e34d6fed0c
|
||||
0769c81a5dd890e2b7d92c4ad51126ec8158679fa5c014428d67e485fdcdbe24e9a8f7bd46ad3b02354ed
|
||||
febc7133cf198a841a163a6580ad89badaee7620419e30234ca94744d936bad9ffa468bcf669741fadb7e
|
||||
7da12908e4903eba485cde036725fc4ffaef6e7a1500f40428418ef570b355810ba4981fdfb039b4e5d84
|
||||
50e979ab8f676d1b1c84897fc5cd7ed57e4962686a91687f04932f690ad55a85a7f235ea99d3ee0ee9a8d
|
||||
5ef0e84d43c2ec8ef3b3da80a5c3c973e41e6d85cfa28f53c3cce3117b05662f23f8f37923518a77e5408
|
||||
76abb03b6b1bdd606ee9127ed6c03a8b90a30e772ae9fdd287cff1df87d2ca3b344f615afdccf09f9aae6
|
||||
115fb99b7a4da857c30d73e08c7cb474a65564536738f64630013e6e7a375ef2b721ceeb77c2bee0be730
|
||||
5f4beaf9fd048ccc03e2a536e57afe06cb981b8d788c0114b1422ccd025205a92d1d98b7de5f604e3e55e
|
||||
2621f2d8933169615c9e5a6f354396e184ab69722b33eace77fde03c67b553084dbd35ca860f8e1798827
|
||||
9539eda36bf63bf8b1345491ced4c6c89ddcd709ddecc764a86565b8ba49368c4a4034302acfc0184c3c2
|
||||
d9f8ba34fde40cef6d3869fe6a5d1af17e059445d3bf9c950470cdac062e2986877ec72a79333089b2ce6
|
||||
9ffab8c5438a1298bc50e0e9c2e286e55b1936ab0903257d52db14fedeeb67da7a1df1506b0fdc4a50d2c
|
||||
721450150b25fe8cb74c39298f620c029dd8a9f1f9b175c5083a6437d0a8f5d05489aa2ff31dfc8ed83aa
|
||||
dbee192b11169e3dd6bd496eacc42c46a952f81f8c39f88ba31ec08f1060d2f2e49c0b900508b4e9e5703
|
||||
003099bc9485e09e5c6a8c9f05389124095b1c9693a30e4b75b7f2e839eb252237a55007ac61fb5268982
|
||||
083d29e757b74c4c310aa1cb03adcafe17afd50a53e4f539fb57a6c5c93ee94cabf36d2375cf0d99ad0dc
|
||||
cabb650f468737745cd0d5e66ca991bfdb46e05371bfa18a034669e967192a53bffce26bf2619a365c21f
|
||||
9f7c54801780c12ad3ff7198e916a1a4451bdcb248aa997d25f312a292c9ae1f70efa6ef1e5df24e48cb4
|
||||
1243ccbee736dc9d32476506126500906db396f312db3d6710669064711709597220dc3367e720819105a
|
||||
f78bfc5a109571b763f44873f4b820af8279d42bff9b5f9da409e0ecb9d6a3485d9bbaf2641461c1cf144
|
||||
eaa2cada36b38beaec87737dd70158735bb9c0ae7de4ddbed353411b8435c80cb2e66a701469c6e65f437
|
||||
1d114775c73d8bfa0ca04b38811b2b31261b86dc2795388577376501aad9658c630d7ac9fa4c1f262d53a
|
||||
91cef7c2990d9597fb2a130985e04233cf178c611be685623ffe5b659af6aad10da3235331fc6f6822fd5
|
||||
cdad3f96e3e1195bcb3c0104ffacf940b570f94ae689924cbba86521af15be9b1148f331ddfa37ad410b8
|
||||
ef99979a56ef1c3c789ffb996507d85383559a229493ad0bab90478d123f0c577ef01c5dc5a3ea28f60d0
|
||||
8409544ea6e44724240b2879f9c2560270e0cc3949af9e22899377635f44cc3fd0120554503d06f4a2b41
|
||||
e42129e7184265b4480edd5031d57368789203fb9a666c1be6692451f684119d85ed4cd88fe63dc1d16fd
|
||||
dc4b8508d04671f837f413a653483f0eee7b5300021735de246ee24d462c5d332c55d4c35c1ab9bd7c9a3
|
||||
d009076a838baa8a88c6fce72f0805ed73221fe98a5941d21a97ab5641d2e54df83c2437fa9cd88dec024
|
||||
1f1254c6a0ca3e85f678eafab8b013459590f87fd580fc0c05f5967a58f4dfe6a89ac1e47e4dc09adc942
|
||||
4336dd355c6f783c2698b8539c3f801f999ce5db3f041cca86b75e3e92e3d98922ef2c191282a7516024d
|
||||
f2949c1e88ea6b53b5d713b57d3edd5c78a978f7d854e487eddc60c7685120980a5cdc259cfb2de591875
|
||||
d88f9b898ef60d6da810b1a07252a56993bb5bba723f4f838ec648e19bf63dedb33eb1dbf07f456b41563
|
||||
c0102cb18220b308ef60908e75a77e6954a4f2993b60c10464dafb40e79e3cf5dce392207e473913e61e2
|
||||
75b090793fe0bc1856b6574cbc6fd1295448b34caa325df832a095266beec91604a2726f33e54e25e9478
|
||||
d859c348ad45ba5b51eda93cba7d957c5d0d76f2de84d225a5cbe6a5553c1311c35f12281d98acc7eec95
|
||||
d7f5e0ff3a0b27c0032b59a656f70d0cc5a042ee5b72365c0c8ee03ab6c48e18f87e050fd9707104924c1
|
||||
59b48edafc57cbb56722f62702390e688a0bd463c95318d3bb13b44033ea78d19c665aea20c67cd7896ff
|
||||
cf2c8e2806e5380f0d53b0b8d30fdb35d496a891dab54d3a4ab1b2a6f4b4091b48b339c5213a6f8c3f8ab
|
||||
9a9873a605494cedf22b17a6defb8ec1a88f471ce7c073ce264fffcf9af0c6a37398491652fae2c29a496
|
||||
6b022fe608c51f28503dcced1d5961186c3889e4d5ea8bc94667c80cf0d6b5f4ccf3d8addbf56b6c78028
|
||||
0850e078f39d2377376e120ad05e930e1c58f50bcf980814c2e38215db50567c8870bdfa9940104591384
|
||||
55fdbb2e260190dfac1743a5d6dc9031b0c89bfeed9f70ffa84a964a185834b4e2d3f299f2c4fea605f4a
|
||||
5a97c51fcc0fad21ead2867dcb8fb6cd6ae2ae271e89477d7dd03c34508d719a037fca0c6cb028112d8be
|
||||
93fa865ba60c7d7e1e017f3f49a9f0114c6fab8fe797cc3a4cc80c2351880347ebd8288895fc210431c8d
|
||||
27ef350588a81c382de3a100f8f8458eebb61e33336b179ae24e397661d622c82169c1081fdb929b9f21b
|
||||
4410a09fab9938c40573757d89a4450a4246deadfe4e5a20f04b6162f06bb0ca4c658a88880df139a5641
|
||||
350edf1d19123cce164d5760b6806ba8ec5584effbb87cd284150ed6a73354f9829f5d22508da40bf8f9c
|
||||
7351c45cf169a3f4e7354faed2f42d9cc08ce051e902f8137a8f79b924e2b3000ed25154e617b5d066ff1
|
||||
a3540eed0a4a3da0618d961115091a6ad9f831c25e2ec9fb1ddfa3c28f365b608fa1dafbb0ba9fe340014
|
||||
60e6af2c2da1e90aedcfb07da4e6603a9879834f16fa45cbe6c2206459058c750e534dfb8fefba9bb473d
|
||||
0f307f2e746f4c4f6f7db41bdcc7eb5d7e4c9d5028ce143cd88ebc1efa56f0e9f3ef939526a3f56ae015b
|
||||
5e42fcb7353f5496cb70baf316c8b1bfc7f26872de3f421e87ac81d4a2f51b6c44dce38a6dc9d93009490
|
||||
d84d81807e517f06c896f8adbaac3d5d8d8b83b220114d0da49dffbc5e2cd1e2b715e671b05aa1fd3b0bc
|
||||
dfdad56f65d0393dd9d1fa384b82ccf9b10b36d929f6b8e433999448f23c6c228bff904c0b91d0490af31
|
||||
3623a76fcc4258e9c8efa7ceb4b82aa0cfc6c362eac5b1e61f2a55ec5d3f401a748acb6b8f2dc4641ef9b
|
||||
d4eaf3d20e399956d36c338902c5e3b7ad13249b03bf248f41bb26de70db4d0b0b4c8dd51f92b5c1e9f3c
|
||||
cc7cb4ae36945a16f6b428caed3514af83885312a6e176d9c555199cf7cf444915362184d82d21538697b
|
||||
10326d0c5bb1e99b44ad644de25edbdd2ba404a45258d0e1682e73a42595b797f5e7a0f8b24159047d98d
|
||||
8fc58ee9e47a5068d791bafecee6422d7bc847757c0800c95e23f3470f41500bc08ab71d671765cda7422
|
||||
7535ba05696c703b90ddaaa6e6973389abbea81600e36229d756f7edcc1aceaaa010f1c5aaa1e6f0def4e
|
||||
b3a04613ce82527a67f8be50d072cbca685922d492df81cf737a69e29bb4248076464ac3fbe88db35864e
|
||||
69b71d1ed5b83f2045f680d9cc5d447f09e5405a5939943511eac648c10aca735209612eab589d2d2716a
|
||||
19059248ce4847f3a809ff04477b8378da77e796109fef7d686a5f067cf3d91aab97bd518f388173d9535
|
||||
26a3a77af043427bc2b2a466735a45846c11204b56a84394d724511efb467722ffde80899d3868a31c7ce
|
||||
4c8c2100bcab717f12eea1eb11a7f28abadbc819ceef1132a57f902aabd43337172b3aec8fc7577bca293
|
||||
50551070615735499b2758b2d9c77d391497393b6ad39e3395834185a76f6ce93fca5376e6f5aa78b11a7
|
||||
63f504781ae3e8a773c91e3899574c4b3bb0221ce8a927d443d5292f3ad13e843146736f457b4477ba6d8
|
||||
f462505b7d3d0fa76dff52f01924e00df97944f69a3abe6564793bba2850b0084e4f8d2ace474a1249daf
|
||||
1a4ffdd4a8df84c8d5ead6909929992ca1b6e58476ff388bf978d091921dda2db3b1121e573eee682e22c
|
||||
d01818ae0b7347e2591dedf20ac857746b82c0d4498744744ccb44ff96857a9609d7a500f243a62106e61
|
||||
8eadffeb5355d5e5e7452f5f50b3de48e75adc2be249b20ccc4aa3f4ea357bf4320d8f42e5a3bad1bd3e4
|
||||
2c659f71caa3736871f9b95887adbc04affecf1076598d898917c0b54c63317478b8b8e65fa2e6b243d7d
|
||||
497cebfef615c9974553feb3d33289577886697b6fb01a8849d4714ddf9688080fb0af0e6fcba733b8019
|
||||
28e7664b3840a02b9aab6307af1dd3fa814045733b53e0adab1ec430c40e184db1ceca1bbd58c4dab244f
|
||||
8683bd4edb6e59470deedebe96080be666b779106de5d6acef113a6c75002424e4812e2d9997dec5391d3
|
||||
aaba00320314f44fac9e7ca9b8996bd0a61b00139a8c1d2c9fc52e6ab9f90eba248ab0b3c4444d4ad1f07
|
||||
ac36878ee68bce6c53801a3019b0fc1f1caa3ea761da821753a949724d3b1dca2457fd2b1df7c7f3879c4
|
||||
dab41a20ab4ced8dd9e8b2ecf554fa412153dbcab52cc68ab4d83f7f310e0c5361f9c780160908816ff2e
|
||||
f457db9aa93807da96de3068bfb63a18660d29d6efeb21b36c3c34abf83ff5847711eb85e052854498474
|
||||
6965ceab0caae4fab0ae83bda024bf17d091132fdbf217f13d1c42e0671e324357c6d668492df202797f4
|
||||
1a4a9be3d7598ee4d4530ca0fea76da94a225d93729eebee40f217a9d0a0dbdf28563a184eb1a71f8c6b0
|
||||
0aa550fb21b0b1af62f98a5a165fb3e79d4265962e976c50875fbd374026e7fbe886eeee146d368899bad
|
||||
54f97308f158ee3c33b290445497414186c47f3b54e78ed4fc8b5bf379b0169908cac2c654edb715f9b1a
|
||||
3bc50992ffe9d4d5ba034b3a7128c50aaf2ec50497e68db2261b78f155900def3ece5d86b86f4a892a846
|
||||
483ace0e008728627219bb71d897c726e9a90259c6fc61e4612ae76e41aa302e3193a0cf5d68d380fc7b0
|
||||
7d41a757a459fc81fabc6336d21206b58f3ff06e390475f4e2b99ca3f0e4c82bb2d353375076d987d0a46
|
||||
54aec2438a4c1dc17bd2dfc45a680fcb3b5144d860424b8890b83be8dba8c30ecb06cddd416e01d1917d2
|
||||
eded83012bc19ae856dae5a6713895338a1f10c76260d61d25cc640292cbbe80897913e69c39a04d7c6b5
|
||||
5e9b54dd661bf4f2fc9900283a6c668f82b8e25d0c750fa2fd00de1355e655b8e690d3d2dd1118d6199b1
|
||||
a2723bc402fb38549bf13cacb217f42ab057fb2610d0f7306765d2c3644ee9384b1a8c0ccf847fdec7386
|
||||
efb25ba2e3ad6a1b489aed02cd8a28be43855e4bb718e7647e299c150173e53855a199fef2a797d2d5e0c
|
||||
454494cc175cdb205117614d1aebe6f402e21eed9dff22cfbcab47ededf6ae22717e83f0b4904c4051df6
|
||||
03fd2ce44bf59f0ca07c065d08113bdf87b6c19891e07832d7d93a6845ddbd15d41cd416dddc8de81dbba
|
||||
ade29c6f48c093c8df3c64aa69f8b1a36b79bc41cde01ab1758878b6dbb6b30c4d3cc5826bcf8ee3d159d
|
||||
20289bf01ddca53c7978e8ca1180924fe3274cf855e2861645b24c527ea3f928e428a578c6cb791c8dc2a
|
||||
96862aff4f0b383cfeaf325748f99510bbbc17158f038103157e293951db33b0307791b45e3750b781678
|
||||
3e8a1eb9d2cffbb619bba9b40d55b3e19643acc3486d8c85e75c536033db333d83be39d5cffc02e1c48c7
|
||||
ed56158365a50e9497474bedf48621f8c1ecb58bb87d99127e7d3b44d9ffdf49a967378b8e4a796f9ba1f
|
||||
62d93433afa53443dcb145a27d2bc0d92b99be04f4142a1c94d497ff9477218caa0b318a04d676447a853
|
||||
a51e725419f58374ed6823cd69ef7421d81009d2151fb4799781da7893177d46e9e39a3d2e5b7a2ef1ee4
|
||||
585a606700a2e387dd4e261ce7840f817f5e80af8852689085ce27157ee2cb5398a78feffff635ab26350
|
||||
11d739455c3fefdf16bd7b1d665a7daeb33019bbc7b4688786e58118f77a41e3879b68124d04a8de72479
|
||||
428d222890cf07608fe56f9ad094c20d668d56d985083cd0c23a85da57e37095afb06c60c2c3664a13747
|
||||
8f03438be98b78baa9af5e4d7fcde06b83952a59f4581ac51471fbc4203032f1fa52de74d804f24d99e3b
|
||||
1ebd7177795f81a996225dbdfaedbaf007f6e92fd1e05f59c8864b55614b3d0a1adddc03198f7310ace88
|
||||
254f71e115b8982d1701f6c4818a35f7c13523b81e2996fdd912c0160abbc2ef5b70c8e0bc5c3588b7269
|
||||
e5152afaeb2cf84d106e2e8b1247754789e5714c600fa3df3502374c53e5bd6bd2bfe4533a3d0bc1ae7a4
|
||||
368e811c1cc1047a0a8c085b2852e365735140404ca72c0e689848c3c4409037924118c59e7791f804152
|
||||
00ea282df22aa541e28d271a27b2e50de4485675bb3c8461ff105a17daea67f2b699a42db0298d44d57ae
|
||||
1dab3294399694f30fd2bdc30fb76637381e941c0f07736638cf8e532076160cd6c2a3810abd6d8ebbac4
|
||||
7491021d878b593b854e41a9786e0dec869a7b038649becb63ee65ba9e20e309020068bb54269c442c542
|
||||
5c0cb1d94785e2e1d98f142320e314010794ad009735fe274cb87e160d55baa8ff9ab8e0fc09f07953fec
|
||||
afb1191fdd9b80d0c493baf72c4797feb7b5349c762d00d48d6c5322c7e58bd34d69fbf47ef9d8f1374c8
|
||||
01198b8c59b97baf58c68a42581f9ff0a98cfd587f2707457e0a2df29616a750fe6877dc35d4e9066a67a
|
||||
9d4b89560bd9fcfd3a896fc8e2b9d944efc4043d0301bdd7ce597c62da276a348adb4c837e925aa95318e
|
||||
c20e305a194511f5cfb91076ac244dd4ee09179584241828134bbba779d16f09b8e54413462ae3a6aab5e
|
||||
ca1340ae5314abe946e1674ad4f3d56b677c226727ca8009229441c5ac10cfeb8ce580629393178d42da0
|
||||
7db214ac6596408353ada7b21f9e0d5d2388308042132d5cfac7940237d2acf9d4b873e0cf804c75412d7
|
||||
fb5736e2cf6461d40009ecdb76ed0ee23d59e08d2be29e5229888a3d102faa676ccfd2cf44ad1dafd7101
|
||||
98087fce312ccf89aaf93d6dbe1f32ee5f745d04018d0ba792281972b35ae99cf9ec3974a3ee233985cb9
|
||||
a065d8219b285f181de26a1f154c73871d9164fc068cf86b97ceedbc0f4ef534efa2ab1e8df7cd850173b
|
||||
24b8e6b3b5e683cbc3f50e79a674e89d51ff0a82a15e0e9952fc5d9468c2301f2fb4f3245692eddf6c690
|
||||
6100640ab1d31acad8d834e55fdbcd7c82ab4334466ce761ee775fddb128a8308773346b73d7e472641b2
|
||||
c7335855d6548d3a1edba40eb98a982694b503bc43fa61c91db1f2e18fce5cf8068be156c31b66554137d
|
||||
cab75b034f18d4933acd5ec95d6d97146d327eadc8afaf00c3917418e421e4151c18d771bd79a7d8b860a
|
||||
1fa9315c8bd847306b07e307c69faeeb0679c12cf4761ee21d809c58c2fa3b729904bc6175f755bce0930
|
||||
ee2203591ff57e87b1ca577c1d7d75b5bf7f8d3215fd57af0f3d35a00c76f702c716ca2b9694ef185ee9d
|
||||
2440cd28e2aa8e2e221c475c866699aa1ed7cc5c2c5e0d98bebab8bfd62aa33002c8ca3a58af1c3668c0b
|
||||
fefcdea7388b9227d3155a06cf94b27ff93b5cf86331915c6c132fe1c092000b5e5f17d36193613ee70f1
|
||||
8f672ab6543a65ab653cd47d13fcc138ae485e41710bb96903a7902a40fd1270697eff8e304bdc5c4797e
|
||||
46c8837b7f644ec9acb11e146706f3a1254928373dc7df81d973dcc6d6b0b0443527a34bc31f9b1af586f
|
||||
a667107ab5577c881aaae1b4725d02233a335be4d419c892a31eb397b9965f59f1532853bf456ad132a40
|
||||
b3ea9d20b079ae07727f18918e5534b528ac5bc18f36a0880b7e29e0eac96456fd09e714ea63a8f79554d
|
||||
9d38fe7033a143c01974e23d44e7e763f8dc193c018572afd4303b40af2bc2a91e6353264b6bd95e8f0a9
|
||||
f683eb1e6e9d1ccabceabe9ff569b4d1d658d81c268a6837ed27b675d1adb1f79878828769778bb92649e
|
||||
a29010509ec07d9d8403a21acdbc0f6032645f02908314537b15c7814092f783adea56561b6de27f7a7e4
|
||||
a50f6014d6b3a7a4b56aef01a7fd3f90d829c77493b3505132a3afd275bb8d8debd2758cc3b574a78db81
|
||||
b5ab1794192090ba341ae33a905fc138e4bb189275babe75a9ac1c94a477a65f70811e62f904cdbaaec9d
|
||||
d8d200571d98308986b748974d9dedfaecad9c6dcfb514aadb1a0dadc351ef2b752ea6e8f31859aff8531
|
||||
9be89de9b76107c4d1fe93e9063e9864559f477498922b1271fb4792c594c942dc7fe8de2c2423804cdb0
|
||||
985dfdc7a68ff2eaf3323e38d5ce269d790cc7fcbe124025e7613e80dbd8edd3cf7ca106bd8650e1531eb
|
||||
2fccac7b1fa5e66f7a94ccca1ed903b1d87500be464280c326167689fd4e99eaa25fd10904afdb9888e94
|
||||
bf505483e26eb3fcaae078d9b4d8b47f0104cb572e12fd4854bd908939a6b714b1ef983f38de0408acddb
|
||||
f560cc1beaf92b1c54f278b13d256011a915ea5ac7085134dd08d9b37ad08e6330891e0010b5809022b13
|
||||
9394127b90a25c0cb5e521cef81c9650d5e976c88dfce8bfc6024f28e8ec0b8a0dd1b6036994e89c5506e
|
||||
75af1a43b033bd55f38f6e37830da7ffc265ae85566927a993c7ac49f7e31a5a2795f198757a6f850d76c
|
||||
2d4770336a73f05709603f660ff24e938454ec9f32b7fd873ab645cab0a82f1b865f5e277723fbe1adeab
|
||||
c17784be0fc90fe7d44fdc6aa5938a6da20045cec6acdca7a15d301ab52f289c6172c1ce4bd19a5d94886
|
||||
2413d2bd975534bc56dfecd733065d7db5df03a6dd807785b95c4acc763a2b570e1983633a446a3740e4a
|
||||
a30e0e065d120560532f673b18f5bb33f9ca949a90850da679bf192c76b72b8a684cbbd17fe6740ef28d9
|
||||
9788c69391e5489dc52f950e6f2d3df79e835d84fa0bcb8d4e0015f4b7e8fc6889db37d2438f9e91c8539
|
||||
1d5785920ae05aeb391dd4a8875326b4b20aad9be2dc5b2127e3e5ab46158140026ed1ecef9ed9d2b1668
|
||||
60d0df8e0b59082f64318c075d08bb5d6d03170261510f8f8996ec8195a4ee7a017c8060da2072673fb62
|
||||
4f49fc542e5c605966a5eaa3cb26ad91721b101a21455c7b34823472cb11d05df5a767daf753e333c6141
|
||||
bce8d5d166cc6aa9b52c298ce0464cbda39d5983bdc3b57bdbb01215e225e275e03914cb1262d07a5086b
|
||||
9ac24b337eae21b1277c6a4937a94c21c44759cb2d8ac5f8cac59caa25d103245c4b462bfe955c927f235
|
||||
1b086bc557baaf187a3fff06999a337b2a45d1cda8002feb0defe27e463050ba93a8474f4540fc22034ef
|
||||
311a054fbe15f03643de443575808244134d5e9dbf7bd6cd939d592453ab3b7accf42cc797a276e63c581
|
||||
63ab521bd1bdad3566bd1b1e10248cf7eeb5757c1f7c8ca9f976f4721b3ff780e7edfe2f37f20116fa090
|
||||
5deb4fef0e5c5f2a303a865e6a0a6090afe237ba4b2c1437b569ec457d48c60dd5d878a93aafe3b3c626a
|
||||
5368fedc33f32696fc88ca4a43b3646aad27a6241bdb5b1c273e57ddebaaa88449c54e63a1c8bc386c918
|
||||
3d7b71bb95b0629e8a8f86973726f16b266c6393e3192f812554e73574679cbf3a67b3bbf969e00c904c9
|
||||
89eb9c9fb19f3608810c72eb528253ac8606b1730b5ce4c3928a763da1399ea3ab531d3174a0a221f95de
|
||||
ebc087b3b230734341b85c618f09865ab7c1dd66c74effa2b573de24b14f1385525873e15ab9d90f0c33d
|
||||
fdcfa19de497675f5a3d9956bc2d66942325017e4132176922f08b478907f0a9e45ec64b23353db1d44e8
|
||||
bb7f4060251afeb9e80dceab454eae609a3f5def899a2a42e4e7b62e7d6ae0735072d268bf7de73573070
|
||||
c03546f57214a1e4ea1035bacba81c14147db07e0675ef87b88c14dd64f23c7e9b45d4dc68ac48e294221
|
||||
af0b0d7b747373b03b7b922620e91ca810a13de10b02d13e139f68204d7ce0a2f8db69335b22b15e0bda4
|
||||
9545435cc769e30273ee40d6d54a45256186ff348a52c0c82c8829fbf79d4e3edcc3f42c08b026b98dba9
|
||||
e985d7597e085a767c3234182a0be06cd0435e40a5af588993f82c34e7651ea17ebee8f7035f29a378964
|
||||
0913d812130e76460ec368c9a9a9607e0ecb66866311044b7f950dac488cd4479baa9a0b728f4c2925f04
|
||||
e7bba448e8913b71178026789b3bf48713f619159a8c4c8347d5ea75e795e66c6662a24c4cd1325ba3bec
|
||||
b127848779badddd62fa895df040135b2983c6c529e2bc097bc4c6c144853940903cecd3e0c8695f14d65
|
||||
08a88c135a332b8def181bb0665d76cb6905cc7b87b2ca298cedc035d716be906a18da568351d3631a46c
|
||||
42beb6925cbec36e3877b42fe660c45983a26230654b1a00e464576ecc4e9e98e3183915bc0bec1d724b6
|
||||
4a7de15520e7f82bec8355d38878b3b2f80b731af2029a0f38c310c75a69b53af4f856c46f9772f028356
|
||||
9dfb581e2caf1595414f3f0d74aa609483c1b
|
||||
''')
|
||||
|
||||
db_write_enable=unhex('''
|
||||
0602000001648445315dac4d9c91edfb3c327ec18aee87a1fd5e0993fe74b56ee9a70f0eb4d65bfc877060728ad26e695be98899ef76b85
|
||||
2162cc5e6ccded51e5a26e7e345c4a8e83aafa2e10fa4cc78f0f34575b0565089b4c78ce1ac7fe3744f4721aa73209fa4a8699e7161bfd7
|
||||
ee58dee33f1af15ba3b9ce9a469c5c82eda2b2a2f01658ee14118304e865bc2ad415bec9f06757bb3f2263bd0349a3c089380b72a30edf8
|
||||
db01db75586c60ddc9e7bedc8cf9006fcc6825b0ec9dc8782b95f53325bfb6a6945644f2803a4c7fd35574d8b7b089102fb072dfa883049
|
||||
f9484a789ff763a029f78adfceac92db195573c65986e38aec2135b5da3c0797939154135be5227515602c0148dbcb8c8a3760dad71f877
|
||||
471244cf1053a3cc4bc73c437589a1a47e08c260ea40d3259138e754a556a23e09bf926ad90ff36096c27c460ebdd28f20f31e9f42a1925
|
||||
26d79b94e7f2c36b66db69946d93edf8fbd516e3ae59a0b81400c39f6bc1feb209924bc04703fd36ab53dd5658b2dd91633823917c37e94
|
||||
4e740409c5fd66974ed42b73d5d7db519c7037b1ed32e471750da95299463cb070c80cea4a03bf20351716ee14423f84670c53ef7b998c1
|
||||
79b84ae91cff6ca6b33a372e9947eebc873c6a98c6bcda68e5278b6f799a468bd1a33ae07bf717fbfc20f4d019f0fb25a5d6cb75a97fbd9
|
||||
b8490e6204d272d93f62ad393307cad3e24d292040e61fce6f1104c42dc4260de15f42971bbab18064b5dd6ceb12a32d9d25614d9326048
|
||||
052bc178b5a0aed3f350cbbec021c4b1ac6ed383f7f4eca0e475cf56caefc3edd3cde6526401936cc095b2df8e0008b2d9bd78c82af0a1e
|
||||
c0a71f047dd06b4ce6e91886607c55536f0d8712eae4ccb890008ccc27f2d6f6cb9b9bb88ec205019ec722160ffb1c65ca3177cff09c4bd
|
||||
ae8c40be5bf91488a600ed199d0aad40510afe580802c56c0241a8b2a836800e8a0d07ae37176934252f92fc0e501aee29e6c3567e37b3e
|
||||
1992ff00b561fd1b3ae37caecc3a1fea7720b0806d3b39cf8a3fb46087b43775b9e473e65cb18af1c9d87a5140a5edf8b7843524910d631
|
||||
79c436b6a806d100eb066db889768f7da603631d75a6d79e3d0eb1fe9ba55401b828d4a367f695f3922b982be10fdb1f139a0b1438abc91
|
||||
1db5da00ed464d80e3086d368dd131985a21610cd485740599afa772b5dc44d1906ea4c13b8e10b8db896fb81b706038a3328cd07aeb049
|
||||
e6ec92ecd30044c54eb171e9cf7a0034cd24614616048491f576826af5ca6afe4bc01f86dc01c2ea25efb32bc9b1c8d56cc7d4d86adf8f1
|
||||
f3bb6a649f98bae686ef93524721c618fad85a8125a8ac7d72bfeb7de9f590e8f43535e59259a7a1d13a12a1af91c8ba0dd45ddad02e5b8
|
||||
6224fc00dcbc143b0e1d2da638d6798fcc340bda8f1e3abf21cadb2161c4c4be7001371dc56f0d112b42b113288effea6cab8c4b610f730
|
||||
37643de21f433774d9fb28cfd213a62dcafab8b662b57e77239dc2fb69f026fcb773f09129c8db04b82dce68734516ffcb938d43deeeeda
|
||||
a02cc08d7d06f34ec55ba4b224d3270265001df114b946d4238d51cfbfb84cf715b745ec918259c1165ee12ab82b4373eaa2b0c7e68da3e
|
||||
b869ff033d5953800012bb006d1cf17dcbbe2fb2e129614351c000cab8ccc7c389df33dbe504a0c1df37868b839ef84a6c04072d69fc866
|
||||
33055b2569c9c04f1994758987fc7063b97853c727809185a25cd69bfebf6a4367760fd21e7942b997bb2b7098dbec715769d13413c1c93
|
||||
185409e54a2c9a97daf63114c71348f19549fb3a8551afbbb7476842f7045a0ec8e6d97fb4bb6de76090687ab4e9991a31e7625ba7088a3
|
||||
263797be4787db02573b72100b3ba117e8897b939548715bcfa11d98861b60fa2a4759630b47cbbf329fbc675c4cfc2f963cc9ba72cbe67
|
||||
13aff1851869917ba0b761f6532d1dee95331c4c621bb0513e993f7e6dda6da1e3076829b24093c8338c125aa2f5a0730f9e5631f7a9594
|
||||
c13025fde9bb4f2431540a1c743c7fc55fc8909d85847fe71af8a68d2981b0eee84a308e0160fc4226aa679ca9b35d0aacae8240aabd5b2
|
||||
17c5e66ac4795596f8742acb9869c3f52a96b1d946ff72f403ba491c1a0e4be778efab9d61a250562d705c2b459fc3a420143daf9355226
|
||||
4bb8c7caa64143697961fab1b6af9e852d43a94736e1e75e4b9a7c2bee73598360c7e4c648e47ba9400dbe22b3eea6d9ab87fe677b36242
|
||||
57f81d26b87536a642a7840bdccd8fce05c23891a4fa4ce2156fba2856313653207bf225b8114005432824d16a93473deb81721c77196af
|
||||
d80cf723e8cdea81aaed19f55a09a8986f2950c49f4eebfb142d5e4815632d93ccb0106c156b47efca25dc3d7f31eb9b2dee0d2d83a51cb
|
||||
e5d1270222920f2c87e5acc884c11b0df7a7e1bb49b06fa4f936964d3f2782fa46eec3e430815f82ab0fb5eb82377277f8fe3ae5b33732d
|
||||
7d76ba3de284c66fba372f04f9ad6a39fa669a00583313d51c8e6b1eb960bf1e82ae8e0504b2d3035b371d5ecf638c1cc0c1dd67eff286f
|
||||
c9ee0950da53f339a85fbbcbacf61fcdadee8cdba0950d23ec71e2239ae7ab5be1bf56364897af990428822d23deed81fbbe622420234de
|
||||
d92b8fc3073bfa0a9677cd9e24b9f81278c50584bdc880fa2cd5c5c4b03bd78be872a656f3ef74b30d4e66f1ff091a343f75f096e64ab25
|
||||
b64d426862ed3f21dc54c6b6a8cb90b065c7b33b03e97acde7d58a2fa35664ec03ef1f82a30441a021ec008bee9444bbe50ec8ff457d32d
|
||||
06a63b9dc84fd82fa110a30dd849bf9f8cb4d3599b9aa09a76ad1b7c52bb972e5b16670670994ef7471f2d738ba9430664b7a1c259745ba
|
||||
8b2b9d98e695bad0b59e1fd989475a61570b2b677734c3f1887f9555b760811e20caba91eff59e9fb328561e12749c32f603bd50da5c449
|
||||
7393ccd560e88f367a664c5f2f9fe73107e2664a07a0f015877ce085f469dd24be1a20ce9544692e23094650a991e5bd7ab7d3b575d5ef7
|
||||
1549fa442fe75a79a6c9f598eb1396e9332878c73f8af9e8f9f0cc11a4b42245acbb421646d6181c8f7f602298042a37d8b57520a1d68d6
|
||||
e3d473d5f1897e05db677c7ff6e260048255fdbe35fae42c791ea57ac0f2334e6ab5c650f59f3b27b1af30347314510a29fe19e20ac6e8e
|
||||
eb1e84deb687d2dc3d5cf4b03dbe35d165e
|
||||
''')
|
||||
|
||||
# FIXME this must be very specific to a particular device and constructed on the fly from multiple hardcoded tables:
|
||||
identify_prg=unhex('''
|
||||
02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210
|
||||
000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020
|
||||
0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2
|
||||
0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014
|
||||
0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0
|
||||
6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80
|
||||
0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800
|
||||
b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a
|
||||
ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7
|
||||
00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3
|
||||
08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0
|
||||
97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808
|
||||
d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098
|
||||
7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc
|
||||
800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928
|
||||
00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180
|
||||
0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800
|
||||
abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a
|
||||
020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260
|
||||
02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090
|
||||
0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131
|
||||
415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b
|
||||
4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828
|
||||
38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f
|
||||
201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341
|
||||
c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c
|
||||
2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818
|
||||
08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180
|
||||
81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e
|
||||
''')
|
||||
|
||||
# The following blob has only 1 byte difference from the above
|
||||
enroll_prg=unhex('''
|
||||
02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210
|
||||
000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020
|
||||
0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2
|
||||
0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014
|
||||
0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0
|
||||
6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80
|
||||
0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800
|
||||
b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a
|
||||
ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7
|
||||
00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3
|
||||
08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0
|
||||
97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808
|
||||
d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098
|
||||
7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc
|
||||
800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928
|
||||
00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180
|
||||
0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800
|
||||
abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a
|
||||
020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260
|
||||
02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090
|
||||
0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131
|
||||
415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b
|
||||
4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828
|
||||
38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f
|
||||
201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341
|
||||
c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c
|
||||
2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818
|
||||
08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180
|
||||
81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e
|
||||
''')
|
||||
|
||||
calibrate_prg=unhex('''
|
||||
0298006103230000002000080000200080000001003200700000000080202005002420000050207736282
|
||||
0010030200100082170000c210000482102004c210000582000005c20000060200000682005006c200129
|
||||
70200121742001887820018084202000942001809c200902a0200b19b4200000b8203b04bc201400c0200
|
||||
200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc20e803e0
|
||||
206401e420d002e8200001f0200500f8200500fc200000b8203b000008040014080000080800000808000
|
||||
01408300008080000140831001c081a0032000c0000000080501101004c1126003400080310071d10071d
|
||||
10071d10071d10071c01065810080101000007c8078c06100000204f80007f000003070107010c07032c0
|
||||
8fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d800af908f8800b5d
|
||||
095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b6109628
|
||||
00af408f3800b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af0
|
||||
08ef800b660967800aef08ee800b670968800aee08ed800b68096c800aed08ec800b6c096d800aec08eb8
|
||||
00b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b700971800ae808e7800b71
|
||||
0972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b7509768
|
||||
00ae308e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf
|
||||
08de800b7a097b800ade08dd800b7b097c800add08dc800b7c097d800adc08db800b7d097e800adb08da8
|
||||
00b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808d7800b810982800ad708d6800b82
|
||||
0983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b8609878
|
||||
00ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace
|
||||
08cd800b8b098c800acd08cc800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c98
|
||||
00b8f0990800ac908c8800b900991800ac808c7800b910992800ac708c6800b920993800ac608c5800b93
|
||||
0994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c1800b9709988
|
||||
00ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd
|
||||
08bc800b9c099d800abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b88
|
||||
00ba00801800ab808b7800a010802800ab708b6800a020803800ab608b5800a0308048020030704040200
|
||||
00000000002f0004009000000029000400000000003500040010000000170000003000cc0103000000ff0
|
||||
000001d000003ff00000025000003ff00000022000003101112131415161718191a1b1c1d1e1f20212223
|
||||
2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4
|
||||
e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778
|
||||
797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203
|
||||
c2d182e1e30182e1c321d341d341e321c301e1e241e201f201d1c321a301e1c211e21341f1e202024201f
|
||||
1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341c1e1e1c221f2
|
||||
01d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220
|
||||
301d2d302f2d2c2b23223a211c7e7f807f808080808080808080808080808080808080818081808180818
|
||||
080808080818081808080818081808180818081808180818081808180808081808180808081807f808081
|
||||
8080808180818081808080818081808180818081808180808081808180818081808180818081808180818
|
||||
0818081808180818081808080808080808080807f807f807f807f7f7e7e
|
||||
''')
|
||||
|
||||
64
calibrate.py
Normal file
64
calibrate.py
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
|
||||
from hashlib import sha256
|
||||
from binascii import hexlify, unhexlify
|
||||
|
||||
from tls97 import tls
|
||||
from usb97 import usb
|
||||
from time import ctime
|
||||
from sensor import write_hw_reg32, read_hw_reg32, identify_sensor
|
||||
from flash import read_flash, get_fw_info
|
||||
from util import assert_status
|
||||
from blobs import calibrate_prg
|
||||
|
||||
#usb.trace_enabled=True
|
||||
#tls.trace_enabled=True
|
||||
|
||||
usb.open()
|
||||
tls.parseTlsFlash(read_flash(1, 0, 0x1000))
|
||||
tls.open()
|
||||
|
||||
# no idea what this is:
|
||||
write_hw_reg32(0x8000205c, 7)
|
||||
if read_hw_reg32(0x80002080) != 2:
|
||||
raise Exception('Unexpected register value')
|
||||
|
||||
dev=identify_sensor()
|
||||
print('Sensor: %s' % dev.name)
|
||||
# ^ TODO -- what is the real reason to detect HW at this stage?
|
||||
|
||||
fwi=get_fw_info(2)
|
||||
if fwi == None:
|
||||
raise Exception('No firmware detected')
|
||||
|
||||
print('FWExt version %d.%d (%s), %d modules' % (fwi.major, fwi.minor, ctime(fwi.buildtime), len(fwi.modules)))
|
||||
|
||||
|
||||
|
||||
# >>> 6f 000e 000000000000
|
||||
# <<< 0000 880d 0000 07000000
|
||||
# 0800 0000 9400 0e00 0300 0080 07000000 7e7f807f808080808080808080808080808080808080818081808180818080808080818081808080818081808180818081808180818081808180808081808180808081807f80808180808081808180818080808180818081808180818081808080818081808180818081808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e
|
||||
# a400 0000 0800 0e00 0200 0000 00000000 0d007100
|
||||
# b400 0000 0800 0e00 0800 0080 db000000 00000000
|
||||
# c400 0000 0400 0e00 0500 0080 1c6f0400
|
||||
# d000 0000 9400 0e00 0700 0080 07000000 2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c2b23223a211c
|
||||
# 6c01 0000 1400 0e00 0f00 0080 05550007 7701002805720000080100020811e107
|
||||
# 8801 0000 0c00 0e00 1200 0080 07000000 7002780070027800
|
||||
#
|
||||
# Empty reply:
|
||||
# >>> 6f 000a 000000000000
|
||||
# <<< 0000 880d 0000 00000000
|
||||
|
||||
rsp=tls.cmd(calibrate_prg)
|
||||
assert_status(rsp)
|
||||
print(rsp.hex())
|
||||
# ^ check what the rest of the rsp means, how the calibrate_prg is constructed/selected, etc
|
||||
|
||||
buf=usb.read_82()
|
||||
|
||||
print(sha256(buf).digest().hex())
|
||||
|
||||
# >>> read_flash(6, 0, 0x44)
|
||||
# <<< ffff...
|
||||
|
||||
# >>> write_flash_all(6, 0, buf)
|
||||
|
||||
79
db97.py
79
db97.py
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
from usb97 import unhex
|
||||
from util import unhex
|
||||
from tls97 import tls
|
||||
from util import assert_status
|
||||
from struct import pack, unpack
|
||||
from binascii import hexlify, unhexlify
|
||||
|
|
@ -39,7 +40,7 @@ def parse_user_storage(rsp):
|
|||
name, rsp = rsp[:namesz], rsp[namesz:]
|
||||
|
||||
if len(rsp) > 0:
|
||||
raise Exception('Junk at the end of the storage info response: %s' % unhexlify(rsp).decode())
|
||||
raise Exception('Junk at the end of the storage info response: %s' % rsp.hex())
|
||||
|
||||
storage=UserStorage(recid, name)
|
||||
|
||||
|
|
@ -71,7 +72,7 @@ def parse_user(rsp):
|
|||
identity, rsp = rsp[:identitysz], rsp[identitysz:]
|
||||
|
||||
if len(rsp) > 0:
|
||||
raise Exception('Junk at the end of the user info response: %s' % unhexlify(rsp).decode())
|
||||
raise Exception('Junk at the end of the user info response: %s' % rsp.hex())
|
||||
|
||||
identity = parse_identity(identity)
|
||||
user=User(recid, identity)
|
||||
|
|
@ -97,51 +98,6 @@ def identity_to_bytes(identity):
|
|||
else:
|
||||
raise Exception('Don''t know how to handle identity %s' % repr(identity))
|
||||
|
||||
wtf_hardcoded=unhex('''
|
||||
0602000001648445315dac4d9c91edfb3c327ec18aee87a1fd5e0993fe74b56ee9a70f0eb4d65bfc877060728ad26e695be98899ef76b85
|
||||
2162cc5e6ccded51e5a26e7e345c4a8e83aafa2e10fa4cc78f0f34575b0565089b4c78ce1ac7fe3744f4721aa73209fa4a8699e7161bfd7
|
||||
ee58dee33f1af15ba3b9ce9a469c5c82eda2b2a2f01658ee14118304e865bc2ad415bec9f06757bb3f2263bd0349a3c089380b72a30edf8
|
||||
db01db75586c60ddc9e7bedc8cf9006fcc6825b0ec9dc8782b95f53325bfb6a6945644f2803a4c7fd35574d8b7b089102fb072dfa883049
|
||||
f9484a789ff763a029f78adfceac92db195573c65986e38aec2135b5da3c0797939154135be5227515602c0148dbcb8c8a3760dad71f877
|
||||
471244cf1053a3cc4bc73c437589a1a47e08c260ea40d3259138e754a556a23e09bf926ad90ff36096c27c460ebdd28f20f31e9f42a1925
|
||||
26d79b94e7f2c36b66db69946d93edf8fbd516e3ae59a0b81400c39f6bc1feb209924bc04703fd36ab53dd5658b2dd91633823917c37e94
|
||||
4e740409c5fd66974ed42b73d5d7db519c7037b1ed32e471750da95299463cb070c80cea4a03bf20351716ee14423f84670c53ef7b998c1
|
||||
79b84ae91cff6ca6b33a372e9947eebc873c6a98c6bcda68e5278b6f799a468bd1a33ae07bf717fbfc20f4d019f0fb25a5d6cb75a97fbd9
|
||||
b8490e6204d272d93f62ad393307cad3e24d292040e61fce6f1104c42dc4260de15f42971bbab18064b5dd6ceb12a32d9d25614d9326048
|
||||
052bc178b5a0aed3f350cbbec021c4b1ac6ed383f7f4eca0e475cf56caefc3edd3cde6526401936cc095b2df8e0008b2d9bd78c82af0a1e
|
||||
c0a71f047dd06b4ce6e91886607c55536f0d8712eae4ccb890008ccc27f2d6f6cb9b9bb88ec205019ec722160ffb1c65ca3177cff09c4bd
|
||||
ae8c40be5bf91488a600ed199d0aad40510afe580802c56c0241a8b2a836800e8a0d07ae37176934252f92fc0e501aee29e6c3567e37b3e
|
||||
1992ff00b561fd1b3ae37caecc3a1fea7720b0806d3b39cf8a3fb46087b43775b9e473e65cb18af1c9d87a5140a5edf8b7843524910d631
|
||||
79c436b6a806d100eb066db889768f7da603631d75a6d79e3d0eb1fe9ba55401b828d4a367f695f3922b982be10fdb1f139a0b1438abc91
|
||||
1db5da00ed464d80e3086d368dd131985a21610cd485740599afa772b5dc44d1906ea4c13b8e10b8db896fb81b706038a3328cd07aeb049
|
||||
e6ec92ecd30044c54eb171e9cf7a0034cd24614616048491f576826af5ca6afe4bc01f86dc01c2ea25efb32bc9b1c8d56cc7d4d86adf8f1
|
||||
f3bb6a649f98bae686ef93524721c618fad85a8125a8ac7d72bfeb7de9f590e8f43535e59259a7a1d13a12a1af91c8ba0dd45ddad02e5b8
|
||||
6224fc00dcbc143b0e1d2da638d6798fcc340bda8f1e3abf21cadb2161c4c4be7001371dc56f0d112b42b113288effea6cab8c4b610f730
|
||||
37643de21f433774d9fb28cfd213a62dcafab8b662b57e77239dc2fb69f026fcb773f09129c8db04b82dce68734516ffcb938d43deeeeda
|
||||
a02cc08d7d06f34ec55ba4b224d3270265001df114b946d4238d51cfbfb84cf715b745ec918259c1165ee12ab82b4373eaa2b0c7e68da3e
|
||||
b869ff033d5953800012bb006d1cf17dcbbe2fb2e129614351c000cab8ccc7c389df33dbe504a0c1df37868b839ef84a6c04072d69fc866
|
||||
33055b2569c9c04f1994758987fc7063b97853c727809185a25cd69bfebf6a4367760fd21e7942b997bb2b7098dbec715769d13413c1c93
|
||||
185409e54a2c9a97daf63114c71348f19549fb3a8551afbbb7476842f7045a0ec8e6d97fb4bb6de76090687ab4e9991a31e7625ba7088a3
|
||||
263797be4787db02573b72100b3ba117e8897b939548715bcfa11d98861b60fa2a4759630b47cbbf329fbc675c4cfc2f963cc9ba72cbe67
|
||||
13aff1851869917ba0b761f6532d1dee95331c4c621bb0513e993f7e6dda6da1e3076829b24093c8338c125aa2f5a0730f9e5631f7a9594
|
||||
c13025fde9bb4f2431540a1c743c7fc55fc8909d85847fe71af8a68d2981b0eee84a308e0160fc4226aa679ca9b35d0aacae8240aabd5b2
|
||||
17c5e66ac4795596f8742acb9869c3f52a96b1d946ff72f403ba491c1a0e4be778efab9d61a250562d705c2b459fc3a420143daf9355226
|
||||
4bb8c7caa64143697961fab1b6af9e852d43a94736e1e75e4b9a7c2bee73598360c7e4c648e47ba9400dbe22b3eea6d9ab87fe677b36242
|
||||
57f81d26b87536a642a7840bdccd8fce05c23891a4fa4ce2156fba2856313653207bf225b8114005432824d16a93473deb81721c77196af
|
||||
d80cf723e8cdea81aaed19f55a09a8986f2950c49f4eebfb142d5e4815632d93ccb0106c156b47efca25dc3d7f31eb9b2dee0d2d83a51cb
|
||||
e5d1270222920f2c87e5acc884c11b0df7a7e1bb49b06fa4f936964d3f2782fa46eec3e430815f82ab0fb5eb82377277f8fe3ae5b33732d
|
||||
7d76ba3de284c66fba372f04f9ad6a39fa669a00583313d51c8e6b1eb960bf1e82ae8e0504b2d3035b371d5ecf638c1cc0c1dd67eff286f
|
||||
c9ee0950da53f339a85fbbcbacf61fcdadee8cdba0950d23ec71e2239ae7ab5be1bf56364897af990428822d23deed81fbbe622420234de
|
||||
d92b8fc3073bfa0a9677cd9e24b9f81278c50584bdc880fa2cd5c5c4b03bd78be872a656f3ef74b30d4e66f1ff091a343f75f096e64ab25
|
||||
b64d426862ed3f21dc54c6b6a8cb90b065c7b33b03e97acde7d58a2fa35664ec03ef1f82a30441a021ec008bee9444bbe50ec8ff457d32d
|
||||
06a63b9dc84fd82fa110a30dd849bf9f8cb4d3599b9aa09a76ad1b7c52bb972e5b16670670994ef7471f2d738ba9430664b7a1c259745ba
|
||||
8b2b9d98e695bad0b59e1fd989475a61570b2b677734c3f1887f9555b760811e20caba91eff59e9fb328561e12749c32f603bd50da5c449
|
||||
7393ccd560e88f367a664c5f2f9fe73107e2664a07a0f015877ce085f469dd24be1a20ce9544692e23094650a991e5bd7ab7d3b575d5ef7
|
||||
1549fa442fe75a79a6c9f598eb1396e9332878c73f8af9e8f9f0cc11a4b42245acbb421646d6181c8f7f602298042a37d8b57520a1d68d6
|
||||
e3d473d5f1897e05db677c7ff6e260048255fdbe35fae42c791ea57ac0f2334e6ab5c650f59f3b27b1af30347314510a29fe19e20ac6e8e
|
||||
eb1e84deb687d2dc3d5cf4b03dbe35d165e
|
||||
''')
|
||||
|
||||
class DbRecord():
|
||||
def __init__(self):
|
||||
self.dbid = 0
|
||||
|
|
@ -217,7 +173,7 @@ class Db():
|
|||
|
||||
def new_record(self, parent, typ, storage, data):
|
||||
assert_status(self.tls.cmd(b'\x45'))
|
||||
assert_status(self.tls.cmd(wtf_hardcoded))
|
||||
assert_status(self.tls.cmd(db_write_enable))
|
||||
rsp = self.tls.cmd(pack('<BHHHH', 0x47, parent, typ, storage, len(data)) + data)
|
||||
assert_status(rsp)
|
||||
recid, = unpack('<H', rsp[2:])
|
||||
|
|
@ -234,7 +190,7 @@ class Db():
|
|||
def new_finger(self, userid, template):
|
||||
stg = self.get_user_storage(name='StgWindsor')
|
||||
# We ask to create an object of type 0xb,
|
||||
# but because of the magical `wtf_hardcoded` in the new_record() it ends up being 0x6
|
||||
# but because of the magical `db_write_enable` in the new_record() it ends up being 0x6
|
||||
rec = self.new_record(userid, 0xb, stg.dbid, template)
|
||||
return rec
|
||||
|
||||
|
|
@ -244,9 +200,6 @@ class Db():
|
|||
rec = self.new_record(parent, 0x8, stg.dbid, data)
|
||||
return rec
|
||||
|
||||
def flush_changes(self):
|
||||
assert_status(self.tls.cmd(b'\x1a'))
|
||||
|
||||
def dump_all(self):
|
||||
stg = self.get_user_storage(name='StgWindsor')
|
||||
usrs = [self.get_user(u['dbid']) for u in stg.users]
|
||||
|
|
@ -255,23 +208,5 @@ class Db():
|
|||
for f in u.fingers:
|
||||
print(' %2d: %02x (%s)' % (f['dbid'], f['subtype'], subtype_to_string(f['subtype'])))
|
||||
|
||||
def erase_flash(self, which):
|
||||
self.tls.cmd(wtf_hardcoded)
|
||||
self.tls.cmd(pack('<BB', 0x3f, which))
|
||||
self.flush_changes()
|
||||
|
||||
def read_flash(self, which, addr, size):
|
||||
cmd = pack('<BBBHLL', 0x40, which, 1, 0, addr, size)
|
||||
rsp=self.tls.cmd(cmd)
|
||||
assert_status(rsp)
|
||||
sz, = unpack('<xxLxx', rsp[:8])
|
||||
|
||||
return rsp[8:8+sz]
|
||||
|
||||
def write_flash(self, which, addr, buf):
|
||||
self.tls.cmd(wtf_hardcoded)
|
||||
cmd = pack('<BBBHLL', 0x41, which, 1, 0, addr, len(buf)) + buf
|
||||
rsp=self.tls.cmd(cmd)
|
||||
assert_status(rsp)
|
||||
self.flush_changes()
|
||||
db = Db(tls)
|
||||
|
||||
|
|
|
|||
296
factory-reset.py
296
factory-reset.py
|
|
@ -1,291 +1,11 @@
|
|||
|
||||
from usb97 import *
|
||||
from usb97 import usb
|
||||
from util import unhex, assert_status
|
||||
from blobs import reset_blob
|
||||
from sensor import reboot
|
||||
|
||||
blob=unhex('''
|
||||
06020000013920c0cdd8e7e68d6ef897ee686fbf657f83b9514341e1d3c0835a28c9cd1ccd0016644f74d
|
||||
d02a73b85d95f4d352417cee76ba0bca3ce474159c62ade3e10797715a13f15a292f5d57c6d46cf8f5ef6
|
||||
587a3c55244f2258ffd08b351dc14af0da36121ba0aa4f1147ffd0cccdc1d6dc1d5fa7adb9841ff79c753
|
||||
e2528dc27344be84a2655ab01039c74999b90a7f008f626791d68a76a57b07180129bad2c0a67daf6a3a5
|
||||
ebadd6a429fc087b1e68f1e6535290b7f94e9a9800330d866c5a67b4e974029164f8c6fca8d93c86211ac
|
||||
47d96fe386faf206f92f4afd32d3a90c4287377e8896aa9ae930543864539df833345d0a1869169d69100
|
||||
8510c91dc1a0ec138669c2efb812c7b9b7f201891cdebe9c80eb671ac8a854bdcb9990cc23950f9f1dda0
|
||||
d0119b8c5c2d8446310e8599efd248075bad6613ceb13f0310ceab6ad17b18c8a245c26363ba7a7f24f17
|
||||
972861c6a96e728d1be81a68d66418ee2dbdc00d240bde29c781069f93a06dff89ba4039b980d3c9c2a26
|
||||
a7f41a02a4b9f1c0e0f75f0a59c5c5003d2e90a209cd9f8bdf69414262e238dbe8e1bacf6c880f59843dd
|
||||
8111293e24e99c964538842dcb0b4a8cab6d227cbfe0647cea763496425152aed507b2228e79c8e9bcaaf
|
||||
6380c1d2e7f56c5563706cb5da5b238371ca4b2627ca00f9bc9d71cd73ccf02f02f42e856f9e8defa0195
|
||||
c8647cb1a0a63e6996a1b5906080851f1648cd061a585ddda05fc8f37a99a0dac92dfabbfade8f89157cf
|
||||
11d356782689838c358f4790480fd341c993ae4cc8a8c93cf11578c0571e0c3c8a4964286eac3fae27507
|
||||
d9fb2ee961953d86574e6e5f6d38cf2507a714adbc221867bd701bdffae0b27ce47ae8d06685e534342d1
|
||||
1aef07f2c998fffe8673c2806e8384738b8f4ba401d417cabe088ed2fa09c42e97af72f878753ffc50b87
|
||||
fd292662f421bc6cc8da131957c84f4ce4b69266065d35d3ab91362b13edac27231ea1b6485faa6644c64
|
||||
6747b86341b6d031f6a52b6ad855396b7b8cf9485f50365cdce203355bf2fceebfa59b266772ff2578bb5
|
||||
03f92ca35ca2bc046d63aeb4fbb0f477ef41c65d10c5cdcff5de10afa9e7bc08b026f0fa649629f259c5c
|
||||
2978d26dfc2cbf48f59616ada4bf2fc7a7219fc37d9f5026709e7b472b6f97f78d47e1c5a6af8e23aebb8
|
||||
a88f64f005abc93251aeb8561b0d855941b33ac608413405381fecd0154db93812843f15b8e5e118ba7a7
|
||||
cdc051ef203a7721b769abb3c17c704eb0acf6a2cde267776dfb1ff8d82ba2341d0346cd80cd4480767a3
|
||||
d0edb643c1d9045f24096bd1fc324c03efc0977736725b2770998ea920c19a1fa9add474714a5b7a2a318
|
||||
7e94cf1a3492814ad145a7b204e0b3d35dc4cab2424a891f76160ba722a25bf9906bb3a476250b756249c
|
||||
aed3c4d52c4046012da280ec71898e8e393559979a74432f1df2692616c761c676a0260c7e4042bba7387
|
||||
d3c683d4e08454c7f509b7960a1db2a1cf007538a38a1e39b0a0310c9b77fbf21ab2b3f2e76f3ec9084c6
|
||||
f47f4fb2fc1dbcab40a9d1f6c8e404126193d26ed98270824611c4840087893b3204837e282bf29623080
|
||||
439336435e801de053cebb066bc7a440a3f34fafc2bb7252c5dd846af3404e93f1172ebe2b7861e09d58b
|
||||
cbee0400df8fe627adc42be2860a33d40748bab2f34262ee32409bced9cf8fea90bc32d247dc2787d7289
|
||||
65373063851a991c63c480b67cd301a9c312037c72ffc04120a09b1413756d4e5bb0bccb550c6cf76e2c6
|
||||
35c8498f4e653beee2fb683db0466280bbd297838a8d1f2459a58db77446020cd20b82a52ee5cbf0aa908
|
||||
14a199ae61dca69d0bc90986a2c26b8d65357e3925774a3876ed0eb80124a0bed4c2c0bc632e1b3c1a812
|
||||
2b54b023b05e846d78172b97424ff607b67c2c11f21ceadf82020129e62fb0918e85b623134f4e5e18870
|
||||
42b632662a3d33c6effa4a967e09a4d988dd084fde8c9d4b39dd0e6521b8e2d376807adbb5b86d914eca2
|
||||
38a349d9b0fb23b64668bdfd45f6a735523a31878e4975a42ebe2d3c920f550881818c8139cda34df3669
|
||||
b89aa5fc8b3bad460de2d76d431435c83b6fc0efbaaaa84818e990be36b72826f00f1f2b97d63b680d83d
|
||||
03f2ac5325f8dfc5d460abcbf27ed4ff205542702974eb9bfba456401786578efd93d69ec76a41df43798
|
||||
76891e39acdce7a32e94811157d48829f46b5755d9721d935c73a28423080bc8a48882b4439e92ac68413
|
||||
6a52b078e06a730596eacab8768d0784b0fca63f8a247f2523ea5d4679a8957af6b314594681759ede769
|
||||
76937c5f99c7fc9326579d90fe7a7fe0d512858e3221b50c4e1d9ff16f38d49c52a524ef895dab24059ac
|
||||
7a2b9dc24e59d8b38e4958d51fc309deecf987dd79697fe6ccf955e06bbd0ebe69aa18df39b452ff9ebe8
|
||||
f2f761c1be272141ebe65d0a625b5f1398ac2ae129ee5c1e520beeb492748f9364742978249470be45279
|
||||
11bd9aafbcbfa5e90a56ce40e42b995c82f6c5df51cfedc41a6963475e2d39641e2d7ac624d184aaec303
|
||||
465d4441b1b0acfccf9b45cc3e1825a01be94e93ee16918793a809cef222480377558ee18bc2801e31f24
|
||||
3d609ead015a0a6cec743f7dd0d951a7e0bf56d45ef20177373972602417024412c2adef44b881da42138
|
||||
5286c9e31fcf98b8f8ee10a9ee2730429579825ac159bdee29d1c4cdb9073427d0924174d04818b6586d2
|
||||
d2ac5318156b6139bec3b1959d0d1a8b46603f0ae9862214fff30c133d463cdabf875ef841e01976ad06c
|
||||
bf74c9987839e8a0e41b6a2411e542a061b23bf5b261df7a0cc844c510c102b4e03fbc44c44e998a51699
|
||||
907d252e91e3e89c0728f5db0b868ff2c55fc53d9230dd0dcd01086379a8821a0cb2b7dfb90b25a8c452f
|
||||
285185457827dea2f5b3cf1138e23e9a8d23ba1f2234d233c0c7f0595471e7e3a62d8fbb8a5fb900a3cf0
|
||||
3ee4943e4a4ba5b51200f02a6217ec29d7d5177ba395c77540b7111c5428ab069613c7e17094c5d798049
|
||||
3ce2d945393f3fc11765629597817499cf6585635a3db8d6471af509380224dc04b574891ebce80cb7ea4
|
||||
d0789ffd7b76637fd460ee701b60be9174eeb51f96c6811a4e4dc55ee545a9d9d23b80059084616521742
|
||||
d9b7a47d60b77dd0ed12f10327553448655ed7b7a9d7366854d908a4c762fe9048e4e4a3776f2e22f90de
|
||||
014643101de4715754efd62762500c6de90435fcde78e9fb864045cf8749b93907baeb4f47230547e78be
|
||||
a0e01d918426c3c7a3bdbbf2b54394c44273aaf163306450505862af4778f667d7c34a894c8824effe124
|
||||
b9993690d1519015566849652d86e158830465fd1fab08e4cf5cfff1f437ae0c713abe1b8e1fd15b1a796
|
||||
3751504ea02e4ff1469300a689d4ca4d796be229b4cc041296f9672bb2383442d492eaee0a17d174ac699
|
||||
4d2c1b1a117e54da2bef43347129d94bf4ea029271564f05fc3f607bac5e06e741ed5e9d51a2efafec05d
|
||||
7926c693bed05ee0bc81c1b6aa6d57f58b01aad2d69613c201e86312bdd2e8117eded970e298c096c52ae
|
||||
d21fd7f8aa03e3bf3d280fe3b3ca4e49dbfc90dbdfcae59ba03eb38458cd01f6637843526881b8df0b019
|
||||
e90e2b05bb4154dbac69e82ef4d8f83343fa2b0f10f71f1f0c314f41ca366c296fc41830ab1998829cf55
|
||||
01d8afa090b8803aa1ef94dc8a06c231ebb3e42cabaedc50fdc40832091307b4dc46398c890d71863522a
|
||||
927e1d90cb72d38afbc74ffe8813ab36a168822b5caf7550af92824061d076b5e1f628b6e4a36849c5182
|
||||
58905e734a2dd53258df37305a16c0b844dec711800a822dbf691327b7fac815cef33d59363d56c246d04
|
||||
e877ba09c4fc1aa70937d46adea4b1ba418695a7b86c0d9332b71d44b2dd8c88c93a8efc264b1c29820bb
|
||||
5b66b397136d9715961dbf7d5b59508015b2938edb1938e68f4e354eb7dd60b08b4460c05d1f291e56aca
|
||||
32bf30a59b1d849993750498df7be8101d38cb2781cb52a640dfd09ad469bdaa069eb37b7462343819ce2
|
||||
024bcdd1940f97eec044f7fe41793fda6edf53acc92d2883fdb144de0baa6fff19c59b3b5a673a6be202d
|
||||
8afb436fc6bcf3a5bce2ec9919a9d2f4aafcf2f83698d56fa43efa7b07fd1074b915344d6ce24ffdea58e
|
||||
b3afd95d911187b1070cf1c97a80ec5a5d609869e262b347f24b7e33404e6daa06c89d45db644cc6e29df
|
||||
41198bc8ef699415629b91b6ba52e5cccfc367654ba4fc0c7c6f40a2d9ce519c84a6315dc6e951f828b1f
|
||||
5d3a7c6e7e4a3271dc21c82329a163315a763c25710dbc33f9b79db33eeeaecfb8345d503fdb069160451
|
||||
67cd5451c5feb5358b07b085cb710f348150c92948aef7eca1bf4f51cb31b7429d28ad544cfd325691524
|
||||
ea5a13fb276967ff78719eae6c735d37d7206ba951cf115210ee0c3a0b07268c57a926a4ef8dbd8423190
|
||||
8d15ca9a2f1b519ee982a539eea6e874a6b04cbb65c62ceeb44d7ccf14791bdf5f056bae592830688f03a
|
||||
67d92a8b6b8ab6c40c651eb4e2366fb31434475068839466fff8e5279cbafa713b8d51dcf68001363dad4
|
||||
ac42946ebd79493fca1a868398063193b4f0aca3a5af2fabf868813b91f8f13ebff3430d31ea0d4f43ed3
|
||||
f4b620cd555e685d4ada88cd1df2dc108e1c6202531b63deeb47fc56cf5034a31f6009dbc21ba392464ce
|
||||
c0f410756705d402dc05572236c291eca7f2de1315b9d120f5e90272d2643ee4f941b387b3dda516de4a9
|
||||
a09b3407ceceb015206edd6ef6449fd3304fca2f306e455c6daee470edb19732b76c1982ca03e325d8563
|
||||
c7531abdbe99e8a7742a9802afe43bc46fd795d46052b527d1125f65427c60e6bbfe5e4d391c391a62118
|
||||
ae1ce651622ea9f2a6f4f6a57271b35bc907ded5ee7026adc8f77f50168b75741984e9cc788acc8ff4de7
|
||||
a1aa976466a45948d8b40e3a9ce32ecae381c3376692012456b76ff9b58d70b277e564a2edae34b459476
|
||||
08e660eed03c3d2f4f7112a0bc7b9628d86694f8dd1fb5d9ad8c62c957c1640aad6d0106b1c9d089cfd1c
|
||||
30f155a1e84a2a809f08e212b8b06a81543f2fbded09620782bf8e2bc70461b45a567727c74c1703a23b2
|
||||
3d3014db6a05a368ff9acc84d4fde73f1763603bdcd899b61cb3bcebb900268c93fbd0f12f702661d7582
|
||||
b188ae01922c95dce32d0469e30386774afcf89e4f107a949ba6dedd17d828e480ac653c07ea30f780879
|
||||
be572bdad635c0f9f87d88360b5023e58b661f35df98b7b1a0b1779179e614281147d9c6a4f0853e4d435
|
||||
432b4d6be3879315e2c4fce0ba32a9be43fac22b4f12a97caeba8ba4770c89447dbd902287ffabfa3d270
|
||||
64a45060a2fa458e950f34569ca4cbfdee9b3ff6391bc5a0903e66f5b99526fe75c10a8ab4fa9a100948d
|
||||
71ab96d51e3076e84ac00460eb493b418130f6ff92c0c0a2bba39a14b3f5f003583f481abf35d39dba4ef
|
||||
e41712a6eb1f8021f18d206993c685d806a8c8415cbbc15332ceabeaa8d8f0de9af037c1128fa0207ae5e
|
||||
915c79276e23252fa8255448feb00d79931948967db93f8c95336237761d2eb9cde0eb3ddbf2b0e698136
|
||||
7ac6c5843902670a5bb3a7fb3cc338f7b498cc07db6454e7c8c9b2035e1e21fb1046693a39fe27fc04a38
|
||||
0a209c7ce67c238bb227a9bee07407a9fe65b0914976af513ed2f9964574bf24162940269f8e34d6fed0c
|
||||
0769c81a5dd890e2b7d92c4ad51126ec8158679fa5c014428d67e485fdcdbe24e9a8f7bd46ad3b02354ed
|
||||
febc7133cf198a841a163a6580ad89badaee7620419e30234ca94744d936bad9ffa468bcf669741fadb7e
|
||||
7da12908e4903eba485cde036725fc4ffaef6e7a1500f40428418ef570b355810ba4981fdfb039b4e5d84
|
||||
50e979ab8f676d1b1c84897fc5cd7ed57e4962686a91687f04932f690ad55a85a7f235ea99d3ee0ee9a8d
|
||||
5ef0e84d43c2ec8ef3b3da80a5c3c973e41e6d85cfa28f53c3cce3117b05662f23f8f37923518a77e5408
|
||||
76abb03b6b1bdd606ee9127ed6c03a8b90a30e772ae9fdd287cff1df87d2ca3b344f615afdccf09f9aae6
|
||||
115fb99b7a4da857c30d73e08c7cb474a65564536738f64630013e6e7a375ef2b721ceeb77c2bee0be730
|
||||
5f4beaf9fd048ccc03e2a536e57afe06cb981b8d788c0114b1422ccd025205a92d1d98b7de5f604e3e55e
|
||||
2621f2d8933169615c9e5a6f354396e184ab69722b33eace77fde03c67b553084dbd35ca860f8e1798827
|
||||
9539eda36bf63bf8b1345491ced4c6c89ddcd709ddecc764a86565b8ba49368c4a4034302acfc0184c3c2
|
||||
d9f8ba34fde40cef6d3869fe6a5d1af17e059445d3bf9c950470cdac062e2986877ec72a79333089b2ce6
|
||||
9ffab8c5438a1298bc50e0e9c2e286e55b1936ab0903257d52db14fedeeb67da7a1df1506b0fdc4a50d2c
|
||||
721450150b25fe8cb74c39298f620c029dd8a9f1f9b175c5083a6437d0a8f5d05489aa2ff31dfc8ed83aa
|
||||
dbee192b11169e3dd6bd496eacc42c46a952f81f8c39f88ba31ec08f1060d2f2e49c0b900508b4e9e5703
|
||||
003099bc9485e09e5c6a8c9f05389124095b1c9693a30e4b75b7f2e839eb252237a55007ac61fb5268982
|
||||
083d29e757b74c4c310aa1cb03adcafe17afd50a53e4f539fb57a6c5c93ee94cabf36d2375cf0d99ad0dc
|
||||
cabb650f468737745cd0d5e66ca991bfdb46e05371bfa18a034669e967192a53bffce26bf2619a365c21f
|
||||
9f7c54801780c12ad3ff7198e916a1a4451bdcb248aa997d25f312a292c9ae1f70efa6ef1e5df24e48cb4
|
||||
1243ccbee736dc9d32476506126500906db396f312db3d6710669064711709597220dc3367e720819105a
|
||||
f78bfc5a109571b763f44873f4b820af8279d42bff9b5f9da409e0ecb9d6a3485d9bbaf2641461c1cf144
|
||||
eaa2cada36b38beaec87737dd70158735bb9c0ae7de4ddbed353411b8435c80cb2e66a701469c6e65f437
|
||||
1d114775c73d8bfa0ca04b38811b2b31261b86dc2795388577376501aad9658c630d7ac9fa4c1f262d53a
|
||||
91cef7c2990d9597fb2a130985e04233cf178c611be685623ffe5b659af6aad10da3235331fc6f6822fd5
|
||||
cdad3f96e3e1195bcb3c0104ffacf940b570f94ae689924cbba86521af15be9b1148f331ddfa37ad410b8
|
||||
ef99979a56ef1c3c789ffb996507d85383559a229493ad0bab90478d123f0c577ef01c5dc5a3ea28f60d0
|
||||
8409544ea6e44724240b2879f9c2560270e0cc3949af9e22899377635f44cc3fd0120554503d06f4a2b41
|
||||
e42129e7184265b4480edd5031d57368789203fb9a666c1be6692451f684119d85ed4cd88fe63dc1d16fd
|
||||
dc4b8508d04671f837f413a653483f0eee7b5300021735de246ee24d462c5d332c55d4c35c1ab9bd7c9a3
|
||||
d009076a838baa8a88c6fce72f0805ed73221fe98a5941d21a97ab5641d2e54df83c2437fa9cd88dec024
|
||||
1f1254c6a0ca3e85f678eafab8b013459590f87fd580fc0c05f5967a58f4dfe6a89ac1e47e4dc09adc942
|
||||
4336dd355c6f783c2698b8539c3f801f999ce5db3f041cca86b75e3e92e3d98922ef2c191282a7516024d
|
||||
f2949c1e88ea6b53b5d713b57d3edd5c78a978f7d854e487eddc60c7685120980a5cdc259cfb2de591875
|
||||
d88f9b898ef60d6da810b1a07252a56993bb5bba723f4f838ec648e19bf63dedb33eb1dbf07f456b41563
|
||||
c0102cb18220b308ef60908e75a77e6954a4f2993b60c10464dafb40e79e3cf5dce392207e473913e61e2
|
||||
75b090793fe0bc1856b6574cbc6fd1295448b34caa325df832a095266beec91604a2726f33e54e25e9478
|
||||
d859c348ad45ba5b51eda93cba7d957c5d0d76f2de84d225a5cbe6a5553c1311c35f12281d98acc7eec95
|
||||
d7f5e0ff3a0b27c0032b59a656f70d0cc5a042ee5b72365c0c8ee03ab6c48e18f87e050fd9707104924c1
|
||||
59b48edafc57cbb56722f62702390e688a0bd463c95318d3bb13b44033ea78d19c665aea20c67cd7896ff
|
||||
cf2c8e2806e5380f0d53b0b8d30fdb35d496a891dab54d3a4ab1b2a6f4b4091b48b339c5213a6f8c3f8ab
|
||||
9a9873a605494cedf22b17a6defb8ec1a88f471ce7c073ce264fffcf9af0c6a37398491652fae2c29a496
|
||||
6b022fe608c51f28503dcced1d5961186c3889e4d5ea8bc94667c80cf0d6b5f4ccf3d8addbf56b6c78028
|
||||
0850e078f39d2377376e120ad05e930e1c58f50bcf980814c2e38215db50567c8870bdfa9940104591384
|
||||
55fdbb2e260190dfac1743a5d6dc9031b0c89bfeed9f70ffa84a964a185834b4e2d3f299f2c4fea605f4a
|
||||
5a97c51fcc0fad21ead2867dcb8fb6cd6ae2ae271e89477d7dd03c34508d719a037fca0c6cb028112d8be
|
||||
93fa865ba60c7d7e1e017f3f49a9f0114c6fab8fe797cc3a4cc80c2351880347ebd8288895fc210431c8d
|
||||
27ef350588a81c382de3a100f8f8458eebb61e33336b179ae24e397661d622c82169c1081fdb929b9f21b
|
||||
4410a09fab9938c40573757d89a4450a4246deadfe4e5a20f04b6162f06bb0ca4c658a88880df139a5641
|
||||
350edf1d19123cce164d5760b6806ba8ec5584effbb87cd284150ed6a73354f9829f5d22508da40bf8f9c
|
||||
7351c45cf169a3f4e7354faed2f42d9cc08ce051e902f8137a8f79b924e2b3000ed25154e617b5d066ff1
|
||||
a3540eed0a4a3da0618d961115091a6ad9f831c25e2ec9fb1ddfa3c28f365b608fa1dafbb0ba9fe340014
|
||||
60e6af2c2da1e90aedcfb07da4e6603a9879834f16fa45cbe6c2206459058c750e534dfb8fefba9bb473d
|
||||
0f307f2e746f4c4f6f7db41bdcc7eb5d7e4c9d5028ce143cd88ebc1efa56f0e9f3ef939526a3f56ae015b
|
||||
5e42fcb7353f5496cb70baf316c8b1bfc7f26872de3f421e87ac81d4a2f51b6c44dce38a6dc9d93009490
|
||||
d84d81807e517f06c896f8adbaac3d5d8d8b83b220114d0da49dffbc5e2cd1e2b715e671b05aa1fd3b0bc
|
||||
dfdad56f65d0393dd9d1fa384b82ccf9b10b36d929f6b8e433999448f23c6c228bff904c0b91d0490af31
|
||||
3623a76fcc4258e9c8efa7ceb4b82aa0cfc6c362eac5b1e61f2a55ec5d3f401a748acb6b8f2dc4641ef9b
|
||||
d4eaf3d20e399956d36c338902c5e3b7ad13249b03bf248f41bb26de70db4d0b0b4c8dd51f92b5c1e9f3c
|
||||
cc7cb4ae36945a16f6b428caed3514af83885312a6e176d9c555199cf7cf444915362184d82d21538697b
|
||||
10326d0c5bb1e99b44ad644de25edbdd2ba404a45258d0e1682e73a42595b797f5e7a0f8b24159047d98d
|
||||
8fc58ee9e47a5068d791bafecee6422d7bc847757c0800c95e23f3470f41500bc08ab71d671765cda7422
|
||||
7535ba05696c703b90ddaaa6e6973389abbea81600e36229d756f7edcc1aceaaa010f1c5aaa1e6f0def4e
|
||||
b3a04613ce82527a67f8be50d072cbca685922d492df81cf737a69e29bb4248076464ac3fbe88db35864e
|
||||
69b71d1ed5b83f2045f680d9cc5d447f09e5405a5939943511eac648c10aca735209612eab589d2d2716a
|
||||
19059248ce4847f3a809ff04477b8378da77e796109fef7d686a5f067cf3d91aab97bd518f388173d9535
|
||||
26a3a77af043427bc2b2a466735a45846c11204b56a84394d724511efb467722ffde80899d3868a31c7ce
|
||||
4c8c2100bcab717f12eea1eb11a7f28abadbc819ceef1132a57f902aabd43337172b3aec8fc7577bca293
|
||||
50551070615735499b2758b2d9c77d391497393b6ad39e3395834185a76f6ce93fca5376e6f5aa78b11a7
|
||||
63f504781ae3e8a773c91e3899574c4b3bb0221ce8a927d443d5292f3ad13e843146736f457b4477ba6d8
|
||||
f462505b7d3d0fa76dff52f01924e00df97944f69a3abe6564793bba2850b0084e4f8d2ace474a1249daf
|
||||
1a4ffdd4a8df84c8d5ead6909929992ca1b6e58476ff388bf978d091921dda2db3b1121e573eee682e22c
|
||||
d01818ae0b7347e2591dedf20ac857746b82c0d4498744744ccb44ff96857a9609d7a500f243a62106e61
|
||||
8eadffeb5355d5e5e7452f5f50b3de48e75adc2be249b20ccc4aa3f4ea357bf4320d8f42e5a3bad1bd3e4
|
||||
2c659f71caa3736871f9b95887adbc04affecf1076598d898917c0b54c63317478b8b8e65fa2e6b243d7d
|
||||
497cebfef615c9974553feb3d33289577886697b6fb01a8849d4714ddf9688080fb0af0e6fcba733b8019
|
||||
28e7664b3840a02b9aab6307af1dd3fa814045733b53e0adab1ec430c40e184db1ceca1bbd58c4dab244f
|
||||
8683bd4edb6e59470deedebe96080be666b779106de5d6acef113a6c75002424e4812e2d9997dec5391d3
|
||||
aaba00320314f44fac9e7ca9b8996bd0a61b00139a8c1d2c9fc52e6ab9f90eba248ab0b3c4444d4ad1f07
|
||||
ac36878ee68bce6c53801a3019b0fc1f1caa3ea761da821753a949724d3b1dca2457fd2b1df7c7f3879c4
|
||||
dab41a20ab4ced8dd9e8b2ecf554fa412153dbcab52cc68ab4d83f7f310e0c5361f9c780160908816ff2e
|
||||
f457db9aa93807da96de3068bfb63a18660d29d6efeb21b36c3c34abf83ff5847711eb85e052854498474
|
||||
6965ceab0caae4fab0ae83bda024bf17d091132fdbf217f13d1c42e0671e324357c6d668492df202797f4
|
||||
1a4a9be3d7598ee4d4530ca0fea76da94a225d93729eebee40f217a9d0a0dbdf28563a184eb1a71f8c6b0
|
||||
0aa550fb21b0b1af62f98a5a165fb3e79d4265962e976c50875fbd374026e7fbe886eeee146d368899bad
|
||||
54f97308f158ee3c33b290445497414186c47f3b54e78ed4fc8b5bf379b0169908cac2c654edb715f9b1a
|
||||
3bc50992ffe9d4d5ba034b3a7128c50aaf2ec50497e68db2261b78f155900def3ece5d86b86f4a892a846
|
||||
483ace0e008728627219bb71d897c726e9a90259c6fc61e4612ae76e41aa302e3193a0cf5d68d380fc7b0
|
||||
7d41a757a459fc81fabc6336d21206b58f3ff06e390475f4e2b99ca3f0e4c82bb2d353375076d987d0a46
|
||||
54aec2438a4c1dc17bd2dfc45a680fcb3b5144d860424b8890b83be8dba8c30ecb06cddd416e01d1917d2
|
||||
eded83012bc19ae856dae5a6713895338a1f10c76260d61d25cc640292cbbe80897913e69c39a04d7c6b5
|
||||
5e9b54dd661bf4f2fc9900283a6c668f82b8e25d0c750fa2fd00de1355e655b8e690d3d2dd1118d6199b1
|
||||
a2723bc402fb38549bf13cacb217f42ab057fb2610d0f7306765d2c3644ee9384b1a8c0ccf847fdec7386
|
||||
efb25ba2e3ad6a1b489aed02cd8a28be43855e4bb718e7647e299c150173e53855a199fef2a797d2d5e0c
|
||||
454494cc175cdb205117614d1aebe6f402e21eed9dff22cfbcab47ededf6ae22717e83f0b4904c4051df6
|
||||
03fd2ce44bf59f0ca07c065d08113bdf87b6c19891e07832d7d93a6845ddbd15d41cd416dddc8de81dbba
|
||||
ade29c6f48c093c8df3c64aa69f8b1a36b79bc41cde01ab1758878b6dbb6b30c4d3cc5826bcf8ee3d159d
|
||||
20289bf01ddca53c7978e8ca1180924fe3274cf855e2861645b24c527ea3f928e428a578c6cb791c8dc2a
|
||||
96862aff4f0b383cfeaf325748f99510bbbc17158f038103157e293951db33b0307791b45e3750b781678
|
||||
3e8a1eb9d2cffbb619bba9b40d55b3e19643acc3486d8c85e75c536033db333d83be39d5cffc02e1c48c7
|
||||
ed56158365a50e9497474bedf48621f8c1ecb58bb87d99127e7d3b44d9ffdf49a967378b8e4a796f9ba1f
|
||||
62d93433afa53443dcb145a27d2bc0d92b99be04f4142a1c94d497ff9477218caa0b318a04d676447a853
|
||||
a51e725419f58374ed6823cd69ef7421d81009d2151fb4799781da7893177d46e9e39a3d2e5b7a2ef1ee4
|
||||
585a606700a2e387dd4e261ce7840f817f5e80af8852689085ce27157ee2cb5398a78feffff635ab26350
|
||||
11d739455c3fefdf16bd7b1d665a7daeb33019bbc7b4688786e58118f77a41e3879b68124d04a8de72479
|
||||
428d222890cf07608fe56f9ad094c20d668d56d985083cd0c23a85da57e37095afb06c60c2c3664a13747
|
||||
8f03438be98b78baa9af5e4d7fcde06b83952a59f4581ac51471fbc4203032f1fa52de74d804f24d99e3b
|
||||
1ebd7177795f81a996225dbdfaedbaf007f6e92fd1e05f59c8864b55614b3d0a1adddc03198f7310ace88
|
||||
254f71e115b8982d1701f6c4818a35f7c13523b81e2996fdd912c0160abbc2ef5b70c8e0bc5c3588b7269
|
||||
e5152afaeb2cf84d106e2e8b1247754789e5714c600fa3df3502374c53e5bd6bd2bfe4533a3d0bc1ae7a4
|
||||
368e811c1cc1047a0a8c085b2852e365735140404ca72c0e689848c3c4409037924118c59e7791f804152
|
||||
00ea282df22aa541e28d271a27b2e50de4485675bb3c8461ff105a17daea67f2b699a42db0298d44d57ae
|
||||
1dab3294399694f30fd2bdc30fb76637381e941c0f07736638cf8e532076160cd6c2a3810abd6d8ebbac4
|
||||
7491021d878b593b854e41a9786e0dec869a7b038649becb63ee65ba9e20e309020068bb54269c442c542
|
||||
5c0cb1d94785e2e1d98f142320e314010794ad009735fe274cb87e160d55baa8ff9ab8e0fc09f07953fec
|
||||
afb1191fdd9b80d0c493baf72c4797feb7b5349c762d00d48d6c5322c7e58bd34d69fbf47ef9d8f1374c8
|
||||
01198b8c59b97baf58c68a42581f9ff0a98cfd587f2707457e0a2df29616a750fe6877dc35d4e9066a67a
|
||||
9d4b89560bd9fcfd3a896fc8e2b9d944efc4043d0301bdd7ce597c62da276a348adb4c837e925aa95318e
|
||||
c20e305a194511f5cfb91076ac244dd4ee09179584241828134bbba779d16f09b8e54413462ae3a6aab5e
|
||||
ca1340ae5314abe946e1674ad4f3d56b677c226727ca8009229441c5ac10cfeb8ce580629393178d42da0
|
||||
7db214ac6596408353ada7b21f9e0d5d2388308042132d5cfac7940237d2acf9d4b873e0cf804c75412d7
|
||||
fb5736e2cf6461d40009ecdb76ed0ee23d59e08d2be29e5229888a3d102faa676ccfd2cf44ad1dafd7101
|
||||
98087fce312ccf89aaf93d6dbe1f32ee5f745d04018d0ba792281972b35ae99cf9ec3974a3ee233985cb9
|
||||
a065d8219b285f181de26a1f154c73871d9164fc068cf86b97ceedbc0f4ef534efa2ab1e8df7cd850173b
|
||||
24b8e6b3b5e683cbc3f50e79a674e89d51ff0a82a15e0e9952fc5d9468c2301f2fb4f3245692eddf6c690
|
||||
6100640ab1d31acad8d834e55fdbcd7c82ab4334466ce761ee775fddb128a8308773346b73d7e472641b2
|
||||
c7335855d6548d3a1edba40eb98a982694b503bc43fa61c91db1f2e18fce5cf8068be156c31b66554137d
|
||||
cab75b034f18d4933acd5ec95d6d97146d327eadc8afaf00c3917418e421e4151c18d771bd79a7d8b860a
|
||||
1fa9315c8bd847306b07e307c69faeeb0679c12cf4761ee21d809c58c2fa3b729904bc6175f755bce0930
|
||||
ee2203591ff57e87b1ca577c1d7d75b5bf7f8d3215fd57af0f3d35a00c76f702c716ca2b9694ef185ee9d
|
||||
2440cd28e2aa8e2e221c475c866699aa1ed7cc5c2c5e0d98bebab8bfd62aa33002c8ca3a58af1c3668c0b
|
||||
fefcdea7388b9227d3155a06cf94b27ff93b5cf86331915c6c132fe1c092000b5e5f17d36193613ee70f1
|
||||
8f672ab6543a65ab653cd47d13fcc138ae485e41710bb96903a7902a40fd1270697eff8e304bdc5c4797e
|
||||
46c8837b7f644ec9acb11e146706f3a1254928373dc7df81d973dcc6d6b0b0443527a34bc31f9b1af586f
|
||||
a667107ab5577c881aaae1b4725d02233a335be4d419c892a31eb397b9965f59f1532853bf456ad132a40
|
||||
b3ea9d20b079ae07727f18918e5534b528ac5bc18f36a0880b7e29e0eac96456fd09e714ea63a8f79554d
|
||||
9d38fe7033a143c01974e23d44e7e763f8dc193c018572afd4303b40af2bc2a91e6353264b6bd95e8f0a9
|
||||
f683eb1e6e9d1ccabceabe9ff569b4d1d658d81c268a6837ed27b675d1adb1f79878828769778bb92649e
|
||||
a29010509ec07d9d8403a21acdbc0f6032645f02908314537b15c7814092f783adea56561b6de27f7a7e4
|
||||
a50f6014d6b3a7a4b56aef01a7fd3f90d829c77493b3505132a3afd275bb8d8debd2758cc3b574a78db81
|
||||
b5ab1794192090ba341ae33a905fc138e4bb189275babe75a9ac1c94a477a65f70811e62f904cdbaaec9d
|
||||
d8d200571d98308986b748974d9dedfaecad9c6dcfb514aadb1a0dadc351ef2b752ea6e8f31859aff8531
|
||||
9be89de9b76107c4d1fe93e9063e9864559f477498922b1271fb4792c594c942dc7fe8de2c2423804cdb0
|
||||
985dfdc7a68ff2eaf3323e38d5ce269d790cc7fcbe124025e7613e80dbd8edd3cf7ca106bd8650e1531eb
|
||||
2fccac7b1fa5e66f7a94ccca1ed903b1d87500be464280c326167689fd4e99eaa25fd10904afdb9888e94
|
||||
bf505483e26eb3fcaae078d9b4d8b47f0104cb572e12fd4854bd908939a6b714b1ef983f38de0408acddb
|
||||
f560cc1beaf92b1c54f278b13d256011a915ea5ac7085134dd08d9b37ad08e6330891e0010b5809022b13
|
||||
9394127b90a25c0cb5e521cef81c9650d5e976c88dfce8bfc6024f28e8ec0b8a0dd1b6036994e89c5506e
|
||||
75af1a43b033bd55f38f6e37830da7ffc265ae85566927a993c7ac49f7e31a5a2795f198757a6f850d76c
|
||||
2d4770336a73f05709603f660ff24e938454ec9f32b7fd873ab645cab0a82f1b865f5e277723fbe1adeab
|
||||
c17784be0fc90fe7d44fdc6aa5938a6da20045cec6acdca7a15d301ab52f289c6172c1ce4bd19a5d94886
|
||||
2413d2bd975534bc56dfecd733065d7db5df03a6dd807785b95c4acc763a2b570e1983633a446a3740e4a
|
||||
a30e0e065d120560532f673b18f5bb33f9ca949a90850da679bf192c76b72b8a684cbbd17fe6740ef28d9
|
||||
9788c69391e5489dc52f950e6f2d3df79e835d84fa0bcb8d4e0015f4b7e8fc6889db37d2438f9e91c8539
|
||||
1d5785920ae05aeb391dd4a8875326b4b20aad9be2dc5b2127e3e5ab46158140026ed1ecef9ed9d2b1668
|
||||
60d0df8e0b59082f64318c075d08bb5d6d03170261510f8f8996ec8195a4ee7a017c8060da2072673fb62
|
||||
4f49fc542e5c605966a5eaa3cb26ad91721b101a21455c7b34823472cb11d05df5a767daf753e333c6141
|
||||
bce8d5d166cc6aa9b52c298ce0464cbda39d5983bdc3b57bdbb01215e225e275e03914cb1262d07a5086b
|
||||
9ac24b337eae21b1277c6a4937a94c21c44759cb2d8ac5f8cac59caa25d103245c4b462bfe955c927f235
|
||||
1b086bc557baaf187a3fff06999a337b2a45d1cda8002feb0defe27e463050ba93a8474f4540fc22034ef
|
||||
311a054fbe15f03643de443575808244134d5e9dbf7bd6cd939d592453ab3b7accf42cc797a276e63c581
|
||||
63ab521bd1bdad3566bd1b1e10248cf7eeb5757c1f7c8ca9f976f4721b3ff780e7edfe2f37f20116fa090
|
||||
5deb4fef0e5c5f2a303a865e6a0a6090afe237ba4b2c1437b569ec457d48c60dd5d878a93aafe3b3c626a
|
||||
5368fedc33f32696fc88ca4a43b3646aad27a6241bdb5b1c273e57ddebaaa88449c54e63a1c8bc386c918
|
||||
3d7b71bb95b0629e8a8f86973726f16b266c6393e3192f812554e73574679cbf3a67b3bbf969e00c904c9
|
||||
89eb9c9fb19f3608810c72eb528253ac8606b1730b5ce4c3928a763da1399ea3ab531d3174a0a221f95de
|
||||
ebc087b3b230734341b85c618f09865ab7c1dd66c74effa2b573de24b14f1385525873e15ab9d90f0c33d
|
||||
fdcfa19de497675f5a3d9956bc2d66942325017e4132176922f08b478907f0a9e45ec64b23353db1d44e8
|
||||
bb7f4060251afeb9e80dceab454eae609a3f5def899a2a42e4e7b62e7d6ae0735072d268bf7de73573070
|
||||
c03546f57214a1e4ea1035bacba81c14147db07e0675ef87b88c14dd64f23c7e9b45d4dc68ac48e294221
|
||||
af0b0d7b747373b03b7b922620e91ca810a13de10b02d13e139f68204d7ce0a2f8db69335b22b15e0bda4
|
||||
9545435cc769e30273ee40d6d54a45256186ff348a52c0c82c8829fbf79d4e3edcc3f42c08b026b98dba9
|
||||
e985d7597e085a767c3234182a0be06cd0435e40a5af588993f82c34e7651ea17ebee8f7035f29a378964
|
||||
0913d812130e76460ec368c9a9a9607e0ecb66866311044b7f950dac488cd4479baa9a0b728f4c2925f04
|
||||
e7bba448e8913b71178026789b3bf48713f619159a8c4c8347d5ea75e795e66c6662a24c4cd1325ba3bec
|
||||
b127848779badddd62fa895df040135b2983c6c529e2bc097bc4c6c144853940903cecd3e0c8695f14d65
|
||||
08a88c135a332b8def181bb0665d76cb6905cc7b87b2ca298cedc035d716be906a18da568351d3631a46c
|
||||
42beb6925cbec36e3877b42fe660c45983a26230654b1a00e464576ecc4e9e98e3183915bc0bec1d724b6
|
||||
4a7de15520e7f82bec8355d38878b3b2f80b731af2029a0f38c310c75a69b53af4f856c46f9772f028356
|
||||
9dfb581e2caf1595414f3f0d74aa609483c1b
|
||||
''')
|
||||
|
||||
reset=unhex('''
|
||||
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000
|
||||
''')
|
||||
|
||||
usb=Usb()
|
||||
usb.trace_enabled=True
|
||||
#usb.trace_enabled=True
|
||||
usb.open()
|
||||
usb.cmd(blob)
|
||||
usb.cmd(reset)
|
||||
assert_status(usb.cmd(reset_blob))
|
||||
assert_status(usb.cmd(b'\x10' + b'\0'*0x61))
|
||||
reboot()
|
||||
|
|
|
|||
129
flash.py
Normal file
129
flash.py
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
|
||||
from tls97 import tls
|
||||
from struct import pack, unpack
|
||||
from binascii import hexlify, unhexlify
|
||||
from util import assert_status, unhex
|
||||
from blobs import db_write_enable
|
||||
from hw_tables import flash_ic_table_lookup
|
||||
|
||||
class FlashInfo():
|
||||
def __init__(self, ic, blocks, unknown0, blocksize, unknown1, partitions):
|
||||
self.ic, self.blocks, self.unknown0, self.blocksize, self.unknown1, self.partitions = ic, blocks, unknown0, blocksize, unknown1, partitions
|
||||
|
||||
def __repr__(self):
|
||||
return 'FlashInfo(%s, 0x%x, 0x%x, 0x%x, 0x%x, %s)' % (repr(self.ic), self.blocks, self.unknown0, self.blocksize, self.unknown1, repr(self.partitions))
|
||||
|
||||
# type 01 is for the firmware - written blocks are decrypted on the fly using fw key
|
||||
# access lvl:
|
||||
# 2 -- write only
|
||||
# 7 -- can read/write even without TLS
|
||||
class PartitionInfo():
|
||||
def __init__(self, id, type, access_lvl, offset, size):
|
||||
self.id, self.type, self.access_lvl, self.offset, self.size = id, type, access_lvl, offset, size
|
||||
|
||||
def __repr__(self):
|
||||
return 'PartitionInfo(0x%02x, 0x%02x, 0x%04x, 0x%08x, 0x%08x)' % (self.id, self.type, self.access_lvl, self.offset, self.size)
|
||||
|
||||
def get_flash_info():
|
||||
rsp=tls.cmd(unhex('3e'))
|
||||
assert_status(rsp)
|
||||
rsp=rsp[2:]
|
||||
hdr=rsp[:0xe]
|
||||
rsp=rsp[0xe:]
|
||||
jid0, jid1, blocks, unknown0, blocksize, unknown1, pcnt = unpack('<HHHHHHH', hdr)
|
||||
|
||||
ic=flash_ic_table_lookup(jid0, jid1, blocks*blocksize)
|
||||
|
||||
if ic == None:
|
||||
raise Exception('Unknown flash IC. JEDEC id=%x:%x, size=%dx%d' % (jid0, jid1, blocks, blocksize))
|
||||
|
||||
partitions=[rsp[i*0xc:(i+1)*0xc] for i in range(0, pcnt)]
|
||||
partitions=[unpack('<BBHLL', i) for i in partitions]
|
||||
partitions=[PartitionInfo(*i) for i in partitions]
|
||||
|
||||
return FlashInfo(ic, blocks, unknown0, blocksize, unknown1, partitions)
|
||||
|
||||
# >>> 4302 -- get partition header (get fwext info)
|
||||
# b004 -- no fw detected
|
||||
# 0000
|
||||
# 0100 (major) 0100 (minor) 0800 (modules) c28c745a (buildtime)
|
||||
# type subtype major minor size
|
||||
# 0100 3446 0200 0700 d03e0000
|
||||
# 0100 8408 0100 0700 00040000
|
||||
# 0200 8428 0300 1200 e0100000
|
||||
# 0200 7636 0100 0c00 100a0000
|
||||
# 0100 8647 0000 0100 505a0000
|
||||
# 0200 2377 0000 0100 802f0000
|
||||
# 0200 6637 0100 0c00 f0220200
|
||||
# 0100 2556 0000 0100 60040000
|
||||
class ModuleInfo():
|
||||
def __init__(self, type, subtype, major, minor, size):
|
||||
self.type, self.subtype, self.major, self.minor, self.size = type, subtype, major, minor, size
|
||||
|
||||
def __repr__(self):
|
||||
return 'ModuleInfo(0x%04x, 0x%04x, %d, %d, %d)' % (self.type, self.subtype, self.major, self.minor, self.size)
|
||||
|
||||
class FirmwareInfo():
|
||||
def __init__(self, major, minor, buildtime, modules):
|
||||
self.major, self.minor, self.buildtime, self.modules = major, minor, buildtime, modules
|
||||
|
||||
def __repr__(self):
|
||||
return 'FirmwareInfo(%d, %d, %d, %s)' % (self.major, self.minor, self.buildtime, repr(self.modules))
|
||||
|
||||
def get_fw_info(partition):
|
||||
rsp=tls.cmd(pack('<BB', 0x43, partition))
|
||||
|
||||
# don't want to throw exception here - it is normal not to have FW when we're about to upload it
|
||||
if len(rsp) == 2 and rsp[1] == 4 and rsp[0] == 0xb0:
|
||||
return None
|
||||
|
||||
assert_status(rsp)
|
||||
rsp=rsp[2:]
|
||||
hdr=rsp[:0xa]
|
||||
rsp=rsp[0xa:]
|
||||
major, minor, modcnt, buildtime = unpack('<HHHL', hdr)
|
||||
modules=[rsp[i*0xc:(i+1)*0xc] for i in range(0, modcnt)]
|
||||
modules=[unpack('<HHHHL', i) for i in modules]
|
||||
modules=[ModuleInfo(*i) for i in modules]
|
||||
|
||||
return FirmwareInfo(major, minor, buildtime, modules)
|
||||
|
||||
def flush_changes():
|
||||
assert_status(tls.cmd(b'\x1a'))
|
||||
|
||||
def erase_flash(partition):
|
||||
tls.cmd(db_write_enable)
|
||||
tls.cmd(pack('<BB', 0x3f, partition))
|
||||
flush_changes()
|
||||
|
||||
def read_flash(partition, addr, size):
|
||||
cmd = pack('<BBBHLL', 0x40, partition, 1, 0, addr, size)
|
||||
rsp = tls.cmd(cmd)
|
||||
assert_status(rsp)
|
||||
sz, = unpack('<xxLxx', rsp[:8])
|
||||
|
||||
return rsp[8:8+sz]
|
||||
|
||||
def write_flash(partition, addr, buf):
|
||||
tls.cmd(db_write_enable)
|
||||
cmd = pack('<BBBHLL', 0x41, partition, 1, 0, addr, len(buf)) + buf
|
||||
rsp = tls.cmd(cmd)
|
||||
assert_status(rsp)
|
||||
flush_changes()
|
||||
|
||||
def write_flash_all(partition, ptr, buf):
|
||||
bs = 0x1000
|
||||
while len(buf) > 0:
|
||||
chunk, buf = buf[:bs], buf[bs:]
|
||||
write_flash(partition, ptr, chunk)
|
||||
ptr += len(chunk)
|
||||
|
||||
def read_flash_all(partition, start, end):
|
||||
bs = 0x1000
|
||||
blocks = [db.read_flash(partition, addr, bs) for addr in range(start, end, bs)]
|
||||
return b''.join(blocks)
|
||||
|
||||
def write_fw_signature(partition, signature):
|
||||
rsp=tls.cmd(pack('<BBxH', 0x42, partition, len(signature)) + signature)
|
||||
assert_status(rsp)
|
||||
|
||||
485
hw_tables.py
Normal file
485
hw_tables.py
Normal file
|
|
@ -0,0 +1,485 @@
|
|||
|
||||
class DeviceInfo():
|
||||
def __init__(self, major, type, version, version_mask, name):
|
||||
self.major, self.type, self.version, self.version_mask, self.name = major, type, version, version_mask, name
|
||||
|
||||
def __repr__(self):
|
||||
return "DeviceInfo(0x%04x, 0x%04x, 0x%02x, 0x%02x, '%s')" % (
|
||||
self.major, self.type, self.version, self.version_mask, self.name
|
||||
)
|
||||
|
||||
dev_info_table=[
|
||||
DeviceInfo(0x0000, 0x0080, 0x00, 0x00, 'VSI 15A '),
|
||||
DeviceInfo(0x0000, 0x0080, 0x00, 0x00, 'VSI 15A '),
|
||||
DeviceInfo(0x0000, 0x0080, 0x00, 0x00, 'VSI 15A '),
|
||||
DeviceInfo(0x0000, 0x0083, 0x00, 0x00, 'VSI 40A '),
|
||||
DeviceInfo(0x0000, 0x0083, 0x00, 0x00, 'VSI 40A '),
|
||||
DeviceInfo(0x0000, 0x0083, 0x00, 0x00, 'VSI 40A '),
|
||||
DeviceInfo(0x0000, 0x0080, 0x00, 0x00, 'VSI 15B '),
|
||||
DeviceInfo(0x0000, 0x0080, 0x00, 0x00, 'VSI 15B '),
|
||||
DeviceInfo(0x0000, 0x0080, 0x00, 0x00, 'VSI 15B '),
|
||||
DeviceInfo(0x0000, 0x0089, 0x00, 0x00, 'VSI 32A '),
|
||||
DeviceInfo(0x0000, 0x0089, 0x00, 0x00, 'VSI 32A '),
|
||||
DeviceInfo(0x0000, 0x0089, 0x00, 0x00, 'VSI 32A '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x01, 0xff, 'SYN 73A0 FM113-001 '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x02, 0xff, 'SYN 73A0 FM125-001 '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x03, 0xff, 'SYN 73A0 FM132-001 '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x04, 0xff, 'SYN 73A0 FM132-002 '),
|
||||
DeviceInfo(0x0049, 0x143b, 0x09, 0xff, 'SYN 73A0 FM132-003 '),
|
||||
DeviceInfo(0x0049, 0x143b, 0x0a, 0xff, 'SYN 73A0 FM132-004 '),
|
||||
DeviceInfo(0x0049, 0x143b, 0x0c, 0xff, 'SYN 73A0 FM132-005 '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x06, 0xff, 'SYN 73A0 FM144-001 '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x07, 0xff, 'SYN 73A0 FM113-002 '),
|
||||
DeviceInfo(0x0049, 0x00b3, 0x08, 0xff, 'SYN 73A0 FM159-001 '),
|
||||
DeviceInfo(0x0049, 0x143b, 0x0d, 0xff, 'SYN 73A0 FM132-006 '),
|
||||
DeviceInfo(0x0049, 0x143b, 0x0e, 0xff, 'SYN 73A0 FM132-007 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x01, 0xff, 'SYN 57K0 '),
|
||||
DeviceInfo(0x004a, 0x0885, 0x02, 0xff, 'SYN 57K1 '),
|
||||
DeviceInfo(0x004a, 0x1055, 0x03, 0xff, 'SYN 57K0 HEK '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x05, 0xff, 'SYN 57K0 Gold1 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x06, 0xff, 'SYN 57K0 Gold2 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x07, 0xff, 'SYN 57K0 Gold3 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x08, 0xff, 'SYN 57K0 Silver '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x09, 0xff, 'SYN 57K0 FM114-001 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x0a, 0xff, 'SYN 57K0 FM94-006 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x0b, 0xff, 'SYN 57K0 FM94-007 '),
|
||||
DeviceInfo(0x004a, 0x1825, 0x0c, 0xff, 'SYN 57K0 FM154-001 '),
|
||||
DeviceInfo(0x004a, 0x1825, 0x0d, 0xff, 'SYN 57K0 FM155-001 '),
|
||||
DeviceInfo(0x004a, 0x1825, 0x0e, 0xff, 'SYN 57K0 FM154-002 '),
|
||||
DeviceInfo(0x004a, 0x1825, 0x0f, 0xff, 'SYN 57K0 FM154-003 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x10, 0xff, 'SYN 57K0 FM94-009 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x11, 0xff, 'SYN 57K0 FM94-010 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x12, 0xff, 'SYN 57K0 FM94-011 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x13, 0xff, 'SYN 57K0 FM3297-02 '),
|
||||
DeviceInfo(0x004a, 0x00b5, 0x14, 0xff, 'SYN 57K0 FM3297-03 '),
|
||||
DeviceInfo(0x0000, 0x00b5, 0x00, 0x00, 'SYN 57F '),
|
||||
DeviceInfo(0x0000, 0x00b5, 0x00, 0x00, 'SYN 57E '),
|
||||
DeviceInfo(0x0000, 0x00bc, 0x00, 0x00, 'SYN 74A '),
|
||||
DeviceInfo(0x0000, 0x00bc, 0x00, 0x00, 'SYN 74A '),
|
||||
DeviceInfo(0x0000, 0x00be, 0x00, 0x00, 'VSI 19A '),
|
||||
DeviceInfo(0x0000, 0x00be, 0x00, 0x00, 'VSI 19A '),
|
||||
DeviceInfo(0x0000, 0x00be, 0x00, 0x00, 'VSI 19A '),
|
||||
DeviceInfo(0x0000, 0x00c1, 0x00, 0x00, 'VSI 50A '),
|
||||
DeviceInfo(0x0000, 0x00c2, 0x00, 0x00, 'VSI 51A '),
|
||||
DeviceInfo(0x0000, 0x00c3, 0x00, 0x00, 'VSI 50B '),
|
||||
DeviceInfo(0x0000, 0x00c4, 0x00, 0x00, 'VSI 52A '),
|
||||
DeviceInfo(0x0000, 0x00c4, 0x00, 0x00, 'VSI 52A '),
|
||||
DeviceInfo(0x0000, 0x00c4, 0x00, 0x00, 'VSI 52A '),
|
||||
DeviceInfo(0x0000, 0x00ca, 0x00, 0x00, 'VSI 55C '),
|
||||
DeviceInfo(0x0000, 0x00ca, 0x00, 0x00, 'VSI 55A '),
|
||||
DeviceInfo(0x0000, 0x00ca, 0x00, 0x00, 'VSI 55A '),
|
||||
DeviceInfo(0x0000, 0x00cd, 0x00, 0x00, 'VSI 25B '),
|
||||
DeviceInfo(0x0000, 0x00cd, 0x00, 0x00, 'VSI 25B '),
|
||||
DeviceInfo(0x0000, 0x00d1, 0x00, 0x00, 'SYN 110A0 '),
|
||||
DeviceInfo(0x0000, 0x00d2, 0x00, 0x00, 'VSI 54A '),
|
||||
DeviceInfo(0x0000, 0x00d3, 0x00, 0x00, 'VSI 59A '),
|
||||
DeviceInfo(0x0000, 0x00d4, 0x00, 0x00, 'VSI 54A '),
|
||||
DeviceInfo(0x0000, 0x00d6, 0x00, 0x00, 'VSI 70A '),
|
||||
DeviceInfo(0x0000, 0x00d7, 0x00, 0x00, 'VSI 71A '),
|
||||
DeviceInfo(0x0070, 0x00da, 0x01, 0xff, 'VSI 55D '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x01, 0xff, 'VSI 55E FM72-001 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x02, 0xff, 'VSI 55E FM72-002 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x03, 0xff, 'VSI 55E FM72-003 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x04, 0xff, 'VSI 55E FM72-004 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x05, 0xff, 'VSI 55E FM160-001 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x06, 0xff, 'VSI 55E FM160-002 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x07, 0xff, 'VSI 55E FM187-001 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x08, 0xff, 'VSI 55E FM187-002 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x09, 0xff, 'VSI 55E FM187-003 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x0a, 0xff, 'VSI 55E FM160-003 '),
|
||||
DeviceInfo(0x0071, 0x04c3, 0x0b, 0xff, 'VSI 55E FM191-001 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x0c, 0xff, 'VSI 55E FM187-004 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x0d, 0xff, 'VSI 55E FM209-001 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x0e, 0xff, 'VSI 55E FM209-002 '),
|
||||
DeviceInfo(0x0071, 0x00db, 0x0f, 0xff, 'VSI 55E FM3292-001'),
|
||||
DeviceInfo(0x0000, 0x00dd, 0x00, 0x00, 'SYN 85A '),
|
||||
DeviceInfo(0x0074, 0x08ae, 0x02, 0xff, 'SYN 109A FM146-001 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x01, 0xff, 'SYN 109A FM146-002 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x03, 0xff, 'SYN 109A FM146-003 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x04, 0xff, 'SYN 109A FM182-001 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x05, 0xff, 'SYN 109A FM192-001 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x06, 0xff, 'SYN 109A FM192-002 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x07, 0xff, 'SYN 109A FM192-003 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x08, 0xff, 'SYN 109A FM192-004 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x09, 0xff, 'SYN 109A FM192-005 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x0a, 0xff, 'SYN 109A FM192-006 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x0b, 0xff, 'SYN 109A FM192-007 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x0c, 0xff, 'SYN 109A FM192-008 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x0d, 0xff, 'SYN 109A FM193-001 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x0e, 0xff, 'SYN 109A FM194-001 '),
|
||||
DeviceInfo(0x0074, 0x00de, 0x11, 0xff, 'SYN 109A FM190-003 '),
|
||||
DeviceInfo(0x0077, 0x00e1, 0x01, 0xff, 'SYN 75B '),
|
||||
DeviceInfo(0x0077, 0x08b1, 0x03, 0xff, 'SYN 75B0 FM148-001 '),
|
||||
DeviceInfo(0x0077, 0x08b1, 0x04, 0xff, 'SYN 75B0 FM148-002 '),
|
||||
DeviceInfo(0x0077, 0x08b1, 0x05, 0xff, 'SYN 75B0 FM148-003 '),
|
||||
DeviceInfo(0x0077, 0x08b1, 0x06, 0xff, 'SYN 75B0 FM148-004 '),
|
||||
DeviceInfo(0x007a, 0x00e4, 0x01, 0xff, 'SYN 57K2 Ofilm '),
|
||||
DeviceInfo(0x007a, 0x00e4, 0x02, 0xff, 'SYN 57K2 ASE '),
|
||||
DeviceInfo(0x007a, 0x00e4, 0x03, 0xff, 'SYN 57K2 FM156-001 '),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x01, 0xff, 'SYN 73A1 '),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x02, 0xff, 'SYN 73A01 FM152-001'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x03, 0xff, 'SYN 73A01 FM152-002'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x06, 0xff, 'SYN 73A01 FM152-003'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x07, 0xff, 'SYN 73A01 FM152-004'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x04, 0xff, 'SYN 73A01 FM153-001'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x05, 0xff, 'SYN 73A01 FM153-002'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x08, 0xff, 'SYN 73A01 FM153-003'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x09, 0xff, 'SYN 73A01 FM153-004'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x0a, 0xff, 'SYN 73A01 FM152-005'),
|
||||
DeviceInfo(0x007f, 0x00b3, 0x0b, 0xff, 'SYN 73A01 FM153-005'),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x01, 0xff, 'SYN 77A0 FM133-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x02, 0xff, 'SYN 77A0 FM133-002 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x03, 0xff, 'SYN 77A0 FM133-003 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x04, 0xff, 'SYN 77A0 FM-143-001'),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x05, 0xff, 'SYN 77A0 FM143-002 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x06, 0xff, 'SYN 77A0 FM143-003 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x07, 0xff, 'SYN 77A0 FM147-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x08, 0xff, 'SYN 77A0 FM157-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x09, 0xff, 'SYN 77A0 FM179-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x0a, 0xff, 'SYN 77A0 FM157-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x0b, 0xff, 'SYN 77A0 FM133-004 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x0c, 0xff, 'SYN 77A0 FM143-004 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x0d, 0xff, 'SYN 77A0 FM133-005 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x0e, 0xff, 'SYN 77A0 FM133-006 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x0f, 0xff, 'SYN 77A0 FM133-007 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x10, 0xff, 'SYN 77A0 FM143-005 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x11, 0xff, 'SYN 77A0 FM180-002 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x13, 0xff, 'SYN 77A0 FM195-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x16, 0xff, 'SYN 77A0 FM232-001 '),
|
||||
DeviceInfo(0x0080, 0x00ea, 0x07, 0xff, 'SYN 77B0 FM147-001 '),
|
||||
DeviceInfo(0x0083, 0x00ed, 0x01, 0xff, 'SYN 57L '),
|
||||
DeviceInfo(0x0083, 0x00ed, 0x02, 0xff, 'SYN 57L0 FM3299-001'),
|
||||
DeviceInfo(0x0083, 0x00ed, 0x03, 0xff, 'SYN 57L0 FM211-001 '),
|
||||
DeviceInfo(0x0049, 0x04d5, 0x05, 0xff, 'SYN 57L FM-151-001 '),
|
||||
DeviceInfo(0x0049, 0x00ed, 0x0b, 0xff, 'SYN 57L FM-151-002 '),
|
||||
DeviceInfo(0x0000, 0x00f6, 0x00, 0x00, 'ENG-UG1-R1 '),
|
||||
DeviceInfo(0x0092, 0x00fc, 0x01, 0xff, 'SYN 76A '),
|
||||
DeviceInfo(0x0000, 0x00fd, 0x00, 0x00, 'SYN 79A '),
|
||||
DeviceInfo(0x0000, 0x00fe, 0x00, 0x00, 'SYN 77A '),
|
||||
DeviceInfo(0x0000, 0x00ff, 0x00, 0x00, 'SYN 78A '),
|
||||
DeviceInfo(0x00a4, 0x08de, 0x01, 0xff, 'SYN 82ES '),
|
||||
DeviceInfo(0x0000, 0x0110, 0x00, 0x00, 'SYN 80A '),
|
||||
DeviceInfo(0x0000, 0x0111, 0x00, 0x00, 'SYN 82P '),
|
||||
DeviceInfo(0x0000, 0x0112, 0x00, 0x00, 'SYN 82F '),
|
||||
DeviceInfo(0x0000, 0x0115, 0x00, 0x00, 'SYN 87C '),
|
||||
DeviceInfo(0x00ae, 0x0116, 0x03, 0xff, 'SYN 81D FM119-002 '),
|
||||
DeviceInfo(0x00ae, 0x04fe, 0x04, 0xff, 'SYN 81D FM119-003 '),
|
||||
DeviceInfo(0x0000, 0x011c, 0x00, 0x00, 'SYN 90A '),
|
||||
DeviceInfo(0x0000, 0x011d, 0x00, 0x00, 'SYN 89A '),
|
||||
DeviceInfo(0x0000, 0x011e, 0x00, 0x00, 'SYN 80A '),
|
||||
DeviceInfo(0x0000, 0x011f, 0x00, 0x00, 'SYN 80A '),
|
||||
DeviceInfo(0x0000, 0x0120, 0x00, 0x00, 'SYN 87D '),
|
||||
DeviceInfo(0x00b7, 0x0b4b, 0x01, 0xff, 'SYN 86C FM115-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x18, 0xff, 'SYN 86C FM115-002 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x13, 0xff, 'SYN 86C FM115-003 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x14, 0xff, 'SYN 86C FM115-004 '),
|
||||
DeviceInfo(0x00b7, 0x0b4b, 0x02, 0xff, 'SYN 86C FM117-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x09, 0xff, 'SYN 86C FM117-002 '),
|
||||
DeviceInfo(0x00b7, 0x0b4c, 0x17, 0xff, 'SYN 86C FM117-004 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x1b, 0xff, 'SYN 86C FM149-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x1c, 0xff, 'SYN 86C FM149-002 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x1d, 0xff, 'SYN 86C FM149-003 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x1e, 0xff, 'SYN 86C FM149-004 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x1f, 0xff, 'SYN 86C FM149-005 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x20, 0xff, 'SYN 86C FM149-006 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x21, 0xff, 'SYN 86C FM149-007 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x22, 0xff, 'SYN 86C FM149-008 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x24, 0xff, 'SYN 86C FM161-001 '),
|
||||
DeviceInfo(0x00b7, 0x0b4d, 0x3b, 0xff, 'SYN 86C FM161-002 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x26, 0xff, 'SYN 86C FM163-004 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x29, 0xff, 'SYN 86C FM166-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x2a, 0xff, 'SYN 86C FM166-002 '),
|
||||
DeviceInfo(0x00b7, 0x0b4d, 0x2f, 0xff, 'SYN 86C FM166-003 '),
|
||||
DeviceInfo(0x00b7, 0x0b4d, 0x31, 0xff, 'SYN 86C FM166-005 '),
|
||||
DeviceInfo(0x00b7, 0x0b4b, 0x32, 0xff, 'SYN 86C FM166-006 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x33, 0xff, 'SYN 86C FM166-007 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x3c, 0xff, 'SYN 86C FM166-008 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x38, 0xff, 'SYN 86C FM166-009 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x3a, 0xff, 'SYN 86C FM166-011 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x3d, 0xff, 'SYN 86C FM166-012 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x2e, 0xff, 'SYN 86C FM172-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x34, 0xff, 'SYN 86C FM172-002 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x35, 0xff, 'SYN 86C FM172-003 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x36, 0xff, 'SYN 86C FM172-004 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x42, 0xff, 'SYN 86C FM224-001 '),
|
||||
DeviceInfo(0x00b7, 0x0509, 0x44, 0xff, 'SYN 86C FM231-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x45, 0xff, 'SYN 86C FM231-002 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x4d, 0xff, 'SYN 86C FM163-005 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x46, 0xff, 'SYN 86C FM163-002 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x47, 0xff, 'SYN 86C FM163-003 '),
|
||||
DeviceInfo(0x00b7, 0x2449, 0x48, 0xff, 'SYN 86C FM03290001'),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x49, 0xff, 'SYN 86C FM235-001 '),
|
||||
DeviceInfo(0x00b7, 0x0121, 0x4a, 0xff, 'SYN 86C FM235-002 '),
|
||||
DeviceInfo(0x00b7, 0x2449, 0x37, 0xff, 'SYN 86C TM03267001'),
|
||||
DeviceInfo(0x0000, 0x0122, 0x00, 0x00, 'SYN 82T4 '),
|
||||
DeviceInfo(0x00b9, 0x08f3, 0x04, 0xff, 'SYN 82E1 '),
|
||||
DeviceInfo(0x00b9, 0x08f3, 0x05, 0xff, 'SYN 82E2 '),
|
||||
DeviceInfo(0x00b9, 0x08f3, 0x06, 0xff, 'SYN 82E3 '),
|
||||
DeviceInfo(0x0000, 0x0124, 0x00, 0x00, 'SYN 83A '),
|
||||
DeviceInfo(0x0000, 0x0125, 0x00, 0x00, 'SYN 84C '),
|
||||
DeviceInfo(0x00bc, 0x0126, 0x04, 0xff, 'SYN 86A FM78-001 '),
|
||||
DeviceInfo(0x00bc, 0x0126, 0x05, 0xff, 'SYN 86A FM78-002 '),
|
||||
DeviceInfo(0x00bc, 0x0126, 0x06, 0xff, 'SYN 86A FM78-003 '),
|
||||
DeviceInfo(0x00bc, 0x0126, 0x07, 0xff, 'SYN 86A FM91-001 '),
|
||||
DeviceInfo(0x00bc, 0x0126, 0x0a, 0xff, 'SYN 86A FM91-002 '),
|
||||
DeviceInfo(0x00bc, 0x0126, 0x0b, 0xff, 'SYN 86A FM91-003 '),
|
||||
DeviceInfo(0x00bd, 0x0127, 0x01, 0xff, 'SYN 82E5 FS8203BT12'),
|
||||
DeviceInfo(0x0000, 0x012f, 0x00, 0x00, 'SYN 101A '),
|
||||
DeviceInfo(0x00c6, 0x0130, 0x01, 0xff, 'SYN 88B FM141-001 '),
|
||||
DeviceInfo(0x00c6, 0x0be1, 0x03, 0xff, 'SYN 88B FM141-003 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x05, 0xff, 'SYN 88B FM141-004 '),
|
||||
DeviceInfo(0x00c6, 0x0130, 0x06, 0xff, 'SYN 88B FM196-001 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x07, 0xff, 'SYN 88B FM196-002 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x08, 0xff, 'SYN 88B FM196-003 '),
|
||||
DeviceInfo(0x00c6, 0x0be1, 0x09, 0xff, 'SYN 88B FM196-004 '),
|
||||
DeviceInfo(0x00c6, 0x0130, 0x0b, 0xff, 'SYN 88B FM196-005 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x0c, 0xff, 'SYN 88B FM196-006 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x0d, 0xff, 'SYN 88B FM196-007 '),
|
||||
DeviceInfo(0x00c6, 0x0be1, 0x0e, 0xff, 'SYN 88B FM196-008 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x10, 0xff, 'SYN 88B FM196-009 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x11, 0xff, 'SYN 88B FM196-010 '),
|
||||
DeviceInfo(0x00c6, 0x0be1, 0x0a, 0xff, 'SYN 88B FM205-001 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x12, 0xff, 'SYN 88B FM241-001 '),
|
||||
DeviceInfo(0x00c6, 0x0130, 0x15, 0xff, 'SYN 88B FM241-002 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x16, 0xff, 'SYN 88B FM241-003 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x17, 0xff, 'SYN 88B FM241-004 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x18, 0xff, 'SYN 88B FM241-005 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x19, 0xff, 'SYN 88B FM241-006 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x21, 0xff, 'SYN 88B FM241-007 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x22, 0xff, 'SYN 88B FM241-008 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x13, 0xff, 'SYN 88B FM245-001 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x14, 0xff, 'SYN 88B FM245-002 '),
|
||||
DeviceInfo(0x00c6, 0x0130, 0x1a, 0xff, 'SYN 88B FM245-003 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x1b, 0xff, 'SYN 88B FM245-004 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x1d, 0xff, 'SYN 88B FM264-001 '),
|
||||
DeviceInfo(0x00c6, 0x0130, 0x1e, 0xff, 'SYN 88B FM264-002 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x1f, 0xff, 'SYN 88B FM264-003 '),
|
||||
DeviceInfo(0x00c6, 0x0be2, 0x20, 0xff, 'SYN 88B FM264-004 '),
|
||||
DeviceInfo(0x00c6, 0x0518, 0x23, 0xff, 'SYN 88B FM264-005 '),
|
||||
DeviceInfo(0x0000, 0x016f, 0x00, 0x00, 'VSI 57D '),
|
||||
DeviceInfo(0x0000, 0x016d, 0x00, 0x00, 'VSI 57A '),
|
||||
DeviceInfo(0x0000, 0x016f, 0x00, 0x00, 'VSI 57B '),
|
||||
DeviceInfo(0x0000, 0x016f, 0x00, 0x00, 'VSI 57B '),
|
||||
DeviceInfo(0x0107, 0x0171, 0x01, 0xff, 'SYN 76A '),
|
||||
DeviceInfo(0x0000, 0x0179, 0x00, 0x00, 'ENG VIPER FPGA '),
|
||||
DeviceInfo(0x0000, 0x017c, 0x00, 0x00, 'SYNA 106A '),
|
||||
DeviceInfo(0x0112, 0x017c, 0x01, 0xff, 'SYNA 106A FM225-001'),
|
||||
DeviceInfo(0x0114, 0x017e, 0x01, 0x00, 'SYNA 86D '),
|
||||
DeviceInfo(0x011b, 0x0185, 0x02, 0xff, 'SYN 82ES3 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x01, 0xff, '86C FM-3290-002 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x02, 0xff, '86C FM-3324-001 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x03, 0xff, '88B0 FM-3316-001 '),
|
||||
DeviceInfo(0x0190, 0x1ff5, 0x04, 0xff, '57K0 FM-3328-001 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x05, 0xff, '57K0 FM-3297-004 '),
|
||||
DeviceInfo(0x0190, 0x0c6d, 0x06, 0xff, '57K0 FM-3297-005 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x07, 0xff, '57K0 FM-3297-006 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x08, 0xff, '57K0 FM-3297-007 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x09, 0xff, '57K0 FM-3297-008 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x0a, 0xff, '57K0 FM-3297-009 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x0b, 0xff, '57K0 FM-3297-010 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x0c, 0xff, '57K0 FM-3297-011 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x0d, 0xff, '88B0 FM-3300-001 '),
|
||||
DeviceInfo(0x0190, 0x04c3, 0x0e, 0xff, '55E FM3327-FM3342 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x0f, 0xff, '57L0 FM-3331-001 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x10, 0xff, '57L0 FM-3331-002 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x11, 0xff, '57L0 FM-3331-003 '),
|
||||
DeviceInfo(0x0190, 0x0580, 0x12, 0xff, '88B0 FM-3310-001 '),
|
||||
DeviceInfo(0x0190, 0x0580, 0x13, 0xff, '88B0 FM-3310-002 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x14, 0xff, '57L0 FM- 151-003 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x15, 0xff, '57L0 FM- 211-002 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x16, 0xff, '57L0 FM-3299-002 '),
|
||||
DeviceInfo(0x0190, 0x0d49, 0x17, 0xff, '57L0 FM-3331-004 '),
|
||||
DeviceInfo(0x0190, 0x1131, 0x18, 0xff, '57L0 FM-3331-005 '),
|
||||
DeviceInfo(0x0190, 0x0197, 0x19, 0xff, '73A0 FM-3332-001 '),
|
||||
DeviceInfo(0x0190, 0x0195, 0x1a, 0xff, '86D TM3329-001-003'),
|
||||
DeviceInfo(0x0190, 0x0195, 0x1b, 0xff, '86D TM3329-002-006'),
|
||||
DeviceInfo(0x0190, 0x0196, 0x1c, 0xff, '57K0 FM- 155-003 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x1d, 0xff, '86C TM-3315-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x1e, 0xff, '86C TM-3315-002 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x1f, 0xff, '86C TM-3322-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x20, 0xff, '86C FM-3326-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x21, 0xff, '86C FM-3208-002 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x22, 0xff, '86C FM-3340-001 '),
|
||||
DeviceInfo(0x0190, 0x0196, 0x23, 0xff, '57K0 FM- 155-004 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x24, 0xff, '57K0 FM-3297-012 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x25, 0xff, '57K0 FM-3297-013 '),
|
||||
DeviceInfo(0x0190, 0x0197, 0x26, 0xff, '73A0 FM-3341-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x28, 0xff, '86C TM-3315-003 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x29, 0xff, '57K0 FM-3297-020 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x2a, 0xff, '57K0 FM-3297-021 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x2b, 0xff, '57K0 FM-3297-022 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x2c, 0xff, '57K0 FM-3297-023 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x2d, 0xff, '57K0 FM-3297-024 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x2e, 0xff, '57K0 FM-3297-025 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x2f, 0xff, '57K0 FM-3297-026 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x30, 0xff, '57K0 FM-3297-027 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x31, 0xff, '57K0 FM-3297-028 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x32, 0xff, '57K0 FM-3297-029 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x33, 0xff, '57K0 FM-3297-030 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x34, 0xff, '57K0 FM-3297-031 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x35, 0xff, '57K0 FM-3297-014 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x36, 0xff, '57K0 FM-3297-015 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x37, 0xff, '57K0 FM-3297-032 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x38, 0xff, '57K0 FM-3297-033 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x39, 0xff, '88B0 FM-3300-002 '),
|
||||
DeviceInfo(0x0190, 0x00de, 0x3a, 0xff, '109A_FM-3302-001 '),
|
||||
DeviceInfo(0x0190, 0x057e, 0x3b, 0xff, '57K0 FM- 154-020 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x3c, 0xff, '57K0 FM- 154-021 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x3d, 0xff, '86C TM-3226-001 '),
|
||||
DeviceInfo(0x0190, 0x0195, 0x3e, 0xff, '86D TM3329-004-007'),
|
||||
DeviceInfo(0x0190, 0x0196, 0x3f, 0xff, '57K0 FM- 155-002 '),
|
||||
DeviceInfo(0x0190, 0x1825, 0x41, 0xff, '57K0 FM- 154-001 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x42, 0xff, '57K0 FM- 154-022 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x43, 0xff, '88B0FM3358-1 3359-2'),
|
||||
DeviceInfo(0x0190, 0x057b, 0x44, 0xff, '88B0 FM-3358-002 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x45, 0xff, '88B0 FM-3359-001 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x46, 0xff, '57K0 FM-3297-100 '),
|
||||
DeviceInfo(0x0190, 0x057e, 0x47, 0xff, '57K0 FM- 154-200 '),
|
||||
DeviceInfo(0x0190, 0x0000, 0x48, 0xff, '115C0FM-3363-001 '),
|
||||
DeviceInfo(0x0190, 0x0198, 0x49, 0xff, '88B0 FM-3366-001 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x4a, 0xff, '57K0 FM-3367-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x4b, 0xff, '86C TM-3368-001 '),
|
||||
DeviceInfo(0x0190, 0x00db, 0x4c, 0xff, '55E FM- 209-005 '),
|
||||
DeviceInfo(0x0190, 0x0000, 0x4d, 0xff, '115C0FM-3371-001 '),
|
||||
DeviceInfo(0x0190, 0x0000, 0x4e, 0xff, '115C0FM-3372-001 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x4f, 0xff, '57K0 FM- 154-023 '),
|
||||
DeviceInfo(0x0190, 0x0580, 0x50, 0xff, '88B0 FM-3373-001 '),
|
||||
DeviceInfo(0x0190, 0x00db, 0x51, 0xff, '55E FM- 209-006 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x52, 0xff, '57K0 FM- 154-001 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x53, 0xff, '57K0 FM- 154-002 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x54, 0xff, '57K0 FM- 154-003 '),
|
||||
DeviceInfo(0x0190, 0x0d51, 0x55, 0xff, '57K0 FM- 154-020 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x56, 0xff, '57K0 FM- 155-001 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x57, 0xff, '57K0 FM- 155-002 '),
|
||||
DeviceInfo(0x0190, 0x0195, 0x58, 0xff, '86D TM-3329-005 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x59, 0xff, '57K0 FM-3367-002 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x5a, 0xff, '57K0 FM-3367-003 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x5b, 0xff, '57K0 FM-3367-004 '),
|
||||
DeviceInfo(0x0190, 0x00db, 0x5c, 0xff, '55E FM- 160-004 '),
|
||||
DeviceInfo(0x0190, 0x0968, 0x5d, 0xff, '88B0 FM-3366-002 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x5e, 0xff, '86C TM-P3376-P3404'),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x5f, 0xff, '57K0 FM-3380-001 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x60, 0xff, '57K0 FM-3380-002 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x61, 0xff, '57K0 FM-3380-003 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x62, 0xff, '57K0 FM-3380-004 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x63, 0xff, '86C FM-3290-003 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x64, 0xff, '88B0 FM-3358-003 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x65, 0xff, '86C FM-3389-001 '),
|
||||
DeviceInfo(0x0190, 0x0000, 0x66, 0xff, '115C0FM-3363-002 '),
|
||||
DeviceInfo(0x0190, 0x0000, 0x67, 0xff, '115C0FM-3363-003 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x68, 0xff, '57K0 FM-3367-005 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x69, 0xff, '57K0 FM-3367-006 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x6a, 0xff, '57K0 FM-3380-001 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x6b, 0xff, '57L0 FM-3396-001 '),
|
||||
DeviceInfo(0x0190, 0x0191, 0x6c, 0xff, '57L0 FM-3397-001 '),
|
||||
DeviceInfo(0x0190, 0x0000, 0x6d, 0xff, '115C0TM-P3374-100 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x6e, 0xff, '86C TM3261-003-004'),
|
||||
DeviceInfo(0x0190, 0x0581, 0x6f, 0xff, '57K0 FM-3395-001 '),
|
||||
DeviceInfo(0x0190, 0x0d51, 0x70, 0xff, '57K0 FM- 154-120 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x71, 0xff, '57K0 FM- 154-123 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x72, 0xff, '57K0 FM-3401-001 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x73, 0xff, '57K0 FM-3401-004 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x74, 0xff, '57K0 FM-3401-005 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x75, 0xff, '57K0 FM-3401-006 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x76, 0xff, '57K0 FM-155-005/006'),
|
||||
DeviceInfo(0x0190, 0x0193, 0x77, 0xff, '88B0 FM-3366-001 '),
|
||||
DeviceInfo(0x0190, 0x0d4b, 0x78, 0xff, '88B0 FM-3366-002 '),
|
||||
DeviceInfo(0x0190, 0x0c6d, 0x79, 0xff, '57K0 FM-3297-034 '),
|
||||
DeviceInfo(0x0190, 0x00b5, 0x7a, 0xff, '57K0 FM-3297-035 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x7b, 0xff, '88B0 FM-3358-004 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x7c, 0xff, '88B0 FM-3358-005 '),
|
||||
DeviceInfo(0x0190, 0x0963, 0x7d, 0xff, '88B0 FM-3358-006 '),
|
||||
DeviceInfo(0x0190, 0x00de, 0x00, 0xff, '109A_FM-3302-001 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x7e, 0xff, '57K0 FM-155-007 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x82, 0xff, '57K0 FM-155-102 '),
|
||||
DeviceInfo(0x0190, 0x00de, 0x7f, 0xff, '109A_FM-3435-001 '),
|
||||
DeviceInfo(0x0190, 0x0d51, 0x83, 0xff, '57K0 FM-3439-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x84, 0xff, '86C FM-3324-002 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x85, 0xff, '57K0 FM-3439-002 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0x86, 0xff, '86C FM-3324-003 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x87, 0xff, '57K0 FM-3439-003 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x88, 0xff, '57K0 FM-3439-004 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x89, 0xff, '57K0 FM-155-008 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x8a, 0xff, '57K0 FM-154-124 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x8b, 0xff, '88B0 FM-3358-007 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x8c, 0xff, '57K0 FM-3439-005 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x8d, 0xff, '57K0 FM-3439-006 '),
|
||||
DeviceInfo(0x0190, 0x0199, 0x8e, 0xff, '57K0 FM-155-103 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x8f, 0xff, '57K0 FM-154-125 '),
|
||||
DeviceInfo(0x0190, 0x0581, 0x90, 0xff, '57K0 FM-3439-007 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x91, 0xff, '57K0 FM-3439-008 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x92, 0xff, '57K0 FM-3439-009 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x93, 0xff, '57K0 FM-3439-010 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x94, 0xff, '57K0 FM-3439-011 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x95, 0xff, '57K0 FM-3439-108 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x96, 0xff, '57K0 FM-3439-109 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x97, 0xff, '57K0 FM-3439-110 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x98, 0xff, '88B0 FM-3358-008 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0x99, 0xff, '88B0 FM-3358-009 '),
|
||||
DeviceInfo(0x0190, 0x0d51, 0x9a, 0xff, '57K0 FM-3439-101 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x9b, 0xff, '57K0 FM-3439-102 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x9c, 0xff, '57K0 FM-3439-012 '),
|
||||
DeviceInfo(0x0190, 0x1139, 0x9d, 0xff, '57K0 FM-3439-013 '),
|
||||
DeviceInfo(0x0190, 0x0969, 0x9e, 0xff, '57K0 FM-3439-014 '),
|
||||
DeviceInfo(0x0190, 0x0c6d, 0x9f, 0xff, '57K0 FM-3297-036 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0xa0, 0xff, '88B0 FM-3358-010 '),
|
||||
DeviceInfo(0x0190, 0x057b, 0xa1, 0xff, '88B0 FM-3316-002 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0xa2, 0xff, '86C TM-P3568-001 '),
|
||||
DeviceInfo(0x0190, 0x2449, 0xa3, 0xff, '86C TM-P3569-001 '),
|
||||
]
|
||||
|
||||
def dev_info_lookup(major, ver):
|
||||
fuzzy_match = None
|
||||
|
||||
for i in dev_info_table:
|
||||
if i.major != major:
|
||||
continue
|
||||
|
||||
masked_ver = i.version & i.version_mask
|
||||
|
||||
if ver == 0 or masked_ver == 0:
|
||||
fuzzy_match = i
|
||||
elif ver == masked_ver:
|
||||
return i
|
||||
|
||||
return fuzzy_match
|
||||
|
||||
class FlashIcInfo():
|
||||
def __init__(self, name, size, f18, jid0, jid1, f1b, f1c, f1e, secror_size, sector_erase_cmd, f25, f26):
|
||||
self.name, self.size, self.f18, self.jid0, self.jid1, self.f1b, self.f1c, self.f1e, self.secror_size, self.sector_erase_cmd, self.f25, self.f26 = name, size, f18, jid0, jid1, f1b, f1c, f1e, secror_size, sector_erase_cmd, f25, f26
|
||||
|
||||
def __repr__(self):
|
||||
return "FlashIcInfo('%s', %d, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)" % (
|
||||
self.name, self.size, self.f18, self.jid0, self.jid1, self.f1b, self.f1c, self.f1e, self.secror_size, self.sector_erase_cmd, self.f25, self.f26)
|
||||
|
||||
|
||||
flash_ic_table=[
|
||||
FlashIcInfo('M25P05-A', 65536, 0x5, 0x20, 0x20, 0x10, 0x8000, 0x0, 0x8000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P10-A', 131072, 0x10, 0x20, 0x20, 0x11, 0x8000, 0x0, 0x8000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P20', 262144, 0x11, 0x20, 0x20, 0x12, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P40', 524288, 0x12, 0x20, 0x20, 0x13, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P80', 1048576, 0x13, 0x20, 0x20, 0x14, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P16', 2097152, 0x14, 0x20, 0x20, 0x15, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P32', 4194304, 0x15, 0x20, 0x20, 0x16, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('M25P64', 8388608, 0x16, 0x20, 0x20, 0x17, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('SST25VF040B', 524288, 0x8d, 0xbf, 0x25, 0x8d, 0x0, 0x1, 0x10000, 0xd8, 0x0, 0x4),
|
||||
FlashIcInfo('W25X10A', 131072, 0x10, 0xef, 0x30, 0x11, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('W25X20A', 262144, 0x11, 0xef, 0x30, 0x12, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('W25X40A', 524288, 0x12, 0xef, 0x30, 0x13, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('W25X80A', 1048576, 0x13, 0xef, 0x30, 0x14, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('W25Q40B', 524288, 0x12, 0xef, 0x40, 0x13, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('W25Q80B', 1048576, 0x13, 0xef, 0x40, 0x14, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('MX25L4006E', 524288, 0x12, 0xc2, 0x20, 0x13, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('EN25Q40', 524288, 0x12, 0x1c, 0x30, 0x13, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('MX25V8035F', 1048576, 0x14, 0xc2, 0x23, 0x14, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('AT25SF081', 1048576, 0x14, 0x1f, 0x85, 0x1, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
FlashIcInfo('GD25Q80C', 1048576, 0x13, 0xc8, 0x40, 0x14, 0x0, 0x1, 0x1000, 0x20, 0x0, 0x4),
|
||||
]
|
||||
|
||||
def flash_ic_table_lookup(jedec_id0, jedec_id1, size):
|
||||
for i in flash_ic_table:
|
||||
if i.jid0 == jedec_id0 and i.jid1 == jedec_id1 and i.size == size:
|
||||
return i
|
||||
|
||||
return None
|
||||
|
||||
|
|
@ -1,9 +1,12 @@
|
|||
|
||||
from db97 import *
|
||||
from tls97 import *
|
||||
from tls97 import tls, psk_encryption_key, psk_validation_key, hs_key, crt_hardcoded
|
||||
from hashlib import sha256
|
||||
from struct import pack
|
||||
from usb97 import *
|
||||
import hmac
|
||||
from struct import pack, unpack
|
||||
from binascii import hexlify, unhexlify
|
||||
from usb97 import usb
|
||||
from flash import write_flash, erase_flash, flush_changes, PartitionInfo, get_flash_info
|
||||
from sensor import reboot
|
||||
from Crypto.Random import get_random_bytes
|
||||
from Crypto.Cipher import AES
|
||||
from fastecdsa.encoding.der import DEREncoder
|
||||
|
|
@ -11,294 +14,20 @@ from fastecdsa.curve import P256
|
|||
from fastecdsa.ecdsa import sign
|
||||
from fastecdsa.point import Point
|
||||
from fastecdsa.keys import gen_private_key, get_public_key
|
||||
from util import assert_status
|
||||
from util import assert_status, unhex
|
||||
from blobs import reset_blob
|
||||
|
||||
flash_layout_hardcoded=[
|
||||
# id ?? acc offset size
|
||||
unhex('01 04 0700 00100000 00100000'), # cert store
|
||||
unhex('02 01 0200 00200000 00e00300'), # code
|
||||
unhex('05 05 0300 00000400 00800000'), # ???
|
||||
unhex('06 06 0300 00800400 00800000'), # calibration data
|
||||
unhex('04 03 0500 00000500 00000300'), # template database
|
||||
# id type access offset size
|
||||
# lvl
|
||||
PartitionInfo(1, 4, 7, 0x00001000, 0x00001000), # cert store
|
||||
#PartitionInfo(2, 1, 2, 0x00002000, 0x0003e000), # xpfwext
|
||||
PartitionInfo(2, 1, 7, 0x00002000, 0x0003e000), # xpfwext
|
||||
PartitionInfo(5, 5, 3, 0x00040000, 0x00008000), # ???
|
||||
PartitionInfo(6, 6, 3, 0x00048000, 0x00008000), # calibration data
|
||||
PartitionInfo(4, 3, 5, 0x00050000, 0x00030000), # template database
|
||||
]
|
||||
|
||||
enable_blob=unhex('''
|
||||
06020000013920c0cdd8e7e68d6ef897ee686fbf657f83b9514341e1d3c0835a28c9cd1ccd0016644f74d
|
||||
d02a73b85d95f4d352417cee76ba0bca3ce474159c62ade3e10797715a13f15a292f5d57c6d46cf8f5ef6
|
||||
587a3c55244f2258ffd08b351dc14af0da36121ba0aa4f1147ffd0cccdc1d6dc1d5fa7adb9841ff79c753
|
||||
e2528dc27344be84a2655ab01039c74999b90a7f008f626791d68a76a57b07180129bad2c0a67daf6a3a5
|
||||
ebadd6a429fc087b1e68f1e6535290b7f94e9a9800330d866c5a67b4e974029164f8c6fca8d93c86211ac
|
||||
47d96fe386faf206f92f4afd32d3a90c4287377e8896aa9ae930543864539df833345d0a1869169d69100
|
||||
8510c91dc1a0ec138669c2efb812c7b9b7f201891cdebe9c80eb671ac8a854bdcb9990cc23950f9f1dda0
|
||||
d0119b8c5c2d8446310e8599efd248075bad6613ceb13f0310ceab6ad17b18c8a245c26363ba7a7f24f17
|
||||
972861c6a96e728d1be81a68d66418ee2dbdc00d240bde29c781069f93a06dff89ba4039b980d3c9c2a26
|
||||
a7f41a02a4b9f1c0e0f75f0a59c5c5003d2e90a209cd9f8bdf69414262e238dbe8e1bacf6c880f59843dd
|
||||
8111293e24e99c964538842dcb0b4a8cab6d227cbfe0647cea763496425152aed507b2228e79c8e9bcaaf
|
||||
6380c1d2e7f56c5563706cb5da5b238371ca4b2627ca00f9bc9d71cd73ccf02f02f42e856f9e8defa0195
|
||||
c8647cb1a0a63e6996a1b5906080851f1648cd061a585ddda05fc8f37a99a0dac92dfabbfade8f89157cf
|
||||
11d356782689838c358f4790480fd341c993ae4cc8a8c93cf11578c0571e0c3c8a4964286eac3fae27507
|
||||
d9fb2ee961953d86574e6e5f6d38cf2507a714adbc221867bd701bdffae0b27ce47ae8d06685e534342d1
|
||||
1aef07f2c998fffe8673c2806e8384738b8f4ba401d417cabe088ed2fa09c42e97af72f878753ffc50b87
|
||||
fd292662f421bc6cc8da131957c84f4ce4b69266065d35d3ab91362b13edac27231ea1b6485faa6644c64
|
||||
6747b86341b6d031f6a52b6ad855396b7b8cf9485f50365cdce203355bf2fceebfa59b266772ff2578bb5
|
||||
03f92ca35ca2bc046d63aeb4fbb0f477ef41c65d10c5cdcff5de10afa9e7bc08b026f0fa649629f259c5c
|
||||
2978d26dfc2cbf48f59616ada4bf2fc7a7219fc37d9f5026709e7b472b6f97f78d47e1c5a6af8e23aebb8
|
||||
a88f64f005abc93251aeb8561b0d855941b33ac608413405381fecd0154db93812843f15b8e5e118ba7a7
|
||||
cdc051ef203a7721b769abb3c17c704eb0acf6a2cde267776dfb1ff8d82ba2341d0346cd80cd4480767a3
|
||||
d0edb643c1d9045f24096bd1fc324c03efc0977736725b2770998ea920c19a1fa9add474714a5b7a2a318
|
||||
7e94cf1a3492814ad145a7b204e0b3d35dc4cab2424a891f76160ba722a25bf9906bb3a476250b756249c
|
||||
aed3c4d52c4046012da280ec71898e8e393559979a74432f1df2692616c761c676a0260c7e4042bba7387
|
||||
d3c683d4e08454c7f509b7960a1db2a1cf007538a38a1e39b0a0310c9b77fbf21ab2b3f2e76f3ec9084c6
|
||||
f47f4fb2fc1dbcab40a9d1f6c8e404126193d26ed98270824611c4840087893b3204837e282bf29623080
|
||||
439336435e801de053cebb066bc7a440a3f34fafc2bb7252c5dd846af3404e93f1172ebe2b7861e09d58b
|
||||
cbee0400df8fe627adc42be2860a33d40748bab2f34262ee32409bced9cf8fea90bc32d247dc2787d7289
|
||||
65373063851a991c63c480b67cd301a9c312037c72ffc04120a09b1413756d4e5bb0bccb550c6cf76e2c6
|
||||
35c8498f4e653beee2fb683db0466280bbd297838a8d1f2459a58db77446020cd20b82a52ee5cbf0aa908
|
||||
14a199ae61dca69d0bc90986a2c26b8d65357e3925774a3876ed0eb80124a0bed4c2c0bc632e1b3c1a812
|
||||
2b54b023b05e846d78172b97424ff607b67c2c11f21ceadf82020129e62fb0918e85b623134f4e5e18870
|
||||
42b632662a3d33c6effa4a967e09a4d988dd084fde8c9d4b39dd0e6521b8e2d376807adbb5b86d914eca2
|
||||
38a349d9b0fb23b64668bdfd45f6a735523a31878e4975a42ebe2d3c920f550881818c8139cda34df3669
|
||||
b89aa5fc8b3bad460de2d76d431435c83b6fc0efbaaaa84818e990be36b72826f00f1f2b97d63b680d83d
|
||||
03f2ac5325f8dfc5d460abcbf27ed4ff205542702974eb9bfba456401786578efd93d69ec76a41df43798
|
||||
76891e39acdce7a32e94811157d48829f46b5755d9721d935c73a28423080bc8a48882b4439e92ac68413
|
||||
6a52b078e06a730596eacab8768d0784b0fca63f8a247f2523ea5d4679a8957af6b314594681759ede769
|
||||
76937c5f99c7fc9326579d90fe7a7fe0d512858e3221b50c4e1d9ff16f38d49c52a524ef895dab24059ac
|
||||
7a2b9dc24e59d8b38e4958d51fc309deecf987dd79697fe6ccf955e06bbd0ebe69aa18df39b452ff9ebe8
|
||||
f2f761c1be272141ebe65d0a625b5f1398ac2ae129ee5c1e520beeb492748f9364742978249470be45279
|
||||
11bd9aafbcbfa5e90a56ce40e42b995c82f6c5df51cfedc41a6963475e2d39641e2d7ac624d184aaec303
|
||||
465d4441b1b0acfccf9b45cc3e1825a01be94e93ee16918793a809cef222480377558ee18bc2801e31f24
|
||||
3d609ead015a0a6cec743f7dd0d951a7e0bf56d45ef20177373972602417024412c2adef44b881da42138
|
||||
5286c9e31fcf98b8f8ee10a9ee2730429579825ac159bdee29d1c4cdb9073427d0924174d04818b6586d2
|
||||
d2ac5318156b6139bec3b1959d0d1a8b46603f0ae9862214fff30c133d463cdabf875ef841e01976ad06c
|
||||
bf74c9987839e8a0e41b6a2411e542a061b23bf5b261df7a0cc844c510c102b4e03fbc44c44e998a51699
|
||||
907d252e91e3e89c0728f5db0b868ff2c55fc53d9230dd0dcd01086379a8821a0cb2b7dfb90b25a8c452f
|
||||
285185457827dea2f5b3cf1138e23e9a8d23ba1f2234d233c0c7f0595471e7e3a62d8fbb8a5fb900a3cf0
|
||||
3ee4943e4a4ba5b51200f02a6217ec29d7d5177ba395c77540b7111c5428ab069613c7e17094c5d798049
|
||||
3ce2d945393f3fc11765629597817499cf6585635a3db8d6471af509380224dc04b574891ebce80cb7ea4
|
||||
d0789ffd7b76637fd460ee701b60be9174eeb51f96c6811a4e4dc55ee545a9d9d23b80059084616521742
|
||||
d9b7a47d60b77dd0ed12f10327553448655ed7b7a9d7366854d908a4c762fe9048e4e4a3776f2e22f90de
|
||||
014643101de4715754efd62762500c6de90435fcde78e9fb864045cf8749b93907baeb4f47230547e78be
|
||||
a0e01d918426c3c7a3bdbbf2b54394c44273aaf163306450505862af4778f667d7c34a894c8824effe124
|
||||
b9993690d1519015566849652d86e158830465fd1fab08e4cf5cfff1f437ae0c713abe1b8e1fd15b1a796
|
||||
3751504ea02e4ff1469300a689d4ca4d796be229b4cc041296f9672bb2383442d492eaee0a17d174ac699
|
||||
4d2c1b1a117e54da2bef43347129d94bf4ea029271564f05fc3f607bac5e06e741ed5e9d51a2efafec05d
|
||||
7926c693bed05ee0bc81c1b6aa6d57f58b01aad2d69613c201e86312bdd2e8117eded970e298c096c52ae
|
||||
d21fd7f8aa03e3bf3d280fe3b3ca4e49dbfc90dbdfcae59ba03eb38458cd01f6637843526881b8df0b019
|
||||
e90e2b05bb4154dbac69e82ef4d8f83343fa2b0f10f71f1f0c314f41ca366c296fc41830ab1998829cf55
|
||||
01d8afa090b8803aa1ef94dc8a06c231ebb3e42cabaedc50fdc40832091307b4dc46398c890d71863522a
|
||||
927e1d90cb72d38afbc74ffe8813ab36a168822b5caf7550af92824061d076b5e1f628b6e4a36849c5182
|
||||
58905e734a2dd53258df37305a16c0b844dec711800a822dbf691327b7fac815cef33d59363d56c246d04
|
||||
e877ba09c4fc1aa70937d46adea4b1ba418695a7b86c0d9332b71d44b2dd8c88c93a8efc264b1c29820bb
|
||||
5b66b397136d9715961dbf7d5b59508015b2938edb1938e68f4e354eb7dd60b08b4460c05d1f291e56aca
|
||||
32bf30a59b1d849993750498df7be8101d38cb2781cb52a640dfd09ad469bdaa069eb37b7462343819ce2
|
||||
024bcdd1940f97eec044f7fe41793fda6edf53acc92d2883fdb144de0baa6fff19c59b3b5a673a6be202d
|
||||
8afb436fc6bcf3a5bce2ec9919a9d2f4aafcf2f83698d56fa43efa7b07fd1074b915344d6ce24ffdea58e
|
||||
b3afd95d911187b1070cf1c97a80ec5a5d609869e262b347f24b7e33404e6daa06c89d45db644cc6e29df
|
||||
41198bc8ef699415629b91b6ba52e5cccfc367654ba4fc0c7c6f40a2d9ce519c84a6315dc6e951f828b1f
|
||||
5d3a7c6e7e4a3271dc21c82329a163315a763c25710dbc33f9b79db33eeeaecfb8345d503fdb069160451
|
||||
67cd5451c5feb5358b07b085cb710f348150c92948aef7eca1bf4f51cb31b7429d28ad544cfd325691524
|
||||
ea5a13fb276967ff78719eae6c735d37d7206ba951cf115210ee0c3a0b07268c57a926a4ef8dbd8423190
|
||||
8d15ca9a2f1b519ee982a539eea6e874a6b04cbb65c62ceeb44d7ccf14791bdf5f056bae592830688f03a
|
||||
67d92a8b6b8ab6c40c651eb4e2366fb31434475068839466fff8e5279cbafa713b8d51dcf68001363dad4
|
||||
ac42946ebd79493fca1a868398063193b4f0aca3a5af2fabf868813b91f8f13ebff3430d31ea0d4f43ed3
|
||||
f4b620cd555e685d4ada88cd1df2dc108e1c6202531b63deeb47fc56cf5034a31f6009dbc21ba392464ce
|
||||
c0f410756705d402dc05572236c291eca7f2de1315b9d120f5e90272d2643ee4f941b387b3dda516de4a9
|
||||
a09b3407ceceb015206edd6ef6449fd3304fca2f306e455c6daee470edb19732b76c1982ca03e325d8563
|
||||
c7531abdbe99e8a7742a9802afe43bc46fd795d46052b527d1125f65427c60e6bbfe5e4d391c391a62118
|
||||
ae1ce651622ea9f2a6f4f6a57271b35bc907ded5ee7026adc8f77f50168b75741984e9cc788acc8ff4de7
|
||||
a1aa976466a45948d8b40e3a9ce32ecae381c3376692012456b76ff9b58d70b277e564a2edae34b459476
|
||||
08e660eed03c3d2f4f7112a0bc7b9628d86694f8dd1fb5d9ad8c62c957c1640aad6d0106b1c9d089cfd1c
|
||||
30f155a1e84a2a809f08e212b8b06a81543f2fbded09620782bf8e2bc70461b45a567727c74c1703a23b2
|
||||
3d3014db6a05a368ff9acc84d4fde73f1763603bdcd899b61cb3bcebb900268c93fbd0f12f702661d7582
|
||||
b188ae01922c95dce32d0469e30386774afcf89e4f107a949ba6dedd17d828e480ac653c07ea30f780879
|
||||
be572bdad635c0f9f87d88360b5023e58b661f35df98b7b1a0b1779179e614281147d9c6a4f0853e4d435
|
||||
432b4d6be3879315e2c4fce0ba32a9be43fac22b4f12a97caeba8ba4770c89447dbd902287ffabfa3d270
|
||||
64a45060a2fa458e950f34569ca4cbfdee9b3ff6391bc5a0903e66f5b99526fe75c10a8ab4fa9a100948d
|
||||
71ab96d51e3076e84ac00460eb493b418130f6ff92c0c0a2bba39a14b3f5f003583f481abf35d39dba4ef
|
||||
e41712a6eb1f8021f18d206993c685d806a8c8415cbbc15332ceabeaa8d8f0de9af037c1128fa0207ae5e
|
||||
915c79276e23252fa8255448feb00d79931948967db93f8c95336237761d2eb9cde0eb3ddbf2b0e698136
|
||||
7ac6c5843902670a5bb3a7fb3cc338f7b498cc07db6454e7c8c9b2035e1e21fb1046693a39fe27fc04a38
|
||||
0a209c7ce67c238bb227a9bee07407a9fe65b0914976af513ed2f9964574bf24162940269f8e34d6fed0c
|
||||
0769c81a5dd890e2b7d92c4ad51126ec8158679fa5c014428d67e485fdcdbe24e9a8f7bd46ad3b02354ed
|
||||
febc7133cf198a841a163a6580ad89badaee7620419e30234ca94744d936bad9ffa468bcf669741fadb7e
|
||||
7da12908e4903eba485cde036725fc4ffaef6e7a1500f40428418ef570b355810ba4981fdfb039b4e5d84
|
||||
50e979ab8f676d1b1c84897fc5cd7ed57e4962686a91687f04932f690ad55a85a7f235ea99d3ee0ee9a8d
|
||||
5ef0e84d43c2ec8ef3b3da80a5c3c973e41e6d85cfa28f53c3cce3117b05662f23f8f37923518a77e5408
|
||||
76abb03b6b1bdd606ee9127ed6c03a8b90a30e772ae9fdd287cff1df87d2ca3b344f615afdccf09f9aae6
|
||||
115fb99b7a4da857c30d73e08c7cb474a65564536738f64630013e6e7a375ef2b721ceeb77c2bee0be730
|
||||
5f4beaf9fd048ccc03e2a536e57afe06cb981b8d788c0114b1422ccd025205a92d1d98b7de5f604e3e55e
|
||||
2621f2d8933169615c9e5a6f354396e184ab69722b33eace77fde03c67b553084dbd35ca860f8e1798827
|
||||
9539eda36bf63bf8b1345491ced4c6c89ddcd709ddecc764a86565b8ba49368c4a4034302acfc0184c3c2
|
||||
d9f8ba34fde40cef6d3869fe6a5d1af17e059445d3bf9c950470cdac062e2986877ec72a79333089b2ce6
|
||||
9ffab8c5438a1298bc50e0e9c2e286e55b1936ab0903257d52db14fedeeb67da7a1df1506b0fdc4a50d2c
|
||||
721450150b25fe8cb74c39298f620c029dd8a9f1f9b175c5083a6437d0a8f5d05489aa2ff31dfc8ed83aa
|
||||
dbee192b11169e3dd6bd496eacc42c46a952f81f8c39f88ba31ec08f1060d2f2e49c0b900508b4e9e5703
|
||||
003099bc9485e09e5c6a8c9f05389124095b1c9693a30e4b75b7f2e839eb252237a55007ac61fb5268982
|
||||
083d29e757b74c4c310aa1cb03adcafe17afd50a53e4f539fb57a6c5c93ee94cabf36d2375cf0d99ad0dc
|
||||
cabb650f468737745cd0d5e66ca991bfdb46e05371bfa18a034669e967192a53bffce26bf2619a365c21f
|
||||
9f7c54801780c12ad3ff7198e916a1a4451bdcb248aa997d25f312a292c9ae1f70efa6ef1e5df24e48cb4
|
||||
1243ccbee736dc9d32476506126500906db396f312db3d6710669064711709597220dc3367e720819105a
|
||||
f78bfc5a109571b763f44873f4b820af8279d42bff9b5f9da409e0ecb9d6a3485d9bbaf2641461c1cf144
|
||||
eaa2cada36b38beaec87737dd70158735bb9c0ae7de4ddbed353411b8435c80cb2e66a701469c6e65f437
|
||||
1d114775c73d8bfa0ca04b38811b2b31261b86dc2795388577376501aad9658c630d7ac9fa4c1f262d53a
|
||||
91cef7c2990d9597fb2a130985e04233cf178c611be685623ffe5b659af6aad10da3235331fc6f6822fd5
|
||||
cdad3f96e3e1195bcb3c0104ffacf940b570f94ae689924cbba86521af15be9b1148f331ddfa37ad410b8
|
||||
ef99979a56ef1c3c789ffb996507d85383559a229493ad0bab90478d123f0c577ef01c5dc5a3ea28f60d0
|
||||
8409544ea6e44724240b2879f9c2560270e0cc3949af9e22899377635f44cc3fd0120554503d06f4a2b41
|
||||
e42129e7184265b4480edd5031d57368789203fb9a666c1be6692451f684119d85ed4cd88fe63dc1d16fd
|
||||
dc4b8508d04671f837f413a653483f0eee7b5300021735de246ee24d462c5d332c55d4c35c1ab9bd7c9a3
|
||||
d009076a838baa8a88c6fce72f0805ed73221fe98a5941d21a97ab5641d2e54df83c2437fa9cd88dec024
|
||||
1f1254c6a0ca3e85f678eafab8b013459590f87fd580fc0c05f5967a58f4dfe6a89ac1e47e4dc09adc942
|
||||
4336dd355c6f783c2698b8539c3f801f999ce5db3f041cca86b75e3e92e3d98922ef2c191282a7516024d
|
||||
f2949c1e88ea6b53b5d713b57d3edd5c78a978f7d854e487eddc60c7685120980a5cdc259cfb2de591875
|
||||
d88f9b898ef60d6da810b1a07252a56993bb5bba723f4f838ec648e19bf63dedb33eb1dbf07f456b41563
|
||||
c0102cb18220b308ef60908e75a77e6954a4f2993b60c10464dafb40e79e3cf5dce392207e473913e61e2
|
||||
75b090793fe0bc1856b6574cbc6fd1295448b34caa325df832a095266beec91604a2726f33e54e25e9478
|
||||
d859c348ad45ba5b51eda93cba7d957c5d0d76f2de84d225a5cbe6a5553c1311c35f12281d98acc7eec95
|
||||
d7f5e0ff3a0b27c0032b59a656f70d0cc5a042ee5b72365c0c8ee03ab6c48e18f87e050fd9707104924c1
|
||||
59b48edafc57cbb56722f62702390e688a0bd463c95318d3bb13b44033ea78d19c665aea20c67cd7896ff
|
||||
cf2c8e2806e5380f0d53b0b8d30fdb35d496a891dab54d3a4ab1b2a6f4b4091b48b339c5213a6f8c3f8ab
|
||||
9a9873a605494cedf22b17a6defb8ec1a88f471ce7c073ce264fffcf9af0c6a37398491652fae2c29a496
|
||||
6b022fe608c51f28503dcced1d5961186c3889e4d5ea8bc94667c80cf0d6b5f4ccf3d8addbf56b6c78028
|
||||
0850e078f39d2377376e120ad05e930e1c58f50bcf980814c2e38215db50567c8870bdfa9940104591384
|
||||
55fdbb2e260190dfac1743a5d6dc9031b0c89bfeed9f70ffa84a964a185834b4e2d3f299f2c4fea605f4a
|
||||
5a97c51fcc0fad21ead2867dcb8fb6cd6ae2ae271e89477d7dd03c34508d719a037fca0c6cb028112d8be
|
||||
93fa865ba60c7d7e1e017f3f49a9f0114c6fab8fe797cc3a4cc80c2351880347ebd8288895fc210431c8d
|
||||
27ef350588a81c382de3a100f8f8458eebb61e33336b179ae24e397661d622c82169c1081fdb929b9f21b
|
||||
4410a09fab9938c40573757d89a4450a4246deadfe4e5a20f04b6162f06bb0ca4c658a88880df139a5641
|
||||
350edf1d19123cce164d5760b6806ba8ec5584effbb87cd284150ed6a73354f9829f5d22508da40bf8f9c
|
||||
7351c45cf169a3f4e7354faed2f42d9cc08ce051e902f8137a8f79b924e2b3000ed25154e617b5d066ff1
|
||||
a3540eed0a4a3da0618d961115091a6ad9f831c25e2ec9fb1ddfa3c28f365b608fa1dafbb0ba9fe340014
|
||||
60e6af2c2da1e90aedcfb07da4e6603a9879834f16fa45cbe6c2206459058c750e534dfb8fefba9bb473d
|
||||
0f307f2e746f4c4f6f7db41bdcc7eb5d7e4c9d5028ce143cd88ebc1efa56f0e9f3ef939526a3f56ae015b
|
||||
5e42fcb7353f5496cb70baf316c8b1bfc7f26872de3f421e87ac81d4a2f51b6c44dce38a6dc9d93009490
|
||||
d84d81807e517f06c896f8adbaac3d5d8d8b83b220114d0da49dffbc5e2cd1e2b715e671b05aa1fd3b0bc
|
||||
dfdad56f65d0393dd9d1fa384b82ccf9b10b36d929f6b8e433999448f23c6c228bff904c0b91d0490af31
|
||||
3623a76fcc4258e9c8efa7ceb4b82aa0cfc6c362eac5b1e61f2a55ec5d3f401a748acb6b8f2dc4641ef9b
|
||||
d4eaf3d20e399956d36c338902c5e3b7ad13249b03bf248f41bb26de70db4d0b0b4c8dd51f92b5c1e9f3c
|
||||
cc7cb4ae36945a16f6b428caed3514af83885312a6e176d9c555199cf7cf444915362184d82d21538697b
|
||||
10326d0c5bb1e99b44ad644de25edbdd2ba404a45258d0e1682e73a42595b797f5e7a0f8b24159047d98d
|
||||
8fc58ee9e47a5068d791bafecee6422d7bc847757c0800c95e23f3470f41500bc08ab71d671765cda7422
|
||||
7535ba05696c703b90ddaaa6e6973389abbea81600e36229d756f7edcc1aceaaa010f1c5aaa1e6f0def4e
|
||||
b3a04613ce82527a67f8be50d072cbca685922d492df81cf737a69e29bb4248076464ac3fbe88db35864e
|
||||
69b71d1ed5b83f2045f680d9cc5d447f09e5405a5939943511eac648c10aca735209612eab589d2d2716a
|
||||
19059248ce4847f3a809ff04477b8378da77e796109fef7d686a5f067cf3d91aab97bd518f388173d9535
|
||||
26a3a77af043427bc2b2a466735a45846c11204b56a84394d724511efb467722ffde80899d3868a31c7ce
|
||||
4c8c2100bcab717f12eea1eb11a7f28abadbc819ceef1132a57f902aabd43337172b3aec8fc7577bca293
|
||||
50551070615735499b2758b2d9c77d391497393b6ad39e3395834185a76f6ce93fca5376e6f5aa78b11a7
|
||||
63f504781ae3e8a773c91e3899574c4b3bb0221ce8a927d443d5292f3ad13e843146736f457b4477ba6d8
|
||||
f462505b7d3d0fa76dff52f01924e00df97944f69a3abe6564793bba2850b0084e4f8d2ace474a1249daf
|
||||
1a4ffdd4a8df84c8d5ead6909929992ca1b6e58476ff388bf978d091921dda2db3b1121e573eee682e22c
|
||||
d01818ae0b7347e2591dedf20ac857746b82c0d4498744744ccb44ff96857a9609d7a500f243a62106e61
|
||||
8eadffeb5355d5e5e7452f5f50b3de48e75adc2be249b20ccc4aa3f4ea357bf4320d8f42e5a3bad1bd3e4
|
||||
2c659f71caa3736871f9b95887adbc04affecf1076598d898917c0b54c63317478b8b8e65fa2e6b243d7d
|
||||
497cebfef615c9974553feb3d33289577886697b6fb01a8849d4714ddf9688080fb0af0e6fcba733b8019
|
||||
28e7664b3840a02b9aab6307af1dd3fa814045733b53e0adab1ec430c40e184db1ceca1bbd58c4dab244f
|
||||
8683bd4edb6e59470deedebe96080be666b779106de5d6acef113a6c75002424e4812e2d9997dec5391d3
|
||||
aaba00320314f44fac9e7ca9b8996bd0a61b00139a8c1d2c9fc52e6ab9f90eba248ab0b3c4444d4ad1f07
|
||||
ac36878ee68bce6c53801a3019b0fc1f1caa3ea761da821753a949724d3b1dca2457fd2b1df7c7f3879c4
|
||||
dab41a20ab4ced8dd9e8b2ecf554fa412153dbcab52cc68ab4d83f7f310e0c5361f9c780160908816ff2e
|
||||
f457db9aa93807da96de3068bfb63a18660d29d6efeb21b36c3c34abf83ff5847711eb85e052854498474
|
||||
6965ceab0caae4fab0ae83bda024bf17d091132fdbf217f13d1c42e0671e324357c6d668492df202797f4
|
||||
1a4a9be3d7598ee4d4530ca0fea76da94a225d93729eebee40f217a9d0a0dbdf28563a184eb1a71f8c6b0
|
||||
0aa550fb21b0b1af62f98a5a165fb3e79d4265962e976c50875fbd374026e7fbe886eeee146d368899bad
|
||||
54f97308f158ee3c33b290445497414186c47f3b54e78ed4fc8b5bf379b0169908cac2c654edb715f9b1a
|
||||
3bc50992ffe9d4d5ba034b3a7128c50aaf2ec50497e68db2261b78f155900def3ece5d86b86f4a892a846
|
||||
483ace0e008728627219bb71d897c726e9a90259c6fc61e4612ae76e41aa302e3193a0cf5d68d380fc7b0
|
||||
7d41a757a459fc81fabc6336d21206b58f3ff06e390475f4e2b99ca3f0e4c82bb2d353375076d987d0a46
|
||||
54aec2438a4c1dc17bd2dfc45a680fcb3b5144d860424b8890b83be8dba8c30ecb06cddd416e01d1917d2
|
||||
eded83012bc19ae856dae5a6713895338a1f10c76260d61d25cc640292cbbe80897913e69c39a04d7c6b5
|
||||
5e9b54dd661bf4f2fc9900283a6c668f82b8e25d0c750fa2fd00de1355e655b8e690d3d2dd1118d6199b1
|
||||
a2723bc402fb38549bf13cacb217f42ab057fb2610d0f7306765d2c3644ee9384b1a8c0ccf847fdec7386
|
||||
efb25ba2e3ad6a1b489aed02cd8a28be43855e4bb718e7647e299c150173e53855a199fef2a797d2d5e0c
|
||||
454494cc175cdb205117614d1aebe6f402e21eed9dff22cfbcab47ededf6ae22717e83f0b4904c4051df6
|
||||
03fd2ce44bf59f0ca07c065d08113bdf87b6c19891e07832d7d93a6845ddbd15d41cd416dddc8de81dbba
|
||||
ade29c6f48c093c8df3c64aa69f8b1a36b79bc41cde01ab1758878b6dbb6b30c4d3cc5826bcf8ee3d159d
|
||||
20289bf01ddca53c7978e8ca1180924fe3274cf855e2861645b24c527ea3f928e428a578c6cb791c8dc2a
|
||||
96862aff4f0b383cfeaf325748f99510bbbc17158f038103157e293951db33b0307791b45e3750b781678
|
||||
3e8a1eb9d2cffbb619bba9b40d55b3e19643acc3486d8c85e75c536033db333d83be39d5cffc02e1c48c7
|
||||
ed56158365a50e9497474bedf48621f8c1ecb58bb87d99127e7d3b44d9ffdf49a967378b8e4a796f9ba1f
|
||||
62d93433afa53443dcb145a27d2bc0d92b99be04f4142a1c94d497ff9477218caa0b318a04d676447a853
|
||||
a51e725419f58374ed6823cd69ef7421d81009d2151fb4799781da7893177d46e9e39a3d2e5b7a2ef1ee4
|
||||
585a606700a2e387dd4e261ce7840f817f5e80af8852689085ce27157ee2cb5398a78feffff635ab26350
|
||||
11d739455c3fefdf16bd7b1d665a7daeb33019bbc7b4688786e58118f77a41e3879b68124d04a8de72479
|
||||
428d222890cf07608fe56f9ad094c20d668d56d985083cd0c23a85da57e37095afb06c60c2c3664a13747
|
||||
8f03438be98b78baa9af5e4d7fcde06b83952a59f4581ac51471fbc4203032f1fa52de74d804f24d99e3b
|
||||
1ebd7177795f81a996225dbdfaedbaf007f6e92fd1e05f59c8864b55614b3d0a1adddc03198f7310ace88
|
||||
254f71e115b8982d1701f6c4818a35f7c13523b81e2996fdd912c0160abbc2ef5b70c8e0bc5c3588b7269
|
||||
e5152afaeb2cf84d106e2e8b1247754789e5714c600fa3df3502374c53e5bd6bd2bfe4533a3d0bc1ae7a4
|
||||
368e811c1cc1047a0a8c085b2852e365735140404ca72c0e689848c3c4409037924118c59e7791f804152
|
||||
00ea282df22aa541e28d271a27b2e50de4485675bb3c8461ff105a17daea67f2b699a42db0298d44d57ae
|
||||
1dab3294399694f30fd2bdc30fb76637381e941c0f07736638cf8e532076160cd6c2a3810abd6d8ebbac4
|
||||
7491021d878b593b854e41a9786e0dec869a7b038649becb63ee65ba9e20e309020068bb54269c442c542
|
||||
5c0cb1d94785e2e1d98f142320e314010794ad009735fe274cb87e160d55baa8ff9ab8e0fc09f07953fec
|
||||
afb1191fdd9b80d0c493baf72c4797feb7b5349c762d00d48d6c5322c7e58bd34d69fbf47ef9d8f1374c8
|
||||
01198b8c59b97baf58c68a42581f9ff0a98cfd587f2707457e0a2df29616a750fe6877dc35d4e9066a67a
|
||||
9d4b89560bd9fcfd3a896fc8e2b9d944efc4043d0301bdd7ce597c62da276a348adb4c837e925aa95318e
|
||||
c20e305a194511f5cfb91076ac244dd4ee09179584241828134bbba779d16f09b8e54413462ae3a6aab5e
|
||||
ca1340ae5314abe946e1674ad4f3d56b677c226727ca8009229441c5ac10cfeb8ce580629393178d42da0
|
||||
7db214ac6596408353ada7b21f9e0d5d2388308042132d5cfac7940237d2acf9d4b873e0cf804c75412d7
|
||||
fb5736e2cf6461d40009ecdb76ed0ee23d59e08d2be29e5229888a3d102faa676ccfd2cf44ad1dafd7101
|
||||
98087fce312ccf89aaf93d6dbe1f32ee5f745d04018d0ba792281972b35ae99cf9ec3974a3ee233985cb9
|
||||
a065d8219b285f181de26a1f154c73871d9164fc068cf86b97ceedbc0f4ef534efa2ab1e8df7cd850173b
|
||||
24b8e6b3b5e683cbc3f50e79a674e89d51ff0a82a15e0e9952fc5d9468c2301f2fb4f3245692eddf6c690
|
||||
6100640ab1d31acad8d834e55fdbcd7c82ab4334466ce761ee775fddb128a8308773346b73d7e472641b2
|
||||
c7335855d6548d3a1edba40eb98a982694b503bc43fa61c91db1f2e18fce5cf8068be156c31b66554137d
|
||||
cab75b034f18d4933acd5ec95d6d97146d327eadc8afaf00c3917418e421e4151c18d771bd79a7d8b860a
|
||||
1fa9315c8bd847306b07e307c69faeeb0679c12cf4761ee21d809c58c2fa3b729904bc6175f755bce0930
|
||||
ee2203591ff57e87b1ca577c1d7d75b5bf7f8d3215fd57af0f3d35a00c76f702c716ca2b9694ef185ee9d
|
||||
2440cd28e2aa8e2e221c475c866699aa1ed7cc5c2c5e0d98bebab8bfd62aa33002c8ca3a58af1c3668c0b
|
||||
fefcdea7388b9227d3155a06cf94b27ff93b5cf86331915c6c132fe1c092000b5e5f17d36193613ee70f1
|
||||
8f672ab6543a65ab653cd47d13fcc138ae485e41710bb96903a7902a40fd1270697eff8e304bdc5c4797e
|
||||
46c8837b7f644ec9acb11e146706f3a1254928373dc7df81d973dcc6d6b0b0443527a34bc31f9b1af586f
|
||||
a667107ab5577c881aaae1b4725d02233a335be4d419c892a31eb397b9965f59f1532853bf456ad132a40
|
||||
b3ea9d20b079ae07727f18918e5534b528ac5bc18f36a0880b7e29e0eac96456fd09e714ea63a8f79554d
|
||||
9d38fe7033a143c01974e23d44e7e763f8dc193c018572afd4303b40af2bc2a91e6353264b6bd95e8f0a9
|
||||
f683eb1e6e9d1ccabceabe9ff569b4d1d658d81c268a6837ed27b675d1adb1f79878828769778bb92649e
|
||||
a29010509ec07d9d8403a21acdbc0f6032645f02908314537b15c7814092f783adea56561b6de27f7a7e4
|
||||
a50f6014d6b3a7a4b56aef01a7fd3f90d829c77493b3505132a3afd275bb8d8debd2758cc3b574a78db81
|
||||
b5ab1794192090ba341ae33a905fc138e4bb189275babe75a9ac1c94a477a65f70811e62f904cdbaaec9d
|
||||
d8d200571d98308986b748974d9dedfaecad9c6dcfb514aadb1a0dadc351ef2b752ea6e8f31859aff8531
|
||||
9be89de9b76107c4d1fe93e9063e9864559f477498922b1271fb4792c594c942dc7fe8de2c2423804cdb0
|
||||
985dfdc7a68ff2eaf3323e38d5ce269d790cc7fcbe124025e7613e80dbd8edd3cf7ca106bd8650e1531eb
|
||||
2fccac7b1fa5e66f7a94ccca1ed903b1d87500be464280c326167689fd4e99eaa25fd10904afdb9888e94
|
||||
bf505483e26eb3fcaae078d9b4d8b47f0104cb572e12fd4854bd908939a6b714b1ef983f38de0408acddb
|
||||
f560cc1beaf92b1c54f278b13d256011a915ea5ac7085134dd08d9b37ad08e6330891e0010b5809022b13
|
||||
9394127b90a25c0cb5e521cef81c9650d5e976c88dfce8bfc6024f28e8ec0b8a0dd1b6036994e89c5506e
|
||||
75af1a43b033bd55f38f6e37830da7ffc265ae85566927a993c7ac49f7e31a5a2795f198757a6f850d76c
|
||||
2d4770336a73f05709603f660ff24e938454ec9f32b7fd873ab645cab0a82f1b865f5e277723fbe1adeab
|
||||
c17784be0fc90fe7d44fdc6aa5938a6da20045cec6acdca7a15d301ab52f289c6172c1ce4bd19a5d94886
|
||||
2413d2bd975534bc56dfecd733065d7db5df03a6dd807785b95c4acc763a2b570e1983633a446a3740e4a
|
||||
a30e0e065d120560532f673b18f5bb33f9ca949a90850da679bf192c76b72b8a684cbbd17fe6740ef28d9
|
||||
9788c69391e5489dc52f950e6f2d3df79e835d84fa0bcb8d4e0015f4b7e8fc6889db37d2438f9e91c8539
|
||||
1d5785920ae05aeb391dd4a8875326b4b20aad9be2dc5b2127e3e5ab46158140026ed1ecef9ed9d2b1668
|
||||
60d0df8e0b59082f64318c075d08bb5d6d03170261510f8f8996ec8195a4ee7a017c8060da2072673fb62
|
||||
4f49fc542e5c605966a5eaa3cb26ad91721b101a21455c7b34823472cb11d05df5a767daf753e333c6141
|
||||
bce8d5d166cc6aa9b52c298ce0464cbda39d5983bdc3b57bdbb01215e225e275e03914cb1262d07a5086b
|
||||
9ac24b337eae21b1277c6a4937a94c21c44759cb2d8ac5f8cac59caa25d103245c4b462bfe955c927f235
|
||||
1b086bc557baaf187a3fff06999a337b2a45d1cda8002feb0defe27e463050ba93a8474f4540fc22034ef
|
||||
311a054fbe15f03643de443575808244134d5e9dbf7bd6cd939d592453ab3b7accf42cc797a276e63c581
|
||||
63ab521bd1bdad3566bd1b1e10248cf7eeb5757c1f7c8ca9f976f4721b3ff780e7edfe2f37f20116fa090
|
||||
5deb4fef0e5c5f2a303a865e6a0a6090afe237ba4b2c1437b569ec457d48c60dd5d878a93aafe3b3c626a
|
||||
5368fedc33f32696fc88ca4a43b3646aad27a6241bdb5b1c273e57ddebaaa88449c54e63a1c8bc386c918
|
||||
3d7b71bb95b0629e8a8f86973726f16b266c6393e3192f812554e73574679cbf3a67b3bbf969e00c904c9
|
||||
89eb9c9fb19f3608810c72eb528253ac8606b1730b5ce4c3928a763da1399ea3ab531d3174a0a221f95de
|
||||
ebc087b3b230734341b85c618f09865ab7c1dd66c74effa2b573de24b14f1385525873e15ab9d90f0c33d
|
||||
fdcfa19de497675f5a3d9956bc2d66942325017e4132176922f08b478907f0a9e45ec64b23353db1d44e8
|
||||
bb7f4060251afeb9e80dceab454eae609a3f5def899a2a42e4e7b62e7d6ae0735072d268bf7de73573070
|
||||
c03546f57214a1e4ea1035bacba81c14147db07e0675ef87b88c14dd64f23c7e9b45d4dc68ac48e294221
|
||||
af0b0d7b747373b03b7b922620e91ca810a13de10b02d13e139f68204d7ce0a2f8db69335b22b15e0bda4
|
||||
9545435cc769e30273ee40d6d54a45256186ff348a52c0c82c8829fbf79d4e3edcc3f42c08b026b98dba9
|
||||
e985d7597e085a767c3234182a0be06cd0435e40a5af588993f82c34e7651ea17ebee8f7035f29a378964
|
||||
0913d812130e76460ec368c9a9a9607e0ecb66866311044b7f950dac488cd4479baa9a0b728f4c2925f04
|
||||
e7bba448e8913b71178026789b3bf48713f619159a8c4c8347d5ea75e795e66c6662a24c4cd1325ba3bec
|
||||
b127848779badddd62fa895df040135b2983c6c529e2bc097bc4c6c144853940903cecd3e0c8695f14d65
|
||||
08a88c135a332b8def181bb0665d76cb6905cc7b87b2ca298cedc035d716be906a18da568351d3631a46c
|
||||
42beb6925cbec36e3877b42fe660c45983a26230654b1a00e464576ecc4e9e98e3183915bc0bec1d724b6
|
||||
4a7de15520e7f82bec8355d38878b3b2f80b731af2029a0f38c310c75a69b53af4f856c46f9772f028356
|
||||
9dfb581e2caf1595414f3f0d74aa609483c1b
|
||||
''')
|
||||
|
||||
|
||||
def with_hdr(id, buf):
|
||||
return pack('<HH', id, len(buf)) + buf
|
||||
|
|
@ -306,19 +35,6 @@ def with_hdr(id, buf):
|
|||
client_private = gen_private_key(P256)
|
||||
client_public = get_public_key(client_private, P256)
|
||||
|
||||
def make_cert():
|
||||
msg=(pack('<LL', 0x17, 0x20) +
|
||||
unhexlify('%064x' % client_public.x)[::-1] +
|
||||
(b'\0'*0x24) +
|
||||
unhexlify('%064x' % client_public.y)[::-1] +
|
||||
(b'\0'*0x4c))
|
||||
s=sign(msg, hs_key())
|
||||
s=DEREncoder().encode_signature(s[0], s[1])
|
||||
s=pack('<L', len(s)) + s
|
||||
msg = msg + s
|
||||
msg += b'\0'*(444 - len(msg))
|
||||
return msg
|
||||
|
||||
def encrypt_key():
|
||||
x = unhexlify('%064x' % client_public.x)[::-1]
|
||||
y = unhexlify('%064x' % client_public.y)[::-1]
|
||||
|
|
@ -334,52 +50,60 @@ def encrypt_key():
|
|||
sig = hmac.new(psk_validation_key, c, sha256).digest()
|
||||
return b'\x02' + c + sig
|
||||
|
||||
|
||||
def make_flash_params(flash_size, sector_size, erase_cmd):
|
||||
return pack('<LLxxBx', flash_size, sector_size, erase_cmd)
|
||||
|
||||
cmd = unhex('4f 0000 0000')
|
||||
# TODO lookup flash params from JEDEC ID returned by cmd 3f
|
||||
# currently, hardcoded for W25Q80B, 1MB, 4K sectors, 0x20 sector erase
|
||||
cmd += with_hdr(0, make_flash_params(0x100000, 0x1000, 0x20))
|
||||
cmd += with_hdr(1, b''.join([i + b'\0'*4 + sha256(i).digest() for i in flash_layout_hardcoded]))
|
||||
cmd += with_hdr(5, make_cert())
|
||||
cmd += with_hdr(3, crt_hardcoded)
|
||||
|
||||
usb=Usb()
|
||||
usb.trace_enabled=True
|
||||
|
||||
tls=Tls(usb)
|
||||
tls.trace_enabled=True
|
||||
tls.handle_priv(encrypt_key())
|
||||
|
||||
db=Db(tls)
|
||||
|
||||
def make_cert():
|
||||
msg=(pack('<LL', 0x17, 0x20) +
|
||||
unhexlify('%064x' % client_public.x)[::-1] +
|
||||
(b'\0'*0x24) +
|
||||
unhexlify('%064x' % client_public.y)[::-1] +
|
||||
(b'\0'*0x4c))
|
||||
s=sign(msg, hs_key())
|
||||
s=DEREncoder().encode_signature(s[0], s[1])
|
||||
s=pack('<L', len(s)) + s
|
||||
msg = msg + s
|
||||
msg += b'\0'*(444 - len(msg)) # not sure this math is right
|
||||
return msg
|
||||
|
||||
def serialize_flash_params(ic):
|
||||
return pack('<LLxxBx', ic.size, ic.secror_size, ic.sector_erase_cmd)
|
||||
|
||||
def serialize_partition(p):
|
||||
b = pack('<BBHLL', p.id, p.type, p.access_lvl, p.offset, p.size)
|
||||
b = b + b'\0'*4 + sha256(b).digest()
|
||||
return b
|
||||
|
||||
def partition_flash(layout):
|
||||
info = get_flash_info()
|
||||
|
||||
print('Detected Flash IC: %s, %d bytes' % (info.ic.name, info.ic.size))
|
||||
|
||||
if len(info.partitions) > 0:
|
||||
raise Exception('Flash is already partitioned')
|
||||
|
||||
cmd = unhex('4f 0000 0000')
|
||||
cmd += with_hdr(0, serialize_flash_params(info.ic))
|
||||
cmd += with_hdr(1, b''.join([serialize_partition(p) for p in layout]))
|
||||
cmd += with_hdr(5, make_cert())
|
||||
cmd += with_hdr(3, crt_hardcoded)
|
||||
rsp = tls.cmd(cmd)
|
||||
assert_status(rsp)
|
||||
rsp = rsp[2:]
|
||||
crt_len, rsp=rsp[:4], rsp[4:]
|
||||
crt_len, = unpack('<L', crt_len)
|
||||
tls.handle_cert(rsp[:crt_len])
|
||||
# ^ TODO - validate cert
|
||||
rsp = rsp[crt_len:]
|
||||
# ^ TODO - figure out what the rest of rsp means
|
||||
|
||||
#usb.trace_enabled=True
|
||||
#tls.trace_enabled=True
|
||||
|
||||
usb.open()
|
||||
usb.cmd(enable_blob)
|
||||
rsp=usb.cmd(unhex('3e'))
|
||||
# ^ response contains flash_layout_hardcoded table sent via 4f previosly (if any). i.e.
|
||||
# Given IC: W25Q80B, 1MB flash
|
||||
# flash JEDEC ID=ef:40, blks=0x1000, blksz=0x100 (0x100000 bytes)
|
||||
# before 4f:
|
||||
# 0000 ef00 4000 0010 1000 0001 0100 0000
|
||||
# after 4f:
|
||||
# sts id0 id1 blks ??? blksz partitions
|
||||
# 0000 ef00 4000 0010 0100 0001 0100 0500
|
||||
# 01 04 0700 00100000 00100000
|
||||
# 02 01 0200 00200000 00e00300
|
||||
# 05 05 0300 00000400 00800000
|
||||
# 06 06 0300 00800400 00800000
|
||||
# 04 03 0500 00000500 00000300
|
||||
rsp=usb.cmd(cmd)
|
||||
assert_status(rsp)
|
||||
rsp=rsp[2:]
|
||||
crt_len, rsp=rsp[:4], rsp[4:]
|
||||
crt_len, = unpack('<L', crt_len)
|
||||
tls.handle_cert(rsp[:crt_len])
|
||||
# ^ TODO - validate cert
|
||||
rsp = rsp[crt_len:]
|
||||
# ^ TODO - figure out what the rest of rsp means
|
||||
assert_status(usb.cmd(reset_blob))
|
||||
|
||||
partition_flash(flash_layout_hardcoded)
|
||||
|
||||
rsp=usb.cmd(unhex('01'))
|
||||
assert_status(rsp)
|
||||
|
|
@ -389,26 +113,26 @@ rsp=usb.cmd(unhex('50'))
|
|||
# ^ TODO validate response
|
||||
# It should be signed by the firmware private key.
|
||||
# The corresponding pub key is hardcoded for each fw revision in the synaWudfBioUsb.dll.
|
||||
# for my device it is: x=f727653b4e16ce0665a6894d7f3a30d7d0a0be310d1292a743671fdf69f6a8d3, y=a85538f8b6bec50d6eef8bd5f4d07a886243c58b2393948df761a84721a6ca94
|
||||
# for my device it is: x=f727653b4e16ce0665a6894d7f3a30d7d0a0be310d1292a743671fdf69f6a8d3,
|
||||
# y=a85538f8b6bec50d6eef8bd5f4d07a886243c58b2393948df761a84721a6ca94
|
||||
assert_status(rsp)
|
||||
rsp=rsp[2:]
|
||||
l,=unpack('<L', rsp[:4])
|
||||
tls.handle_ecdh(rsp[l-400:])
|
||||
tls.handle_ecdh(rsp[l-400:]) # not sure offsets are calculated this way
|
||||
|
||||
rsp=usb.cmd(unhex('1a'))
|
||||
assert_status(rsp)
|
||||
flush_changes()
|
||||
|
||||
tls.open()
|
||||
|
||||
# Wipe newly created partitions clean
|
||||
db.erase_flash(1)
|
||||
db.erase_flash(2)
|
||||
db.erase_flash(5)
|
||||
db.erase_flash(6)
|
||||
db.erase_flash(4)
|
||||
erase_flash(1)
|
||||
erase_flash(2)
|
||||
erase_flash(5)
|
||||
erase_flash(6)
|
||||
erase_flash(4)
|
||||
|
||||
# Persist certs and keys on cert partition.
|
||||
db.write_flash(1, 0, tls.makeTlsFlash())
|
||||
write_flash(1, 0, tls.makeTlsFlash())
|
||||
|
||||
# Reboot
|
||||
tls.cmd(unhex('050200'))
|
||||
reboot()
|
||||
|
|
|
|||
358
prototype.py
358
prototype.py
|
|
@ -3,21 +3,18 @@ from util import assert_status
|
|||
from time import sleep
|
||||
from struct import pack, unpack
|
||||
from binascii import hexlify, unhexlify
|
||||
from tls97 import Tls
|
||||
from usb97 import Usb, unhex
|
||||
from db97 import *
|
||||
from tls97 import tls
|
||||
from usb97 import usb, unhex
|
||||
from db97 import db
|
||||
from flash import read_flash
|
||||
from sid import *
|
||||
|
||||
usb = Usb()
|
||||
tls = Tls(usb)
|
||||
db = Db(tls)
|
||||
|
||||
def open97():
|
||||
usb.open()
|
||||
usb.send_init()
|
||||
|
||||
# try to init TLS session from the flash
|
||||
tls.parseTlsFlash(db.read_flash(1, 0, 0x1000))
|
||||
tls.parseTlsFlash(read_flash(1, 0, 0x1000))
|
||||
|
||||
tls.open()
|
||||
tls.save()
|
||||
|
|
@ -30,350 +27,5 @@ def load97():
|
|||
usb.open()
|
||||
tls.load()
|
||||
|
||||
def glow_start_scan():
|
||||
cmd=unhexlify('3920bf0200ffff0000019900200000000099990000000000000000000000000020000000000000000000000000ffff000000990020000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
|
||||
assert_status(tls.app(cmd))
|
||||
|
||||
def glow_end_enroll():
|
||||
cmd=unhexlify('39f4010000f401000001ff002000000000ffff0000000000000000000000000020000000000000000000000000f401000000ff0020000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
|
||||
assert_status(tls.app(cmd))
|
||||
|
||||
# FIXME this must be very specific to a particular device and constructed on the fly from multiple hardcoded tables:
|
||||
identify_prg=unhex('''
|
||||
02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210
|
||||
000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020
|
||||
0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2
|
||||
0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014
|
||||
0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0
|
||||
6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80
|
||||
0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800
|
||||
b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a
|
||||
ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7
|
||||
00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3
|
||||
08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0
|
||||
97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808
|
||||
d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098
|
||||
7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc
|
||||
800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928
|
||||
00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180
|
||||
0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800
|
||||
abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a
|
||||
020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260
|
||||
02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090
|
||||
0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131
|
||||
415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b
|
||||
4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828
|
||||
38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f
|
||||
201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341
|
||||
c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c
|
||||
2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818
|
||||
08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180
|
||||
81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e
|
||||
''')
|
||||
# The following blob has only 1 byte difference from the above
|
||||
enroll_prg=unhex('''
|
||||
02980000002300000020000800002000800000010032007000000000802020050024200000502077362820010030200100082170000c210
|
||||
000482102004c210000582000005c20000060200000682005006c20012970200121742001887820018084202000942001809c200902a020
|
||||
0b19b4200000b8203b04bc201400c0200200c4200100c82002003300100000000080cc200000f503d0200000a1013200440000000080dc2
|
||||
0e803e0206401e420d002e8200001f0200500f8200500fc200000b8203b0000080400140800000808000008080000140830000808000014
|
||||
0831001c081a0032000c0000000080501101004c1126003400080310071d10071d10071d10071d10071c01065810080101000007c8078c0
|
||||
6100000204f80007f000003070107010c07032c08fc80095a800afc08fb800b5a095b800afb08fa800b5b095c800afa08f9800b5c095d80
|
||||
0af908f8800b5d095e800af808f7800b5e095f800af708f6800b5f0960800af608f5800b600961800af508f4800b610962800af408f3800
|
||||
b620963800af308f2800b630964800af208f1800b640965800af108f0800b650966800af008ef800b660967800aef08ee800b670968800a
|
||||
ee08ed800b68096c800aed08ec800b6c096d800aec08eb800b6d096e800aeb08ea800b6e096f800aea08e9800b6f0970800ae908e8800b7
|
||||
00971800ae808e7800b710972800ae708e6800b720973800ae608e5800b730974800ae508e4800b740975800ae408e3800b750976800ae3
|
||||
08e2800b760977800ae208e1800b770978800ae108e0800b780979800ae008df800b79097a800adf08de800b7a097b800ade08dd800b7b0
|
||||
97c800add08dc800b7c097d800adc08db800b7d097e800adb08da800b7e097f800ada08d9800b7f0980800ad908d8800b800981800ad808
|
||||
d7800b810982800ad708d6800b820983800ad608d5800b830984800ad508d4800b840985800ad408d3800b850986800ad308d2800b86098
|
||||
7800ad208d1800b870988800ad108d0800b880989800ad008cf800b89098a800acf08ce800b8a098b800ace08cd800b8b098c800acd08cc
|
||||
800b8c098d800acc08cb800b8d098e800acb08ca800b8e098f800aca08c9800b8f0990800ac908c8800b900991800ac808c7800b9109928
|
||||
00ac708c6800b920993800ac608c5800b930994800ac508c4800b940995800ac408c3800b950996800ac308c2800b960997800ac208c180
|
||||
0b970998800ac108c0800b980999800ac008bf800b99099a800abf08be800b9a099b800abe08bd800b9b099c800abd08bc800b9c099d800
|
||||
abc08bb800b9d099e800abb08ba800b9e099f800aba08b9800b9f09a0800ab908b8800ba00801800ab808b7800a010802800ab708b6800a
|
||||
020803800ab608b5800a030804802003070404020000000000002f000400900000002900040000000000350004001000000017000000260
|
||||
02800fbb20f00f2220f00300000006001020040010a00018000000a0200000b19000050c360ea010910002e001c00020018002300000090
|
||||
0090004d01000090017c013c323232640a02013000cc0103000000ff0000001d000003ff00000025000003ff00000022000003101112131
|
||||
415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b
|
||||
4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828
|
||||
38485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f2b23203c2d182e1e30182e1c321d341d341e321c301e1e241e201f
|
||||
201d1c321a301e1c211e21341f1e202024201f1e20201f212221221d221e23341e1d1e1d20341f1d193b341c1d1e35201e201c20221f341
|
||||
c1e1e1c221f201d21201e1c1f34242221201f20221f201e241e241d2020221e2420231d221e211e1f1e1e341c321e3220301d2d302f2d2c
|
||||
2b23223a211c7e7f807f8080808080808080808080808080808080808180818081808180808080808180818080808180818081808180818
|
||||
08180818081808180808081808180808081807f808081808080818081808180808081808180818081808180818080808180818081808180
|
||||
81808180818081808180818081808180818081808080808080808080807f807f807f807f7f7e7e
|
||||
''')
|
||||
|
||||
def start_scan(cmd):
|
||||
assert_status(tls.app(cmd))
|
||||
|
||||
def cancel_capture():
|
||||
usb.queue.put(b'')
|
||||
#sleep(0.2)
|
||||
#rsp=tls.app(b'\x04')
|
||||
#assert_status(rsp)
|
||||
usb.read_82()
|
||||
|
||||
def wait_for_finger():
|
||||
while True:
|
||||
b=usb.wait_int()
|
||||
|
||||
if len(b) == 0:
|
||||
raise Exception('Cancelled')
|
||||
|
||||
if b[0] == 2:
|
||||
break
|
||||
|
||||
def get_prg_status():
|
||||
return tls.app(unhexlify('5100000000'))
|
||||
|
||||
def wait_till_finished():
|
||||
while True:
|
||||
status = get_prg_status()
|
||||
|
||||
if status[0] in [0, 7]:
|
||||
break
|
||||
|
||||
sleep(0.2)
|
||||
|
||||
def stop_prg():
|
||||
return tls.app(unhexlify('5100200000'))
|
||||
|
||||
def capture(prg):
|
||||
usb.purge_int_queue()
|
||||
|
||||
start_scan(prg)
|
||||
|
||||
b=usb.wait_int()
|
||||
if b[0] != 0:
|
||||
raise Exception('Unexpected interrupt type %s' % hexlify(b).decode())
|
||||
|
||||
try:
|
||||
wait_for_finger()
|
||||
wait_till_finished()
|
||||
finally:
|
||||
res=stop_prg()
|
||||
|
||||
while True:
|
||||
b=usb.wait_int()
|
||||
if b[0] != 3:
|
||||
raise Exception('Unexpected interrupt type %s' % hexlify(b).decode())
|
||||
|
||||
if b[1] == 0x43:
|
||||
break
|
||||
|
||||
assert_status(res)
|
||||
res = res[2:]
|
||||
|
||||
l, res = res[:4], res[4:]
|
||||
l, = unpack('<L', l)
|
||||
|
||||
if l != len(res):
|
||||
raise Exception('Response size does not match %d != %d', l, len(res))
|
||||
|
||||
x, y, w1, w2, error = unpack('<HHHHL', res)
|
||||
|
||||
return error
|
||||
|
||||
def append_new_image(key=0, prev=b''):
|
||||
rsp=tls.app(pack('<BLL', 0x68, key, 0))
|
||||
assert_status(rsp)
|
||||
new_key, = unpack('<L', rsp[2:])
|
||||
|
||||
usb.wait_int()
|
||||
|
||||
rsp=tls.app(b'\x6b' + prev)
|
||||
assert_status(rsp)
|
||||
|
||||
usb.wait_int()
|
||||
|
||||
rsp=tls.app(b'\x6b' + prev)
|
||||
assert_status(rsp)
|
||||
res=rsp[2:]
|
||||
|
||||
rsp=tls.app(unhexlify('6900000000'))
|
||||
assert_status(rsp)
|
||||
|
||||
l, res = res[:2], res[2:]
|
||||
l, = unpack('<H', l)
|
||||
if l != len(res):
|
||||
raise Exception('Response size does not match %d != %d', l, len(res))
|
||||
|
||||
# FIXME check how it's done rather than using a hardcoded offsets
|
||||
res, new = res[:0x6c], res[0x6c:]
|
||||
|
||||
return (new_key, res, new)
|
||||
|
||||
def parse_template(subtype, template):
|
||||
# This number is very odd. It seems to be always a multiple of 0x10,
|
||||
# which probably means that this is not a size of the plain text.
|
||||
# On the other hand it is exactly 0x30 bytes less than the size of the payload.
|
||||
# If we assume algos are all the same, 0x30 could be 0x10 for AES IV and
|
||||
# 0x20 for SHA256 MAC
|
||||
ciphertext_size, = unpack('<H', template[2:4])
|
||||
template_size = 8+ciphertext_size+0x30
|
||||
template, rest = template[:template_size], template[template_size:]
|
||||
|
||||
template = pack('<H', len(template)) + template
|
||||
|
||||
# FIXME this is most likely wrong, need to do a proper code dive to figure out
|
||||
# how enrollment update response is handled in the dll
|
||||
hs, rest = rest[-0x20:], rest[:-0x20]
|
||||
hs = pack('<H', len(hs)) + hs
|
||||
|
||||
tinfo = pack('<H', 1) + template
|
||||
tinfo += pack('<H', 2) + hs
|
||||
|
||||
tinfo = pack('<HHHH', subtype, 3, len(tinfo), 0x20) + tinfo
|
||||
tinfo += b'\0' * 0x20
|
||||
|
||||
return tinfo
|
||||
|
||||
def enroll(identity, subtype):
|
||||
key=0
|
||||
template=b''
|
||||
|
||||
print('Waiting for a finger...')
|
||||
|
||||
while True:
|
||||
glow_start_scan()
|
||||
|
||||
err = capture(enroll_prg)
|
||||
if err != 0:
|
||||
print('Error %08x, try again' % err)
|
||||
continue
|
||||
|
||||
key, rsp, template = append_new_image(key, template)
|
||||
|
||||
print('Progress: %d %% done' % rsp[0x3c])
|
||||
|
||||
if rsp[0x3c] == 100:
|
||||
break
|
||||
|
||||
# FIXME check for duplicates
|
||||
|
||||
tinfo = parse_template(subtype, template)
|
||||
|
||||
usr=db.lookup_user(identity)
|
||||
if usr == None:
|
||||
usr = db.new_user(identity)
|
||||
else:
|
||||
usr = usr.dbid
|
||||
|
||||
recid = db.new_finger(usr, tinfo)
|
||||
|
||||
glow_end_enroll()
|
||||
|
||||
print('All done')
|
||||
|
||||
return recid
|
||||
|
||||
def parse_dict(x):
|
||||
rc={}
|
||||
|
||||
while len(x) > 0:
|
||||
(t, l), x = unpack('<HH', x[:4]), x[4:]
|
||||
rc[t], x = x[:l], x[l:]
|
||||
|
||||
return rc
|
||||
|
||||
|
||||
def identify():
|
||||
glow_start_scan()
|
||||
try:
|
||||
err = capture(identify_prg)
|
||||
if err != 0:
|
||||
raise Exception('Capture failed: %08x' % err)
|
||||
|
||||
# which finger?
|
||||
stg_id=0 # match against any storage
|
||||
usr_id=0 # match against any user
|
||||
cmd=pack('<BBBHHHHH', 0x5e, 2, 0xff, stg_id, usr_id, 1, 0,0)
|
||||
rsp=tls.app(cmd)
|
||||
assert_status(rsp)
|
||||
|
||||
b = usb.wait_int()
|
||||
if b[0] != 3:
|
||||
raise Exception('Identification failed: %s' % hexlify(b).decode())
|
||||
|
||||
rsp = tls.app(unhexlify('6000000000'))
|
||||
assert_status(rsp)
|
||||
rsp = rsp[2:]
|
||||
|
||||
finally:
|
||||
# finish
|
||||
assert_status(tls.app(unhexlify('6200000000')))
|
||||
|
||||
(l,), rsp = unpack('<H', rsp[:2]), rsp[2:]
|
||||
if l != len(rsp):
|
||||
raise Exception('Response size does not match')
|
||||
|
||||
rsp=parse_dict(rsp)
|
||||
|
||||
|
||||
#for k in rsp:
|
||||
# print('%04x: %s (%d)' % (k, hexlify(rsp[k]).decode(), len(rsp[k])))
|
||||
|
||||
#0001: 09000000 (4)
|
||||
#0003: f500 (2)
|
||||
#0004: 8dee792532d3432d41c872fd4d6d590fbc855ad449cf2753cd919eb9c94675c6 (32)
|
||||
#0005: 0000000000000000000000000000000000000000000000000000000000000000 (32)
|
||||
#0008: 0a00 (2)
|
||||
#0002: 010b0000 (4)
|
||||
#0006: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 (40)
|
||||
usrid, subtype, hsh, fingerid = rsp[1], rsp[3], rsp[4], rsp[8]
|
||||
usrid, = unpack('<L', usrid)
|
||||
subtype, = unpack('<H', subtype)
|
||||
fingerid, = unpack('<H', fingerid)
|
||||
|
||||
usr = db.get_user(usrid)
|
||||
finger_record = db.get_record_children(fingerid)
|
||||
|
||||
# Device won't let you add more than one data blob
|
||||
if len(finger_record.children) > 1:
|
||||
raise Exception('Expected only one child record for finger')
|
||||
|
||||
print('Recognised finger %02x (%s) from user %s' % (subtype, subtype_to_string(subtype), repr(usr.identity)))
|
||||
print('Template hash: %s' % hexlify(hsh).decode())
|
||||
|
||||
if len(finger_record.children) > 0:
|
||||
if finger_record.children[0]['type'] != 8:
|
||||
raise Exception('Expected data blob as a finger child')
|
||||
|
||||
blob_id = finger_record.children[0]['dbid']
|
||||
blob = db.get_record_value(blob_id).value
|
||||
|
||||
tag, sz = unpack('<HH', blob[:4])
|
||||
val = blob[4:4+sz]
|
||||
|
||||
print('Data blob associated with the finger: %04x: %s' % (tag, hexlify(val).decode()))
|
||||
|
||||
return rsp
|
||||
|
||||
|
||||
def read_flash(which, size):
|
||||
block_size = 0x1000
|
||||
blocks = [db.read_flash(which, addr, 0x1000) for addr in range(0, size, 0x1000)]
|
||||
return b''.join(blocks)
|
||||
|
||||
def dump_flash():
|
||||
with open('db_flash.bin', 'wb') as f:
|
||||
f.write(read_flash(4, 0x30000))
|
||||
|
||||
with open('cert_flash.bin', 'wb') as f:
|
||||
f.write(read_flash(1, 0x1000))
|
||||
|
||||
with open('calib_flash.bin', 'wb') as f:
|
||||
f.write(read_flash(6, 0x8000))
|
||||
|
||||
with open('5_flash.bin', 'wb') as f:
|
||||
f.write(read_flash(5, 0x8000))
|
||||
|
||||
def read_hw_reg32(addr):
|
||||
rsp=tls.cmd(pack('<BLB', 7, addr, 4))
|
||||
assert_status(rsp)
|
||||
rsp, = unpack('<L', rsp[2:])
|
||||
return rsp
|
||||
|
||||
def write_hw_reg32(addr, val):
|
||||
rsp=tls.cmd(pack('<BLLB', 8, addr, val, 4))
|
||||
assert_status(rsp)
|
||||
|
|
|
|||
9
reboot.py
Normal file
9
reboot.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
from usb97 import usb
|
||||
from sensor import reboot
|
||||
|
||||
#usb.trace_enabled=True
|
||||
#tls.trace_enabled=True
|
||||
|
||||
usb.open()
|
||||
reboot()
|
||||
289
sensor.py
Normal file
289
sensor.py
Normal file
|
|
@ -0,0 +1,289 @@
|
|||
|
||||
from tls97 import tls
|
||||
from struct import pack, unpack
|
||||
from binascii import hexlify, unhexlify
|
||||
from util import assert_status, unhex
|
||||
from hw_tables import dev_info_lookup
|
||||
|
||||
|
||||
def glow_start_scan():
|
||||
cmd=unhexlify('3920bf0200ffff0000019900200000000099990000000000000000000000000020000000000000000000000000ffff000000990020000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
|
||||
assert_status(tls.app(cmd))
|
||||
|
||||
def glow_end_enroll():
|
||||
cmd=unhexlify('39f4010000f401000001ff002000000000ffff0000000000000000000000000020000000000000000000000000f401000000ff0020000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
|
||||
assert_status(tls.app(cmd))
|
||||
|
||||
def start_scan(cmd):
|
||||
assert_status(tls.app(cmd))
|
||||
|
||||
def cancel_capture():
|
||||
usb.queue.put(b'')
|
||||
#sleep(0.2)
|
||||
#rsp=tls.app(b'\x04')
|
||||
#assert_status(rsp)
|
||||
usb.read_82()
|
||||
|
||||
def wait_for_finger():
|
||||
while True:
|
||||
b=usb.wait_int()
|
||||
|
||||
if len(b) == 0:
|
||||
raise Exception('Cancelled')
|
||||
|
||||
if b[0] == 2:
|
||||
break
|
||||
|
||||
def get_prg_status():
|
||||
return tls.app(unhexlify('5100000000'))
|
||||
|
||||
def wait_till_finished():
|
||||
while True:
|
||||
status = get_prg_status()
|
||||
|
||||
if status[0] in [0, 7]:
|
||||
break
|
||||
|
||||
sleep(0.2)
|
||||
|
||||
def stop_prg():
|
||||
return tls.app(unhexlify('5100200000'))
|
||||
|
||||
def capture(prg):
|
||||
usb.purge_int_queue()
|
||||
|
||||
start_scan(prg)
|
||||
|
||||
b=usb.wait_int()
|
||||
if b[0] != 0:
|
||||
raise Exception('Unexpected interrupt type %s' % hexlify(b).decode())
|
||||
|
||||
try:
|
||||
wait_for_finger()
|
||||
wait_till_finished()
|
||||
finally:
|
||||
res=stop_prg()
|
||||
|
||||
while True:
|
||||
b=usb.wait_int()
|
||||
if b[0] != 3:
|
||||
raise Exception('Unexpected interrupt type %s' % hexlify(b).decode())
|
||||
|
||||
if b[1] == 0x43:
|
||||
break
|
||||
|
||||
assert_status(res)
|
||||
res = res[2:]
|
||||
|
||||
l, res = res[:4], res[4:]
|
||||
l, = unpack('<L', l)
|
||||
|
||||
if l != len(res):
|
||||
raise Exception('Response size does not match %d != %d', l, len(res))
|
||||
|
||||
x, y, w1, w2, error = unpack('<HHHHL', res)
|
||||
|
||||
return error
|
||||
|
||||
def append_new_image(key=0, prev=b''):
|
||||
rsp=tls.app(pack('<BLL', 0x68, key, 0))
|
||||
assert_status(rsp)
|
||||
new_key, = unpack('<L', rsp[2:])
|
||||
|
||||
usb.wait_int()
|
||||
|
||||
rsp=tls.app(b'\x6b' + prev)
|
||||
assert_status(rsp)
|
||||
|
||||
usb.wait_int()
|
||||
|
||||
rsp=tls.app(b'\x6b' + prev)
|
||||
assert_status(rsp)
|
||||
res=rsp[2:]
|
||||
|
||||
rsp=tls.app(unhexlify('6900000000'))
|
||||
assert_status(rsp)
|
||||
|
||||
l, res = res[:2], res[2:]
|
||||
l, = unpack('<H', l)
|
||||
if l != len(res):
|
||||
raise Exception('Response size does not match %d != %d', l, len(res))
|
||||
|
||||
# FIXME check how it's done rather than using a hardcoded offsets
|
||||
res, new = res[:0x6c], res[0x6c:]
|
||||
|
||||
return (new_key, res, new)
|
||||
|
||||
def parse_template(subtype, template):
|
||||
# This number is very odd. It seems to be always a multiple of 0x10,
|
||||
# which probably means that this is not a size of the plain text.
|
||||
# On the other hand it is exactly 0x30 bytes less than the size of the payload.
|
||||
# If we assume algos are all the same, 0x30 could be 0x10 for AES IV and
|
||||
# 0x20 for SHA256 MAC
|
||||
ciphertext_size, = unpack('<H', template[2:4])
|
||||
template_size = 8+ciphertext_size+0x30
|
||||
template, rest = template[:template_size], template[template_size:]
|
||||
|
||||
template = pack('<H', len(template)) + template
|
||||
|
||||
# FIXME this is most likely wrong, need to do a proper code dive to figure out
|
||||
# how enrollment update response is handled in the dll
|
||||
hs, rest = rest[-0x20:], rest[:-0x20]
|
||||
hs = pack('<H', len(hs)) + hs
|
||||
|
||||
tinfo = pack('<H', 1) + template
|
||||
tinfo += pack('<H', 2) + hs
|
||||
|
||||
tinfo = pack('<HHHH', subtype, 3, len(tinfo), 0x20) + tinfo
|
||||
tinfo += b'\0' * 0x20
|
||||
|
||||
return tinfo
|
||||
|
||||
def enroll(identity, subtype):
|
||||
key=0
|
||||
template=b''
|
||||
|
||||
print('Waiting for a finger...')
|
||||
|
||||
while True:
|
||||
glow_start_scan()
|
||||
|
||||
err = capture(enroll_prg)
|
||||
if err != 0:
|
||||
print('Error %08x, try again' % err)
|
||||
continue
|
||||
|
||||
key, rsp, template = append_new_image(key, template)
|
||||
|
||||
print('Progress: %d %% done' % rsp[0x3c])
|
||||
|
||||
if rsp[0x3c] == 100:
|
||||
break
|
||||
|
||||
# FIXME check for duplicates
|
||||
|
||||
tinfo = parse_template(subtype, template)
|
||||
|
||||
usr=db.lookup_user(identity)
|
||||
if usr == None:
|
||||
usr = db.new_user(identity)
|
||||
else:
|
||||
usr = usr.dbid
|
||||
|
||||
recid = db.new_finger(usr, tinfo)
|
||||
|
||||
glow_end_enroll()
|
||||
|
||||
print('All done')
|
||||
|
||||
return recid
|
||||
|
||||
def parse_dict(x):
|
||||
rc={}
|
||||
|
||||
while len(x) > 0:
|
||||
(t, l), x = unpack('<HH', x[:4]), x[4:]
|
||||
rc[t], x = x[:l], x[l:]
|
||||
|
||||
return rc
|
||||
|
||||
|
||||
def identify():
|
||||
glow_start_scan()
|
||||
try:
|
||||
err = capture(identify_prg)
|
||||
if err != 0:
|
||||
raise Exception('Capture failed: %08x' % err)
|
||||
|
||||
# which finger?
|
||||
stg_id=0 # match against any storage
|
||||
usr_id=0 # match against any user
|
||||
cmd=pack('<BBBHHHHH', 0x5e, 2, 0xff, stg_id, usr_id, 1, 0,0)
|
||||
rsp=tls.app(cmd)
|
||||
assert_status(rsp)
|
||||
|
||||
b = usb.wait_int()
|
||||
if b[0] != 3:
|
||||
raise Exception('Identification failed: %s' % hexlify(b).decode())
|
||||
|
||||
rsp = tls.app(unhexlify('6000000000'))
|
||||
assert_status(rsp)
|
||||
rsp = rsp[2:]
|
||||
|
||||
finally:
|
||||
# finish
|
||||
assert_status(tls.app(unhexlify('6200000000')))
|
||||
|
||||
(l,), rsp = unpack('<H', rsp[:2]), rsp[2:]
|
||||
if l != len(rsp):
|
||||
raise Exception('Response size does not match')
|
||||
|
||||
rsp=parse_dict(rsp)
|
||||
|
||||
|
||||
#for k in rsp:
|
||||
# print('%04x: %s (%d)' % (k, hexlify(rsp[k]).decode(), len(rsp[k])))
|
||||
|
||||
#0001: 09000000 (4)
|
||||
#0003: f500 (2)
|
||||
#0004: 8dee792532d3432d41c872fd4d6d590fbc855ad449cf2753cd919eb9c94675c6 (32)
|
||||
#0005: 0000000000000000000000000000000000000000000000000000000000000000 (32)
|
||||
#0008: 0a00 (2)
|
||||
#0002: 010b0000 (4)
|
||||
#0006: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 (40)
|
||||
usrid, subtype, hsh, fingerid = rsp[1], rsp[3], rsp[4], rsp[8]
|
||||
usrid, = unpack('<L', usrid)
|
||||
subtype, = unpack('<H', subtype)
|
||||
fingerid, = unpack('<H', fingerid)
|
||||
|
||||
usr = db.get_user(usrid)
|
||||
finger_record = db.get_record_children(fingerid)
|
||||
|
||||
# Device won't let you add more than one data blob
|
||||
if len(finger_record.children) > 1:
|
||||
raise Exception('Expected only one child record for finger')
|
||||
|
||||
print('Recognised finger %02x (%s) from user %s' % (subtype, subtype_to_string(subtype), repr(usr.identity)))
|
||||
print('Template hash: %s' % hexlify(hsh).decode())
|
||||
|
||||
if len(finger_record.children) > 0:
|
||||
if finger_record.children[0]['type'] != 8:
|
||||
raise Exception('Expected data blob as a finger child')
|
||||
|
||||
blob_id = finger_record.children[0]['dbid']
|
||||
blob = db.get_record_value(blob_id).value
|
||||
|
||||
tag, sz = unpack('<HH', blob[:4])
|
||||
val = blob[4:4+sz]
|
||||
|
||||
print('Data blob associated with the finger: %04x: %s' % (tag, hexlify(val).decode()))
|
||||
|
||||
return rsp
|
||||
|
||||
|
||||
def read_hw_reg32(addr):
|
||||
rsp=tls.cmd(pack('<BLB', 7, addr, 4))
|
||||
assert_status(rsp)
|
||||
rsp, = unpack('<L', rsp[2:])
|
||||
return rsp
|
||||
|
||||
def write_hw_reg32(addr, val):
|
||||
rsp=tls.cmd(pack('<BLLB', 8, addr, val, 4))
|
||||
assert_status(rsp)
|
||||
|
||||
|
||||
def reboot():
|
||||
assert_status(tls.cmd(unhex('050200')))
|
||||
|
||||
def identify_sensor():
|
||||
rsp=tls.cmd(b'\x75')
|
||||
assert_status(rsp)
|
||||
rsp=rsp[2:]
|
||||
|
||||
zeroes, minor, major = unpack('<LHH', rsp)
|
||||
|
||||
if zeroes != 0:
|
||||
raise Exception('This was not expected')
|
||||
|
||||
return dev_info_lookup(major, minor)
|
||||
|
||||
4
tls97.py
4
tls97.py
|
|
@ -3,7 +3,7 @@ import hmac
|
|||
import sys
|
||||
from hashlib import sha256, md5, sha1
|
||||
from binascii import *
|
||||
from usb97 import unhex
|
||||
from usb97 import unhex, usb
|
||||
from struct import pack, unpack
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Random import get_random_bytes
|
||||
|
|
@ -59,7 +59,6 @@ def hs_key():
|
|||
key=password_hardcoded[:0x10]
|
||||
seed=password_hardcoded[0x10:] + b'\xaa'*2
|
||||
hs_key=prf(key, b'HS_KEY_PAIR_GEN' + seed, 0x20)
|
||||
print(hs_key.hex())
|
||||
return int(hs_key[::-1].hex(), 16)
|
||||
|
||||
def with_2bytes_size(chunk):
|
||||
|
|
@ -499,3 +498,4 @@ class Tls():
|
|||
self.pub_key = Point(x, y, P256)
|
||||
self.priv_key = d
|
||||
|
||||
tls = Tls(usb)
|
||||
|
|
|
|||
|
|
@ -1,45 +1,52 @@
|
|||
|
||||
from db97 import *
|
||||
from tls97 import *
|
||||
from usb97 import *
|
||||
from prototype import *
|
||||
from binascii import hexlify, unhexlify
|
||||
from time import ctime
|
||||
|
||||
from tls97 import tls
|
||||
from usb97 import usb
|
||||
from sensor import reboot, write_hw_reg32, read_hw_reg32, identify_sensor
|
||||
from flash import flush_changes, read_flash, erase_flash, write_flash_all, write_fw_signature, get_fw_info
|
||||
from util import assert_status
|
||||
|
||||
|
||||
with open('6_07f_lenovo_mis.xpfwext', 'rb') as f:
|
||||
fwext=f.read()
|
||||
|
||||
fwext=fwext[fwext.index(b'\x1a')+1:]
|
||||
fwext, signature = fwext[:-0x100], fwext[-0x100:]
|
||||
|
||||
usb.trace_enabled=True
|
||||
tls.trace_enabled=True
|
||||
open97()
|
||||
#usb.trace_enabled=True
|
||||
#tls.trace_enabled=True
|
||||
|
||||
usb.open()
|
||||
tls.parseTlsFlash(read_flash(1, 0, 0x1000))
|
||||
tls.open()
|
||||
|
||||
# no idea what this is:
|
||||
write_hw_reg32(0x8000205c, 7)
|
||||
print('*0x80002080=%08x' % read_hw_reg32(0x80002080))
|
||||
if read_hw_reg32(0x80002080) != 2:
|
||||
raise Exception('Unexpected register value')
|
||||
|
||||
tls.cmd(unhexlify('75'))
|
||||
dev=identify_sensor()
|
||||
print('Sensor: %s' % dev.name)
|
||||
# ^ TODO -- what is the real reason to detect HW at this stage?
|
||||
|
||||
# get fwext header info
|
||||
rsp=tls.cmd(unhexlify('4302'))
|
||||
# ^ should fail 'cause no fwext uploaded yet
|
||||
rsp=tls.cmd(unhexlify('4302')) # should fail 'cause no fwext uploaded yet
|
||||
|
||||
if rsp[:2] == b'\0' * 2:
|
||||
raise Exception('FW is already present')
|
||||
fwi=get_fw_info(2)
|
||||
if fwi != None:
|
||||
raise Exception('FW is already present (version %d.%d (%s))' % (fwi.major, fwi.minor, ctime(fwi.buildtime)))
|
||||
|
||||
db.flush_changes()
|
||||
#flush_changes()
|
||||
write_flash_all(2, 0, fwext)
|
||||
write_fw_signature(2, signature)
|
||||
|
||||
ptr=0
|
||||
while len(fwext) > 0:
|
||||
chunk, fwext = fwext[:0x1000], fwext[0x1000:]
|
||||
db.write_flash(2, ptr, chunk)
|
||||
ptr += len(chunk)
|
||||
fwi=get_fw_info(2)
|
||||
if fwi == None:
|
||||
raise Exception('No firmware detected')
|
||||
|
||||
rsp=tls.cmd(pack('<BBxH', 0x42, 2, len(signature)) + signature)
|
||||
assert_status(rsp)
|
||||
|
||||
rsp=tls.cmd(unhexlify('4302'))
|
||||
assert_status(rsp)
|
||||
print('Loaded FWExt version %d.%d (%s), %d modules' % (fwi.major, fwi.minor, ctime(fwi.buildtime), len(fwi.modules)))
|
||||
|
||||
# Reboot
|
||||
tls.cmd(unhexlify('050200'))
|
||||
reboot()
|
||||
|
|
|
|||
13
usb97.py
13
usb97.py
|
|
@ -1,17 +1,13 @@
|
|||
|
||||
import re
|
||||
import usb.core
|
||||
import usb.core as ucore
|
||||
from binascii import *
|
||||
from util import assert_status
|
||||
from util import assert_status, unhex
|
||||
from struct import unpack
|
||||
from usb.util import claim_interface, release_interface
|
||||
from queue import Queue
|
||||
from threading import Thread
|
||||
from usb.core import USBError
|
||||
|
||||
def unhex(x):
|
||||
return unhexlify(re.sub('\W', '', x))
|
||||
|
||||
init_hardcoded=unhex('''
|
||||
06020000015cb560afa595d0dcf4fca09ebb69301e2b9e24a5dfb6f2602833427d3bd65222c418ff15b54587ab2854c4fe9aea74fa55567
|
||||
2036fa3ec73c6912c58b1b49cbdcc7664165482cd70d5bb95d9d469626fdc2e012d74157c5792260968a2a4572b1ccccc26ec2e2ed0ddda
|
||||
|
|
@ -54,8 +50,8 @@ class Usb():
|
|||
pass
|
||||
|
||||
def open(self):
|
||||
self.dev = usb.core.find(idVendor=0x138a, idProduct=0x0097)
|
||||
self.dev.default_timeout = 5000
|
||||
self.dev = ucore.find(idVendor=0x138a, idProduct=0x0097)
|
||||
self.dev.default_timeout = 15000
|
||||
self.thread = Thread(target=lambda: self.int_thread())
|
||||
self.thread.daemon = True
|
||||
self.thread.start()
|
||||
|
|
@ -120,3 +116,4 @@ class Usb():
|
|||
if self.trace_enabled:
|
||||
print(s)
|
||||
|
||||
usb=Usb()
|
||||
|
|
|
|||
5
util.py
5
util.py
|
|
@ -1,8 +1,13 @@
|
|||
|
||||
import re
|
||||
from struct import unpack
|
||||
from binascii import unhexlify
|
||||
|
||||
def assert_status(b):
|
||||
s,=unpack('<H', b[:2])
|
||||
if s != 0:
|
||||
raise Exception('Failed: %04x' % s)
|
||||
|
||||
def unhex(x):
|
||||
return unhexlify(re.sub('\W', '', x))
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue