From mboxrd@z Thu Jan 1 00:00:00 1970 From: Evgeniy Polyakov Subject: Asynchronous crypto layer. Date: Fri, 29 Oct 2004 10:22:38 +0400 Sender: netdev-bounce@oss.sgi.com Message-ID: <1099030958.4944.148.camel@uganda> Reply-To: johnpol@2ka.mipt.ru Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-a71b/Hi3u7ltMlmkhSjh" Cc: cryptoapi@lists.logix.cz Return-path: To: netdev@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com List-Id: netdev.vger.kernel.org --=-a71b/Hi3u7ltMlmkhSjh Content-Type: multipart/mixed; boundary="=-gAz1C7z/zhc3Hd8IdTzQ" --=-gAz1C7z/zhc3Hd8IdTzQ Content-Type: text/plain Content-Transfer-Encoding: quoted-printable I'm pleased to announce asynchronous crypto layer for Linux kernel 2.6. It support following features: - multiple asynchronous crypto device queues - crypto session routing - crypto session binding - modular load balancing - crypto session batching genetically implemented by design - crypto session priority - different kinds of crypto operation(RNG, asymmetrical crypto, HMAC and any other) Some design notes: acrypto has one main crypto session queue(double linked list, probably it should be done like crypto_route or sk_buff queue), into which each newly allocated session is inserted and this is a place where load balancing searches it's food. When new session is being prepared for insertion it calls load balancer's ->find_device() method, which should return suitable device(current simple_lb load balancer returns device with the lowest load(device has the least number of session in it's queue)) if it exists. After crypto_device being returned acrypto creates new crypto routing entry which points to returned device and adds it to crypto session routing queue. Crypto session is being inserted into device's queue according to it's priority and it is crypto device driver that should process it's session list according to session's priority. All insertion and deletion are guarded by appropriate locks, but session_list traversing is not guarded in crypto_lb_thread() since session can be removed _only_ from that function by design, so if crypto device (atomically) marks session as completed and not being processed and use list_for_each_safe() for traversing it's queue all should be OK. Each crypto load balancer must implement 2 methods:=20 ->rehash() and ->find_device() which will be called from any context and under spinlock. ->rehash() method should be called to remix crypto sessions in device's queues, for example if driver decides that it's device is broken it marks itself as broken and load balancer(or scheduler if you like) should remove all sessions from this queue to some other devices.=20 If session can not be completed scheduler must mark it as broken and complete it(by calling first broke_session() and then complete_session() and stop_process_session()). Consumer must check if operation was successful(and therefore session is not broken). ->find_device() method should return appropriate crypto device. For crypto session to be successfully allocated crypto consumer must provide two structures - struct crypto_session_initializer=20 (hmm, why only one z?) and struct crypto_data. struct crypto_session_initializer contains data needed to find appropriate device, like type of operation, mode of operation, some flags(for example SESSION_BINDED, which means that session must be bound to specified in bdev field crypto device, it is useful for TCPA/TPM), session priority and callback which will be called after all routing for given session are finished. struct crypto_data contains scatterlists for src, dst, key and iv. It also has void *priv field and it's size which is allocated and may be used by any crypto agent(for example VIA PadLock driver uses it to store aes_ctx field, crypto_session can use this field to store some pointers needed in ->callback()). Actually callback will be called from queue_work, but I suppose it is better to not assume calling context. ->callback() will be called after all crypto routing for given session are done with the same parameters as were provided in initialisation time(if session has only one routing callback will be called with original parameters, but if it has several routes callback will be called with parameters from the latest processed one). I believe crypto callback should not know about crypto sessions, routings, device and so on, proper restriction is always a good idea. Crypto routing. This feature allows the same session to be processed by several devices/algorithms. For example if you need to encrypt data and then sign it in TPM device you can create one route to encryption device and then route it to TPM device. (Note: this feature must be discussed since there is no time slice after session allocation, only in crypto_device->data_ready() method and there are locking issues in ->callback() method). Crypto device. It can be either software emulator or hardware accelerator chip(like HIFN 79*/83* or Via PadLock ACE/RNG, or even TPM device like each IBM ThinkPad or some HP laptops have=20 (gentle hint: _they_ even have a _windows_ software for them :) )). It can be registered with asynchronous crypto layer and must provide some data for it: ->data_ready() method - it is called each time new session is added to device's queue. Array of struct crypto_capability and it's amount -=20 struct crypto_capability describes each operation given device can handle, and has a maximum session queue length parameter. Note: this structure can [be extended to] include "rate" parameter to show absolute speed of given operation in some units, which therefore can be used by scheduler(load balancer) for proper device selection. Actually queue length can somehow reflects device's "speed". Also attached: - simple synchronous <-> asynchronous bridge for sha1 crypto provider. It can be easily extended to handle whole number of synchronous software implemented algorithms. - driver for Via PadLock ACE - not tested, since my M10000 does not have xcrypt module. This work is 98% by Michal Ludvig , I have just silently stolen it several days ago. I've obtained bits of documentation for HIFN 795* so driver will be created for it. I want to thank Wim Vandeputte and www.soekris.com for steps towards me in ordering and delivering process to Russia. Asynchronous crypto layer depends on kernel connector which was presented in both linux-kernel@ and netdev@ several weeks ago. Currently acrypto does not handle userspace session requests(for example from OpenSSL) but I will implement it soon in form of char device and it's ->mmap method. Please review and comment, I am open for discussion. Thank you. --=20 Evgeniy Polyakov Crash is better than data corruption. -- Art Grabowski --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=acrypto.h Content-Type: text/x-chdr; name=acrypto.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAlhY3J5cHRvLmgNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQb2x5 YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4NCiAqIA0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQogKiBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQ0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uDQogKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KICogR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KICogYWxv bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUN CiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24s IE1BIDAyMTExLTEzMDcgVVNBDQogKi8NCg0KI2lmbmRlZiBfX0FDUllQVE9fSA0KI2RlZmluZSBf X0FDUllQVE9fSA0KDQojZGVmaW5lIFNDQUNIRV9OQU1FTEVOCQkzMg0KDQpzdHJ1Y3QgY3J5cHRv X3Nlc3Npb25faW5pdGlhbGl6ZXI7DQpzdHJ1Y3QgY3J5cHRvX2RhdGE7DQp0eXBlZGVmIHZvaWQg KCpjcnlwdG9fY2FsbGJhY2tfdCkoc3RydWN0IGNyeXB0b19zZXNzaW9uX2luaXRpYWxpemVyICos IHN0cnVjdCBjcnlwdG9fZGF0YSAqKTsNCg0KI2lmIDANCiNkZWZpbmUgU0VTU0lPTl9DT01QTEVU RUQJMA0KI2RlZmluZSBTRVNTSU9OX0ZJTklTSEVECTENCiNkZWZpbmUgU0VTU0lPTl9TVEFSVEVE CQkyDQojZGVmaW5lIFNFU1NJT05fUFJPQ0VTU0VECTMNCg0KI2RlZmluZSBzZXNzaW9uX2NvbXBs ZXRlZChzKQkodGVzdF9iaXQoU0VTU0lPTl9DT01QTEVURUQsICh1bnNpZ25lZCBsb25nICopJnMt PmNpLmZsYWdzKSkNCiNkZWZpbmUgY29tcGxldGVfc2Vzc2lvbihzKQlkbyB7IHNldF9iaXQoU0VT U0lPTl9DT01QTEVURUQsICh1bnNpZ25lZCBsb25nICopJnMtPmNpLmZsYWdzKTsgfXdoaWxlICgw KQ0KI2RlZmluZSB1bmNvbXBsZXRlX3Nlc3Npb24ocykJZG8geyBjbGVhcl9iaXQoU0VTU0lPTl9D T01QTEVURUQsICh1bnNpZ25lZCBsb25nICopJnMtPmNpLmZsYWdzKTsgfSB3aGlsZSAoMCkNCg0K I2RlZmluZSBzZXNzaW9uX3N0YXJ0ZWQocykJKHRlc3RfYml0KFNFU1NJT05fU1RBUlRFRCwgKHVu c2lnbmVkIGxvbmcgKikmcy0+Y2kuZmxhZ3MpKQ0KI2RlZmluZSBzdGFydF9zZXNzaW9uKHMpCWRv IHsgc2V0X2JpdChTRVNTSU9OX1NUQVJURUQsICh1bnNpZ25lZCBsb25nICopJnMtPmNpLmZsYWdz KTsgfSB3aGlsZSAoMCkNCiNkZWZpbmUgdW5zdGFydF9zZXNzaW9uKHMpCWRvIHsgY2xlYXJfYml0 KFNFU1NJT05fU1RBUlRFRCwgKHVuc2lnbmVkIGxvbmcgKikmcy0+Y2kuZmxhZ3MpOyB9IHdoaWxl ICgwKQ0KDQojZGVmaW5lIHNlc3Npb25fZmluaXNoZWQocykJKHRlc3RfYml0KFNFU1NJT05fRklO SVNIRUQsICh1bnNpZ25lZCBsb25nICopJnMtPmNpLmZsYWdzKSkNCiNkZWZpbmUgZmluaXNoX3Nl c3Npb24ocykJZG8geyBzZXRfYml0KFNFU1NJT05fRklOSVNIRUQsICh1bnNpZ25lZCBsb25nICop JnMtPmNpLmZsYWdzKTsgfSB3aGlsZSAoMCkNCiNkZWZpbmUgdW5maW5pc2hfc2Vzc2lvbihzKQlk byB7IGNsZWFyX2JpdChTRVNTSU9OX0ZJTklTSEVELCAodW5zaWduZWQgbG9uZyAqKSZzLT5jaS5m bGFncyk7IH0gd2hpbGUgKDApDQoNCiNkZWZpbmUgc2Vzc2lvbl9pc19wcm9jZXNzZWQocykJKHRl c3RfYml0KFNFU1NJT05fUFJPQ0VTU0VELCAodW5zaWduZWQgbG9uZyAqKSZzLT5jaS5mbGFncykp DQojZGVmaW5lIHN0YXJ0X3Byb2Nlc3Nfc2Vzc2lvbihzKQlkbyB7IHNldF9iaXQoU0VTU0lPTl9Q Uk9DRVNTRUQsICh1bnNpZ25lZCBsb25nICopJnMtPmNpLmZsYWdzKTsgfSB3aGlsZSAoMCkNCiNk ZWZpbmUgc3RvcF9wcm9jZXNzX3Nlc3Npb24ocykJZG8geyBjbGVhcl9iaXQoU0VTU0lPTl9QUk9D RVNTRUQsICh1bnNpZ25lZCBsb25nICopJnMtPmNpLmZsYWdzKTsgfSB3aGlsZSAoMCkNCiNlbHNl DQoNCiNkZWZpbmUgU0VTU0lPTl9DT01QTEVURUQJKDE8PDE1KQ0KI2RlZmluZSBTRVNTSU9OX0ZJ TklTSEVECSgxPDwxNCkNCiNkZWZpbmUgU0VTU0lPTl9TVEFSVEVECQkoMTw8MTMpDQojZGVmaW5l IFNFU1NJT05fUFJPQ0VTU0VECSgxPDwxMikNCiNkZWZpbmUgU0VTU0lPTl9CSU5ERUQJCSgxPDwx MSkNCiNkZWZpbmUgU0VTU0lPTl9CUk9LRU4JCSgxPDwxMCkNCg0KI2RlZmluZSBzZXNzaW9uX2Nv bXBsZXRlZChzKQkocy0+Y2kuZmxhZ3MgJiBTRVNTSU9OX0NPTVBMRVRFRCkNCiNkZWZpbmUgY29t cGxldGVfc2Vzc2lvbihzKQlkbyB7cy0+Y2kuZmxhZ3MgfD0gU0VTU0lPTl9DT01QTEVURUQ7fSB3 aGlsZSgwKQ0KI2RlZmluZSB1bmNvbXBsZXRlX3Nlc3Npb24ocykJZG8ge3MtPmNpLmZsYWdzICY9 IH5TRVNTSU9OX0NPTVBMRVRFRDt9IHdoaWxlICgwKQ0KDQojZGVmaW5lIHNlc3Npb25fZmluaXNo ZWQocykJKHMtPmNpLmZsYWdzICYgU0VTU0lPTl9GSU5JU0hFRCkNCiNkZWZpbmUgZmluaXNoX3Nl c3Npb24ocykJZG8ge3MtPmNpLmZsYWdzIHw9IFNFU1NJT05fRklOSVNIRUQ7fSB3aGlsZSgwKQ0K I2RlZmluZSB1bmZpbmlzaF9zZXNzaW9uKHMpCWRvIHtzLT5jaS5mbGFncyAmPSB+U0VTU0lPTl9G SU5JU0hFRDt9IHdoaWxlICgwKQ0KDQojZGVmaW5lIHNlc3Npb25fc3RhcnRlZChzKQkocy0+Y2ku ZmxhZ3MgJiBTRVNTSU9OX1NUQVJURUQpDQojZGVmaW5lIHN0YXJ0X3Nlc3Npb24ocykJZG8ge3Mt PmNpLmZsYWdzIHw9IFNFU1NJT05fU1RBUlRFRDt9IHdoaWxlKDApDQojZGVmaW5lIHVuc3RhcnRf c2Vzc2lvbihzKQlkbyB7cy0+Y2kuZmxhZ3MgJj0gflNFU1NJT05fU1RBUlRFRDt9IHdoaWxlICgw KQ0KDQojZGVmaW5lIHNlc3Npb25faXNfcHJvY2Vzc2VkKHMpCQkocy0+Y2kuZmxhZ3MgJiBTRVNT SU9OX1BST0NFU1NFRCkNCiNkZWZpbmUgc3RhcnRfcHJvY2Vzc19zZXNzaW9uKHMpCWRvIHtzLT5j aS5mbGFncyB8PSBTRVNTSU9OX1BST0NFU1NFRDt9IHdoaWxlKDApDQojZGVmaW5lIHN0b3BfcHJv Y2Vzc19zZXNzaW9uKHMpCQlkbyB7cy0+Y2kuZmxhZ3MgJj0gflNFU1NJT05fUFJPQ0VTU0VEO30g d2hpbGUgKDApDQoNCiNkZWZpbmUgc2Vzc2lvbl9iaW5kZWQocykJKHMtPmNpLmZsYWdzICYgU0VT U0lPTl9CSU5ERUQpDQojZGVmaW5lIGJpbmRfc2Vzc2lvbihzKQkJZG8ge3MtPmNpLmZsYWdzIHw9 IFNFU1NJT05fQklOREVEO30gd2hpbGUoMCkNCiNkZWZpbmUgdW5iaW5kX3Nlc3Npb24ocykJZG8g e3MtPmNpLmZsYWdzICY9IH5TRVNTSU9OX0JJTkRFRDt9IHdoaWxlICgwKQ0KI2RlZmluZSBzY2lf YmluZGVkKGNpKQkJKGNpLT5mbGFncyAmIFNFU1NJT05fQklOREVEKQ0KDQojZGVmaW5lIHNlc3Np b25fYnJva2VuKHMpCShzLT5jaS5mbGFncyAmIFNFU1NJT05fQlJPS0VOKQ0KI2RlZmluZSBicm9r ZV9zZXNzaW9uKHMpCWRvIHtzLT5jaS5mbGFncyB8PSBTRVNTSU9OX0JST0tFTjt9IHdoaWxlKDAp DQojZGVmaW5lIHVuYnJva2Vfc2Vzc2lvbihzKQlkbyB7cy0+Y2kuZmxhZ3MgJj0gflNFU1NJT05f QlJPS0VOO30gd2hpbGUgKDApDQoNCiNlbmRpZg0KDQpzdHJ1Y3QgY3J5cHRvX2RldmljZV9zdGF0 DQp7DQoJX191NjQJCQlzY29tcGxldGVkOw0KCV9fdTY0CQkJc2ZpbmlzaGVkOw0KCV9fdTY0CQkJ c3N0YXJ0ZWQ7DQoJX191NjQJCQlrbWVtX2ZhaWxlZDsNCn07DQoNCiNpZmRlZiBfX0tFUk5FTF9f DQoNCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4NCiNp bmNsdWRlIDxsaW51eC9zbGFiLmg+DQojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCiNpbmNs dWRlIDxsaW51eC9kZXZpY2UuaD4NCiNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4NCg0KI2lu Y2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPg0KDQojZGVmaW5lIERFQlVHDQojaWZkZWYgREVCVUcN CiNkZWZpbmUgZHByaW50ayhmLCBhLi4uKSBwcmludGsoS0VSTl9FTUVSRyBmLCAjI2EpDQojZWxz ZQ0KI2RlZmluZSBkcHJpbnRrKGYsIGEuLi4pDQojZW5kaWYNCg0KI2RlZmluZSBDUllQVE9fTUFY X1BSSVZfU0laRQkxMDI0DQoNCiNkZWZpbmUgREVWSUNFX0JST0tFTgkJKDE8PDApDQoNCiNkZWZp bmUgZGV2aWNlX2Jyb2tlbihkZXYpCShkZXYtPmZsYWdzICYgREVWSUNFX0JST0tFTikNCiNkZWZp bmUgYnJva2VfZGV2aWNlKGRldikJZG8ge2Rldi0+ZmxhZ3MgfD0gREVWSUNFX0JST0tFTjt9IHdo aWxlKDApDQojZGVmaW5lIHJlcGFpcl9kZXZpY2UoZGV2KQlkbyB7ZGV2LT5mbGFncyAmPSB+REVW SUNFX0JST0tFTjt9IHdoaWxlKDApDQoNCnN0cnVjdCBjcnlwdG9fY2FwYWJpbGl0eQ0Kew0KCXUx NgkJCW9wZXJhdGlvbjsNCgl1MTYJCQl0eXBlOw0KCXUxNgkJCW1vZGU7DQoJdTE2CQkJcWxlbjsN Cn07DQoNCnN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplcg0Kew0KCXUxNgkJCW9wZXJh dGlvbjsNCgl1MTYJCQl0eXBlOw0KCXUxNgkJCW1vZGU7DQoJdTE2CQkJcHJpb3JpdHk7DQoNCgl1 NjQJCQlpZDsNCgl1NjQJCQlkZXZfaWQ7DQoNCgl1MzIJCQlmbGFnczsNCg0KCXUzMgkJCWJkZXY7 DQoNCgljcnlwdG9fY2FsbGJhY2tfdAljYWxsYmFjazsNCn07DQoNCnN0cnVjdCBjcnlwdG9fZGF0 YQ0Kew0KCWludCAJCQlzZ19zcmNfbnVtOw0KCXN0cnVjdCBzY2F0dGVybGlzdAlzZ19zcmM7DQoJ c3RydWN0IHNjYXR0ZXJsaXN0CXNnX2RzdDsNCglzdHJ1Y3Qgc2NhdHRlcmxpc3QJc2dfa2V5Ow0K CXN0cnVjdCBzY2F0dGVybGlzdAlzZ19pdjsNCg0KCXZvaWQJCQkqcHJpdjsNCgl1bnNpZ25lZCBp bnQJCXByaXZfc2l6ZTsNCn07DQoNCnN0cnVjdCBjcnlwdG9fZGV2aWNlDQp7DQoJY2hhcgkJCW5h bWVbU0NBQ0hFX05BTUVMRU5dOw0KDQoJc3BpbmxvY2tfdAkJc2Vzc2lvbl9sb2NrOw0KCXN0cnVj dCBsaXN0X2hlYWQJc2Vzc2lvbl9saXN0Ow0KDQoJdTY0CQkJc2lkOw0KCXNwaW5sb2NrX3QJCWxv Y2s7DQoNCglhdG9taWNfdAkJcmVmY250Ow0KDQoJdTMyCQkJZmxhZ3M7DQoNCgl1MzIJCQlpZDsN Cg0KCXN0cnVjdCBsaXN0X2hlYWQJY2Rldl9lbnRyeTsNCg0KCXZvaWQJCQkoKmRhdGFfcmVhZHkp KHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOw0KDQoJc3RydWN0IGRldmljZV9kcml2ZXIJKmRyaXZl cjsNCglzdHJ1Y3QgZGV2aWNlCQlkZXZpY2U7DQoJc3RydWN0IGNsYXNzX2RldmljZQljbGFzc19k ZXZpY2U7DQoJc3RydWN0IGNvbXBsZXRpb24gCWRldl9yZWxlYXNlZDsNCg0KCXNwaW5sb2NrX3QJ CXN0YXRfbG9jazsNCglzdHJ1Y3QgY3J5cHRvX2RldmljZV9zdGF0CXN0YXQ7DQoNCglzdHJ1Y3Qg Y3J5cHRvX2NhcGFiaWxpdHkJKmNhcDsNCglpbnQJCQljYXBfbnVtYmVyOw0KfTsNCg0Kc3RydWN0 IGNyeXB0b19yb3V0ZV9oZWFkDQp7DQoJc3RydWN0IGNyeXB0b19yb3V0ZSAJKm5leHQ7DQoJc3Ry dWN0IGNyeXB0b19yb3V0ZSAJKnByZXY7DQoNCglfX3UzMgkJCXFsZW47DQoJc3BpbmxvY2tfdAkJ bG9jazsNCn07DQoNCnN0cnVjdCBjcnlwdG9fcm91dGUNCnsNCglzdHJ1Y3QgY3J5cHRvX3JvdXRl CSpuZXh0Ow0KCXN0cnVjdCBjcnlwdG9fcm91dGUJKnByZXY7DQoNCglzdHJ1Y3QgY3J5cHRvX3Jv dXRlX2hlYWQgKmxpc3Q7DQoJc3RydWN0IGNyeXB0b19kZXZpY2UgCSpkZXY7DQoNCglzdHJ1Y3Qg Y3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIJY2k7DQp9Ow0KDQoNCnN0cnVjdCBjcnlwdG9fc2Vz c2lvbg0Kew0KCXN0cnVjdCBsaXN0X2hlYWQJZGV2X3F1ZXVlX2VudHJ5Ow0KCXN0cnVjdCBsaXN0 X2hlYWQJbWFpbl9xdWV1ZV9lbnRyeTsNCg0KCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFs aXplciBjaTsNCg0KCXN0cnVjdCBjcnlwdG9fZGF0YQlkYXRhOw0KDQoJc3BpbmxvY2tfdAkJbG9j azsNCg0KCXN0cnVjdCB3b3JrX3N0cnVjdCAJd29yazsNCg0KCXN0cnVjdCBjcnlwdG9fcm91dGVf aGVhZCByb3V0ZV9saXN0Ow0KfTsNCg0Kc3RydWN0IGNyeXB0b19zZXNzaW9uICpjcnlwdG9fc2Vz c2lvbl9hbGxvYyhzdHJ1Y3QgY3J5cHRvX3Nlc3Npb25faW5pdGlhbGl6ZXIgKiwgc3RydWN0IGNy eXB0b19kYXRhICopOw0KaW5saW5lIHZvaWQgY3J5cHRvX3Nlc3Npb25fZGVxdWV1ZV9tYWluKHN0 cnVjdCBjcnlwdG9fc2Vzc2lvbiAqKTsNCmlubGluZSB2b2lkIF9fY3J5cHRvX3Nlc3Npb25fZGVx dWV1ZV9tYWluKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqKTsNCnZvaWQgY3J5cHRvX3Nlc3Npb25f ZGVxdWV1ZV9yb3V0ZShzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKik7DQoNCmlubGluZSB2b2lkIGNy eXB0b19kZXZpY2VfZ2V0KHN0cnVjdCBjcnlwdG9fZGV2aWNlICopOw0KaW5saW5lIHZvaWQgY3J5 cHRvX2RldmljZV9wdXQoc3RydWN0IGNyeXB0b19kZXZpY2UgKik7DQppbmxpbmUgc3RydWN0IGNy eXB0b19kZXZpY2UgKmNyeXB0b19kZXZpY2VfZ2V0X25hbWUoY2hhciAqKTsNCg0KaW50IF9fY3J5 cHRvX2RldmljZV9hZGQoc3RydWN0IGNyeXB0b19kZXZpY2UgKik7DQppbnQgY3J5cHRvX2Rldmlj ZV9hZGQoc3RydWN0IGNyeXB0b19kZXZpY2UgKik7DQp2b2lkIF9fY3J5cHRvX2RldmljZV9yZW1v dmUoc3RydWN0IGNyeXB0b19kZXZpY2UgKik7DQp2b2lkIGNyeXB0b19kZXZpY2VfcmVtb3ZlKHN0 cnVjdCBjcnlwdG9fZGV2aWNlICopOw0KaW50IG1hdGNoX2luaXRpYWxpemVyKHN0cnVjdCBjcnlw dG9fZGV2aWNlICosIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplciAqKTsNCg0KaW5s aW5lIHZvaWQgY3J5cHRvX3Nlc3Npb25faW5zZXJ0X21haW4oc3RydWN0IGNyeXB0b19kZXZpY2Ug KmRldiwgc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKTsNCmlubGluZSB2b2lkIGNyeXB0b19zZXNz aW9uX2luc2VydChzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2LCBzdHJ1Y3QgY3J5cHRvX3Nlc3Np b24gKnMpOw0KDQojZW5kaWYgLyogX19LRVJORUxfXyAqLw0KI2VuZGlmIC8qIF9fQUNSWVBUT19I ICovDQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=consumer.c Content-Type: text/x-csrc; name=consumer.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljb25zdW1lci5jDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9s eWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICog aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl DQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9u LCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCiNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPg0K I2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4NCiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPg0KI2luY2x1ZGUg PGxpbnV4L3dvcmtxdWV1ZS5oPg0KI2luY2x1ZGUgPGxpbnV4L2Vyci5oPg0KI2luY2x1ZGUgPGxp bnV4L21tLmg+DQojaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPg0KDQojaW5jbHVkZSAiYWNy eXB0by5oIg0KI2luY2x1ZGUgImNyeXB0b19kZWYuaCINCiNpbmNsdWRlICJ2aWEtcGFkbG9jay9w YWRsb2NrLmgiDQoNCiNkZWZpbmUgS0VZX0xFTkdUSAkJMTYNCnN0YXRpYyBjaGFyIGNrZXlbS0VZ X0xFTkdUSF07DQpzdGF0aWMgaW50IGtleV9sZW5ndGggPSBzaXplb2YoY2tleSk7DQoNCnN0YXRp YyB2b2lkIGN0ZXN0X2NhbGxiYWNrKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplciAq Y2ksIHN0cnVjdCBjcnlwdG9fZGF0YSAqZGF0YSk7DQoNCnN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3Nl c3Npb25faW5pdGlhbGl6ZXIgY2kgPSANCnsNCgkub3BlcmF0aW9uCQk9IENSWVBUT19PUF9FTkNS WVBULA0KCS50eXBlCQkJPSBDUllQVE9fVFlQRV9BRVNfMTI4LA0KCS5tb2RlCQkJPSBDUllQVE9f TU9ERV9FQ0IsDQoJLnByaW9yaXR5CQk9IDQsDQoJLmNhbGxiYWNrCQk9IGN0ZXN0X2NhbGxiYWNr LA0KfTsNCg0Kc3RhdGljIHN0cnVjdCBjcnlwdG9fZGF0YSBjZGF0YTsNCg0KI2RlZmluZSBDU0VT U0lPTl9NQVgJMTAwMA0Kc3RhdGljIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqczsNCnN0YXRpYyBp bnQgd2F0ZXJtYXJrOw0Kc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIGNhbGxiYWNrX2NvbXBsZXRl ZDsNCg0Kc3RhdGljIHZvaWQgY3Rlc3RfY2FsbGJhY2soc3RydWN0IGNyeXB0b19zZXNzaW9uX2lu aXRpYWxpemVyICpjaSwgc3RydWN0IGNyeXB0b19kYXRhICpkYXRhKQ0Kew0KCWludCBpLCBvZmYs IHNpemUsIHNzaXplOw0KCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7DQoJdW5zaWduZWQgY2hhciAq cHRyOw0KDQoJd2F0ZXJtYXJrLS07DQoNCglkcHJpbnRrKCIlczogc2Vzc2lvbiAlbGx1IFslbGx1 XVxuIiwgX19mdW5jX18sIGNpLT5pZCwgY2ktPmRldl9pZCk7DQoJZHByaW50aygic3JjPSVzLCBs ZW49JWQuXG4iLCAoY2hhciAqKXBhZ2VfYWRkcmVzcyhkYXRhLT5zZ19zcmMucGFnZSksIGRhdGEt PnNnX3NyYy5sZW5ndGgpOw0KDQoJc2cgPSAmZGF0YS0+c2dfa2V5Ow0KCXB0ciA9ICh1bnNpZ25l ZCBjaGFyICopcGFnZV9hZGRyZXNzKHNnLT5wYWdlKTsNCglvZmYgPSBzZy0+b2Zmc2V0Ow0KCXNp emUgPSBzZy0+bGVuZ3RoOw0KCQ0KCXByaW50aygia2V5WyVkXT0iLCBzaXplKTsNCglmb3IgKGk9 MDsgaTxzaXplOyArK2kpDQoJCXByaW50aygiMHglMDJ4LCAiLCBwdHJbaStvZmZdKTsNCglwcmlu dGsoIlxuIik7DQoNCglzZyA9ICZkYXRhLT5zZ19zcmM7DQoJcHRyID0gKHVuc2lnbmVkIGNoYXIg KilwYWdlX2FkZHJlc3Moc2ctPnBhZ2UpOw0KCW9mZiA9IHNnLT5vZmZzZXQ7DQoJc3NpemUgPSBz aXplID0gc2ctPmxlbmd0aDsNCgkNCglwcmludGsoInNyY1slZF09Iiwgc2l6ZSk7DQoJZm9yIChp PTA7IGk8c2l6ZTsgKytpKQ0KCQlwcmludGsoIjB4JTAyeCwgIiwgcHRyW2krb2ZmXSk7DQoJcHJp bnRrKCJcbiIpOw0KDQoJc2cgPSAmZGF0YS0+c2dfZHN0Ow0KCXB0ciA9ICh1bnNpZ25lZCBjaGFy ICopcGFnZV9hZGRyZXNzKHNnLT5wYWdlKTsNCglvZmYgPSBzZy0+b2Zmc2V0Ow0KCXNpemUgPSBz Zy0+bGVuZ3RoOw0KDQoJaWYgKHNpemUgPT0gMCkNCgl7DQoJCWRwcmludGsoInNpemU9NSwgc2V0 dGluZyB0byAlZC5cbiIsIHNzaXplKTsNCgkJc2l6ZSA9IHNzaXplOw0KCX0NCgkNCglwcmludGso ImRzdFslZF09Iiwgc2l6ZSk7DQoJZm9yIChpPTA7IGk8c2l6ZTsgKytpKQ0KCQlwcmludGsoIjB4 JTAyeCwgIiwgcHRyW2krb2ZmXSk7DQoJcHJpbnRrKCJcbiIpOw0KDQoJY29tcGxldGUoJmNhbGxi YWNrX2NvbXBsZXRlZCk7DQp9DQoNCmludCBjdGltZXJfZnVuYyh2b2lkICpkYXRhLCBpbnQgc2l6 ZSwgaW50IG9wKQ0Kew0KCXU4ICpwdHI7DQoJDQoJaWYgKHNpemUgPiBQQUdFX1NJWkUpDQoJCXNp emUgPSBQQUdFX1NJWkU7DQoJDQoJcHRyID0gKHU4ICopcGFnZV9hZGRyZXNzKGNkYXRhLnNnX3Ny Yy5wYWdlKTsNCgltZW1jcHkocHRyLCBkYXRhLCBzaXplKTsNCgljZGF0YS5zZ19zcmMubGVuZ3Ro ID0gc2l6ZTsNCg0KCWNpLm9wZXJhdGlvbiA9IG9wOw0KCXMgPSBjcnlwdG9fc2Vzc2lvbl9hbGxv YygmY2ksICZjZGF0YSk7DQoJaWYgKHMpDQoJCXdhdGVybWFyaysrOw0KCWVsc2UNCgkJZHByaW50 aygiYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsNCg0KCXJldHVybiAocyk/MDotRUlOVkFMOw0KfQ0K DQpzdGF0aWMgaW50IGFsbG9jX3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHZvaWQgKmRhdGEs IGludCBzaXplKQ0Kew0KCXNnLT5vZmZzZXQgPSAwOw0KCXNnLT5wYWdlID0gYWxsb2NfcGFnZXMo R0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsNCglpZiAoIXNnLT5wYWdlKQl7DQoJCXByaW50 ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIHBhZ2UuXG4iKTsNCgkJcmV0dXJuIC1FTk9N RU07DQoJfQ0KDQoJaWYgKGRhdGEpDQoJCW1lbWNweShzZy0+cGFnZSwgZGF0YSwgc2l6ZSk7DQoN CglzZy0+bGVuZ3RoID0gc2l6ZTsNCg0KCXJldHVybiAwOw0KfQ0KDQppbnQgY29uc3VtZXJfaW5p dCh2b2lkKQ0Kew0KCWludCBlcnI7DQoJY2hhciBzdHJbXSA9ICJ0ZXN0IG1lc3NhZ2UgcXdlcnR5 ICBhc2R6eGNcbiI7DQoJaW50IHNpemU7DQoNCglpbml0X2NvbXBsZXRpb24oJmNhbGxiYWNrX2Nv bXBsZXRlZCk7DQoNCgljZGF0YS5zZ19zcmNfbnVtID0gMTsNCg0KCWVyciA9IGFsbG9jX3NnKCZj ZGF0YS5zZ19zcmMsIE5VTEwsIFBBR0VfU0laRSk7DQoJaWYgKGVycikNCgkJZ290byBlcnJfb3V0 X3JldHVybjsNCgkNCgllcnIgPSBhbGxvY19zZygmY2RhdGEuc2dfZHN0LCBOVUxMLCBQQUdFX1NJ WkUpOw0KCWlmIChlcnIpDQoJCWdvdG8gZXJyX291dF9zcmM7DQoJDQoJZXJyID0gYWxsb2Nfc2co JmNkYXRhLnNnX2tleSwgY2tleSwga2V5X2xlbmd0aCk7DQoJaWYgKGVycikNCgkJZ290byBlcnJf b3V0X2RzdDsNCgkNCgllcnIgPSBhbGxvY19zZygmY2RhdGEuc2dfaXYsIE5VTEwsIFBBR0VfU0la RSk7DQoJaWYgKGVycikNCgkJZ290byBlcnJfb3V0X2tleTsNCg0KCWNkYXRhLnByaXZfc2l6ZSA9 IHNpemVvZihzdHJ1Y3QgYWVzX2N0eCk7DQoNCglzaXplID0gMzI7DQoJZXJyID0gY3RpbWVyX2Z1 bmMoc3RyLCBzaXplLCBDUllQVE9fT1BfRU5DUllQVCk7DQoJaWYgKGVycikNCgkJZ290byBlcnJf b3V0X2l2Ow0KDQoJd2FpdF9mb3JfY29tcGxldGlvbigmY2FsbGJhY2tfY29tcGxldGVkKTsNCglp bml0X2NvbXBsZXRpb24oJmNhbGxiYWNrX2NvbXBsZXRlZCk7DQoNCgllcnIgPSBjdGltZXJfZnVu YyhwYWdlX2FkZHJlc3MoY2RhdGEuc2dfZHN0LnBhZ2UpLCBjZGF0YS5zZ19kc3QubGVuZ3RoLCBD UllQVE9fT1BfREVDUllQVCk7DQoJaWYgKGVycikNCgkJZ290byBlcnJfb3V0X2l2Ow0KDQoJd2Fp dF9mb3JfY29tcGxldGlvbigmY2FsbGJhY2tfY29tcGxldGVkKTsNCgkNCmVycl9vdXRfaXY6DQoJ X19mcmVlX3BhZ2VzKGNkYXRhLnNnX2l2LnBhZ2UsIGdldF9vcmRlcigxKSk7DQplcnJfb3V0X2tl eToNCglfX2ZyZWVfcGFnZXMoY2RhdGEuc2dfa2V5LnBhZ2UsIGdldF9vcmRlcihjZGF0YS5zZ19r ZXkubGVuZ3RoKSk7DQplcnJfb3V0X2RzdDoNCglfX2ZyZWVfcGFnZXMoY2RhdGEuc2dfZHN0LnBh Z2UsIGdldF9vcmRlcigxKSk7DQplcnJfb3V0X3NyYzoNCglfX2ZyZWVfcGFnZXMoY2RhdGEuc2df c3JjLnBhZ2UsIGdldF9vcmRlcigxKSk7DQplcnJfb3V0X3JldHVybjoNCglyZXR1cm4gLUVOT0RF VjsNCn0NCg0Kdm9pZCBjb25zdW1lcl9maW5pKHZvaWQpDQp7DQoJd2hpbGUod2F0ZXJtYXJrKQ0K CXsNCgkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOw0KCQlzY2hlZHVs ZV90aW1lb3V0KEhaKTsNCg0KCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciBzZXNzaW9u cyB0byBiZSBmcmVlZDogd2F0ZXJtYXJrPSVkLlxuIiwNCgkJCQl3YXRlcm1hcmspOw0KCX0NCgkN CglpZiAoIWNkYXRhLnNnX2tleS5sZW5ndGgpDQoJCXByaW50aygiQlVHOiBrZXkgbGVuZ3RoIGlz IDAgaW4gJXMuXG4iLCBfX2Z1bmNfXyk7DQoJDQoJX19mcmVlX3BhZ2VzKGNkYXRhLnNnX2tleS5w YWdlLCBnZXRfb3JkZXIoa2V5X2xlbmd0aCkpOw0KCV9fZnJlZV9wYWdlcyhjZGF0YS5zZ19kc3Qu cGFnZSwgZ2V0X29yZGVyKDEpKTsNCglfX2ZyZWVfcGFnZXMoY2RhdGEuc2dfc3JjLnBhZ2UsIGdl dF9vcmRlcigxKSk7DQoJDQoJcHJpbnRrKEtFUk5fSU5GTyAiVGVzdCBjcnlwdG8gbW9kdWxlIGNv bnN1bWVyIGlzIHVubG9hZGVkLlxuIik7DQp9DQoNCm1vZHVsZV9pbml0KGNvbnN1bWVyX2luaXQp Ow0KbW9kdWxlX2V4aXQoY29uc3VtZXJfZmluaSk7DQoNCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsN Ck1PRFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Iik7 DQpNT0RVTEVfREVTQ1JJUFRJT04oIlRlc3QgY3J5cHRvIG1vZHVsZSBjb25zdW1lci4iKTsNCn== --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_conn.c Content-Type: text/x-csrc; name=crypto_conn.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fY29ubi5jDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkg UG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0K ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4N CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5o Pg0KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2lu Y2x1ZGUgPGxpbnV4L3NsYWIuaD4NCiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPg0KI2luY2x1 ZGUgPGxpbnV4L3ZtYWxsb2MuaD4NCg0KI2luY2x1ZGUgImFjcnlwdG8uaCINCiNpbmNsdWRlICJj cnlwdG9fbGIuaCINCg0KI2luY2x1ZGUgIi4uL2Nvbm5lY3Rvci9jb25uZWN0b3IuaCINCg0KI2lu Y2x1ZGUgImNyeXB0b19jb25uLmgiDQoNCnN0YXRpYyBzdHJ1Y3QgY2JfaWQgY3J5cHRvX2Nvbm5f aWQgPSB7IDB4ZGVhZCwgMHgwMDAwIH07DQpzdGF0aWMgY2hhciBjcnlwdG9fY29ubl9uYW1lW10g PSAiY3Jjb25uIjsNCg0Kc3RhdGljIHZvaWQgY3J5cHRvX2Nvbm5fY2FsbGJhY2sodm9pZCAqZGF0 YSkNCnsNCglzdHJ1Y3QgY25fbXNnICptc2csICpyZXBseTsNCglzdHJ1Y3QgY3J5cHRvX2Nvbm5f ZGF0YSAqZCwgKmNtZDsNCglzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2Ow0KCXUzMiBzZXNzaW9u czsNCg0KICAgICAgIAltc2cgPSAoc3RydWN0IGNuX21zZyAqKWRhdGE7DQogICAgICAgCWQgPSAo c3RydWN0IGNyeXB0b19jb25uX2RhdGEgKiltc2ctPmRhdGE7DQoNCglpZiAobXNnLT5sZW4gPCBz aXplb2YoKmQpKQ0KCXsNCgkJZHByaW50ayhLRVJOX0VSUiAiV3JvbmcgbWVzc2FnZSB0byBjcnlw dG8gY29ubmVjdG9yOiBtc2ctPmxlbj0ldSA8ICV1LlxuIiwgDQoJCQkJbXNnLT5sZW4sIHNpemVv ZigqZCkpOw0KCQlyZXR1cm47DQoJfQ0KDQoJaWYgKG1zZy0+bGVuICE9IHNpemVvZigqZCkgKyBk LT5sZW4pDQoJew0KCQlkcHJpbnRrKEtFUk5fRVJSICJXcm9uZyBtZXNzYWdlIHRvIGNyeXB0byBj b25uZWN0b3I6IG1zZy0+bGVuPSV1ICE9ICV1LlxuIiwgDQoJCQkJbXNnLT5sZW4sIHNpemVvZigq ZCkgKyBkLT5sZW4pOw0KCQlyZXR1cm47DQoJfQ0KDQoJZGV2ID0gY3J5cHRvX2RldmljZV9nZXRf bmFtZShkLT5uYW1lKTsNCglpZiAoIWRldikNCgl7DQoJCWRwcmludGsoS0VSTl9JTkZPICJDcnlw dG8gZGV2aWNlICVzIHdhcyBub3QgZm91bmQuXG4iLCBkLT5uYW1lKTsNCgkJcmV0dXJuOw0KCX0N CgkJCQ0KCXN3aXRjaCAoZC0+Y21kKQ0KCXsNCgkJY2FzZSBDUllQVE9fQ09OTl9SRUFEX1NFU1NJ T05TOg0KCQlyZXBseSA9IGttYWxsb2Moc2l6ZW9mKCptc2cpICsgc2l6ZW9mKCpjbWQpICsgc2l6 ZW9mKHNlc3Npb25zKSwgR0ZQX0FUT01JQyk7DQoJCWlmIChyZXBseSkgew0KCQkJbWVtY3B5KHJl cGx5LCBtc2csIHNpemVvZigqcmVwbHkpKTsNCgkJCXJlcGx5LT5sZW4gPSBzaXplb2YoKmNtZCkg KyBzaXplb2Yoc2Vzc2lvbnMpOw0KDQoJCQkvKg0KCQkJICogU2VlIHByb3RvY29sIGRlc2NyaXB0 aW9uIGluIGNvbm5lY3Rvci5jDQoJCQkgKi8NCgkJCXJlcGx5LT5hY2srKzsNCg0KCQkJY21kID0g KHN0cnVjdCBjcnlwdG9fY29ubl9kYXRhICopKHJlcGx5ICsgMSk7DQoJCQltZW1jcHkoY21kLCBk LCBzaXplb2YoKmNtZCkpOw0KCQkJY21kLT5sZW4gPSBzaXplb2Yoc2Vzc2lvbnMpOw0KCQkJDQoJ CQlzZXNzaW9ucyA9IGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCk7DQoNCgkJCW1lbWNweShjbWQr MSwgJnNlc3Npb25zLCBzaXplb2Yoc2Vzc2lvbnMpKTsNCgkJCQ0KCQkJY25fbmV0bGlua19zZW5k KHJlcGx5LCAwKTsNCg0KCQkJa2ZyZWUocmVwbHkpOw0KCQl9IGVsc2UNCgkJCWRwcmludGsoS0VS Tl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBpbiByZXBseSB0byBjb21hbW5kIDB4 JXguXG4iLA0KCQkJICAgICAgIHNpemVvZigqbXNnKSArIHNpemVvZigqY21kKSwgZC0+Y21kKTsN CgkJYnJlYWs7DQoJCWNhc2UgQ1JZUFRPX0NPTk5fRFVNUF9RVUVVRToNCgkJcmVwbHkgPSBrbWFs bG9jKHNpemVvZigqbXNnKSArIHNpemVvZigqY21kKSArIDEwMjQqc2l6ZW9mKHN0cnVjdCBjcnlw dG9fc2Vzc2lvbl9pbml0aWFsaXplciksIEdGUF9BVE9NSUMpOw0KCQlpZiAocmVwbHkpIHsNCgkJ CXN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqczsNCgkJCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0 aWFsaXplciAqcHRyOw0KCQkJDQoJCQltZW1jcHkocmVwbHksIG1zZywgc2l6ZW9mKCpyZXBseSkp Ow0KDQoJCQkvKg0KCQkJICogU2VlIHByb3RvY29sIGRlc2NyaXB0aW9uIGluIGNvbm5lY3Rvci5j DQoJCQkgKi8NCgkJCXJlcGx5LT5hY2srKzsNCg0KCQkJY21kID0gKHN0cnVjdCBjcnlwdG9fY29u bl9kYXRhICopKHJlcGx5ICsgMSk7DQoJCQltZW1jcHkoY21kLCBkLCBzaXplb2YoKmNtZCkpOw0K CQkJDQoJCQlwdHIgPSAoc3RydWN0IGNyeXB0b19zZXNzaW9uX2luaXRpYWxpemVyICopKGNtZCsx KTsNCg0KCQkJc2Vzc2lvbnMgPSAwOw0KCQkJc3Bpbl9sb2NrX2JoKCZkZXYtPnNlc3Npb25fbG9j ayk7DQoJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZkZXYtPnNlc3Npb25fbGlzdCwgZGV2X3F1 ZXVlX2VudHJ5KQ0KCQkJew0KCQkJCW1lbWNweShwdHIsICZzLT5jaSwgc2l6ZW9mKCpwdHIpKTsN CgkJCQlzZXNzaW9ucysrOw0KCQkJCXB0cisrOw0KDQoJCQkJaWYgKHNlc3Npb25zID49IDEwMjQp DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+c2Vzc2lvbl9sb2Nr KTsNCgkJCQ0KCQkJY21kLT5sZW4gPSBzaXplb2YoKnB0cikqc2Vzc2lvbnM7DQoJCQlyZXBseS0+ bGVuID0gc2l6ZW9mKCpjbWQpICsgY21kLT5sZW47DQoJCQkNCgkJCWNuX25ldGxpbmtfc2VuZChy ZXBseSwgMCk7DQoNCgkJCWtmcmVlKHJlcGx5KTsNCgkJfSBlbHNlDQoJCQlkcHJpbnRrKEtFUk5f RVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgaW4gcmVwbHkgdG8gY29tYW1uZCAweCV4 LlxuIiwNCgkJCSAgICAgICBzaXplb2YoKm1zZykgKyBzaXplb2YoKmNtZCksIGQtPmNtZCk7DQoJ CWJyZWFrOw0KCQljYXNlIENSWVBUT19HRVRfU1RBVDoNCgkJcmVwbHkgPSBrbWFsbG9jKHNpemVv ZigqbXNnKSArIHNpemVvZigqY21kKSArIHNpemVvZihzdHJ1Y3QgY3J5cHRvX2RldmljZV9zdGF0 KSwgR0ZQX0FUT01JQyk7DQoJCWlmIChyZXBseSkgew0KCQkJc3RydWN0IGNyeXB0b19kZXZpY2Vf c3RhdCAqcHRyOw0KCQkJDQoJCQltZW1jcHkocmVwbHksIG1zZywgc2l6ZW9mKCpyZXBseSkpOw0K CQkJcmVwbHktPmxlbiA9IHNpemVvZigqY21kKSArIHNpemVvZigqcHRyKTsNCg0KCQkJLyoNCgkJ CSAqIFNlZSBwcm90b2NvbCBkZXNjcmlwdGlvbiBpbiBjb25uZWN0b3IuYw0KCQkJICovDQoJCQly ZXBseS0+YWNrKys7DQoNCgkJCWNtZCA9IChzdHJ1Y3QgY3J5cHRvX2Nvbm5fZGF0YSAqKShyZXBs eSArIDEpOw0KCQkJbWVtY3B5KGNtZCwgZCwgc2l6ZW9mKCpjbWQpKTsNCgkJCWNtZC0+bGVuID0g c2l6ZW9mKCpwdHIpOw0KCQkJDQoJCQlwdHIgPSAoc3RydWN0IGNyeXB0b19kZXZpY2Vfc3RhdCAq KShjbWQrMSk7DQoJCQltZW1jcHkocHRyLCAmZGV2LT5zdGF0LCBzaXplb2YoKnB0cikpOw0KCQkJ DQoJCQljbl9uZXRsaW5rX3NlbmQocmVwbHksIDApOw0KDQoJCQlrZnJlZShyZXBseSk7DQoJCX0g ZWxzZQ0KCQkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGlu IHJlcGx5IHRvIGNvbWFtbmQgMHgleC5cbiIsDQoJCQkgICAgICAgc2l6ZW9mKCptc2cpICsgc2l6 ZW9mKCpjbWQpLCBkLT5jbWQpOw0KCQlicmVhazsNCgkJZGVmYXVsdDoNCgkJCWRwcmludGsoS0VS Tl9FUlIgIldyb25nIG9wZXJhdGlvbiAweCUwNHggZm9yIGNyeXB0byBjb25uZWN0b3IuXG4iLCAN CgkJCQkJZC0+Y21kKTsNCgkJCXJldHVybjsNCgl9DQoNCgljcnlwdG9fZGV2aWNlX3B1dChkZXYp Ow0KfQ0KDQppbnQgY3J5cHRvX2Nvbm5faW5pdCh2b2lkKQ0Kew0KCWludCBlcnI7DQoJDQoJZXJy ID0gY25fYWRkX2NhbGxiYWNrKCZjcnlwdG9fY29ubl9pZCwgY3J5cHRvX2Nvbm5fbmFtZSwgY3J5 cHRvX2Nvbm5fY2FsbGJhY2spOw0KCWlmIChlcnIpDQoJCXJldHVybiBlcnI7DQoNCglkcHJpbnRr KEtFUk5fSU5GTyAiQ3J5cHRvIGNvbm5lY3RvciBjYWxsYmFjayBpcyByZWdpc3RlcmVkLlxuIik7 DQoNCglyZXR1cm4gMDsNCn0NCg0Kdm9pZCBjcnlwdG9fY29ubl9maW5pKHZvaWQpDQp7DQoJY25f ZGVsX2NhbGxiYWNrKCZjcnlwdG9fY29ubl9pZCk7DQoJZHByaW50ayhLRVJOX0lORk8gIkNyeXB0 byBjb25uZWN0b3IgY2FsbGJhY2sgaXMgdW5yZWdpc3RlcmVkLlxuIik7DQp9DQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_conn.h Content-Type: text/x-chdr; name=crypto_conn.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fY29ubi5oDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkg UG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0K ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpZm5kZWYgX19DUllQVE9fQ09OTl9IDQoj ZGVmaW5lIF9fQ1JZUFRPX0NPTk5fSA0KDQojaW5jbHVkZSAiYWNyeXB0by5oIg0KDQojZGVmaW5l IENSWVBUT19DT05OX1JFQURfU0VTU0lPTlMJCTANCiNkZWZpbmUgQ1JZUFRPX0NPTk5fRFVNUF9R VUVVRQkJCTENCiNkZWZpbmUgQ1JZUFRPX0dFVF9TVEFUCQkJCTINCg0Kc3RydWN0IGNyeXB0b19j b25uX2RhdGENCnsNCgljaGFyCQkJbmFtZVtTQ0FDSEVfTkFNRUxFTl07DQoJX191MTYJCQljbWQ7 DQoJX191MTYJCQlsZW47DQoJX191OAkJCWRhdGFbMF07DQp9Ow0KDQojaWZkZWYgX19LRVJORUxf Xw0KDQppbnQgY3J5cHRvX2Nvbm5faW5pdCh2b2lkKTsNCnZvaWQgY3J5cHRvX2Nvbm5fZmluaSh2 b2lkKTsNCg0KI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8NCiNlbmRpZiAvKiBfX0NSWVBUT19DT05O X0ggKi8NCg== --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_def.h Content-Type: text/x-chdr; name=crypto_def.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fZGVmLmgNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQ b2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4NCiAqIA0KICoNCiAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQog KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQ0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uDQogKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICogTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KICog YWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUNCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sIE1BIDAyMTExLTEzMDcgVVNBDQogKi8NCg0KI2lmbmRlZiBfX0NSWVBUT19ERUZfSA0KI2Rl ZmluZSBfX0NSWVBUT19ERUZfSA0KDQojZGVmaW5lIENSWVBUT19PUF9ERUNSWVBUCTANCiNkZWZp bmUgQ1JZUFRPX09QX0VOQ1JZUFQJMQ0KI2RlZmluZSBDUllQVE9fT1BfSE1BQwkJMg0KDQojZGVm aW5lIENSWVBUT19NT0RFX0VDQgkJMA0KI2RlZmluZSBDUllQVE9fTU9ERV9DQkMJCTENCiNkZWZp bmUgQ1JZUFRPX01PREVfQ0ZCCQkyDQojZGVmaW5lIENSWVBUT19NT0RFX09GQgkJMw0KDQojZGVm aW5lIENSWVBUT19UWVBFX0FFU18xMjgJMA0KI2RlZmluZSBDUllQVE9fVFlQRV9BRVNfMTkyCTEN CiNkZWZpbmUgQ1JZUFRPX1RZUEVfQUVTXzI1NgkyDQoNCiNlbmRpZiAvKiBfX0NSWVBUT19ERUZf SCAqLw0K --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_dev.c Content-Type: text/x-csrc; name=crypto_dev.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fZGV2LmMNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5peSBQ b2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4NCiAqIA0KICoNCiAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQog KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQ0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uDQogKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICogTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KICog YWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUNCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0 b24sIE1BIDAyMTExLTEzMDcgVVNBDQogKi8NCg0KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0K I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+ DQojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+DQojaW5j bHVkZSA8bGludXgvc2xhYi5oPg0KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPg0KI2luY2x1 ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+DQoNCiNpbmNs dWRlICJhY3J5cHRvLmgiDQoNCnN0YXRpYyBMSVNUX0hFQUQoY2Rldl9saXN0KTsNCnN0YXRpYyBz cGlubG9ja190IGNkZXZfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsNCnN0YXRpYyB1MzIgY2Rl dl9pZHM7DQoNCnN0cnVjdCBsaXN0X2hlYWQgKmNyeXB0b19kZXZpY2VfbGlzdCA9ICZjZGV2X2xp c3Q7DQpzcGlubG9ja190ICpjcnlwdG9fZGV2aWNlX2xvY2sgPSAmY2Rldl9sb2NrOw0KDQpzdGF0 aWMgaW50IGNyeXB0b19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJp dmVyICpkcnYpDQp7DQoJcmV0dXJuIDE7DQp9DQoNCnN0YXRpYyBpbnQgY3J5cHRvX3Byb2JlKHN0 cnVjdCBkZXZpY2UgKmRldikNCnsNCglyZXR1cm4gLUVOT0RFVjsNCn0NCg0Kc3RhdGljIGludCBj cnlwdG9fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikNCnsNCglyZXR1cm4gMDsNCn0NCg0Kc3Rh dGljIHZvaWQgY3J5cHRvX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQ0Kew0KCXN0cnVjdCBj cnlwdG9fZGV2aWNlICpkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNyeXB0b19kZXZpY2Us IGRldmljZSk7DQoNCgljb21wbGV0ZSgmZC0+ZGV2X3JlbGVhc2VkKTsNCn0NCg0Kc3RhdGljIHZv aWQgY3J5cHRvX2NsYXNzX3JlbGVhc2Uoc3RydWN0IGNsYXNzICpjbGFzcykNCnsNCn0NCg0Kc3Rh dGljIHZvaWQgY3J5cHRvX2NsYXNzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBjbGFzc19kZXZpY2Ug KmNsYXNzX2RldikNCnsNCn0NCg0Kc3RydWN0IGNsYXNzIGNyeXB0b19jbGFzcyA9DQp7DQoJLm5h bWUJCQk9ICJhY3J5cHRvIiwNCgkuY2xhc3NfcmVsZWFzZQkJPSBjcnlwdG9fY2xhc3NfcmVsZWFz ZSwNCgkucmVsZWFzZQkJPSBjcnlwdG9fY2xhc3NfcmVsZWFzZV9kZXZpY2UNCn07DQoNCnN0cnVj dCBidXNfdHlwZSBjcnlwdG9fYnVzX3R5cGUgPQ0Kew0KCS5uYW1lCQkJPSAiYWNyeXB0byIsDQoJ Lm1hdGNoCQkJPSBjcnlwdG9fbWF0Y2gNCn07DQoNCnN0cnVjdCBkZXZpY2VfZHJpdmVyIGNyeXB0 b19kcml2ZXIgPSB7DQoJLm5hbWUgPSAiY3J5cHRvX2RyaXZlciIsDQoJLmJ1cyA9ICZjcnlwdG9f YnVzX3R5cGUsDQoJLnByb2JlID0gY3J5cHRvX3Byb2JlLA0KCS5yZW1vdmUgPSBjcnlwdG9fcmVt b3ZlLA0KfTsNCg0Kc3RydWN0IGRldmljZSBjcnlwdG9fZGV2ID0gew0KCS5wYXJlbnQgPSBOVUxM LA0KCS5idXMgPSAmY3J5cHRvX2J1c190eXBlLA0KCS5idXNfaWQgPSAiQXN5bmNocm9ub3VzIGNy eXB0byIsDQoJLmRyaXZlciA9ICZjcnlwdG9fZHJpdmVyLA0KCS5yZWxlYXNlID0gJmNyeXB0b19y ZWxlYXNlDQp9Ow0KDQpzdGF0aWMgc3NpemVfdCBzZXNzaW9uc19zaG93KHN0cnVjdCBjbGFzc19k ZXZpY2UgKmRldiwgY2hhciAqYnVmKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkID0gY29u dGFpbmVyX29mKGRldiwgc3RydWN0IGNyeXB0b19kZXZpY2UsIGNsYXNzX2RldmljZSk7DQoNCgly ZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYXRvbWljX3JlYWQoJmQtPnJlZmNudCkpOw0KfQ0K c3RhdGljIHNzaXplX3QgbmFtZV9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAq YnVmKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkID0gY29udGFpbmVyX29mKGRldiwgc3Ry dWN0IGNyeXB0b19kZXZpY2UsIGNsYXNzX2RldmljZSk7DQoNCglyZXR1cm4gc3ByaW50ZihidWYs ICIlc1xuIiwgZC0+bmFtZSk7DQp9DQpzdGF0aWMgc3NpemVfdCBkZXZpY2VzX3Nob3coc3RydWN0 IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpDQp7DQoJc3RydWN0IGNyeXB0b19kZXZpY2Ug KmQ7DQoJaW50IG9mZiA9IDA7DQoNCglzcGluX2xvY2tfYmgoJmNkZXZfbG9jayk7DQoJbGlzdF9m b3JfZWFjaF9lbnRyeShkLCAmY2Rldl9saXN0LCBjZGV2X2VudHJ5KQ0KCXsNCgkJb2ZmICs9IHNw cmludGYoYnVmK29mZiwgIiVzICIsIGQtPm5hbWUpOw0KCX0NCglzcGluX3VubG9ja19iaCgmY2Rl dl9sb2NrKTsNCg0KCWlmICghb2ZmKQ0KCQlvZmYgPSBzcHJpbnRmKGJ1ZiwgIk5vIGRldmljZXMg cmVnaXN0ZXJlZCB5ZXQuIik7DQoNCglvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiXG4iKTsNCgkN CglyZXR1cm4gb2ZmOw0KfQ0KDQpzdGF0aWMgc3NpemVfdCBrbWVtX2ZhaWxlZF9zaG93KHN0cnVj dCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNyeXB0b19kZXZpY2UsIGNsYXNzX2Rldmlj ZSk7DQoNCglyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCBkLT5zdGF0LmttZW1fZmFpbGVk KTsNCn0NCnN0YXRpYyBzc2l6ZV90IHNzdGFydGVkX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAq ZGV2LCBjaGFyICpidWYpDQp7DQoJc3RydWN0IGNyeXB0b19kZXZpY2UgKmQgPSBjb250YWluZXJf b2YoZGV2LCBzdHJ1Y3QgY3J5cHRvX2RldmljZSwgY2xhc3NfZGV2aWNlKTsNCg0KCXJldHVybiBz cHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIGQtPnN0YXQuc3N0YXJ0ZWQpOw0KfQ0Kc3RhdGljIHNzaXpl X3Qgc2ZpbmlzaGVkX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpDQp7 DQoJc3RydWN0IGNyeXB0b19kZXZpY2UgKmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY3J5 cHRvX2RldmljZSwgY2xhc3NfZGV2aWNlKTsNCg0KCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVc biIsIGQtPnN0YXQuc2ZpbmlzaGVkKTsNCn0NCnN0YXRpYyBzc2l6ZV90IHNjb21wbGV0ZWRfc2hv dyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikNCnsNCglzdHJ1Y3QgY3J5cHRv X2RldmljZSAqZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjcnlwdG9fZGV2aWNlLCBjbGFz c19kZXZpY2UpOw0KDQoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgZC0+c3RhdC5zY29t cGxldGVkKTsNCn0NCg0Kc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHNlc3Npb25zLCAwNDQ0LCBz ZXNzaW9uc19zaG93LCBOVUxMKTsNCnN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCAwNDQ0 LCBuYW1lX3Nob3csIE5VTEwpOw0KQ0xBU1NfREVWSUNFX0FUVFIoZGV2aWNlcywgMDQ0NCwgZGV2 aWNlc19zaG93LCBOVUxMKTsNCnN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzY29tcGxldGVkLCAw NDQ0LCBzY29tcGxldGVkX3Nob3csIE5VTEwpOw0Kc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHNz dGFydGVkLCAwNDQ0LCBzc3RhcnRlZF9zaG93LCBOVUxMKTsNCnN0YXRpYyBDTEFTU19ERVZJQ0Vf QVRUUihzZmluaXNoZWQsIDA0NDQsIHNmaW5pc2hlZF9zaG93LCBOVUxMKTsNCnN0YXRpYyBDTEFT U19ERVZJQ0VfQVRUUihrbWVtX2ZhaWxlZCwgMDQ0NCwga21lbV9mYWlsZWRfc2hvdywgTlVMTCk7 DQoNCnN0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfZGV2aWNlKHN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkMSwgc3RydWN0IGNyeXB0b19kZXZpY2UgKmQyKQ0Kew0KCWlmICghc3RybmNtcChkMS0+bmFt ZSwgZDItPm5hbWUsIHNpemVvZihkMS0+bmFtZSkpKQ0KCQlyZXR1cm4gMTsNCg0KCXJldHVybiAw Ow0KfQ0KDQpzdGF0aWMgdm9pZCBjcmVhdGVfZGV2aWNlX2F0dHJpYnV0ZXMoc3RydWN0IGNyeXB0 b19kZXZpY2UgKmRldikNCnsNCgljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+Y2xhc3Nf ZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfc2Vzc2lvbnMpOw0KCWNsYXNzX2RldmljZV9jcmVh dGVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2VfYXR0cl9uYW1lKTsNCglj bGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNl X2F0dHJfc2NvbXBsZXRlZCk7DQoJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmNsYXNz X2RldmljZSwgJmNsYXNzX2RldmljZV9hdHRyX3NzdGFydGVkKTsNCgljbGFzc19kZXZpY2VfY3Jl YXRlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfc2ZpbmlzaGVk KTsNCgljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xhc3Nf ZGV2aWNlX2F0dHJfa21lbV9mYWlsZWQpOw0KfQ0KDQpzdGF0aWMgdm9pZCByZW1vdmVfZGV2aWNl X2F0dHJpYnV0ZXMoc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldikNCnsNCgljbGFzc19kZXZpY2Vf cmVtb3ZlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfc2Vzc2lv bnMpOw0KCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFz c19kZXZpY2VfYXR0cl9uYW1lKTsNCgljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+Y2xh c3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfc2NvbXBsZXRlZCk7DQoJY2xhc3NfZGV2aWNl X3JlbW92ZV9maWxlKCZkZXYtPmNsYXNzX2RldmljZSwgJmNsYXNzX2RldmljZV9hdHRyX3NzdGFy dGVkKTsNCgljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNlLCAmY2xh c3NfZGV2aWNlX2F0dHJfc2ZpbmlzaGVkKTsNCgljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJmRl di0+Y2xhc3NfZGV2aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfa21lbV9mYWlsZWQpOw0KfQ0KDQpz dGF0aWMgaW50IF9fbWF0Y2hfaW5pdGlhbGl6ZXIoc3RydWN0IGNyeXB0b19jYXBhYmlsaXR5ICpj YXAsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplciAqY2kpDQp7DQoJaWYgKAljYXAt Pm9wZXJhdGlvbiA9PSBjaS0+b3BlcmF0aW9uICYmDQoJCWNhcC0+dHlwZSA9PSBjaS0+dHlwZSAm Jg0KCQljYXAtPm1vZGUgPT0gKGNpLT5tb2RlICYgMHgxZmZmKSkNCgkJcmV0dXJuIDE7DQoNCgly ZXR1cm4gMDsNCn0NCg0KaW50IG1hdGNoX2luaXRpYWxpemVyKHN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkZXYsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplciAqY2kpDQp7DQoJaW50IGk7 DQoJDQoJZm9yIChpPTA7IGk8ZGV2LT5jYXBfbnVtYmVyOyArK2kpDQoJew0KCQlzdHJ1Y3QgY3J5 cHRvX2NhcGFiaWxpdHkgKmNhcCA9ICZkZXYtPmNhcFtpXTsNCgkJDQoJCWlmIChfX21hdGNoX2lu aXRpYWxpemVyKGNhcCwgY2kpKQ0KCQl7DQoJCQlpZiAoY2FwLT5xbGVuID49IGF0b21pY19yZWFk KCZkZXYtPnJlZmNudCkgKyAxKQ0KCQkJCXJldHVybiAxOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIDA7 DQp9DQoNCg0KaW5saW5lIHZvaWQgY3J5cHRvX2RldmljZV9nZXQoc3RydWN0IGNyeXB0b19kZXZp Y2UgKmRldikNCnsNCglhdG9taWNfaW5jKCZkZXYtPnJlZmNudCk7DQp9DQoNCmlubGluZSBzdHJ1 Y3QgY3J5cHRvX2RldmljZSAqY3J5cHRvX2RldmljZV9nZXRfbmFtZShjaGFyICpuYW1lKQ0Kew0K CXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXY7DQoJaW50IGZvdW5kID0gMDsNCgkNCglzcGluX2xv Y2tfYmgoJmNkZXZfbG9jayk7DQoJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjZGV2X2xpc3Qs IGNkZXZfZW50cnkpDQoJew0KCQlpZiAoIXN0cmNtcChkZXYtPm5hbWUsIG5hbWUpKQ0KCQl7DQoJ CQlmb3VuZCA9IDE7DQoJCQljcnlwdG9fZGV2aWNlX2dldChkZXYpOw0KCQkJYnJlYWs7DQoJCX0N Cgl9DQoJc3Bpbl91bmxvY2tfYmgoJmNkZXZfbG9jayk7DQoNCglpZiAoIWZvdW5kKQ0KCQlyZXR1 cm4gTlVMTDsNCgkNCglyZXR1cm4gZGV2Ow0KfQ0KDQppbmxpbmUgdm9pZCBjcnlwdG9fZGV2aWNl X3B1dChzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2KQ0Kew0KCWF0b21pY19kZWMoJmRldi0+cmVm Y250KTsNCn0NCg0KDQppbnQgX19jcnlwdG9fZGV2aWNlX2FkZChzdHJ1Y3QgY3J5cHRvX2Rldmlj ZSAqZGV2KQ0Kew0KCWludCBlcnI7DQoNCgltZW1zZXQoJmRldi0+c3RhdCwgMCwgc2l6ZW9mKGRl di0+c3RhdCkpOw0KCXNwaW5fbG9ja19pbml0KCZkZXYtPnN0YXRfbG9jayk7DQoJc3Bpbl9sb2Nr X2luaXQoJmRldi0+bG9jayk7DQoJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2Vzc2lvbl9sb2NrKTsN CglJTklUX0xJU1RfSEVBRCgmZGV2LT5zZXNzaW9uX2xpc3QpOw0KCWF0b21pY19zZXQoJmRldi0+ cmVmY250LCAwKTsNCglkZXYtPnNpZCA9IDA7DQoJZGV2LT5mbGFncyA9IDA7DQoJaW5pdF9jb21w bGV0aW9uKCZkZXYtPmRldl9yZWxlYXNlZCk7DQoJbWVtY3B5KCZkZXYtPmRldmljZSwgJmNyeXB0 b19kZXYsIHNpemVvZihzdHJ1Y3QgZGV2aWNlKSk7DQoJZGV2LT5kcml2ZXIgPSAmY3J5cHRvX2Ry aXZlcjsNCg0KCXNucHJpbnRmKGRldi0+ZGV2aWNlLmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2aWNl LmJ1c19pZCksICIlcyIsIGRldi0+bmFtZSk7DQoJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYt PmRldmljZSk7DQoJaWYgKGVycikNCgl7DQoJCWRwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBy ZWdpc3RlciBjcnlwdG8gZGV2aWNlICVzOiBlcnI9JWQuXG4iLCANCgkJCQlkZXYtPm5hbWUsIGVy cik7DQoJCXJldHVybiBlcnI7DQoJfQ0KDQoJc25wcmludGYoZGV2LT5jbGFzc19kZXZpY2UuY2xh c3NfaWQsIHNpemVvZihkZXYtPmNsYXNzX2RldmljZS5jbGFzc19pZCksICIlcyIsIGRldi0+bmFt ZSk7DQoJZGV2LT5jbGFzc19kZXZpY2UuZGV2IAk9ICZkZXYtPmRldmljZTsNCglkZXYtPmNsYXNz X2RldmljZS5jbGFzcwk9ICZjcnlwdG9fY2xhc3M7DQoJDQoJZXJyID0gY2xhc3NfZGV2aWNlX3Jl Z2lzdGVyKCZkZXYtPmNsYXNzX2RldmljZSk7DQoJaWYgKGVycikNCgl7DQoJCWRwcmludGsoS0VS Tl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjcnlwdG8gY2xhc3MgZGV2aWNlICVzOiBlcnI9JWQu XG4iLCANCgkJCQlkZXYtPm5hbWUsIGVycik7DQoJCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRl dmljZSk7DQoJCXJldHVybiBlcnI7DQoJfQ0KDQoJY3JlYXRlX2RldmljZV9hdHRyaWJ1dGVzKGRl dik7DQoJDQoJcmV0dXJuIDA7DQp9DQoNCnZvaWQgX19jcnlwdG9fZGV2aWNlX3JlbW92ZShzdHJ1 Y3QgY3J5cHRvX2RldmljZSAqZGV2KQ0Kew0KCXJlbW92ZV9kZXZpY2VfYXR0cmlidXRlcyhkZXYp Ow0KCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPmNsYXNzX2RldmljZSk7DQoJZGV2aWNl X3VucmVnaXN0ZXIoJmRldi0+ZGV2aWNlKTsNCn0NCg0KaW50IGNyeXB0b19kZXZpY2VfYWRkKHN0 cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYpDQp7DQoJaW50IGVycjsNCg0KCWVyciA9IF9fY3J5cHRv X2RldmljZV9hZGQoZGV2KTsNCglpZiAoZXJyKQ0KCQlyZXR1cm4gZXJyOw0KDQoJc3Bpbl9sb2Nr X2JoKCZjZGV2X2xvY2spOw0KCWxpc3RfYWRkKCZkZXYtPmNkZXZfZW50cnksICZjZGV2X2xpc3Qp Ow0KCWRldi0+aWQgPSArK2NkZXZfaWRzOw0KCXNwaW5fdW5sb2NrX2JoKCZjZGV2X2xvY2spOw0K DQoJZHByaW50ayhLRVJOX0lORk8gIkNyeXB0byBkZXZpY2UgJXMgd2FzIHJlZ2lzdGVyZWQgd2l0 aCBJRD0leC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pZCk7DQoNCglyZXR1cm4gMDsNCn0NCg0Kdm9p ZCBjcnlwdG9fZGV2aWNlX3JlbW92ZShzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2KQ0Kew0KCXN0 cnVjdCBjcnlwdG9fZGV2aWNlICpfX2RldiwgKm47DQoJdW5zaWduZWQgbG9uZyBmbGFnczsNCg0K CV9fY3J5cHRvX2RldmljZV9yZW1vdmUoZGV2KTsNCgkNCglzcGluX2xvY2tfaXJxc2F2ZSgmY2Rl dl9sb2NrLCBmbGFncyk7DQoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKF9fZGV2LCBuLCAmY2Rl dl9saXN0LCBjZGV2X2VudHJ5KQ0KCXsNCgkJaWYgKGNvbXBhcmVfZGV2aWNlKF9fZGV2LCBkZXYp KQ0KCQl7DQoJCQlsaXN0X2RlbCgmX19kZXYtPmNkZXZfZW50cnkpOw0KCQkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmY2Rldl9sb2NrLCBmbGFncyk7DQoNCgkJCS8qDQoJCQkgKiBJbiB0ZXN0IGNh c2VzIG9yIHdoZW4gY3J5cHRvIGRldmljZSBkcml2ZXIgaXMgbm90IHdyaXR0ZW4gY29ycmVjdGx5 LA0KCQkJICogaXQncyAtPmRhdGFfcmVhZHkoKSBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVuIGFu eW1vcmUNCgkJCSAqIGFmdGVyIGRldmljZSBpcyByZW1vdmVkIGZyb20gY3J5cHRvIGRldmljZSBs aXN0Lg0KCQkJICoNCgkJCSAqIEZvciBzdWNoIGNhc2VzIHdlIGVpdGhlciBzaG91bGQgcHJvdmlk ZSAtPmZsdXNoKCkgY2FsbA0KCQkJICogb3IgcHJvcGVybHkgd3JpdGUgLT5kYXRhX3JlYWR5KCkg bWV0aG9kLg0KCQkJICovDQoNCgkJCXdoaWxlIChhdG9taWNfcmVhZCgmX19kZXYtPnJlZmNudCkp DQoJCQl7DQoNCgkJCQlkcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGluZyBmb3IgJXMgdG8gYmVjb21l IGZyZWU6IHJlZmNudD0lZC5cbiIsIA0KCQkJCQkJX19kZXYtPm5hbWUsIGF0b21pY19yZWFkKCZk ZXYtPnJlZmNudCkpOw0KDQoJCQkJLyoNCgkJCQkgKiBIYWNrIHpvbmU6IHlvdSBuZWVkIHRvIHdy aXRlIGdvb2QgLT5kYXRhX3JlYWR5KCkNCgkJCQkgKiBhbmQgY3J5cHRvIGRldmljZSBkcml2ZXIg aXRzZWxmLg0KCQkJCSAqDQoJCQkJICogRHJpdmVyIHNob3VkIG5vdCBidXp6IGlmIGl0IGhhcyBw ZW5kaW5nIHNlc3Npb25zDQoJCQkJICogaW4gaXQncyBxdWV1ZSBhbmQgaXQgd2FzIHJlbW92ZWQg ZnJvbSBnbG9iYWwgZGV2aWNlIGxpc3QuDQoJCQkJICoNCgkJCQkgKiBBbHRob3VnaCBJIGNhbiB3 b3JrYXJvdW5kIGl0IGhlcmUsIGZvciBleGFtcGxlIGJ5DQoJCQkJICogZmx1c2hpbmcgdGhlIHdo b2xlIHF1ZXVlIGFuZCBkcm9wIGFsbCBwZW5kaW5nIHNlc3Npb25zLg0KCQkJCSAqLw0KDQoJCQkJ X19kZXYtPmRhdGFfcmVhZHkoX19kZXYpOw0KCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5J TlRFUlJVUFRJQkxFKTsNCgkJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsNCgkJCX0NCgkJCQ0KCQkJ ZHByaW50ayhLRVJOX0VSUiAiQ3J5cHRvIGRldmljZSAlcyB3YXMgdW5yZWdpc3RlcmVkLlxuIiwg ZGV2LT5uYW1lKTsNCgkJCXJldHVybjsNCgkJfQ0KCX0NCglzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZjZGV2X2xvY2ssIGZsYWdzKTsNCgkJCQ0KCWRwcmludGsoS0VSTl9FUlIgIkNyeXB0byBkZXZp Y2UgJXMgd2FzIG5vdCByZWdpc3RlcmVkLlxuIiwgZGV2LT5uYW1lKTsNCn0NCg0KRVhQT1JUX1NZ TUJPTChjcnlwdG9fZGV2aWNlX2FkZCk7DQpFWFBPUlRfU1lNQk9MKGNyeXB0b19kZXZpY2VfcmVt b3ZlKTsNCkVYUE9SVF9TWU1CT0woY3J5cHRvX2RldmljZV9nZXQpOw0KRVhQT1JUX1NZTUJPTChj cnlwdG9fZGV2aWNlX2dldF9uYW1lKTsNCkVYUE9SVF9TWU1CT0woY3J5cHRvX2RldmljZV9wdXQp Ow0KRVhQT1JUX1NZTUJPTChtYXRjaF9pbml0aWFsaXplcik7DQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_lb.c Content-Type: text/x-csrc; name=crypto_lb.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fbGIuYw0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBv bHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1Pg0KICogDQogKg0KICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5DQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4NCiAqDQogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQogKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoNCiAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQ0KICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3Rv biwgTUEgMDIxMTEtMTMwNyBVU0ENCiAqLw0KDQojaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQoj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4N CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4NCiNpbmNs dWRlIDxsaW51eC9zbGFiLmg+DQojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+DQojaW5jbHVk ZSA8bGludXgvc3BpbmxvY2suaD4NCiNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4NCiNpbmNs dWRlIDxsaW51eC9lcnIuaD4NCg0KI2luY2x1ZGUgImFjcnlwdG8uaCINCiNpbmNsdWRlICJjcnlw dG9fbGIuaCINCiNpbmNsdWRlICJjcnlwdG9fc3RhdC5oIg0KI2luY2x1ZGUgImNyeXB0b19yb3V0 ZS5oIg0KDQpzdGF0aWMgTElTVF9IRUFEKGNyeXB0b19sYl9saXN0KTsNCnN0YXRpYyBzcGlubG9j a190IGNyeXB0b19sYl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOw0Kc3RhdGljIGludCBsYl9u dW0gPSAwOw0Kc3RhdGljIHN0cnVjdCBjcnlwdG9fbGIgKmN1cnJlbnRfbGIsICpkZWZhdWx0X2xi Ow0Kc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIHRocmVhZF9leGl0ZWQ7DQpzdGF0aWMgaW50IG5l ZWRfZXhpdDsNCnN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY3J5cHRvX2xiX3F1ZXVl Ow0Kc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGNyeXB0b19sYl93YWl0X3F1ZXVlKTsN Cg0KZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgKmNyeXB0b19kZXZpY2VfbGlzdDsNCmV4dGVybiBz cGlubG9ja190ICpjcnlwdG9fZGV2aWNlX2xvY2s7DQoNCmV4dGVybiBpbnQgZm9yY2VfbGJfcmVt b3ZlOw0KZXh0ZXJuIHN0cnVjdCBjcnlwdG9fZGV2aWNlIG1haW5fY3J5cHRvX2RldmljZTsNCg0K c3RhdGljIGlubGluZSBpbnQgbGJfaXNfY3VycmVudChzdHJ1Y3QgY3J5cHRvX2xiICpsKQ0Kew0K CXJldHVybiAobC0+Y3J5cHRvX2RldmljZV9saXN0ICE9IE5VTEwgJiYgbC0+Y3J5cHRvX2Rldmlj ZV9sb2NrICE9IE5VTEwpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIGludCBsYl9pc19kZWZhdWx0KHN0 cnVjdCBjcnlwdG9fbGIgKmwpDQp7DQoJcmV0dXJuIChsID09IGRlZmF1bHRfbGIpOw0KfQ0KDQpz dGF0aWMgaW5saW5lIHZvaWQgX19sYl9zZXRfY3VycmVudChzdHJ1Y3QgY3J5cHRvX2xiICpsKQ0K ew0KCXN0cnVjdCBjcnlwdG9fbGIgKmMgPSBjdXJyZW50X2xiOw0KCQ0KCWlmIChjKQ0KCXsNCgkJ bC0+Y3J5cHRvX2RldmljZV9saXN0ID0gY3J5cHRvX2RldmljZV9saXN0Ow0KCQlsLT5jcnlwdG9f ZGV2aWNlX2xvY2sgPSBjcnlwdG9fZGV2aWNlX2xvY2s7DQoJCWN1cnJlbnRfbGIgPSBsOw0KCQlj LT5jcnlwdG9fZGV2aWNlX2xpc3QgPSBOVUxMOw0KCQljLT5jcnlwdG9fZGV2aWNlX2xvY2sgPSBO VUxMOw0KCX0NCgllbHNlDQoJew0KCQlsLT5jcnlwdG9fZGV2aWNlX2xpc3QgPSBjcnlwdG9fZGV2 aWNlX2xpc3Q7DQoJCWwtPmNyeXB0b19kZXZpY2VfbG9jayA9IGNyeXB0b19kZXZpY2VfbG9jazsN CgkJY3VycmVudF9sYiA9IGw7DQoJfQ0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgbGJfc2V0X2N1 cnJlbnQoc3RydWN0IGNyeXB0b19sYiAqbCkNCnsNCglzdHJ1Y3QgY3J5cHRvX2xiICpjID0gY3Vy cmVudF9sYjsNCgkNCglpZiAoYykNCgl7DQoJCXNwaW5fbG9ja19iaCgmYy0+bG9jayk7DQoJCV9f bGJfc2V0X2N1cnJlbnQobCk7DQoJCXNwaW5fdW5sb2NrX2JoKCZjLT5sb2NrKTsNCgl9DQoJZWxz ZQ0KCQlfX2xiX3NldF9jdXJyZW50KGwpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgX19sYl9z ZXRfZGVmYXVsdChzdHJ1Y3QgY3J5cHRvX2xiICpsKQ0Kew0KCWRlZmF1bHRfbGIgPSBsOw0KfQ0K DQpzdGF0aWMgaW5saW5lIHZvaWQgbGJfc2V0X2RlZmF1bHQoc3RydWN0IGNyeXB0b19sYiAqbCkN CnsNCglzdHJ1Y3QgY3J5cHRvX2xiICpjID0gZGVmYXVsdF9sYjsNCg0KCWlmIChjKQ0KCXsNCgkJ c3Bpbl9sb2NrX2JoKCZjLT5sb2NrKTsNCgkJX19sYl9zZXRfZGVmYXVsdChsKTsNCgkJc3Bpbl91 bmxvY2tfYmgoJmMtPmxvY2spOw0KCX0NCgllbHNlDQoJCV9fbGJfc2V0X2RlZmF1bHQobCk7DQp9 DQoNCg0Kc3RhdGljIGludCBjcnlwdG9fbGJfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1 Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQ0Kew0KCXJldHVybiAxOw0KfQ0KDQpzdGF0aWMgaW50IGNy eXB0b19sYl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpDQp7DQoJcmV0dXJuIC1FTk9ERVY7DQp9 DQoNCnN0YXRpYyBpbnQgY3J5cHRvX2xiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpDQp7DQoJ cmV0dXJuIDA7DQp9DQoNCnN0YXRpYyB2b2lkIGNyeXB0b19sYl9yZWxlYXNlKHN0cnVjdCBkZXZp Y2UgKmRldikNCnsNCglzdHJ1Y3QgY3J5cHRvX2xiICpkID0gY29udGFpbmVyX29mKGRldiwgc3Ry dWN0IGNyeXB0b19sYiwgZGV2aWNlKTsNCg0KCWNvbXBsZXRlKCZkLT5kZXZfcmVsZWFzZWQpOw0K fQ0KDQpzdGF0aWMgdm9pZCBjcnlwdG9fbGJfY2xhc3NfcmVsZWFzZShzdHJ1Y3QgY2xhc3MgKmNs YXNzKQ0Kew0KfQ0KDQpzdGF0aWMgdm9pZCBjcnlwdG9fbGJfY2xhc3NfcmVsZWFzZV9kZXZpY2Uo c3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQ0Kew0KfQ0KDQpzdHJ1Y3QgY2xhc3MgY3J5 cHRvX2xiX2NsYXNzID0NCnsNCgkubmFtZQkJCT0gImNyeXB0b19sYiIsDQoJLmNsYXNzX3JlbGVh c2UJCT0gY3J5cHRvX2xiX2NsYXNzX3JlbGVhc2UsDQoJLnJlbGVhc2UJCT0gY3J5cHRvX2xiX2Ns YXNzX3JlbGVhc2VfZGV2aWNlDQp9Ow0KDQpzdHJ1Y3QgYnVzX3R5cGUgY3J5cHRvX2xiX2J1c190 eXBlID0NCnsNCgkubmFtZQkJCT0gImNyeXB0b19sYiIsDQoJLm1hdGNoCQkJPSBjcnlwdG9fbGJf bWF0Y2gNCn07DQoNCnN0cnVjdCBkZXZpY2VfZHJpdmVyIGNyeXB0b19sYl9kcml2ZXIgPSB7DQoJ Lm5hbWUgPSAiY3J5cHRvX2xiX2RyaXZlciIsDQoJLmJ1cyA9ICZjcnlwdG9fbGJfYnVzX3R5cGUs DQoJLnByb2JlID0gY3J5cHRvX2xiX3Byb2JlLA0KCS5yZW1vdmUgPSBjcnlwdG9fbGJfcmVtb3Zl LA0KfTsNCg0Kc3RydWN0IGRldmljZSBjcnlwdG9fbGJfZGV2ID0gew0KCS5wYXJlbnQgPSBOVUxM LA0KCS5idXMgPSAmY3J5cHRvX2xiX2J1c190eXBlLA0KCS5idXNfaWQgPSAiY3J5cHRvIGxvYWQg YmFsYW5jZXIiLA0KCS5kcml2ZXIgPSAmY3J5cHRvX2xiX2RyaXZlciwNCgkucmVsZWFzZSA9ICZj cnlwdG9fbGJfcmVsZWFzZQ0KfTsNCg0Kc3RhdGljIHNzaXplX3QgbmFtZV9zaG93KHN0cnVjdCBj bGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQ0Kew0KCXN0cnVjdCBjcnlwdG9fbGIgKmxiID0g Y29udGFpbmVyX29mKGRldiwgc3RydWN0IGNyeXB0b19sYiwgY2xhc3NfZGV2aWNlKTsNCg0KCXJl dHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBsYi0+bmFtZSk7DQp9DQoNCnN0YXRpYyBzc2l6ZV90 IGN1cnJlbnRfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikNCnsNCglz dHJ1Y3QgY3J5cHRvX2xiICpsYjsNCglpbnQgb2ZmID0gMDsNCg0KCXNwaW5fbG9ja19iaCgmY3J5 cHRvX2xiX2xvY2spOw0KCWxpc3RfZm9yX2VhY2hfZW50cnkobGIsICZjcnlwdG9fbGJfbGlzdCwg bGJfZW50cnkpDQoJew0KCQlpZiAobGJfaXNfY3VycmVudChsYikpDQoJCQlvZmYgKz0gc3ByaW50 ZihidWYrb2ZmLCAiWyIpOw0KCQlpZiAobGJfaXNfZGVmYXVsdChsYikpDQoJCQlvZmYgKz0gc3By aW50ZihidWYrb2ZmLCAiKCIpOw0KCQlvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiJXMiLCBsYi0+ bmFtZSk7DQoJCWlmIChsYl9pc19kZWZhdWx0KGxiKSkNCgkJCW9mZiArPSBzcHJpbnRmKGJ1Zitv ZmYsICIpIik7DQoJCWlmIChsYl9pc19jdXJyZW50KGxiKSkNCgkJCW9mZiArPSBzcHJpbnRmKGJ1 ZitvZmYsICJdIik7DQoJfQ0KCXNwaW5fdW5sb2NrX2JoKCZjcnlwdG9fbGJfbG9jayk7DQoNCglp ZiAoIW9mZikNCgkJb2ZmID0gc3ByaW50ZihidWYsICJObyBsb2FkIGJhbGFuY2VycyByZWdpdGVy ZWQgeWV0LiIpOw0KDQoJb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIlxuIik7DQoJDQoJcmV0dXJu IG9mZjsNCn0NCnN0YXRpYyBzc2l6ZV90IGN1cnJlbnRfc3RvcmUoc3RydWN0IGNsYXNzX2Rldmlj ZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkNCnsNCglzdHJ1Y3QgY3J5cHRv X2xiICpsYjsNCg0KCXNwaW5fbG9ja19iaCgmY3J5cHRvX2xiX2xvY2spOw0KCWxpc3RfZm9yX2Vh Y2hfZW50cnkobGIsICZjcnlwdG9fbGJfbGlzdCwgbGJfZW50cnkpDQoJew0KCQlpZiAoY291bnQg PT0gc3RybGVuKGxiLT5uYW1lKSAmJiAhc3RyY21wKGJ1ZiwgbGItPm5hbWUpKQ0KCQl7DQoJCQls Yl9zZXRfY3VycmVudChsYik7DQoJCQlsYl9zZXRfZGVmYXVsdChsYik7DQoNCgkJCWRwcmludGso S0VSTl9JTkZPICJMb2FkIGJhbGFuY2VyICVzIGlzIHNldCBhcyBjdXJyZW50IGFuZCBkZWZhdWx0 LlxuIiwgDQoJCQkJCWxiLT5uYW1lKTsNCgkJCQ0KCQkJYnJlYWs7DQoJCX0NCgl9DQoJc3Bpbl91 bmxvY2tfYmgoJmNyeXB0b19sYl9sb2NrKTsNCg0KCXJldHVybiBjb3VudDsNCn0NCg0Kc3RhdGlj IENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIDA0NDQsIG5hbWVfc2hvdywgTlVMTCk7DQpDTEFTU19E RVZJQ0VfQVRUUihsYnMsIDA2NDQsIGN1cnJlbnRfc2hvdywgY3VycmVudF9zdG9yZSk7DQoNCnN0 YXRpYyB2b2lkIGNyZWF0ZV9kZXZpY2VfYXR0cmlidXRlcyhzdHJ1Y3QgY3J5cHRvX2xiICpsYikN CnsNCgljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmxiLT5jbGFzc19kZXZpY2UsICZjbGFzc19k ZXZpY2VfYXR0cl9uYW1lKTsNCn0NCg0Kc3RhdGljIHZvaWQgcmVtb3ZlX2RldmljZV9hdHRyaWJ1 dGVzKHN0cnVjdCBjcnlwdG9fbGIgKmxiKQ0Kew0KCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgm bGItPmNsYXNzX2RldmljZSwgJmNsYXNzX2RldmljZV9hdHRyX25hbWUpOw0KfQ0KDQpzdGF0aWMg aW5saW5lIGludCBjb21wYXJlX2xiKHN0cnVjdCBjcnlwdG9fbGIgKmwxLCBzdHJ1Y3QgY3J5cHRv X2xiICpsMikNCnsNCglpZiAoIXN0cm5jbXAobDEtPm5hbWUsIGwyLT5uYW1lLCBzaXplb2YobDEt Pm5hbWUpKSkNCgkJcmV0dXJuIDE7DQoNCglyZXR1cm4gMDsNCn0NCg0KaW5saW5lIHZvaWQgY3J5 cHRvX2xiX3JlaGFzaCh2b2lkKQ0Kew0KCWlmICghY3VycmVudF9sYikNCgkJcmV0dXJuOw0KDQoJ c3Bpbl9sb2NrX2JoKCZjdXJyZW50X2xiLT5sb2NrKTsNCgljdXJyZW50X2xiLT5yZWhhc2goY3Vy cmVudF9sYik7DQoJc3Bpbl91bmxvY2tfYmgoJmN1cnJlbnRfbGItPmxvY2spOw0KDQoJd2FrZV91 cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9fbGJfd2FpdF9xdWV1ZSk7DQp9DQoNCnN0cnVjdCBjcnlw dG9fZGV2aWNlICpjcnlwdG9fbGJfZmluZF9kZXZpY2Uoc3RydWN0IGNyeXB0b19zZXNzaW9uX2lu aXRpYWxpemVyICpjaSkNCnsNCglzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2Ow0KCQ0KCWlmICgh Y3VycmVudF9sYikNCgkJcmV0dXJuIE5VTEw7DQoNCglpZiAoc2NpX2JpbmRlZChjaSkpDQoJew0K CQlpbnQgZm91bmQgPSAwOw0KCQkNCgkJc3Bpbl9sb2NrX2JoKGNyeXB0b19kZXZpY2VfbG9jayk7 DQoJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCBjcnlwdG9fZGV2aWNlX2xpc3QsIGNkZXZfZW50 cnkpDQoJCXsNCgkJCWlmIChkZXYtPmlkID09IGNpLT5iZGV2KQ0KCQkJew0KCQkJCWZvdW5kID0g MTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCQlzcGluX3VubG9ja19iaChjcnlwdG9fZGV2aWNl X2xvY2spOw0KDQoJCXJldHVybiAoZm91bmQpP2RldjpOVUxMOw0KCX0NCgkNCglzcGluX2xvY2tf YmgoJmN1cnJlbnRfbGItPmxvY2spOw0KCQ0KCWN1cnJlbnRfbGItPnJlaGFzaChjdXJyZW50X2xi KTsNCg0KCXNwaW5fbG9jayhjcnlwdG9fZGV2aWNlX2xvY2spOw0KCQ0KCWRldiA9IGN1cnJlbnRf bGItPmZpbmRfZGV2aWNlKGN1cnJlbnRfbGIsIGNpKTsNCglpZiAoZGV2KQ0KCQljcnlwdG9fZGV2 aWNlX2dldChkZXYpOw0KCQ0KCXNwaW5fdW5sb2NrKGNyeXB0b19kZXZpY2VfbG9jayk7DQoJc3Bp bl91bmxvY2tfYmgoJmN1cnJlbnRfbGItPmxvY2spOw0KCQ0KCXdha2VfdXBfaW50ZXJydXB0aWJs ZSgmY3J5cHRvX2xiX3dhaXRfcXVldWUpOw0KCQ0KCXJldHVybiBkZXY7DQp9DQoNCnN0YXRpYyBp bnQgX19jcnlwdG9fbGJfcmVnaXN0ZXIoc3RydWN0IGNyeXB0b19sYiAqbGIpDQp7DQoJaW50IGVy cjsNCg0KCXNwaW5fbG9ja19pbml0KCZsYi0+bG9jayk7DQoJDQoJaW5pdF9jb21wbGV0aW9uKCZs Yi0+ZGV2X3JlbGVhc2VkKTsNCgltZW1jcHkoJmxiLT5kZXZpY2UsICZjcnlwdG9fbGJfZGV2LCBz aXplb2Yoc3RydWN0IGRldmljZSkpOw0KCWxiLT5kcml2ZXIgPSAmY3J5cHRvX2xiX2RyaXZlcjsN Cg0KCXNucHJpbnRmKGxiLT5kZXZpY2UuYnVzX2lkLCBzaXplb2YobGItPmRldmljZS5idXNfaWQp LCAiJXMiLCBsYi0+bmFtZSk7DQoJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZsYi0+ZGV2aWNlKTsN CglpZiAoZXJyKQ0KCXsNCgkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNy eXB0byBsb2FkIGJhbGFuY2VyIGRldmljZSAlczogZXJyPSVkLlxuIiwgDQoJCQkJbGItPm5hbWUs IGVycik7DQoJCXJldHVybiBlcnI7DQoJfQ0KDQoJc25wcmludGYobGItPmNsYXNzX2RldmljZS5j bGFzc19pZCwgc2l6ZW9mKGxiLT5jbGFzc19kZXZpY2UuY2xhc3NfaWQpLCAiJXMiLCBsYi0+bmFt ZSk7DQoJbGItPmNsYXNzX2RldmljZS5kZXYgCT0gJmxiLT5kZXZpY2U7DQoJbGItPmNsYXNzX2Rl dmljZS5jbGFzcwk9ICZjcnlwdG9fbGJfY2xhc3M7DQoJDQoJZXJyID0gY2xhc3NfZGV2aWNlX3Jl Z2lzdGVyKCZsYi0+Y2xhc3NfZGV2aWNlKTsNCglpZiAoZXJyKQ0KCXsNCgkJZHByaW50ayhLRVJO X0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBsb2FkIGJhbGFuY2VyIGNsYXNzIGRldmlj ZSAlczogZXJyPSVkLlxuIiwgDQoJCQkJbGItPm5hbWUsIGVycik7DQoJCWRldmljZV91bnJlZ2lz dGVyKCZsYi0+ZGV2aWNlKTsNCgkJcmV0dXJuIGVycjsNCgl9DQoNCgljcmVhdGVfZGV2aWNlX2F0 dHJpYnV0ZXMobGIpOw0KCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3J5cHRvX2xiX3dhaXRfcXVl dWUpOw0KCQ0KCXJldHVybiAwOw0KDQp9DQoNCnN0YXRpYyB2b2lkIF9fY3J5cHRvX2xiX3VucmVn aXN0ZXIoc3RydWN0IGNyeXB0b19sYiAqbGIpDQp7DQoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZj cnlwdG9fbGJfd2FpdF9xdWV1ZSk7DQoJcmVtb3ZlX2RldmljZV9hdHRyaWJ1dGVzKGxiKTsNCglj bGFzc19kZXZpY2VfdW5yZWdpc3RlcigmbGItPmNsYXNzX2RldmljZSk7DQoJZGV2aWNlX3VucmVn aXN0ZXIoJmxiLT5kZXZpY2UpOw0KfQ0KDQppbnQgY3J5cHRvX2xiX3JlZ2lzdGVyKHN0cnVjdCBj cnlwdG9fbGIgKmxiLCBpbnQgc2V0X2N1cnJlbnQsIGludCBzZXRfZGVmYXVsdCkNCnsNCglzdHJ1 Y3QgY3J5cHRvX2xiICpfX2xiOw0KCWludCBlcnI7DQoJDQoJc3Bpbl9sb2NrX2JoKCZjcnlwdG9f bGJfbG9jayk7DQoJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2xiLCAmY3J5cHRvX2xiX2xpc3QsIGxi X2VudHJ5KQ0KCXsNCgkJaWYgKHVubGlrZWx5KGNvbXBhcmVfbGIoX19sYiwgbGIpKSkNCgkJew0K CQkJc3Bpbl91bmxvY2tfYmgoJmNyeXB0b19sYl9sb2NrKTsNCgkJCWRwcmludGsoS0VSTl9FUlIg IkNyeXB0byBsb2FkIGJhbGFuY2VyICVzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIsIGxiLT5u YW1lKTsNCgkJCXJldHVybiAtRUlOVkFMOw0KCQl9DQoJfQ0KDQoJbGlzdF9hZGQoJmxiLT5sYl9l bnRyeSwgJmNyeXB0b19sYl9saXN0KTsNCglzcGluX3VubG9ja19iaCgmY3J5cHRvX2xiX2xvY2sp Ow0KCQ0KCWVyciA9IF9fY3J5cHRvX2xiX3JlZ2lzdGVyKGxiKTsNCglpZiAoZXJyKQ0KCXsNCgkJ c3Bpbl9sb2NrX2JoKCZjcnlwdG9fbGJfbG9jayk7DQoJCWxpc3RfZGVsKCZsYi0+bGJfZW50cnkp Ow0KCQlzcGluX3VubG9ja19iaCgmY3J5cHRvX2xiX2xvY2spOw0KDQoJCXJldHVybiBlcnI7DQoJ fQ0KDQoJaWYgKCFkZWZhdWx0X2xiIHx8IHNldF9kZWZhdWx0KQ0KCQlsYl9zZXRfZGVmYXVsdChs Yik7DQoJDQoJaWYgKCFjdXJyZW50X2xiIHx8IHNldF9jdXJyZW50KQ0KCQlsYl9zZXRfY3VycmVu dChsYik7DQoNCglkcHJpbnRrKEtFUk5fSU5GTyAiQ3J5cHRvIGxvYWQgYmFsYW5jZXIgJXMgd2Fz IHJlZ2lzdGVyZWQgYW5kIHNldCB0byBiZSBbJXMuJXNdLlxuIiwgDQoJCQlsYi0+bmFtZSwgDQoJ CQkobGJfaXNfY3VycmVudChsYikpPyJjdXJyZW50Ijoibm90IGN1cnJlbnQiLCANCgkJCShsYl9p c19kZWZhdWx0KGxiKSk/ImRlZmF1bHQiOiJub3QgZGVmYXVsdCIpOw0KDQoJbGJfbnVtKys7DQoJ DQoJcmV0dXJuIDA7DQp9DQoNCnZvaWQgY3J5cHRvX2xiX3VucmVnaXN0ZXIoc3RydWN0IGNyeXB0 b19sYiAqbGIpDQp7DQoJc3RydWN0IGNyeXB0b19sYiAqX19sYiwgKm47DQoNCglpZiAobGJfbnVt ID09IDEpDQoJew0KCQlkcHJpbnRrKEtFUk5fSU5GTyAiWW91IGFyZSByZW1vdmluZyBjcnlwdG8g bG9hZCBiYWxhbmNlciAlcyB3aGljaCBpcyBjdXJyZW50IGFuZCBkZWZhdWx0LlxuIg0KCQkJCSJU aGVyZSBpcyBubyBvdGhlciBjcnlwdG8gbG9hZCBiYWxhbmNlcnMuICINCgkJCQkiUmVtb3Zpbmcg JXMgZGVsYXllZCB1bnRpbGwgbmV3IGxvYWQgYmFsYW5jZXIgaXMgcmVnaXN0ZXJlZC5cbiIsIA0K CQkJCWxiLT5uYW1lLCAoZm9yY2VfbGJfcmVtb3ZlKT8iaXMgbm90IjoiaXMiKTsNCgkJd2hpbGUg KGxiX251bSA9PSAxICYmICFmb3JjZV9sYl9yZW1vdmUpDQoJCXsNCgkJCXNldF9jdXJyZW50X3N0 YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7DQoJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsNCg0KCQkJ aWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQ0KCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7 DQoJCX0NCgl9DQoNCglfX2NyeXB0b19sYl91bnJlZ2lzdGVyKGxiKTsNCgkNCglzcGluX2xvY2tf YmgoJmNyeXB0b19sYl9sb2NrKTsNCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoX19sYiwgbiwg JmNyeXB0b19sYl9saXN0LCBsYl9lbnRyeSkNCgl7DQoJCWlmIChjb21wYXJlX2xiKF9fbGIsIGxi KSkNCgkJew0KCQkJbGJfbnVtLS07DQoJCQlsaXN0X2RlbCgmX19sYi0+bGJfZW50cnkpOw0KCQkJ DQoJCQlkcHJpbnRrKEtFUk5fRVJSICJDcnlwdG8gbG9hZCBiYWxhbmNlciAlcyB3YXMgdW5yZWdp c3RlcmVkLlxuIiwgbGItPm5hbWUpOw0KCQl9DQoJCWVsc2UgaWYgKGxiX251bSkNCgkJew0KCQkJ aWYgKGxiX2lzX2RlZmF1bHQobGIpKQ0KCQkJCWxiX3NldF9kZWZhdWx0KF9fbGIpOw0KCQkJaWYg KGxiX2lzX2N1cnJlbnQobGIpKQ0KCQkJCWxiX3NldF9jdXJyZW50KGRlZmF1bHRfbGIpOw0KCQl9 DQoJfQ0KCXNwaW5fdW5sb2NrX2JoKCZjcnlwdG9fbGJfbG9jayk7DQp9DQoNCnN0YXRpYyB2b2lk IGNyeXB0b19sYl9xdWV1ZV93cmFwcGVyKHZvaWQgKmRhdGEpDQp7DQoJc3RydWN0IGNyeXB0b19k ZXZpY2UgKmRldiA9ICZtYWluX2NyeXB0b19kZXZpY2U7DQoJc3RydWN0IGNyeXB0b19zZXNzaW9u ICpzID0gKHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqKWRhdGE7DQoNCglkcHJpbnRrKEtFUk5fSU5G TyAiJXM6IENhbGxpbmcgY2FsbGJhY2sgZm9yIHNlc3Npb24gJWxsdSBbJWxsdV0gZmxhZ3M9JXgs ICINCgkJCSJvcD0lMDR1LCB0eXBlPSUwNHgsIG1vZGU9JTA0eCwgcHJpb3JpdHk9JTA0eFxuIiwg DQoJCQlfX2Z1bmNfXywgDQoJCQlzLT5jaS5pZCwgcy0+Y2kuZGV2X2lkLCBzLT5jaS5mbGFncywN CgkJCXMtPmNpLm9wZXJhdGlvbiwgcy0+Y2kudHlwZSwgcy0+Y2kubW9kZSwgcy0+Y2kucHJpb3Jp dHkpOw0KCQ0KCS8qDQoJICogUHJldmVudCByYWNlcyB3aXRoIGNyeXB0byBkZXZpY2VzIA0KCSAq IHdoaWNoIG1heSBjaGFuZ2UgZmxhZ3Mgb2YgdGhlIHNlc3Npb25zIGluIHRoZWlycyBxdWV1ZXMu DQoJICovDQoJc3Bpbl9sb2NrKCZzLT5sb2NrKTsNCgljcnlwdG9fc3RhdF9maW5pc2hfaW5jKHMp Ow0KCWZpbmlzaF9zZXNzaW9uKHMpOw0KCXVuc3RhcnRfc2Vzc2lvbihzKTsNCglzcGluX3VubG9j aygmcy0+bG9jayk7DQoJDQoJcy0+Y2kuY2FsbGJhY2soJnMtPmNpLCAmcy0+ZGF0YSk7DQoNCglp ZiAoc2Vzc2lvbl9maW5pc2hlZChzKSkNCgl7DQoJCWNyeXB0b19zZXNzaW9uX2RlcXVldWVfcm91 dGUocyk7DQoJCWtmcmVlKHMpOw0KCX0NCgllbHNlDQoJew0KCQkvKg0KCQkgKiBTcGVjaWFsIGNh c2U6IGNyeXB0byBjb25zdW1lciBtYXJrcyBzZXNzaW9uIGFzICJub3QgZmluaXNoZWQiDQoJCSAq IGluIGl0J3MgY2FsbGJhY2sgLSBpdCBtZWFucyB0aGF0IGNyeXB0byBjb25zdW1lciB3YW50cyAN CgkJICogdGhpcyBzZXNzaW9uIHRvIGJlIHByb2Nlc3NlZCBmdXJ0aGVyLCANCgkJICogZm9yIGV4 YW1wbGUgY3J5cHRvIGNvbnN1bWVyIGNhbiBhZGQgbmV3IHJvdXRlIGFuZCB0aGVuDQoJCSAqIG1h cmsgc2Vzc2lvbiBhcyAibm90IGZpbmlzaGVkIi4NCgkJICovDQoJDQoJCXVuY29tcGxldGVfc2Vz c2lvbihzKTsNCgkJdW5zdGFydF9zZXNzaW9uKHMpOw0KCQljcnlwdG9fc2Vzc2lvbl9pbnNlcnRf bWFpbihkZXYsIHMpOw0KCX0NCgkNCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNyeXB0b19sYl93 YWl0X3F1ZXVlKTsNCn0NCg0Kc3RhdGljIHZvaWQgY3J5cHRvX2xiX3Byb2Nlc3NfbmV4dF9yb3V0 ZShzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpDQp7DQoJc3RydWN0IGNyeXB0b19yb3V0ZSAqcnQ7 DQoJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldjsNCg0KCXJ0ID0gY3J5cHRvX3JvdXRlX2RlcXVl dWUocyk7DQoJaWYgKHJ0KQ0KCXsNCgkJZGV2ID0gcnQtPmRldjsNCg0KCQlzcGluX2xvY2tfYmgo JmRldi0+c2Vzc2lvbl9sb2NrKTsNCgkJbGlzdF9kZWwoJnMtPmRldl9xdWV1ZV9lbnRyeSk7DQoJ CXNwaW5fdW5sb2NrX2JoKCZkZXYtPnNlc3Npb25fbG9jayk7DQoJCWNyeXB0b19yb3V0ZV9mcmVl KHJ0KTsNCg0KCQlkZXYgPSBjcnlwdG9fcm91dGVfZ2V0X2N1cnJlbnRfZGV2aWNlKHMpOw0KCQlp ZiAoZGV2KQ0KCQl7DQoJCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByb2Nlc3NpbmcgbmV3IHJv dXRlIHRvICVzLlxuIiwgDQoJCQkJCV9fZnVuY19fLCBkZXYtPm5hbWUpOw0KDQoJCQltZW1jcHko JnMtPmNpLCAmcnQtPmNpLCBzaXplb2Yocy0+Y2kpKTsNCgkJCWNyeXB0b19zZXNzaW9uX2luc2Vy dChkZXYsIHMpOw0KDQoJCQkvKg0KCQkJICogUmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlIHdhcyBh bHJlYWR5IGhvbGQgd2hlbg0KCQkJICogbmV3IHJvdXRpbmcgd2FzIGFkZGVkLg0KCQkJICovDQoJ CQljcnlwdG9fZGV2aWNlX3B1dChkZXYpOw0KCQl9DQoJfQ0KfQ0KDQppbnQgY3J5cHRvX2xiX3Ro cmVhZCh2b2lkICpkYXRhKQ0Kew0KCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcywgKm47DQoJc3Ry dWN0IGNyeXB0b19kZXZpY2UgKmRldiA9IChzdHJ1Y3QgY3J5cHRvX2RldmljZSAqKWRhdGE7DQoJ DQoJZGFlbW9uaXplKCIlcyIsIGRldi0+bmFtZSk7DQoJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOw0K DQoJd2hpbGUgKCFuZWVkX2V4aXQpDQoJew0KCQlzcGluX2xvY2tfYmgoJmRldi0+c2Vzc2lvbl9s b2NrKTsNCgkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIG4sICZkZXYtPnNlc3Npb25fbGlz dCwgbWFpbl9xdWV1ZV9lbnRyeSkNCgkJew0KCQkJcHJpbnRrKCJzZXNzaW9uICVsbHUgWyVsbHVd OiBmbGFncz0leCwgcm91dGVfbnVtPSVkLCAlcywlcywlcywlcy5cbiIsIA0KCQkJCQlzLT5jaS5p ZCwgcy0+Y2kuZGV2X2lkLCBzLT5jaS5mbGFncywgDQoJCQkJCWNyeXB0b19yb3V0ZV9xdWV1ZV9s ZW4ocyksDQoJCQkJCShzZXNzaW9uX2NvbXBsZXRlZChzKSk/ImNvbXBsZXRlZCI6ICJub3QgY29t cGxldGVkIiwNCgkJCQkJKHNlc3Npb25fZmluaXNoZWQocykpPyJmaW5pc2hlZCI6ICJub3QgZmlu aXNoZWQiLA0KCQkJCQkoc2Vzc2lvbl9zdGFydGVkKHMpKT8ic3RhcnRlZCI6ICJub3Qgc3RhcnRl ZCIsDQoJCQkJCShzZXNzaW9uX2lzX3Byb2Nlc3NlZChzKSk/ImlzIGJlaW5nIHByb2Nlc3NlZCI6 ICJpcyBub3QgYmVpbmcgcHJvY2Vzc2VkIik7DQoNCgkJCWlmICghc3Bpbl90cnlsb2NrKCZzLT5s b2NrKSkNCgkJCQljb250aW51ZTsNCgkJCQ0KCQkJaWYgKHNlc3Npb25faXNfcHJvY2Vzc2VkKHMp KQ0KCQkJCWdvdG8gdW5sb2NrOw0KCQkJaWYgKHNlc3Npb25fc3RhcnRlZChzKSkNCgkJCQlnb3Rv IHVubG9jazsNCgkJCQ0KCQkJaWYgKHNlc3Npb25fY29tcGxldGVkKHMpKQ0KCQkJew0KCQkJCXVu Y29tcGxldGVfc2Vzc2lvbihzKTsNCg0KCQkJCWlmIChjcnlwdG9fcm91dGVfcXVldWVfbGVuKHMp ID4gMSkNCgkJCQl7DQoJCQkJCWNyeXB0b19sYl9wcm9jZXNzX25leHRfcm91dGUocyk7DQoJCQkJ fQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXN0YXJ0X3Nlc3Npb24ocyk7DQoJCQkJCWNyeXB0b19z dGF0X3N0YXJ0X2luYyhzKTsNCg0KCQkJCQlfX2NyeXB0b19zZXNzaW9uX2RlcXVldWVfbWFpbihz KTsNCgkJCQkJc3Bpbl91bmxvY2soJnMtPmxvY2spOw0KCQkJCQkNCgkJCQkJSU5JVF9XT1JLKCZz LT53b3JrLCAmY3J5cHRvX2xiX3F1ZXVlX3dyYXBwZXIsIHMpOw0KCQkJCQlxdWV1ZV93b3JrKGNy eXB0b19sYl9xdWV1ZSwgJnMtPndvcmspOw0KCQkJCQljb250aW51ZTsNCgkJCQl9DQoJCQl9DQp1 bmxvY2s6DQoJCQlzcGluX3VubG9jaygmcy0+bG9jayk7DQoJCX0NCgkJc3Bpbl91bmxvY2tfYmgo JmRldi0+c2Vzc2lvbl9sb2NrKTsNCg0KCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQo JmNyeXB0b19sYl93YWl0X3F1ZXVlLCAxMDAwKTsNCgl9DQoNCglmbHVzaF93b3JrcXVldWUoY3J5 cHRvX2xiX3F1ZXVlKTsNCgljb21wbGV0ZV9hbmRfZXhpdCgmdGhyZWFkX2V4aXRlZCwgMCk7DQp9 DQoNCmludCBjcnlwdG9fbGJfaW5pdCh2b2lkKQ0Kew0KCWludCBlcnI7DQoJbG9uZyBwaWQ7DQoN CgllcnIgPSBidXNfcmVnaXN0ZXIoJmNyeXB0b19sYl9idXNfdHlwZSk7DQoJaWYgKGVycikNCgl7 DQoJCWRwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjcnlwdG8gbG9hZCBiYWxh bmNlciBidXM6IGVycj0lZC5cbiIsIGVycik7DQoJCWdvdG8gZXJyX291dF9leGl0Ow0KCX0NCgkN CgllcnIgPSBkcml2ZXJfcmVnaXN0ZXIoJmNyeXB0b19sYl9kcml2ZXIpOw0KCWlmIChlcnIpDQoJ ew0KCQlkcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY3J5cHRvIGxvYWQgYmFs YW5jZXIgZHJpdmVyOiBlcnI9JWQuXG4iLCBlcnIpOw0KCQlnb3RvIGVycl9vdXRfYnVzX3VucmVn aXN0ZXI7DQoJfQ0KCQ0KCWNyeXB0b19sYl9jbGFzcy5jbGFzc19kZXZfYXR0cnMgPSAmY2xhc3Nf ZGV2aWNlX2F0dHJfbGJzOw0KCQ0KCWVyciA9IGNsYXNzX3JlZ2lzdGVyKCZjcnlwdG9fbGJfY2xh c3MpOw0KCWlmIChlcnIpDQoJew0KCQlkcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0 ZXIgY3J5cHRvIGxvYWQgYmFsYW5jZXIgY2xhc3M6IGVycj0lZC5cbiIsIGVycik7DQoJCWdvdG8g ZXJyX291dF9kcml2ZXJfdW5yZWdpc3RlcjsNCgl9DQoNCgljcnlwdG9fbGJfcXVldWUgPSBjcmVh dGVfd29ya3F1ZXVlKCJjbGJxIik7DQoJaWYgKCFjcnlwdG9fbGJfcXVldWUpDQoJew0KCQlkcHJp bnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gY3JlYXRlIGNyeXB0byBsb2FkIGJhbGFuZXIgd29yayBx dWV1ZS5cbiIpOw0KCQlnb3RvIGVycl9vdXRfY2xhc3NfdW5yZWdpc3RlcjsNCgl9DQoJDQoJaW5p dF9jb21wbGV0aW9uKCZ0aHJlYWRfZXhpdGVkKTsNCglwaWQgPSBrZXJuZWxfdGhyZWFkKGNyeXB0 b19sYl90aHJlYWQsICZtYWluX2NyeXB0b19kZXZpY2UsIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMp Ow0KCWlmIChJU19FUlIoKHZvaWQgKilwaWQpKQ0KCXsNCgkJZHByaW50ayhLRVJOX0VSUiAiRmFp bGVkIHRvIGNyZWF0ZSBrZXJuZWwgbG9hZCBiYWxhbmNpbmcgdGhyZWFkLlxuIik7DQoJCWdvdG8g ZXJyX291dF9kZXN0cm95X3dvcmtxdWV1ZTsNCgl9DQoJDQoNCglyZXR1cm4gMDsNCg0KZXJyX291 dF9kZXN0cm95X3dvcmtxdWV1ZToNCglkZXN0cm95X3dvcmtxdWV1ZShjcnlwdG9fbGJfcXVldWUp Ow0KZXJyX291dF9jbGFzc191bnJlZ2lzdGVyOg0KCWNsYXNzX3VucmVnaXN0ZXIoJmNyeXB0b19s Yl9jbGFzcyk7DQplcnJfb3V0X2RyaXZlcl91bnJlZ2lzdGVyOg0KCWRyaXZlcl91bnJlZ2lzdGVy KCZjcnlwdG9fbGJfZHJpdmVyKTsNCmVycl9vdXRfYnVzX3VucmVnaXN0ZXI6DQoJYnVzX3VucmVn aXN0ZXIoJmNyeXB0b19sYl9idXNfdHlwZSk7DQplcnJfb3V0X2V4aXQ6DQoJcmV0dXJuIGVycjsN Cn0NCg0Kdm9pZCBjcnlwdG9fbGJfZmluaSh2b2lkKQ0Kew0KCW5lZWRfZXhpdCA9IDE7DQoJd2Fp dF9mb3JfY29tcGxldGlvbigmdGhyZWFkX2V4aXRlZCk7DQoJZGVzdHJveV93b3JrcXVldWUoY3J5 cHRvX2xiX3F1ZXVlKTsNCgljbGFzc191bnJlZ2lzdGVyKCZjcnlwdG9fbGJfY2xhc3MpOw0KCWRy aXZlcl91bnJlZ2lzdGVyKCZjcnlwdG9fbGJfZHJpdmVyKTsNCglidXNfdW5yZWdpc3RlcigmY3J5 cHRvX2xiX2J1c190eXBlKTsNCn0NCg0KRVhQT1JUX1NZTUJPTChjcnlwdG9fbGJfcmVnaXN0ZXIp Ow0KRVhQT1JUX1NZTUJPTChjcnlwdG9fbGJfdW5yZWdpc3Rlcik7DQpFWFBPUlRfU1lNQk9MKGNy eXB0b19sYl9yZWhhc2gpOw0KRVhQT1JUX1NZTUJPTChjcnlwdG9fbGJfZmluZF9kZXZpY2UpOw0K --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_lb.h Content-Type: text/x-chdr; name=crypto_lb.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fbGIuaA0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBv bHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1Pg0KICogDQogKg0KICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5DQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4NCiAqDQogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQogKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoNCiAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQ0KICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3Rv biwgTUEgMDIxMTEtMTMwNyBVU0ENCiAqLw0KDQojaWZuZGVmIF9fQ1JZUFRPX0xCX0gNCiNkZWZp bmUgX19DUllQVE9fTEJfSA0KDQojaW5jbHVkZSAiYWNyeXB0by5oIg0KDQojZGVmaW5lIENSWVBU T19MQl9OQU1FTEVOCTMyDQoNCnN0cnVjdCBjcnlwdG9fbGINCnsNCglzdHJ1Y3QgbGlzdF9oZWFk CWxiX2VudHJ5Ow0KDQoJY2hhciAJCQluYW1lW0NSWVBUT19MQl9OQU1FTEVOXTsNCg0KCXZvaWQJ CQkoKnJlaGFzaCkoc3RydWN0IGNyeXB0b19sYiAqKTsNCglzdHJ1Y3QgY3J5cHRvX2RldmljZSAq CSgqZmluZF9kZXZpY2UpKHN0cnVjdCBjcnlwdG9fbGIgKiwgc3RydWN0IGNyeXB0b19zZXNzaW9u X2luaXRpYWxpemVyICopOw0KDQoJc3BpbmxvY2tfdAkJbG9jazsNCg0KCXNwaW5sb2NrX3QJCSpj cnlwdG9fZGV2aWNlX2xvY2s7DQoJc3RydWN0IGxpc3RfaGVhZAkqY3J5cHRvX2RldmljZV9saXN0 Ow0KDQoJc3RydWN0IGRldmljZV9kcml2ZXIJKmRyaXZlcjsNCglzdHJ1Y3QgZGV2aWNlCQlkZXZp Y2U7DQoJc3RydWN0IGNsYXNzX2RldmljZQljbGFzc19kZXZpY2U7DQoJc3RydWN0IGNvbXBsZXRp b24JZGV2X3JlbGVhc2VkOw0KDQp9Ow0KDQppbnQgY3J5cHRvX2xiX3JlZ2lzdGVyKHN0cnVjdCBj cnlwdG9fbGIgKmxiLCBpbnQgc2V0X2N1cnJlbnQsIGludCBzZXRfZGVmYXVsdCk7DQp2b2lkIGNy eXB0b19sYl91bnJlZ2lzdGVyKHN0cnVjdCBjcnlwdG9fbGIgKmxiKTsNCg0KaW5saW5lIHZvaWQg Y3J5cHRvX2xiX3JlaGFzaCh2b2lkKTsNCnN0cnVjdCBjcnlwdG9fZGV2aWNlICpjcnlwdG9fbGJf ZmluZF9kZXZpY2Uoc3RydWN0IGNyeXB0b19zZXNzaW9uX2luaXRpYWxpemVyICpjaSk7DQoNCmlu dCBjcnlwdG9fbGJfaW5pdCh2b2lkKTsNCnZvaWQgY3J5cHRvX2xiX2Zpbmkodm9pZCk7DQoNCiNl bmRpZiAvKiBfX0NSWVBUT19MQl9IICovDQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_main.c Content-Type: text/x-csrc; name=crypto_main.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fbWFpbi5jDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkg UG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0K ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4N CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5o Pg0KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2lu Y2x1ZGUgPGxpbnV4L3NsYWIuaD4NCiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCiNpbmNs dWRlIDxsaW51eC9zcGlubG9jay5oPg0KDQojaW5jbHVkZSAiYWNyeXB0by5oIg0KI2luY2x1ZGUg ImNyeXB0b19sYi5oIg0KI2luY2x1ZGUgImNyeXB0b19jb25uLmgiDQojaW5jbHVkZSAiY3J5cHRv X3JvdXRlLmgiDQoNCmludCBmb3JjZV9sYl9yZW1vdmU7DQptb2R1bGVfcGFyYW0oZm9yY2VfbGJf cmVtb3ZlLCBpbnQsIDApOw0KDQpzdHJ1Y3QgY3J5cHRvX2RldmljZSBtYWluX2NyeXB0b19kZXZp Y2U7DQoNCmV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgY3J5cHRvX2J1c190eXBlOw0KZXh0ZXJuIHN0 cnVjdCBkZXZpY2VfZHJpdmVyIGNyeXB0b19kcml2ZXI7DQpleHRlcm4gc3RydWN0IGNsYXNzIGNy eXB0b19jbGFzczsNCmV4dGVybiBzdHJ1Y3QgZGV2aWNlIGNyeXB0b19kZXY7DQoNCmV4dGVybiBz dHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cl9kZXZpY2VzOw0K ZXh0ZXJuIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGNsYXNzX2RldmljZV9hdHRyX2xi czsNCg0Kc3RhdGljIGlubGluZSB2b2lkIGR1bXBfY2koc3RydWN0IGNyeXB0b19zZXNzaW9uX2lu aXRpYWxpemVyICpjaSkNCnsNCglkcHJpbnRrKCIlbGx1IFslbGx1XSBvcD0lMDR1LCB0eXBlPSUw NHgsIG1vZGU9JTA0eCwgcHJpb3JpdHk9JTA0eCIsIA0KCQkJY2ktPmlkLCBjaS0+ZGV2X2lkLA0K CQkJY2ktPm9wZXJhdGlvbiwgY2ktPnR5cGUsIGNpLT5tb2RlLCBjaS0+cHJpb3JpdHkpOw0KfQ0K DQpzdGF0aWMgdm9pZCBfX2NyeXB0b19zZXNzaW9uX2luc2VydChzdHJ1Y3QgY3J5cHRvX2Rldmlj ZSAqZGV2LCBzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpDQp7DQoJc3RydWN0IGNyeXB0b19zZXNz aW9uICpfX3M7DQoNCglpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmZGV2LT5zZXNzaW9uX2xpc3Qp KSkNCgl7DQoJCWxpc3RfYWRkKCZzLT5kZXZfcXVldWVfZW50cnksICZkZXYtPnNlc3Npb25fbGlz dCk7DQoJfQ0KCWVsc2UNCgl7DQoJCWludCBpbnNlcnRlZCA9IDA7DQoJCQ0KCQlsaXN0X2Zvcl9l YWNoX2VudHJ5KF9fcywgJmRldi0+c2Vzc2lvbl9saXN0LCBkZXZfcXVldWVfZW50cnkpDQoJCXsN CgkJCWlmIChfX3MtPmNpLnByaW9yaXR5IDwgcy0+Y2kucHJpb3JpdHkpDQoJCQl7DQoJCQkJbGlz dF9hZGRfdGFpbCgmcy0+ZGV2X3F1ZXVlX2VudHJ5LCAmX19zLT5kZXZfcXVldWVfZW50cnkpOw0K CQkJCWluc2VydGVkID0gMTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KDQoJCWlmICghaW5zZXJ0 ZWQpDQoJCQlsaXN0X2FkZF90YWlsKCZzLT5kZXZfcXVldWVfZW50cnksICZkZXYtPnNlc3Npb25f bGlzdCk7DQoJfQ0KCQ0KCWR1bXBfY2koJnMtPmNpKTsNCglkcHJpbnRrKCIgYWRkZWQgdG8gY3J5 cHRvIGRldmljZSAlcyBbJWRdLlxuIiwgZGV2LT5uYW1lLCBhdG9taWNfcmVhZCgmZGV2LT5yZWZj bnQpKTsNCn0NCg0KaW5saW5lIHZvaWQgY3J5cHRvX3Nlc3Npb25faW5zZXJ0X21haW4oc3RydWN0 IGNyeXB0b19kZXZpY2UgKmRldiwgc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQ0Kew0KCXN0cnVj dCBjcnlwdG9fc2Vzc2lvbiAqX19zOw0KDQoJc3Bpbl9sb2NrX2JoKCZkZXYtPnNlc3Npb25fbG9j ayk7DQoJY3J5cHRvX2RldmljZV9nZXQoZGV2KTsNCglpZiAodW5saWtlbHkobGlzdF9lbXB0eSgm ZGV2LT5zZXNzaW9uX2xpc3QpKSkNCgl7DQoJCWxpc3RfYWRkKCZzLT5tYWluX3F1ZXVlX2VudHJ5 LCAmZGV2LT5zZXNzaW9uX2xpc3QpOw0KCX0NCgllbHNlDQoJew0KCQlpbnQgaW5zZXJ0ZWQgPSAw Ow0KCQkNCgkJbGlzdF9mb3JfZWFjaF9lbnRyeShfX3MsICZkZXYtPnNlc3Npb25fbGlzdCwgbWFp bl9xdWV1ZV9lbnRyeSkNCgkJew0KCQkJaWYgKF9fcy0+Y2kucHJpb3JpdHkgPCBzLT5jaS5wcmlv cml0eSkNCgkJCXsNCgkJCQlsaXN0X2FkZF90YWlsKCZzLT5tYWluX3F1ZXVlX2VudHJ5LCAmX19z LT5tYWluX3F1ZXVlX2VudHJ5KTsNCgkJCQlpbnNlcnRlZCA9IDE7DQoJCQkJYnJlYWs7DQoJCQl9 DQoJCX0NCg0KCQlpZiAoIWluc2VydGVkKQ0KCQkJbGlzdF9hZGRfdGFpbCgmcy0+bWFpbl9xdWV1 ZV9lbnRyeSwgJmRldi0+c2Vzc2lvbl9saXN0KTsNCgl9DQoJc3Bpbl91bmxvY2tfYmgoJmRldi0+ c2Vzc2lvbl9sb2NrKTsNCgkNCglkdW1wX2NpKCZzLT5jaSk7DQoJZHByaW50aygiIGFkZGVkIHRv IG1haW4gY3J5cHRvIGRldmljZSAlcyBbJWRdLlxuIiwgZGV2LT5uYW1lLCBhdG9taWNfcmVhZCgm ZGV2LT5yZWZjbnQpKTsNCn0NCg0KaW5saW5lIHZvaWQgY3J5cHRvX3Nlc3Npb25faW5zZXJ0KHN0 cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcykNCnsNCglz cGluX2xvY2tfYmgoJmRldi0+c2Vzc2lvbl9sb2NrKTsNCglfX2NyeXB0b19zZXNzaW9uX2luc2Vy dChkZXYsIHMpOw0KCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnNlc3Npb25fbG9jayk7DQoJDQoJaWYg KGRldi0+ZGF0YV9yZWFkeSkNCgkJZGV2LT5kYXRhX3JlYWR5KGRldik7DQp9DQoNCnN0cnVjdCBj cnlwdG9fc2Vzc2lvbiAqY3J5cHRvX3Nlc3Npb25fYWxsb2Moc3RydWN0IGNyeXB0b19zZXNzaW9u X2luaXRpYWxpemVyICpjaSwgc3RydWN0IGNyeXB0b19kYXRhICpkKQ0Kew0KCXN0cnVjdCBjcnlw dG9fZGV2aWNlICpkZXYgPSAmbWFpbl9jcnlwdG9fZGV2aWNlOw0KCXN0cnVjdCBjcnlwdG9fZGV2 aWNlICpsZGV2Ow0KCXN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqczsNCglpbnQgZXJyOw0KDQoJaWYg KGQtPnByaXZfc2l6ZSA+IENSWVBUT19NQVhfUFJJVl9TSVpFKQ0KCXsNCgkJZHByaW50aygicHJp dl9zaXplICV1IGlzIHRvbyBiaWcsIG1heGltdW0gYWxsb3dlZCAldS5cbiIsIGQtPnByaXZfc2l6 ZSwgQ1JZUFRPX01BWF9QUklWX1NJWkUpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglsZGV2ID0g Y3J5cHRvX2xiX2ZpbmRfZGV2aWNlKGNpKTsNCglpZiAoIWxkZXYpDQoJew0KCQlkcHJpbnRrKCJD YW5ub3QgZmluZCBzdWl0YWJsZSBkZXZpY2UuXG4iKTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCQ0K CXMgPSBrbWFsbG9jKHNpemVvZigqcykgKyBkLT5wcml2X3NpemUsIEdGUF9BVE9NSUMpOw0KCWlm ICghcykNCgl7DQoJCWxkZXYtPnN0YXQua21lbV9mYWlsZWQrKzsNCgkJZ290byBlcnJfb3V0X2Rl dmljZV9wdXQ7DQoJfQ0KDQoJbWVtc2V0KHMsIDB4QUIsIHNpemVvZigqcykpOw0KDQoJY3J5cHRv X3JvdXRlX2hlYWRfaW5pdCgmcy0+cm91dGVfbGlzdCk7DQoJDQoJc3Bpbl9sb2NrX2luaXQoJnMt PmxvY2spOw0KCW1lbWNweSgmcy0+Y2ksIGNpLCBzaXplb2Yocy0+Y2kpKTsNCgltZW1jcHkoJnMt PmRhdGEsIGQsIHNpemVvZihzLT5kYXRhKSk7DQoJaWYgKGQtPnByaXZfc2l6ZSkNCgl7DQoJCXMt PmRhdGEucHJpdiA9IHMrMTsNCgkJaWYgKGQtPnByaXYpDQoJCQltZW1jcHkocy0+ZGF0YS5wcml2 LCBkLT5wcml2LCBkLT5wcml2X3NpemUpOw0KCX0NCgllbHNlDQoJCXMtPmRhdGEucHJpdiA9IE5V TEw7DQoNCglzLT5jaS5pZCAJPSBkZXYtPnNpZCsrOw0KCXMtPmNpLmRldl9pZCAJPSBsZGV2LT5z aWQrKzsNCglzLT5jaS5mbGFncyAJPSAwOw0KI2lmIDENCgllcnIgPSBjcnlwdG9fcm91dGVfYWRk KGxkZXYsIHMsIGNpKTsNCglpZiAoZXJyKQ0KCXsNCgkJZHByaW50aygiQ2FuIG5vdCBhZGQgcm91 dGUgdG8gZGV2aWNlICVzLlxuIiwgbGRldi0+bmFtZSk7DQoJCWdvdG8gZXJyX291dF9zZXNzaW9u X2ZyZWU7DQoJfQ0KCQ0KCWNyeXB0b19zZXNzaW9uX2luc2VydChsZGV2LCBzKTsNCgljcnlwdG9f ZGV2aWNlX3B1dChsZGV2KTsNCiNlbmRpZg0KCWNyeXB0b19zZXNzaW9uX2luc2VydF9tYWluKGRl diwgcyk7DQoNCglyZXR1cm4gczsNCgkNCmVycl9vdXRfc2Vzc2lvbl9mcmVlOg0KCWNyeXB0b19k ZXZpY2VfcHV0KGxkZXYpOw0KZXJyX291dF9kZXZpY2VfcHV0Og0KCWtmcmVlKHMpOw0KDQoJcmV0 dXJuIE5VTEw7DQp9DQoNCnZvaWQgY3J5cHRvX3Nlc3Npb25fZGVxdWV1ZV9yb3V0ZShzdHJ1Y3Qg Y3J5cHRvX3Nlc3Npb24gKnMpDQp7DQoJc3RydWN0IGNyeXB0b19yb3V0ZSAqcnQ7DQoJc3RydWN0 IGNyeXB0b19kZXZpY2UgKmRldjsNCgkNCglCVUdfT04oY3J5cHRvX3JvdXRlX3F1ZXVlX2xlbihz KSA+IDEpOw0KCQ0KCXdoaWxlICgocnQgPSBjcnlwdG9fcm91dGVfZGVxdWV1ZShzKSkpDQoJew0K CQlkZXYgPSBydC0+ZGV2Ow0KDQoJCWRwcmludGsoS0VSTl9JTkZPICJSZW1vdmluZyByb3V0ZSBl bnRyeSBmb3IgZGV2aWNlICVzLlxuIiwgZGV2LT5uYW1lKTsNCg0KCQlzcGluX2xvY2tfYmgoJmRl di0+c2Vzc2lvbl9sb2NrKTsNCgkJbGlzdF9kZWwoJnMtPmRldl9xdWV1ZV9lbnRyeSk7DQoJCXNw aW5fdW5sb2NrX2JoKCZkZXYtPnNlc3Npb25fbG9jayk7DQoNCgkJY3J5cHRvX3JvdXRlX2ZyZWUo cnQpOw0KCX0NCn0NCg0KaW5saW5lIHZvaWQgX19jcnlwdG9fc2Vzc2lvbl9kZXF1ZXVlX21haW4o c3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYg PSAmbWFpbl9jcnlwdG9fZGV2aWNlOw0KDQoJbGlzdF9kZWwoJnMtPm1haW5fcXVldWVfZW50cnkp Ow0KCWNyeXB0b19kZXZpY2VfcHV0KGRldik7DQp9DQoNCmlubGluZSB2b2lkIGNyeXB0b19zZXNz aW9uX2RlcXVldWVfbWFpbihzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpDQp7DQoJc3RydWN0IGNy eXB0b19kZXZpY2UgKmRldiA9ICZtYWluX2NyeXB0b19kZXZpY2U7DQoJDQoJc3Bpbl9sb2NrX2Jo KCZkZXYtPnNlc3Npb25fbG9jayk7DQoJX19jcnlwdG9fc2Vzc2lvbl9kZXF1ZXVlX21haW4ocyk7 DQoJc3Bpbl91bmxvY2tfYmgoJmRldi0+c2Vzc2lvbl9sb2NrKTsNCn0NCg0KaW50IF9fZGV2aW5p dCBjbWFpbl9pbml0KHZvaWQpDQp7DQoJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiA9ICZtYWlu X2NyeXB0b19kZXZpY2U7DQoJaW50IGVycjsNCg0KCXNucHJpbnRmKGRldi0+bmFtZSwgc2l6ZW9m KGRldi0+bmFtZSksICJjcnlwdG9fc2Vzc2lvbnMiKTsNCg0KCWVyciA9IGJ1c19yZWdpc3Rlcigm Y3J5cHRvX2J1c190eXBlKTsNCglpZiAoZXJyKQ0KCXsNCgkJZHByaW50ayhLRVJOX0VSUiAiRmFp bGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBidXM6IGVycj0lZC5cbiIsIGVycik7DQoJCXJldHVybiBl cnI7DQoJfQ0KCQ0KCWVyciA9IGRyaXZlcl9yZWdpc3RlcigmY3J5cHRvX2RyaXZlcik7DQoJaWYg KGVycikNCgl7DQoJCWRwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjcnlwdG8g ZHJpdmVyOiBlcnI9JWQuXG4iLCBlcnIpOw0KCQlnb3RvIGVycl9vdXRfYnVzX3VucmVnaXN0ZXI7 DQoJfQ0KCQ0KCWVyciA9IGNsYXNzX3JlZ2lzdGVyKCZjcnlwdG9fY2xhc3MpOw0KCWlmIChlcnIp DQoJew0KCQlkcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY3J5cHRvIGNsYXNz OiBlcnI9JWQuXG4iLCBlcnIpOw0KCQlnb3RvIGVycl9vdXRfZHJpdmVyX3VucmVnaXN0ZXI7DQoJ fQ0KDQoJZXJyID0gY3J5cHRvX2xiX2luaXQoKTsNCglpZiAoZXJyKQ0KCQlnb3RvIGVycl9vdXRf Y2xhc3NfdW5yZWdpc3RlcjsNCgkNCgllcnIgPSBjcnlwdG9fY29ubl9pbml0KCk7DQoJaWYgKGVy cikNCgkJZ290byBlcnJfb3V0X2NyeXB0b19sYl9maW5pOw0KCQ0KCWVyciA9IF9fY3J5cHRvX2Rl dmljZV9hZGQoZGV2KTsNCglpZiAoZXJyKQ0KCQlnb3RvIGVycl9vdXRfY3J5cHRvX2Nvbm5fZmlu aTsNCgkNCgllcnIgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2aWNl LCAmY2xhc3NfZGV2aWNlX2F0dHJfZGV2aWNlcyk7DQoJaWYgKGVycikNCgkJZHByaW50aygiRmFp bGVkIHRvIGNyZWF0ZSBcImRldmljZXNcIiBhdHRyaWJ1dGU6IGVycj0lZC5cbiIsIGVycik7DQoJ ZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmNsYXNzX2RldmljZSwgJmNsYXNz X2RldmljZV9hdHRyX2xicyk7DQoJaWYgKGVycikNCgkJZHByaW50aygiRmFpbGVkIHRvIGNyZWF0 ZSBcImxic1wiIGF0dHJpYnV0ZTogZXJyPSVkLlxuIiwgZXJyKTsNCgkNCg0KCXJldHVybiAwOw0K CQ0KZXJyX291dF9jcnlwdG9fY29ubl9maW5pOg0KCWNyeXB0b19jb25uX2ZpbmkoKTsNCmVycl9v dXRfY3J5cHRvX2xiX2Zpbmk6DQoJY3J5cHRvX2xiX2ZpbmkoKTsNCmVycl9vdXRfY2xhc3NfdW5y ZWdpc3RlcjoNCgljbGFzc191bnJlZ2lzdGVyKCZjcnlwdG9fY2xhc3MpOw0KZXJyX291dF9kcml2 ZXJfdW5yZWdpc3RlcjoNCglkcml2ZXJfdW5yZWdpc3RlcigmY3J5cHRvX2RyaXZlcik7DQplcnJf b3V0X2J1c191bnJlZ2lzdGVyOg0KCWJ1c191bnJlZ2lzdGVyKCZjcnlwdG9fYnVzX3R5cGUpOw0K DQoJcmV0dXJuIGVycjsJDQp9DQoNCnZvaWQgX19kZXZleGl0IGNtYWluX2Zpbmkodm9pZCkNCnsN CglzdHJ1Y3QgY3J5cHRvX2RldmljZSAqZGV2ID0gJm1haW5fY3J5cHRvX2RldmljZTsNCg0KCWNs YXNzX2RldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5jbGFzc19kZXZpY2UsICZjbGFzc19kZXZpY2Vf YXR0cl9kZXZpY2VzKTsNCgljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+Y2xhc3NfZGV2 aWNlLCAmY2xhc3NfZGV2aWNlX2F0dHJfbGJzKTsNCglfX2NyeXB0b19kZXZpY2VfcmVtb3ZlKGRl dik7DQoNCgljcnlwdG9fY29ubl9maW5pKCk7DQoJY3J5cHRvX2xiX2ZpbmkoKTsNCgkNCgljbGFz c191bnJlZ2lzdGVyKCZjcnlwdG9fY2xhc3MpOw0KCWRyaXZlcl91bnJlZ2lzdGVyKCZjcnlwdG9f ZHJpdmVyKTsNCglidXNfdW5yZWdpc3RlcigmY3J5cHRvX2J1c190eXBlKTsNCn0NCg0KbW9kdWxl X2luaXQoY21haW5faW5pdCk7DQptb2R1bGVfZXhpdChjbWFpbl9maW5pKTsNCg0KTU9EVUxFX0xJ Q0VOU0UoIkdQTCIpOw0KTU9EVUxFX0FVVEhPUigiRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAy a2EubWlwdC5ydT4iKTsNCk1PRFVMRV9ERVNDUklQVElPTigiQXN5bmNocm9ub3VzIGNyeXB0byBs YXllci4iKTsNCg0KRVhQT1JUX1NZTUJPTChjcnlwdG9fc2Vzc2lvbl9hbGxvYyk7DQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_route.h Content-Type: text/x-chdr; name=crypto_route.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fcm91dGUuaA0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5 IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1Pg0KICogDQogKg0KICogVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkN CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5DQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4NCiAqDQogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQogKiBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoNCiAqIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQog KiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0 d2FyZQ0KICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJv c3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiAqLw0KDQojaWZuZGVmIF9fQ1JZUFRPX1JPVVRFX0gN CiNkZWZpbmUgX19DUllQVE9fUk9VVEVfSA0KDQojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCiNp bmNsdWRlIDxsaW51eC9zbGFiLmg+DQojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCg0KI2lu Y2x1ZGUgImFjcnlwdG8uaCINCg0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3JvdXRlICpj cnlwdG9fcm91dGVfYWxsb2Moc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiwgc3RydWN0IGNyeXB0 b19zZXNzaW9uX2luaXRpYWxpemVyICpjaSkNCnsNCglzdHJ1Y3QgY3J5cHRvX3JvdXRlICpydDsN Cg0KCWNyeXB0b19kZXZpY2VfZ2V0KGRldik7DQoJaWYgKCFtYXRjaF9pbml0aWFsaXplcihkZXYs IGNpKSkNCgl7DQoJCWNyeXB0b19kZXZpY2VfcHV0KGRldik7DQoJCXJldHVybiBOVUxMOw0KCX0N Cg0KCXJ0ID0ga21hbGxvYyhzaXplb2YoKnJ0KSwgR0ZQX0FUT01JQyk7DQoJaWYgKCFydCkNCgl7 DQoJCWNyeXB0b19kZXZpY2VfcHV0KGRldik7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCW1lbXNl dChydCwgMCwgc2l6ZW9mKCpydCkpOw0KCW1lbWNweSgmcnQtPmNpLCBjaSwgc2l6ZW9mKCpjaSkp Ow0KDQoJcnQtPmRldiA9IGRldjsNCg0KCXJldHVybiBydDsNCn0NCg0Kc3RhdGljIGlubGluZSB2 b2lkIGNyeXB0b19yb3V0ZV9mcmVlKHN0cnVjdCBjcnlwdG9fcm91dGUgKnJ0KQ0Kew0KCWNyeXB0 b19kZXZpY2VfcHV0KHJ0LT5kZXYpOw0KCXJ0LT5kZXYgPSBOVUxMOw0KCWtmcmVlKHJ0KTsNCn0N Cg0Kc3RhdGljIGlubGluZSB2b2lkIF9fY3J5cHRvX3JvdXRlX2RlbChzdHJ1Y3QgY3J5cHRvX3Jv dXRlICpydCwgc3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkICpsaXN0KQ0Kew0KCXN0cnVjdCBjcnlw dG9fcm91dGUgKm5leHQsICpwcmV2Ow0KDQoJbGlzdC0+cWxlbi0tOw0KCW5leHQJCT0gcnQtPm5l eHQ7DQoJcHJldgkJPSBydC0+cHJldjsNCglydC0+bmV4dAk9IHJ0LT5wcmV2ID0gTlVMTDsNCgly dC0+bGlzdAk9IE5VTEw7DQoJbmV4dC0+cHJldgk9IHByZXY7DQoJcHJldi0+bmV4dAk9IG5leHQ7 DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fcm91dGVfZGVsKHN0cnVjdCBjcnlwdG9f cm91dGUgKnJ0KQ0Kew0KCXN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdCA9IHJ0LT5saXN0 Ow0KDQoJaWYgKGxpc3QpDQoJew0KCQlzcGluX2xvY2tfYmgoJmxpc3QtPmxvY2spOw0KCQlpZiAo bGlzdCA9PSBydC0+bGlzdCkNCgkJCV9fY3J5cHRvX3JvdXRlX2RlbChydCwgcnQtPmxpc3QpOw0K CQlzcGluX3VubG9ja19iaCgmbGlzdC0+bG9jayk7DQoNCgkJY3J5cHRvX3JvdXRlX2ZyZWUocnQp Ow0KCX0NCn0NCg0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3JvdXRlICpfX2NyeXB0b19y b3V0ZV9kZXF1ZXVlKHN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdCkNCnsNCglzdHJ1Y3Qg Y3J5cHRvX3JvdXRlICpuZXh0LCAqcHJldiwgKnJlc3VsdDsNCg0KCXByZXYgPSAoc3RydWN0IGNy eXB0b19yb3V0ZSAqKSBsaXN0Ow0KCW5leHQgPSBwcmV2LT5uZXh0Ow0KCXJlc3VsdCA9IE5VTEw7 DQoJaWYgKG5leHQgIT0gcHJldikgew0KCQlyZXN1bHQJICAgICA9IG5leHQ7DQoJCW5leHQJICAg ICA9IG5leHQtPm5leHQ7DQoJCWxpc3QtPnFsZW4tLTsNCgkJbmV4dC0+cHJldiAgID0gcHJldjsN CgkJcHJldi0+bmV4dCAgID0gbmV4dDsNCgkJcmVzdWx0LT5uZXh0ID0gcmVzdWx0LT5wcmV2ID0g TlVMTDsNCgkJcmVzdWx0LT5saXN0ID0gTlVMTDsNCgl9DQoJcmV0dXJuIHJlc3VsdDsNCn0NCg0K c3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3JvdXRlICpjcnlwdG9fcm91dGVfZGVxdWV1ZShz dHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpDQp7DQoJc3RydWN0IGNyeXB0b19yb3V0ZSAqcnQ7DQoJ DQoJc3Bpbl9sb2NrX2JoKCZzLT5yb3V0ZV9saXN0LmxvY2spOw0KCXJ0ID0gX19jcnlwdG9fcm91 dGVfZGVxdWV1ZSgmcy0+cm91dGVfbGlzdCk7DQoJc3Bpbl91bmxvY2tfYmgoJnMtPnJvdXRlX2xp c3QubG9jayk7DQoNCglyZXR1cm4gcnQ7DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBfX2NyeXB0 b19yb3V0ZV9xdWV1ZShzdHJ1Y3QgY3J5cHRvX3JvdXRlICpydCwgc3RydWN0IGNyeXB0b19yb3V0 ZV9oZWFkICpsaXN0KQ0Kew0KCXN0cnVjdCBjcnlwdG9fcm91dGUgKnByZXYsICpuZXh0Ow0KDQoJ cnQtPmxpc3QgCT0gbGlzdDsNCglsaXN0LT5xbGVuKys7DQoJbmV4dCAJCT0gKHN0cnVjdCBjcnlw dG9fcm91dGUgKilsaXN0Ow0KCXByZXYgCQk9IG5leHQtPnByZXY7DQoJcnQtPm5leHQgCT0gbmV4 dDsNCglydC0+cHJldiAJPSBwcmV2Ow0KCW5leHQtPnByZXYgIAk9IHByZXYtPm5leHQgPSBydDsN Cn0NCg0Kc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19yb3V0ZV9xdWV1ZShzdHJ1Y3QgY3J5cHRv X3JvdXRlICpydCwgc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQ0Kew0KCXNwaW5fbG9ja19iaCgm cy0+cm91dGVfbGlzdC5sb2NrKTsNCglfX2NyeXB0b19yb3V0ZV9xdWV1ZShydCwgJnMtPnJvdXRl X2xpc3QpOw0KCXNwaW5fdW5sb2NrX2JoKCZzLT5yb3V0ZV9saXN0LmxvY2spOw0KfQ0KDQpzdGF0 aWMgaW5saW5lIGludCBjcnlwdG9fcm91dGVfYWRkKHN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXYs IHN0cnVjdCBjcnlwdG9fc2Vzc2lvbiAqcywgc3RydWN0IGNyeXB0b19zZXNzaW9uX2luaXRpYWxp emVyICpjaSkNCnsNCglzdHJ1Y3QgY3J5cHRvX3JvdXRlICpydDsNCg0KCXJ0ID0gY3J5cHRvX3Jv dXRlX2FsbG9jKGRldiwgY2kpOw0KCWlmICghcnQpDQoJCXJldHVybiAtRU5PTUVNOw0KDQoJY3J5 cHRvX3JvdXRlX3F1ZXVlKHJ0LCBzKTsNCgkNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGlubGlu ZSBpbnQgY3J5cHRvX3JvdXRlX3F1ZXVlX2xlbihzdHJ1Y3QgY3J5cHRvX3Nlc3Npb24gKnMpDQp7 DQoJcmV0dXJuIHMtPnJvdXRlX2xpc3QucWxlbjsNCn0NCg0Kc3RhdGljIGlubGluZSB2b2lkIGNy eXB0b19yb3V0ZV9oZWFkX2luaXQoc3RydWN0IGNyeXB0b19yb3V0ZV9oZWFkICpsaXN0KQ0Kew0K CXNwaW5fbG9ja19pbml0KCZsaXN0LT5sb2NrKTsNCglsaXN0LT5wcmV2ID0gbGlzdC0+bmV4dCA9 IChzdHJ1Y3QgY3J5cHRvX3JvdXRlICopbGlzdDsNCglsaXN0LT5xbGVuID0gMDsNCn0NCg0Kc3Rh dGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3JvdXRlICpfX2NyeXB0b19yb3V0ZV9jdXJyZW50KHN0 cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdCkNCnsNCglzdHJ1Y3QgY3J5cHRvX3JvdXRlICpu ZXh0LCAqcHJldiwgKnJlc3VsdDsNCg0KCXByZXYgPSAoc3RydWN0IGNyeXB0b19yb3V0ZSAqKSBs aXN0Ow0KCW5leHQgPSBwcmV2LT5uZXh0Ow0KCXJlc3VsdCA9IE5VTEw7DQoJaWYgKG5leHQgIT0g cHJldikNCgkJcmVzdWx0ID0gbmV4dDsNCg0KCXJldHVybiByZXN1bHQ7DQp9DQoNCnN0YXRpYyBp bmxpbmUgc3RydWN0IGNyeXB0b19yb3V0ZSAqY3J5cHRvX3JvdXRlX2N1cnJlbnQoc3RydWN0IGNy eXB0b19zZXNzaW9uICpzKQ0Kew0KCXN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlzdDsNCglz dHJ1Y3QgY3J5cHRvX3JvdXRlICpydCA9IE5VTEw7DQoNCglsaXN0ID0gJnMtPnJvdXRlX2xpc3Q7 DQoNCglpZiAobGlzdCkNCgl7DQoJCXNwaW5fbG9ja19iaCgmbGlzdC0+bG9jayk7DQoJCXJ0ID0g X19jcnlwdG9fcm91dGVfY3VycmVudChsaXN0KTsNCgkJc3Bpbl91bmxvY2tfYmgoJmxpc3QtPmxv Y2spOw0KCX0NCg0KCXJldHVybiBydDsNCn0NCg0Kc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRv X2RldmljZSAqY3J5cHRvX3JvdXRlX2dldF9jdXJyZW50X2RldmljZShzdHJ1Y3QgY3J5cHRvX3Nl c3Npb24gKnMpDQp7DQoJc3RydWN0IGNyeXB0b19yb3V0ZSAqcnQgPSBOVUxMOw0KCXN0cnVjdCBj cnlwdG9fZGV2aWNlICpkZXYgPSBOVUxMOw0KCXN0cnVjdCBjcnlwdG9fcm91dGVfaGVhZCAqbGlz dCA9ICZzLT5yb3V0ZV9saXN0Ow0KDQoJc3Bpbl9sb2NrX2JoKCZsaXN0LT5sb2NrKTsNCglydCA9 IF9fY3J5cHRvX3JvdXRlX2N1cnJlbnQobGlzdCk7DQoJaWYgKHJ0KQ0KCXsNCgkJZGV2ID0gcnQt PmRldjsNCgkJY3J5cHRvX2RldmljZV9nZXQoZGV2KTsNCgl9DQoJc3Bpbl91bmxvY2tfYmgoJmxp c3QtPmxvY2spOw0KCQ0KCXJldHVybiBkZXY7DQp9DQoNCiNlbmRpZiAvKiBfX0NSWVBUT19ST1VU RV9IICovDQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_stat.c Content-Type: text/x-csrc; name=crypto_stat.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fc3RhdC5jDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkg UG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0K ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4N CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5o Pg0KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2lu Y2x1ZGUgPGxpbnV4L3NsYWIuaD4NCiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCiNpbmNs dWRlIDxsaW51eC9zcGlubG9jay5oPg0KDQojaW5jbHVkZSAiYWNyeXB0by5oIg0KI2luY2x1ZGUg ImNyeXB0b19yb3V0ZS5oIg0KDQppbmxpbmUgdm9pZCBjcnlwdG9fc3RhdF9zdGFydF9pbmMoc3Ry dWN0IGNyeXB0b19zZXNzaW9uICpzKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXY7DQoN CglkZXYgPSBjcnlwdG9fcm91dGVfZ2V0X2N1cnJlbnRfZGV2aWNlKHMpOw0KCWlmIChkZXYpDQoJ ew0KCQlzcGluX2xvY2tfYmgoJmRldi0+c3RhdF9sb2NrKTsNCgkJZGV2LT5zdGF0LnNzdGFydGVk Kys7DQoJCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnN0YXRfbG9jayk7DQoNCgkJY3J5cHRvX2Rldmlj ZV9wdXQoZGV2KTsNCgl9DQp9DQoNCmlubGluZSB2b2lkIGNyeXB0b19zdGF0X2ZpbmlzaF9pbmMo c3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNlICpkZXY7 DQoNCglkZXYgPSBjcnlwdG9fcm91dGVfZ2V0X2N1cnJlbnRfZGV2aWNlKHMpOw0KCWlmIChkZXYp DQoJew0KCQlzcGluX2xvY2tfYmgoJmRldi0+c3RhdF9sb2NrKTsNCgkJZGV2LT5zdGF0LnNmaW5p c2hlZCsrOw0KCQlzcGluX3VubG9ja19iaCgmZGV2LT5zdGF0X2xvY2spOw0KDQoJCWNyeXB0b19k ZXZpY2VfcHV0KGRldik7DQoJfQ0KfQ0KDQppbmxpbmUgdm9pZCBjcnlwdG9fc3RhdF9jb21wbGV0 ZV9pbmMoc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKQ0Kew0KCXN0cnVjdCBjcnlwdG9fZGV2aWNl ICpkZXY7DQoNCglkZXYgPSBjcnlwdG9fcm91dGVfZ2V0X2N1cnJlbnRfZGV2aWNlKHMpOw0KCWlm IChkZXYpDQoJew0KCQlzcGluX2xvY2tfYmgoJmRldi0+c3RhdF9sb2NrKTsNCgkJZGV2LT5zdGF0 LnNjb21wbGV0ZWQrKzsNCgkJc3Bpbl91bmxvY2tfYmgoJmRldi0+c3RhdF9sb2NrKTsNCg0KCQlj cnlwdG9fZGV2aWNlX3B1dChkZXYpOw0KCX0NCn0NCg0KRVhQT1JUX1NZTUJPTChjcnlwdG9fc3Rh dF9zdGFydF9pbmMpOw0KRVhQT1JUX1NZTUJPTChjcnlwdG9fc3RhdF9maW5pc2hfaW5jKTsNCkVY UE9SVF9TWU1CT0woY3J5cHRvX3N0YXRfY29tcGxldGVfaW5jKTsNCg== --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=crypto_stat.h Content-Type: text/x-chdr; name=crypto_stat.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAljcnlwdG9fc3RhdC5oDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkg UG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0K ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9z dG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpZm5kZWYgX19DUllQVE9fU1RBVF9IDQoj ZGVmaW5lIF9fQ1JZUFRPX1NUQVRfSA0KDQojaW5jbHVkZSAiYWNyeXB0by5oIg0KDQppbmxpbmUg dm9pZCBjcnlwdG9fc3RhdF9zdGFydF9pbmMoc3RydWN0IGNyeXB0b19zZXNzaW9uICpzKTsNCmlu bGluZSB2b2lkIGNyeXB0b19zdGF0X2ZpbmlzaF9pbmMoc3RydWN0IGNyeXB0b19zZXNzaW9uICpz KTsNCmlubGluZSB2b2lkIGNyeXB0b19zdGF0X2NvbXBsZXRlX2luYyhzdHJ1Y3QgY3J5cHRvX3Nl c3Npb24gKnMpOw0KDQojZW5kaWYgLyogX19DUllQVE9fU1RBVF9IICovDQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=Makefile Content-Type: text/x-makefile; name=Makefile; charset=KOI8-R Content-Transfer-Encoding: base64 VE9QRElSCTo9ICQoUFdEKQ0KI0tESVIJOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIp L2J1aWxkDQpLRElSCTo9IC91c3IvbG9jYWwvc3JjL2xpbnV4LTIuNi9saW51eC0yLjYNClBXRAk6 PSAkKHNoZWxsIHB3ZCkNCiNDQwk6PSAvdG1wL3NwYXJzZS1iay9jZ2NjDQpDQwk6PSBnY2MNCg0K DQpvYmotbQkJKz0gYWNyeXB0by5vIHNpbXBsZV9sYi5vIA0Kb2JqLW0JCSs9IGNvbnN1bWVyLm8g DQojc2xvd19jb25zdW1lci5vDQpvYmotbQkJKz0gcHJvdmlkZXIubyBzbG93X3Byb3ZpZGVyLm8g c2hhMV9wcm92aWRlci5vDQphY3J5cHRvLW9ianMJOj0gY3J5cHRvX21haW4ubyBjcnlwdG9fbGIu byBjcnlwdG9fZGV2Lm8gY3J5cHRvX2Nvbm4ubyBjcnlwdG9fc3RhdC5vDQoNCm9iai1tCQkrPSB2 aWEtcGFkbG9jay8NCg0KZGVmYXVsdDoNCgkkKE1BS0UpIC1DICQoS0RJUikgU1VCRElSUz0kKFBX RCkgbW9kdWxlcw0KDQpjbGVhbjoNCglybSAtZiAqLm8gKi5rbyAqLm1vZC4qIC4qLmNtZCAqfiAu Ki5kDQoJcm0gLXJmIC50bXBfdmVyc2lvbnMNCgljZCB2aWEtcGFkbG9jayAmJiBtYWtlIGNsZWFu DQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=provider.c Content-Type: text/x-csrc; name=provider.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAlwcm92aWRlci5jDQogKg0KICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9s eWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiANCiAqDQogKiBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICog aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl DQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9u LCBNQSAwMjExMS0xMzA3IFVTQQ0KICovDQoNCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCiNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPg0K I2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4NCiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCiNpbmNsdWRl IDxsaW51eC9zcGlubG9jay5oPg0KI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPg0KI2luY2x1 ZGUgPGxpbnV4L2Vyci5oPg0KDQojaW5jbHVkZSAiYWNyeXB0by5oIg0KI2luY2x1ZGUgImNyeXB0 b19zdGF0LmgiDQoNCnN0YXRpYyBpbnQgcHJvdl9kYXRhX3JlYWR5X3JlZW50cnk7DQpzdGF0aWMg dm9pZCBwcm92X2RhdGFfcmVhZHkoc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldik7DQoNCnN0YXRp YyBzdHJ1Y3QgY3J5cHRvX2NhcGFiaWxpdHkgcHJvdl9jYXBzW10gPSAJew0KCQl7MCwgMCwgMCwg MTAwMH0sIHsxLCAxLCAxLCAxMDAwfSwgezIsIDIsIDIsIDEwMDB9fTsNCnN0YXRpYyBpbnQgcHJv dl9jYXBfbnVtYmVyID0gc2l6ZW9mKHByb3ZfY2Fwcykvc2l6ZW9mKHByb3ZfY2Fwc1swXSk7DQoN CnN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2RldmljZSBwZGV2ID0NCnsNCgkubmFtZQkJCT0gInRlc3Rf cHJvdmlkZXIiLA0KCS5kYXRhX3JlYWR5CQk9IHByb3ZfZGF0YV9yZWFkeSwNCgkuY2FwCQkJPSAm cHJvdl9jYXBzWzBdLA0KfTsNCg0Kc3RhdGljIHZvaWQgcHJvdl9kYXRhX3JlYWR5KHN0cnVjdCBj cnlwdG9fZGV2aWNlICpkZXYpDQp7DQoJc3RydWN0IGNyeXB0b19zZXNzaW9uICpzLCAqbjsNCg0K CWlmIChwcm92X2RhdGFfcmVhZHlfcmVlbnRyeSkNCgkJcmV0dXJuOw0KDQoJcHJvdl9kYXRhX3Jl YWR5X3JlZW50cnkrKzsNCgkvL3NwaW5fbG9ja19iaCgmZGV2LT5zZXNzaW9uX2xvY2spOw0KCWxp c3RfZm9yX2VhY2hfZW50cnlfc2FmZShzLCBuLCAmZGV2LT5zZXNzaW9uX2xpc3QsIGRldl9xdWV1 ZV9lbnRyeSkNCgl7DQoJCWlmICghc2Vzc2lvbl9jb21wbGV0ZWQocykpDQoJCXsNCgkJCWRwcmlu dGsoIkNvbXBsZXRpbmcgc2Vzc2lvbiAlbGx1IFslbGx1XSBpbiAlcy5cbiIsIA0KCQkJCQlzLT5j aS5pZCwgcy0+Y2kuZGV2X2lkLCBwZGV2Lm5hbWUpOw0KCQkJY3J5cHRvX3N0YXRfY29tcGxldGVf aW5jKHMpOw0KCQkJY29tcGxldGVfc2Vzc2lvbihzKTsNCgkJfQ0KCX0NCgkvL3NwaW5fdW5sb2Nr X2JoKCZkZXYtPnNlc3Npb25fbG9jayk7DQoJcHJvdl9kYXRhX3JlYWR5X3JlZW50cnktLTsNCn0N Cg0KaW50IHByb3ZfaW5pdCh2b2lkKQ0Kew0KCWludCBlcnI7DQoNCglwZGV2LmNhcF9udW1iZXIg PSBwcm92X2NhcF9udW1iZXI7DQoNCgllcnIgPSBjcnlwdG9fZGV2aWNlX2FkZCgmcGRldik7DQoJ aWYgKGVycikNCgkJcmV0dXJuIGVycjsNCg0KCWRwcmludGsoS0VSTl9JTkZPICJUZXN0IGNyeXB0 byBwcm92aWRlciBtb2R1bGUgJXMgaXMgbG9hZGVkLlxuIiwgcGRldi5uYW1lKTsNCg0KCXJldHVy biAwOw0KfQ0KDQp2b2lkIHByb3ZfZmluaSh2b2lkKQ0Kew0KCWNyeXB0b19kZXZpY2VfcmVtb3Zl KCZwZGV2KTsNCgkNCglkcHJpbnRrKEtFUk5fSU5GTyAiVGVzdCBjcnlwdG8gcHJvdmlkZXIgbW9k dWxlICVzIGlzIHVubG9hZGVkLlxuIiwgcGRldi5uYW1lKTsNCn0NCg0KbW9kdWxlX2luaXQocHJv dl9pbml0KTsNCm1vZHVsZV9leGl0KHByb3ZfZmluaSk7DQoNCk1PRFVMRV9MSUNFTlNFKCJHUEwi KTsNCk1PRFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+ Iik7DQpNT0RVTEVfREVTQ1JJUFRJT04oIlRlc3QgY3J5cHRvIG1vZHVsZSBwcm92aWRlci4iKTsN Cg== --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=sha1_provider.c Content-Type: text/x-csrc; name=sha1_provider.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAlzaGExX3Byb3ZpZGVyLmMNCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXZnZW5p eSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4NCiAqIA0KICoNCiAqIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 DQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieQ0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxh dGVyIHZlcnNpb24uDQogKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICogTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KICogR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0K ICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m dHdhcmUNCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBC b3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQogKi8NCg0KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o Pg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFt Lmg+DQojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+DQoj aW5jbHVkZSA8bGludXgvc2xhYi5oPg0KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPg0KI2lu Y2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQojaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+DQoj aW5jbHVkZSA8bGludXgvZXJyLmg+DQojaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+DQojaW5jbHVk ZSA8bGludXgvbW0uaD4NCg0KI2luY2x1ZGUgImFjcnlwdG8uaCINCiNpbmNsdWRlICJjcnlwdG9f c3RhdC5oIg0KDQpzdGF0aWMgdm9pZCBwcm92X2RhdGFfcmVhZHkoc3RydWN0IGNyeXB0b19kZXZp Y2UgKmRldik7DQoNCnN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2NhcGFiaWxpdHkgcHJvdl9jYXBzW10g PSAJew0KCQl7MywgMywgMywgMTAwfQ0KfTsNCnN0YXRpYyBpbnQgcHJvdl9jYXBfbnVtYmVyID0g c2l6ZW9mKHByb3ZfY2Fwcykvc2l6ZW9mKHByb3ZfY2Fwc1swXSk7DQoNCnN0YXRpYyBzdHJ1Y3Qg Y29tcGxldGlvbiB0aHJlYWRfZXhpdGVkOw0Kc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFE KHNoYTFfd2FpdF9xdWV1ZSk7DQpzdGF0aWMgaW50IG5lZWRfZXhpdDsNCnN0YXRpYyBzdHJ1Y3Qg Y3J5cHRvX3Nlc3Npb24gKnNwOw0Kc3RhdGljIHN0cnVjdCBjcnlwdG9fdGZtICp0Zm07DQoNCnN0 YXRpYyBzdHJ1Y3QgY3J5cHRvX2RldmljZSBwZGV2ID0NCnsNCgkubmFtZQkJCT0gInNoYTFfcHJv dmlkZXIiLA0KCS5kYXRhX3JlYWR5CQk9IHByb3ZfZGF0YV9yZWFkeSwNCgkuY2FwCQkJPSAmcHJv dl9jYXBzWzBdLA0KfTsNCg0Kc3RhdGljIHZvaWQgcHJvdl9kYXRhX3JlYWR5KHN0cnVjdCBjcnlw dG9fZGV2aWNlICpkZXYpDQp7DQoJc3RydWN0IGNyeXB0b19zZXNzaW9uICpzLCAqbjsNCg0KCWlm ICghc3Bpbl90cnlsb2NrX2JoKCZkZXYtPnNlc3Npb25fbG9jaykpDQoJCXJldHVybjsNCg0KCWxp c3RfZm9yX2VhY2hfZW50cnlfc2FmZShzLCBuLCAmZGV2LT5zZXNzaW9uX2xpc3QsIGRldl9xdWV1 ZV9lbnRyeSkNCgl7DQoJCWlmICghc2Vzc2lvbl9jb21wbGV0ZWQocykpDQoJCXsNCgkJCXNwID0g czsNCgkJCXdha2VfdXAoJnNoYTFfd2FpdF9xdWV1ZSk7DQoJCQlicmVhazsNCgkJfQ0KCX0NCglz cGluX3VubG9ja19iaCgmZGV2LT5zZXNzaW9uX2xvY2spOw0KfQ0KDQpzdGF0aWMgaW50IHNoYTFf dGhyZWFkKHZvaWQgKmRhdGEpDQp7DQoJc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldiA9IChzdHJ1 Y3QgY3J5cHRvX2RldmljZSAqKWRhdGE7DQoJdTggKmtleSwgKm91dDsNCgl1bnNpZ25lZCBpbnQg a2V5bGVuOw0KCQ0KCWRhZW1vbml6ZSgiJXMiLCBkZXYtPm5hbWUpOw0KCWFsbG93X3NpZ25hbChT SUdURVJNKTsNCg0KCXdoaWxlICghbmVlZF9leGl0KQ0KCXsNCgkJaW50ZXJydXB0aWJsZV9zbGVl cF9vbigmc2hhMV93YWl0X3F1ZXVlKTsNCg0KCQlpZiAobmVlZF9leGl0KQ0KCQkJYnJlYWs7DQoJ CWlmICghc3ApDQoJCQljb250aW51ZTsNCg0KCQlzdGFydF9wcm9jZXNzX3Nlc3Npb24oc3ApOw0K DQoJCWtleSA9ICgodTggKilwYWdlX2FkZHJlc3Moc3AtPmRhdGEuc2dfa2V5LnBhZ2UpKSArIHNw LT5kYXRhLnNnX2tleS5vZmZzZXQ7DQoJCWtleWxlbiA9IHNwLT5kYXRhLnNnX2tleS5sZW5ndGg7 DQoJCW91dCA9ICgodTggKilwYWdlX2FkZHJlc3Moc3AtPmRhdGEuc2dfZHN0LnBhZ2UpKSArIHNw LT5kYXRhLnNnX2RzdC5vZmZzZXQ7DQoNCgkJY3J5cHRvX2htYWModGZtLCBrZXksICZrZXlsZW4s ICZzcC0+ZGF0YS5zZ19zcmMsIHNwLT5kYXRhLnNnX3NyY19udW0sIG91dCk7DQoJCXNwLT5kYXRh LnNnX2RzdC5sZW5ndGggPSAyMDsNCgkJCQ0KCQlkcHJpbnRrKCJDb21wbGV0aW5nIHNlc3Npb24g JWxsdSBbJWxsdV0gaW4gJXMuXG4iLCANCgkJCQlzcC0+Y2kuaWQsIHNwLT5jaS5kZXZfaWQsIHBk ZXYubmFtZSk7DQoNCgkJY3J5cHRvX3N0YXRfY29tcGxldGVfaW5jKHNwKTsNCgkJY29tcGxldGVf c2Vzc2lvbihzcCk7DQoJCXN0b3BfcHJvY2Vzc19zZXNzaW9uKHNwKTsNCg0KCQlwcm92X2RhdGFf cmVhZHkoZGV2KTsNCgkJDQoJCXNwID0gTlVMTDsNCgl9DQoJDQoJY29tcGxldGVfYW5kX2V4aXQo JnRocmVhZF9leGl0ZWQsIDApOw0KfQ0KDQppbnQgcHJvdl9pbml0KHZvaWQpDQp7DQoJaW50IGVy ciwgcGlkOw0KDQoJdGZtID0gY3J5cHRvX2FsbG9jX3RmbSgic2hhMSIsIDApOw0KCWlmICghdGZt KQ0KCXsNCgkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgU0hBMSB0Zm0uXG4i KTsNCgkJcmV0dXJuIC1FSU5WQUw7DQoJfQ0KCQ0KCWluaXRfY29tcGxldGlvbigmdGhyZWFkX2V4 aXRlZCk7DQoJcGlkID0ga2VybmVsX3RocmVhZChzaGExX3RocmVhZCwgJnBkZXYsIENMT05FX0ZT IHwgQ0xPTkVfRklMRVMpOw0KCWlmIChJU19FUlIoKHZvaWQgKilwaWQpKQ0KCXsNCgkJZXJyID0g LUVJTlZBTDsNCgkJZHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWwgbG9h ZCBiYWxhbmNpbmcgdGhyZWFkLlxuIik7DQoJCWdvdG8gZXJyX291dF9mcmVlX3RmbTsNCgl9DQoJ DQoJcGRldi5jYXBfbnVtYmVyID0gcHJvdl9jYXBfbnVtYmVyOw0KDQoJZXJyID0gY3J5cHRvX2Rl dmljZV9hZGQoJnBkZXYpOw0KCWlmIChlcnIpDQoJCWdvdG8gZXJyX291dF9yZW1vdmVfdGhyZWFk Ow0KDQoJZHByaW50ayhLRVJOX0lORk8gIlRlc3QgY3J5cHRvIHByb3ZpZGVyIG1vZHVsZSAlcyBp cyBsb2FkZWQuXG4iLCBwZGV2Lm5hbWUpOw0KDQoJcmV0dXJuIDA7DQoNCmVycl9vdXRfcmVtb3Zl X3RocmVhZDoNCgluZWVkX2V4aXQgPSAxOw0KCXdha2VfdXAoJnNoYTFfd2FpdF9xdWV1ZSk7DQoJ d2FpdF9mb3JfY29tcGxldGlvbigmdGhyZWFkX2V4aXRlZCk7DQplcnJfb3V0X2ZyZWVfdGZtOg0K CWNyeXB0b19mcmVlX3RmbSh0Zm0pOw0KDQoJcmV0dXJuIGVycjsNCn0NCg0Kdm9pZCBwcm92X2Zp bmkodm9pZCkNCnsNCgluZWVkX2V4aXQgPSAxOw0KCXdha2VfdXAoJnNoYTFfd2FpdF9xdWV1ZSk7 DQoJd2FpdF9mb3JfY29tcGxldGlvbigmdGhyZWFkX2V4aXRlZCk7DQoNCgljcnlwdG9fZGV2aWNl X3JlbW92ZSgmcGRldik7DQoJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7DQoJDQoJZHByaW50ayhLRVJO X0lORk8gIlRlc3QgY3J5cHRvIHByb3ZpZGVyIG1vZHVsZSAlcyBpcyB1bmxvYWRlZC5cbiIsIHBk ZXYubmFtZSk7DQp9DQoNCm1vZHVsZV9pbml0KHByb3ZfaW5pdCk7DQptb2R1bGVfZXhpdChwcm92 X2ZpbmkpOw0KDQpNT0RVTEVfTElDRU5TRSgiR1BMIik7DQpNT0RVTEVfQVVUSE9SKCJFdmdlbml5 IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PiIpOw0KTU9EVUxFX0RFU0NSSVBUSU9OKCJU ZXN0IGNyeXB0byBtb2R1bGUgcHJvdmlkZXIuIik7DQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=simple_lb.c Content-Type: text/x-csrc; name=simple_lb.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIAlzaW1wbGVfbGIuYw0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBv bHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1Pg0KICogDQogKg0KICogVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5DQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4NCiAqDQogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQogKiBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQogKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoNCiAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQ0KICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3Rv biwgTUEgMDIxMTEtMTMwNyBVU0ENCiAqLw0KDQojaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQoj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4N CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4NCiNpbmNs dWRlIDxsaW51eC9zbGFiLmg+DQojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCg0KI2luY2x1 ZGUgImNyeXB0b19sYi5oIg0KDQpzdGF0aWMgdm9pZCBzaW1wbGVfbGJfcmVoYXNoKHN0cnVjdCBj cnlwdG9fbGIgKik7DQpzdGF0aWMgc3RydWN0IGNyeXB0b19kZXZpY2UgKnNpbXBsZV9sYl9maW5k X2RldmljZShzdHJ1Y3QgY3J5cHRvX2xiICosIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFs aXplciAqKTsNCg0Kc3RydWN0IGNyeXB0b19sYiBzaW1wbGVfbGIgPSANCnsNCgkubmFtZQkJPSAi c2ltcGxlX2xiIiwNCgkucmVoYXNoCQk9IHNpbXBsZV9sYl9yZWhhc2gsDQoJLmZpbmRfZGV2aWNl CT0gc2ltcGxlX2xiX2ZpbmRfZGV2aWNlDQp9Ow0KDQpzdGF0aWMgdm9pZCBzaW1wbGVfbGJfcmVo YXNoKHN0cnVjdCBjcnlwdG9fbGIgKmxiKQ0Kew0KCUJVR19PTighbGItPmNyeXB0b19kZXZpY2Vf bGlzdCk7DQoJQlVHX09OKCFsYi0+Y3J5cHRvX2RldmljZV9sb2NrKTsNCn0NCg0Kc3RhdGljIHN0 cnVjdCBjcnlwdG9fZGV2aWNlICpzaW1wbGVfbGJfZmluZF9kZXZpY2Uoc3RydWN0IGNyeXB0b19s YiAqbGIsIHN0cnVjdCBjcnlwdG9fc2Vzc2lvbl9pbml0aWFsaXplciAqY2kpDQp7DQoJc3RydWN0 IGNyeXB0b19kZXZpY2UgKmRldiwgKl9fZGV2Ow0KCWludCBtaW4gPSAweDdmZmZmZmY7DQoNCglf X2RldiA9IE5VTEw7DQoJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsIGxiLT5jcnlwdG9fZGV2aWNl X2xpc3QsIGNkZXZfZW50cnkpDQoJew0KCQlpZiAoZGV2aWNlX2Jyb2tlbihkZXYpKQ0KCQkJY29u dGludWU7DQoJCWlmICghbWF0Y2hfaW5pdGlhbGl6ZXIoZGV2LCBjaSkpDQoJCQljb250aW51ZTsN Cg0KCQlpZiAoYXRvbWljX3JlYWQoJmRldi0+cmVmY250KSA8IG1pbikNCgkJew0KCQkJbWluID0g YXRvbWljX3JlYWQoJmRldi0+cmVmY250KTsNCgkJCV9fZGV2ID0gZGV2Ow0KCQl9DQoJfQ0KDQoJ cmV0dXJuIF9fZGV2Ow0KfQ0KDQppbnQgX19kZXZpbml0IHNpbXBsZV9sYl9pbml0KHZvaWQpDQp7 DQoJZHByaW50ayhLRVJOX0lORk8gIlJlZ2lzdGVyaW5nIHNpbXBsZSBjcnlwdG8gbG9hZCBiYWxh bmNlci5cbiIpOw0KDQoJcmV0dXJuIGNyeXB0b19sYl9yZWdpc3Rlcigmc2ltcGxlX2xiLCAxLCAx KTsNCn0NCg0Kdm9pZCBfX2RldmV4aXQgc2ltcGxlX2xiX2Zpbmkodm9pZCkNCnsNCglkcHJpbnRr KEtFUk5fSU5GTyAiVW5yZWdpc3RlcmluZyBzaW1wbGUgY3J5cHRvIGxvYWQgYmFsYW5jZXIuXG4i KTsNCg0KCWNyeXB0b19sYl91bnJlZ2lzdGVyKCZzaW1wbGVfbGIpOw0KfQ0KDQptb2R1bGVfaW5p dChzaW1wbGVfbGJfaW5pdCk7DQptb2R1bGVfZXhpdChzaW1wbGVfbGJfZmluaSk7DQoNCk1PRFVM RV9MSUNFTlNFKCJHUEwiKTsNCk1PRFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPGpvaG5w b2xAMmthLm1pcHQucnU+Iik7DQpNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBjcnlwdG8gbG9h ZCBiYWxhbmNlci4iKTsNCg== --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=Makefile Content-Type: text/x-makefile; name=Makefile; charset=KOI8-R Content-Transfer-Encoding: base64 b2JqLW0JCSs9IHBhZGxvY2subw0KcGFkbG9jay1vYmpzCTo9IHBhZGxvY2stYWVzLm8gcGFkbG9j ay1nZW5lcmljLm8NCg0KY2xlYW46DQoJcm0gLWYgKi5vICoua28gKi5tb2QuKiAuKi5jbWQgKn4N CglybSAtcmYgLnRtcF92ZXJzaW9ucw0K --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=padlock-aes.c Content-Type: text/x-csrc; name=padlock-aes.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyogDQogKiBDcnlwdG9ncmFwaGljIEFQSS4NCiAqDQogKiBTdXBwb3J0IGZvciBWSUEgUGFkTG9j ayBoYXJkd2FyZSBjcnlwdG8gZW5naW5lLg0KICoNCiAqIExpbnV4IGRldmVsb3BlcnM6DQogKiAg TWljaGFsIEx1ZHZpZyA8bWx1ZHZpZ0BzdXNlLmN6Pg0KICoNCiAqIEtleSBleHBhbnNpb24gcm91 dGluZSB0YWtlbiBmcm9tIGNyeXB0by9hZXMuYw0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQogKiBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp c2hlZCBieQ0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g MiBvZiB0aGUgTGljZW5zZSwgb3INCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uDQogKg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMDIsIERy IEJyaWFuIEdsYWRtYW4gPGJyZ0BnbGFkbWFuLm1lLnVrPiwgV29yY2VzdGVyLCBVSy4NCiAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogTElDRU5TRSBURVJNUw0KICoNCiAqIFRoZSBmcmVl IGRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gYm90aCBzb3VyY2UgYW5k IGJpbmFyeQ0KICogZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJv dmlkZWQgdGhhdDoNCiAqDQogKiAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29k ZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCiAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qg b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOw0KICoNCiAqICAgMi4g ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQN CiAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZyBkaXNjbGFpbWVyDQogKiAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBh c3NvY2lhdGVkIG1hdGVyaWFsczsNCiAqDQogKiAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3Mg bmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzDQogKiAgICAgIGJ1aWx0IHVzaW5n IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0K ICogQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBp biBmdWxsLCB0aGlzIHByb2R1Y3QNCiAqIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLA0KICogaW4gd2hpY2gg Y2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2 ZW4gYWJvdmUuDQogKg0KICogRElTQ0xBSU1FUg0KICoNCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJv dmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcw0KICog aW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQg dG8sIGNvcnJlY3RuZXNzDQogKiBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4NCiAqIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KICovDQoNCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRl IDxsaW51eC9pbml0Lmg+DQojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCiNpbmNsdWRlIDxsaW51 eC9lcnJuby5oPg0KI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPg0KI2luY2x1ZGUgPGFzbS9ieXRl b3JkZXIuaD4NCiNpbmNsdWRlIDxsaW51eC9tbS5oPg0KDQojaW5jbHVkZSA8YXNtL3NjYXR0ZXJs aXN0Lmg+DQoNCiNpbmNsdWRlICJwYWRsb2NrLmgiDQoNCiNpbmNsdWRlICIuLi9jcnlwdG9fZGVm LmgiDQojaW5jbHVkZSAiLi4vYWNyeXB0by5oIg0KI2luY2x1ZGUgIi4uL2NyeXB0b19zdGF0Lmgi DQoNCnN0YXRpYyBpbmxpbmUgaW50IGFlc19od19leHRrZXlfYXZhaWxhYmxlICh1OCBrZXlfbGVu KTsNCg0Kc3RhdGljIGlubGluZSANCnUzMiBnZW5lcmljX3JvdHIzMiAoY29uc3QgdTMyIHgsIGNv bnN0IHVuc2lnbmVkIGJpdHMpDQp7DQoJY29uc3QgdW5zaWduZWQgbiA9IGJpdHMgJSAzMjsNCgly ZXR1cm4gKHggPj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7DQp9DQoNCnN0YXRpYyBpbmxpbmUgDQp1 MzIgZ2VuZXJpY19yb3RsMzIgKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBiaXRzKQ0Kew0K CWNvbnN0IHVuc2lnbmVkIG4gPSBiaXRzICUgMzI7DQoJcmV0dXJuICh4IDw8IG4pIHwgKHggPj4g KDMyIC0gbikpOw0KfQ0KDQojZGVmaW5lIHJvdGwgZ2VuZXJpY19yb3RsMzINCiNkZWZpbmUgcm90 ciBnZW5lcmljX3JvdHIzMg0KDQovKg0KICogI2RlZmluZSBieXRlKHgsIG5yKSAoKHVuc2lnbmVk IGNoYXIpKCh4KSA+PiAobnIqOCkpKSANCiAqLw0KaW5saW5lIHN0YXRpYyB1OA0KYnl0ZShjb25z dCB1MzIgeCwgY29uc3QgdW5zaWduZWQgbikNCnsNCglyZXR1cm4geCA+PiAobiA8PCAzKTsNCn0N Cg0KI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpDQojZGVm aW5lIHUzMl9vdXQodG8sIGZyb20pICgqKHUzMiAqKSh0bykgPSBjcHVfdG9fbGUzMihmcm9tKSkN Cg0Kc3RhdGljIHU4IHBvd190YWJbMjU2XTsNCnN0YXRpYyB1OCBsb2dfdGFiWzI1Nl07DQpzdGF0 aWMgdTggc2J4X3RhYlsyNTZdOw0Kc3RhdGljIHU4IGlzYl90YWJbMjU2XTsNCnN0YXRpYyB1MzIg cmNvX3RhYlsxMF07DQpzdGF0aWMgdTMyIGZ0X3RhYls0XVsyNTZdOw0Kc3RhdGljIHUzMiBpdF90 YWJbNF1bMjU2XTsNCg0Kc3RhdGljIHUzMiBmbF90YWJbNF1bMjU2XTsNCnN0YXRpYyB1MzIgaWxf dGFiWzRdWzI1Nl07DQoNCnN0YXRpYyBpbmxpbmUgdTgNCmZfbXVsdCAodTggYSwgdTggYikNCnsN Cgl1OCBhYSA9IGxvZ190YWJbYV0sIGNjID0gYWEgKyBsb2dfdGFiW2JdOw0KDQoJcmV0dXJuIHBv d190YWJbY2MgKyAoY2MgPCBhYSA/IDEgOiAwKV07DQp9DQoNCiNkZWZpbmUgZmZfbXVsdChhLGIp ICAgIChhICYmIGIgPyBmX211bHQoYSwgYikgOiAwKQ0KDQojZGVmaW5lIGZfcm4oYm8sIGJpLCBu LCBrKQkJCQkJXA0KICAgIGJvW25dID0gIGZ0X3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwN CiAgICAgICAgICAgICBmdF90YWJbMV1bYnl0ZShiaVsobiArIDEpICYgM10sMSldIF4JCVwNCiAg ICAgICAgICAgICBmdF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwNCiAgICAg ICAgICAgICBmdF90YWJbM11bYnl0ZShiaVsobiArIDMpICYgM10sMyldIF4gKihrICsgbikNCg0K I2RlZmluZSBpX3JuKGJvLCBiaSwgbiwgaykJCQkJCVwNCiAgICBib1tuXSA9ICBpdF90YWJbMF1b Ynl0ZShiaVtuXSwwKV0gXgkJCQlcDQogICAgICAgICAgICAgaXRfdGFiWzFdW2J5dGUoYmlbKG4g KyAzKSAmIDNdLDEpXSBeCQlcDQogICAgICAgICAgICAgaXRfdGFiWzJdW2J5dGUoYmlbKG4gKyAy KSAmIDNdLDIpXSBeCQlcDQogICAgICAgICAgICAgaXRfdGFiWzNdW2J5dGUoYmlbKG4gKyAxKSAm IDNdLDMpXSBeICooayArIG4pDQoNCiNkZWZpbmUgbHNfYm94KHgpCQkJCVwNCiAgICAoIGZsX3Rh YlswXVtieXRlKHgsIDApXSBeCQkJXA0KICAgICAgZmxfdGFiWzFdW2J5dGUoeCwgMSldIF4JCQlc DQogICAgICBmbF90YWJbMl1bYnl0ZSh4LCAyKV0gXgkJCVwNCiAgICAgIGZsX3RhYlszXVtieXRl KHgsIDMpXSApDQoNCiNkZWZpbmUgZl9ybChibywgYmksIG4sIGspCQkJCQlcDQogICAgYm9bbl0g PSAgZmxfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXA0KICAgICAgICAgICAgIGZsX3RhYlsx XVtieXRlKGJpWyhuICsgMSkgJiAzXSwxKV0gXgkJXA0KICAgICAgICAgICAgIGZsX3RhYlsyXVti eXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXA0KICAgICAgICAgICAgIGZsX3RhYlszXVtieXRl KGJpWyhuICsgMykgJiAzXSwzKV0gXiAqKGsgKyBuKQ0KDQojZGVmaW5lIGlfcmwoYm8sIGJpLCBu LCBrKQkJCQkJXA0KICAgIGJvW25dID0gIGlsX3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwN CiAgICAgICAgICAgICBpbF90YWJbMV1bYnl0ZShiaVsobiArIDMpICYgM10sMSldIF4JCVwNCiAg ICAgICAgICAgICBpbF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwNCiAgICAg ICAgICAgICBpbF90YWJbM11bYnl0ZShiaVsobiArIDEpICYgM10sMyldIF4gKihrICsgbikNCg0K c3RhdGljIHZvaWQNCmdlbl90YWJzICh2b2lkKQ0Kew0KCXUzMiBpLCB0Ow0KCXU4IHAsIHE7DQoN CgkvKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMioqOCkgZmluaXRlIGZpZWxkIHdpdGgN CgkgICAweDAxMWIgYXMgbW9kdWxhciBwb2x5bm9taWFsIC0gdGhlIHNpbXBsZXN0IHBybWl0aXZl DQoJICAgcm9vdCBpcyAweDAzLCB1c2VkIGhlcmUgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlcyAqLw0K DQoJZm9yIChpID0gMCwgcCA9IDE7IGkgPCAyNTY7ICsraSkgew0KCQlwb3dfdGFiW2ldID0gKHU4 KSBwOw0KCQlsb2dfdGFiW3BdID0gKHU4KSBpOw0KDQoJCXAgXj0gKHAgPDwgMSkgXiAocCAmIDB4 ODAgPyAweDAxYiA6IDApOw0KCX0NCg0KCWxvZ190YWJbMV0gPSAwOw0KDQoJZm9yIChpID0gMCwg cCA9IDE7IGkgPCAxMDsgKytpKSB7DQoJCXJjb190YWJbaV0gPSBwOw0KDQoJCXAgPSAocCA8PCAx KSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7DQoJfQ0KDQoJZm9yIChpID0gMDsgaSA8IDI1Njsg KytpKSB7DQoJCXAgPSAoaSA/IHBvd190YWJbMjU1IC0gbG9nX3RhYltpXV0gOiAwKTsNCgkJcSA9 ICgocCA+PiA3KSB8IChwIDw8IDEpKSBeICgocCA+PiA2KSB8IChwIDw8IDIpKTsNCgkJcCBePSAw eDYzIF4gcSBeICgocSA+PiA2KSB8IChxIDw8IDIpKTsNCgkJc2J4X3RhYltpXSA9IHA7DQoJCWlz Yl90YWJbcF0gPSAodTgpIGk7DQoJfQ0KDQoJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7DQoJ CXAgPSBzYnhfdGFiW2ldOw0KDQoJCXQgPSBwOw0KCQlmbF90YWJbMF1baV0gPSB0Ow0KCQlmbF90 YWJbMV1baV0gPSByb3RsICh0LCA4KTsNCgkJZmxfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOw0K CQlmbF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7DQoNCgkJdCA9ICgodTMyKSBmZl9tdWx0ICgy LCBwKSkgfA0KCQkgICAgKCh1MzIpIHAgPDwgOCkgfA0KCQkgICAgKCh1MzIpIHAgPDwgMTYpIHwg KCh1MzIpIGZmX211bHQgKDMsIHApIDw8IDI0KTsNCg0KCQlmdF90YWJbMF1baV0gPSB0Ow0KCQlm dF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsNCgkJZnRfdGFiWzJdW2ldID0gcm90bCAodCwgMTYp Ow0KCQlmdF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7DQoNCgkJcCA9IGlzYl90YWJbaV07DQoN CgkJdCA9IHA7DQoJCWlsX3RhYlswXVtpXSA9IHQ7DQoJCWlsX3RhYlsxXVtpXSA9IHJvdGwgKHQs IDgpOw0KCQlpbF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7DQoJCWlsX3RhYlszXVtpXSA9IHJv dGwgKHQsIDI0KTsNCg0KCQl0ID0gKCh1MzIpIGZmX211bHQgKDE0LCBwKSkgfA0KCQkgICAgKCh1 MzIpIGZmX211bHQgKDksIHApIDw8IDgpIHwNCgkJICAgICgodTMyKSBmZl9tdWx0ICgxMywgcCkg PDwgMTYpIHwNCgkJICAgICgodTMyKSBmZl9tdWx0ICgxMSwgcCkgPDwgMjQpOw0KDQoJCWl0X3Rh YlswXVtpXSA9IHQ7DQoJCWl0X3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOw0KCQlpdF90YWJbMl1b aV0gPSByb3RsICh0LCAxNik7DQoJCWl0X3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsNCgl9DQp9 DQoNCiNkZWZpbmUgc3Rhcl94KHgpICgoKHgpICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXiAoKCgoeCkg JiAweDgwODA4MDgwKSA+PiA3KSAqIDB4MWIpDQoNCiNkZWZpbmUgaW1peF9jb2woeSx4KSAgICAg ICBcDQogICAgdSAgID0gc3Rhcl94KHgpOyAgICAgICAgXA0KICAgIHYgICA9IHN0YXJfeCh1KTsg ICAgICAgIFwNCiAgICB3ICAgPSBzdGFyX3godik7ICAgICAgICBcDQogICAgdCAgID0gdyBeICh4 KTsgICAgICAgICAgXA0KICAgKHkpICA9IHUgXiB2IF4gdzsgICAgICAgIFwNCiAgICh5KSBePSBy b3RyKHUgXiB0LCAgOCkgXiBcDQogICAgICAgICAgcm90cih2IF4gdCwgMTYpIF4gXA0KICAgICAg ICAgIHJvdHIodCwyNCkNCg0KLyogaW5pdGlhbGlzZSB0aGUga2V5IHNjaGVkdWxlIGZyb20gdGhl IHVzZXIgc3VwcGxpZWQga2V5ICovDQoNCiNkZWZpbmUgbG9vcDQoaSkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcDQp7ICAgdCA9IHJvdHIodCwgIDgpOyB0ID0gbHNfYm94KHQp IF4gcmNvX3RhYltpXTsgICAgXA0KICAgIHQgXj0gRV9LRVlbNCAqIGldOyAgICAgRV9LRVlbNCAq IGkgKyA0XSA9IHQ7ICAgIFwNCiAgICB0IF49IEVfS0VZWzQgKiBpICsgMV07IEVfS0VZWzQgKiBp ICsgNV0gPSB0OyAgICBcDQogICAgdCBePSBFX0tFWVs0ICogaSArIDJdOyBFX0tFWVs0ICogaSAr IDZdID0gdDsgICAgXA0KICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAzXTsgRV9LRVlbNCAqIGkgKyA3 XSA9IHQ7ICAgIFwNCn0NCg0KI2RlZmluZSBsb29wNihpKSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwNCnsgICB0ID0gcm90cih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29f dGFiW2ldOyAgICBcDQogICAgdCBePSBFX0tFWVs2ICogaV07ICAgICBFX0tFWVs2ICogaSArIDZd ID0gdDsgICAgXA0KICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAxXTsgRV9LRVlbNiAqIGkgKyA3XSA9 IHQ7ICAgIFwNCiAgICB0IF49IEVfS0VZWzYgKiBpICsgMl07IEVfS0VZWzYgKiBpICsgOF0gPSB0 OyAgICBcDQogICAgdCBePSBFX0tFWVs2ICogaSArIDNdOyBFX0tFWVs2ICogaSArIDldID0gdDsg ICAgXA0KICAgIHQgXj0gRV9LRVlbNiAqIGkgKyA0XTsgRV9LRVlbNiAqIGkgKyAxMF0gPSB0OyAg IFwNCiAgICB0IF49IEVfS0VZWzYgKiBpICsgNV07IEVfS0VZWzYgKiBpICsgMTFdID0gdDsgICBc DQp9DQoNCiNkZWZpbmUgbG9vcDgoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcDQp7ICAgdCA9IHJvdHIodCwgIDgpOyA7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAg XA0KICAgIHQgXj0gRV9LRVlbOCAqIGldOyAgICAgRV9LRVlbOCAqIGkgKyA4XSA9IHQ7ICAgIFwN CiAgICB0IF49IEVfS0VZWzggKiBpICsgMV07IEVfS0VZWzggKiBpICsgOV0gPSB0OyAgICBcDQog ICAgdCBePSBFX0tFWVs4ICogaSArIDJdOyBFX0tFWVs4ICogaSArIDEwXSA9IHQ7ICAgXA0KICAg IHQgXj0gRV9LRVlbOCAqIGkgKyAzXTsgRV9LRVlbOCAqIGkgKyAxMV0gPSB0OyAgIFwNCiAgICB0 ICA9IEVfS0VZWzggKiBpICsgNF0gXiBsc19ib3godCk7ICAgIFwNCiAgICBFX0tFWVs4ICogaSAr IDEyXSA9IHQ7ICAgICAgICAgICAgICAgIFwNCiAgICB0IF49IEVfS0VZWzggKiBpICsgNV07IEVf S0VZWzggKiBpICsgMTNdID0gdDsgICBcDQogICAgdCBePSBFX0tFWVs4ICogaSArIDZdOyBFX0tF WVs4ICogaSArIDE0XSA9IHQ7ICAgXA0KICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA3XTsgRV9LRVlb OCAqIGkgKyAxNV0gPSB0OyAgIFwNCn0NCg0Kc3RhdGljIGludA0KYWVzX3NldF9rZXkodm9pZCAq Y3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4pDQp7DQoJc3Ry dWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7DQoJdTMyIGksIHQsIHUsIHYsIHc7DQoJdTMyIFBb QUVTX0VYVEVOREVEX0tFWV9TSVpFXTsNCgl1MzIgcm91bmRzOw0KDQoJaWYgKGtleV9sZW4gIT0g MTYgJiYga2V5X2xlbiAhPSAyNCAmJiBrZXlfbGVuICE9IDMyKSB7DQoJCXJldHVybiAtRUlOVkFM Ow0KCX0NCg0KCWN0eC0+a2V5X2xlbmd0aCA9IGtleV9sZW47DQoNCgljdHgtPkUgPSBjdHgtPmVf ZGF0YTsNCgljdHgtPkQgPSBjdHgtPmRfZGF0YTsNCg0KCS8qIEVuc3VyZSAxNi1CeXRlcyBhbGln bm1lbnRhdGlvbiBvZiBrZXlzIGZvciBWSUEgUGFkTG9jay4gKi8NCglpZiAoKGludCkoY3R4LT5l X2RhdGEpICYgMHgwRikNCgkJY3R4LT5FICs9IDQgLSAoKChpbnQpKGN0eC0+ZV9kYXRhKSAmIDB4 MEYpIC8gc2l6ZW9mIChjdHgtPmVfZGF0YVswXSkpOw0KDQoJaWYgKChpbnQpKGN0eC0+ZF9kYXRh KSAmIDB4MEYpDQoJCWN0eC0+RCArPSA0IC0gKCgoaW50KShjdHgtPmRfZGF0YSkgJiAweDBGKSAv IHNpemVvZiAoY3R4LT5kX2RhdGFbMF0pKTsNCg0KCUVfS0VZWzBdID0gdTMyX2luIChpbl9rZXkp Ow0KCUVfS0VZWzFdID0gdTMyX2luIChpbl9rZXkgKyA0KTsNCglFX0tFWVsyXSA9IHUzMl9pbiAo aW5fa2V5ICsgOCk7DQoJRV9LRVlbM10gPSB1MzJfaW4gKGluX2tleSArIDEyKTsNCg0KCS8qIERv bid0IGdlbmVyYXRlIGV4dGVuZGVkIGtleXMgaWYgdGhlIGhhcmR3YXJlIGNhbiBkbyBpdC4gKi8N CglpZiAoYWVzX2h3X2V4dGtleV9hdmFpbGFibGUoa2V5X2xlbikpDQoJCXJldHVybiAwOw0KDQoJ c3dpdGNoIChrZXlfbGVuKSB7DQoJY2FzZSAxNjoNCgkJdCA9IEVfS0VZWzNdOw0KCQlmb3IgKGkg PSAwOyBpIDwgMTA7ICsraSkNCgkJCWxvb3A0IChpKTsNCgkJYnJlYWs7DQoNCgljYXNlIDI0Og0K CQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOw0KCQl0ID0gRV9LRVlbNV0gPSB1MzJf aW4gKGluX2tleSArIDIwKTsNCgkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkNCgkJCWxvb3A2IChp KTsNCgkJYnJlYWs7DQoNCgljYXNlIDMyOg0KCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsg MTYpOw0KCQlFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOw0KCQlFX0tFWVs2XSA9IHUz Ml9pbiAoaW5fa2V5ICsgMjQpOw0KCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4gKGluX2tleSArIDI4 KTsNCgkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkNCgkJCWxvb3A4IChpKTsNCgkJYnJlYWs7DQoJ fQ0KDQoJRF9LRVlbMF0gPSBFX0tFWVswXTsNCglEX0tFWVsxXSA9IEVfS0VZWzFdOw0KCURfS0VZ WzJdID0gRV9LRVlbMl07DQoJRF9LRVlbM10gPSBFX0tFWVszXTsNCg0KCWZvciAoaSA9IDQ7IGkg PCBrZXlfbGVuICsgMjQ7ICsraSkgew0KCQlpbWl4X2NvbCAoRF9LRVlbaV0sIEVfS0VZW2ldKTsN Cgl9DQoNCgkvKiBQYWRMb2NrIG5lZWRzIGEgZGlmZmVyZW50IGZvcm1hdCBvZiB0aGUgZGVjcnlw dGlvbiBrZXkuICovDQoJcm91bmRzID0gMTAgKyAoa2V5X2xlbiAtIDE2KSAvIDQ7DQoNCglmb3Ig KGkgPSAwOyBpIDwgcm91bmRzOyBpKyspIHsNCgkJUFsoKGkgKyAxKSAqIDQpICsgMF0gPSBEX0tF WVsoKHJvdW5kcyAtIGkgLSAxKSAqIDQpICsgMF07DQoJCVBbKChpICsgMSkgKiA0KSArIDFdID0g RF9LRVlbKChyb3VuZHMgLSBpIC0gMSkgKiA0KSArIDFdOw0KCQlQWygoaSArIDEpICogNCkgKyAy XSA9IERfS0VZWygocm91bmRzIC0gaSAtIDEpICogNCkgKyAyXTsNCgkJUFsoKGkgKyAxKSAqIDQp ICsgM10gPSBEX0tFWVsoKHJvdW5kcyAtIGkgLSAxKSAqIDQpICsgM107DQoJfQ0KDQoJUFswXSA9 IEVfS0VZWyhyb3VuZHMgKiA0KSArIDBdOw0KCVBbMV0gPSBFX0tFWVsocm91bmRzICogNCkgKyAx XTsNCglQWzJdID0gRV9LRVlbKHJvdW5kcyAqIDQpICsgMl07DQoJUFszXSA9IEVfS0VZWyhyb3Vu ZHMgKiA0KSArIDNdOw0KDQoJbWVtY3B5KERfS0VZLCBQLCBBRVNfRVhURU5ERURfS0VZX1NJWkVf Qik7DQoNCglyZXR1cm4gMDsNCn0NCg0KLyogVGVsbHMgd2hldGhlciB0aGUgQUNFIGlzIGNhcGFi bGUgdG8gZ2VuZXJhdGUNCiAgIHRoZSBleHRlbmRlZCBrZXkgZm9yIGEgZ2l2ZW4ga2V5X2xlbi4g Ki8NCnN0YXRpYyBpbmxpbmUgaW50IGFlc19od19leHRrZXlfYXZhaWxhYmxlKHU4IGtleV9sZW4p DQp7DQoJLyogVE9ETzogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhY3R1YWwgQ1BVIG1vZGVsL3N0ZXBw aW5nDQoJICAgICAgICAgYXMgaXQncyBsaWtlbHkgdGhhdCB0aGUgY2FwYWJpbGl0eSB3aWxsIGJl DQoJICAgICAgICAgYWRkZWQgaW4gdGhlIG5leHQgQ1BVIHJldmlzaW9ucy4gKi8NCglpZiAoa2V5 X2xlbiA9PSAxNikNCgkJcmV0dXJuIDE7DQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyB2b2lkIGFl c19wYWRsb2NrKHZvaWQgKmN0eF9hcmcsIHU4ICpvdXRfYXJnLCBjb25zdCB1OCAqaW5fYXJnLA0K CQkJY29uc3QgdTggKml2X2FyZywgc2l6ZV90IG5ieXRlcywgaW50IGVuY2RlYywNCgkJCWludCBt b2RlKQ0Kew0KCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOw0KCWNoYXIgYmlnYnVmW3Np emVvZih1bmlvbiBjd29yZCkgKyAxNl07DQoJdW5pb24gY3dvcmQgKmN3b3JkOw0KCXZvaWQgKmtl eTsNCg0KCWlmICgoKGxvbmcpYmlnYnVmKSAmIDB4MEYpDQoJCWN3b3JkID0gKHZvaWQqKShiaWdi dWYgKyAxNiAtICgobG9uZyliaWdidWYgJiAweDBGKSk7DQoJZWxzZQ0KCQljd29yZCA9ICh2b2lk KiliaWdidWY7DQoNCgkvKiBQcmVwYXJlIENvbnRyb2wgd29yZC4gKi8NCgltZW1zZXQgKGN3b3Jk LCAwLCBzaXplb2YodW5pb24gY3dvcmQpKTsNCgljd29yZC0+Yi5lbmNkZWMgPSAhZW5jZGVjOwkv KiBpbiB0aGUgcmVzdCBvZiBjcnlwdG9hcGkgRU5DPTEvREVDPTAgKi8NCgljd29yZC0+Yi5yb3Vu ZHMgPSAxMCArIChjdHgtPmtleV9sZW5ndGggLSAxNikgLyA0Ow0KCWN3b3JkLT5iLmtzaXplID0g KGN0eC0+a2V5X2xlbmd0aCAtIDE2KSAvIDg7DQoNCgkvKiBJcyB0aGUgaGFyZHdhcmUgY2FwYWJs ZSB0byBnZW5lcmF0ZSB0aGUgZXh0ZW5kZWQga2V5PyAqLw0KCWlmICghYWVzX2h3X2V4dGtleV9h dmFpbGFibGUoY3R4LT5rZXlfbGVuZ3RoKSkNCgkJY3dvcmQtPmIua2V5Z2VuID0gMTsNCg0KCS8q IGN0eC0+RSBzdGFydHMgd2l0aCBhIHBsYWluIGtleSAtIGlmIHRoZSBoYXJkd2FyZSBpcyBjYXBh YmxlDQoJICAgdG8gZ2VuZXJhdGUgdGhlIGV4dGVuZGVkIGtleSBpdHNlbGYgd2UgbXVzdCBzdXBw bHkNCgkgICB0aGUgcGxhaW4ga2V5IGZvciBib3RoIEVuY3J5cHRpb24gYW5kIERlY3J5cHRpb24u ICovDQoJaWYgKGVuY2RlYyA9PSAgQ1JZUFRPX09QX0VOQ1JZUFQgfHwgY3dvcmQtPmIua2V5Z2Vu ID09IDApDQoJCWtleSA9IGN0eC0+RTsNCgllbHNlDQoJCWtleSA9IGN0eC0+RDsNCgkNCglwYWRs b2NrX2FsaWduZXIob3V0X2FyZywgaW5fYXJnLCBpdl9hcmcsIGtleSwgY3dvcmQsDQoJCQluYnl0 ZXMsIEFFU19CTE9DS19TSVpFLCBlbmNkZWMsIG1vZGUpOw0KfQ0KDQpzdGF0aWMgdm9pZCBhZXNf cGFkbG9ja19lY2Iodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjLCBjb25zdCB1OCAq aXYsDQoJCQkgICAgc2l6ZV90IG5ieXRlcywgaW50IGVuY2RlYykNCnsNCglhZXNfcGFkbG9jayhj dHgsIGRzdCwgc3JjLCBOVUxMLCBuYnl0ZXMsIGVuY2RlYywgQ1JZUFRPX01PREVfRUNCKTsNCn0N Cg0Kc3RhdGljIHZvaWQgYWVzX3BhZGxvY2tfY2JjKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3Qg dTggKnNyYywgY29uc3QgdTggKml2LA0KCQkJICAgIHNpemVfdCBuYnl0ZXMsIGludCBlbmNkZWMp DQp7DQoJYWVzX3BhZGxvY2soY3R4LCBkc3QsIHNyYywgaXYsIG5ieXRlcywgZW5jZGVjLCBDUllQ VE9fTU9ERV9DQkMpOw0KfQ0KDQpzdGF0aWMgdm9pZCBhZXNfcGFkbG9ja19jZmIodm9pZCAqY3R4 LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjLCBjb25zdCB1OCAqaXYsDQoJCQkgICAgc2l6ZV90IG5i eXRlcywgaW50IGVuY2RlYykNCnsNCglhZXNfcGFkbG9jayhjdHgsIGRzdCwgc3JjLCBpdiwgbmJ5 dGVzLCBlbmNkZWMsIENSWVBUT19NT0RFX0NGQik7DQp9DQoNCnN0YXRpYyB2b2lkIGFlc19wYWRs b2NrX29mYih2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsIGNvbnN0IHU4ICppdiwN CgkJCSAgICBzaXplX3QgbmJ5dGVzLCBpbnQgZW5jZGVjKQ0Kew0KCWFlc19wYWRsb2NrKGN0eCwg ZHN0LCBzcmMsIGl2LCBuYnl0ZXMsIGVuY2RlYywgQ1JZUFRPX01PREVfT0ZCKTsNCn0NCg0Kc3Rh dGljIHN0cnVjdCBjcnlwdG9fY2FwYWJpbGl0eSBwYWRsb2NrX2NhcHNbXSA9IA0Kew0KCXtDUllQ VE9fT1BfRU5DUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzEyOCwgQ1JZUFRPX01PREVfRUNCLCAxMDAw fSwNCgl7Q1JZUFRPX09QX0VOQ1JZUFQsIENSWVBUT19UWVBFX0FFU18xMjgsIENSWVBUT19NT0RF X0NCQywgMTAwMH0sDQoJe0NSWVBUT19PUF9FTkNSWVBULCBDUllQVE9fVFlQRV9BRVNfMTI4LCBD UllQVE9fTU9ERV9DRkIsIDEwMDB9LA0KCXtDUllQVE9fT1BfRU5DUllQVCwgQ1JZUFRPX1RZUEVf QUVTXzEyOCwgQ1JZUFRPX01PREVfT0ZCLCAxMDAwfSwNCg0KCXtDUllQVE9fT1BfRU5DUllQVCwg Q1JZUFRPX1RZUEVfQUVTXzE5MiwgQ1JZUFRPX01PREVfRUNCLCAxMDAwfSwNCgl7Q1JZUFRPX09Q X0VOQ1JZUFQsIENSWVBUT19UWVBFX0FFU18xOTIsIENSWVBUT19NT0RFX0NCQywgMTAwMH0sDQoJ e0NSWVBUT19PUF9FTkNSWVBULCBDUllQVE9fVFlQRV9BRVNfMTkyLCBDUllQVE9fTU9ERV9DRkIs IDEwMDB9LA0KCXtDUllQVE9fT1BfRU5DUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzE5MiwgQ1JZUFRP X01PREVfT0ZCLCAxMDAwfSwNCgkNCgl7Q1JZUFRPX09QX0VOQ1JZUFQsIENSWVBUT19UWVBFX0FF U18yNTYsIENSWVBUT19NT0RFX0VDQiwgMTAwMH0sDQoJe0NSWVBUT19PUF9FTkNSWVBULCBDUllQ VE9fVFlQRV9BRVNfMjU2LCBDUllQVE9fTU9ERV9DQkMsIDEwMDB9LA0KCXtDUllQVE9fT1BfRU5D UllQVCwgQ1JZUFRPX1RZUEVfQUVTXzI1NiwgQ1JZUFRPX01PREVfQ0ZCLCAxMDAwfSwNCgl7Q1JZ UFRPX09QX0VOQ1JZUFQsIENSWVBUT19UWVBFX0FFU18yNTYsIENSWVBUT19NT0RFX09GQiwgMTAw MH0sDQoJDQoJe0NSWVBUT19PUF9ERUNSWVBULCBDUllQVE9fVFlQRV9BRVNfMTI4LCBDUllQVE9f TU9ERV9FQ0IsIDEwMDB9LA0KCXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzEy OCwgQ1JZUFRPX01PREVfQ0JDLCAxMDAwfSwNCgl7Q1JZUFRPX09QX0RFQ1JZUFQsIENSWVBUT19U WVBFX0FFU18xMjgsIENSWVBUT19NT0RFX0NGQiwgMTAwMH0sDQoJe0NSWVBUT19PUF9ERUNSWVBU LCBDUllQVE9fVFlQRV9BRVNfMTI4LCBDUllQVE9fTU9ERV9PRkIsIDEwMDB9LA0KDQoJe0NSWVBU T19PUF9ERUNSWVBULCBDUllQVE9fVFlQRV9BRVNfMTkyLCBDUllQVE9fTU9ERV9FQ0IsIDEwMDB9 LA0KCXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzE5MiwgQ1JZUFRPX01PREVf Q0JDLCAxMDAwfSwNCgl7Q1JZUFRPX09QX0RFQ1JZUFQsIENSWVBUT19UWVBFX0FFU18xOTIsIENS WVBUT19NT0RFX0NGQiwgMTAwMH0sDQoJe0NSWVBUT19PUF9ERUNSWVBULCBDUllQVE9fVFlQRV9B RVNfMTkyLCBDUllQVE9fTU9ERV9PRkIsIDEwMDB9LA0KCQ0KCXtDUllQVE9fT1BfREVDUllQVCwg Q1JZUFRPX1RZUEVfQUVTXzI1NiwgQ1JZUFRPX01PREVfRUNCLCAxMDAwfSwNCgl7Q1JZUFRPX09Q X0RFQ1JZUFQsIENSWVBUT19UWVBFX0FFU18yNTYsIENSWVBUT19NT0RFX0NCQywgMTAwMH0sDQoJ e0NSWVBUT19PUF9ERUNSWVBULCBDUllQVE9fVFlQRV9BRVNfMjU2LCBDUllQVE9fTU9ERV9DRkIs IDEwMDB9LA0KCXtDUllQVE9fT1BfREVDUllQVCwgQ1JZUFRPX1RZUEVfQUVTXzI1NiwgQ1JZUFRP X01PREVfT0ZCLCAxMDAwfSwNCn07DQpzdGF0aWMgaW50IHBhZGxvY2tfY2FwX251bWJlciA9IHNp emVvZihwYWRsb2NrX2NhcHMpL3NpemVvZihwYWRsb2NrX2NhcHNbMF0pOw0KDQpzdGF0aWMgdm9p ZCBwYWRsb2NrX2RhdGFfcmVhZHkoc3RydWN0IGNyeXB0b19kZXZpY2UgKmRldik7DQpzdGF0aWMg aW50IHBhZGxvY2tfZGF0YV9yZWFkeV9yZWVudHJ5Ow0KDQpzdGF0aWMgc3RydWN0IGNyeXB0b19k ZXZpY2UgcGFkbG9ja19kZXZpY2UgPQ0Kew0KCS5uYW1lCQkJPSAidmlhLXBhZGxvY2siLA0KCS5k YXRhX3JlYWR5CQk9IHBhZGxvY2tfZGF0YV9yZWFkeSwNCgkuY2FwCQkJPSAmcGFkbG9ja19jYXBz WzBdLA0KfTsNCg0Kc3RhdGljIHZvaWQgcHJvY2Vzc19zZXNzaW9uKHN0cnVjdCBjcnlwdG9fc2Vz c2lvbiAqcykNCnsNCglpbnQgZXJyOw0KCXU4ICprZXksICpkc3QsICpzcmMsICppdjsNCglzaXpl X3Qgc2l6ZSwga2V5bGVuOw0KCQ0KCWtleSA9ICgodTggKilwYWdlX2FkZHJlc3Mocy0+ZGF0YS5z Z19rZXkucGFnZSkpICsgcy0+ZGF0YS5zZ19rZXkub2Zmc2V0Ow0KCWtleWxlbiA9IHMtPmRhdGEu c2dfa2V5Lmxlbmd0aDsNCglkc3QgPSAoKHU4ICopcGFnZV9hZGRyZXNzKHMtPmRhdGEuc2dfZHN0 LnBhZ2UpKSArIHMtPmRhdGEuc2dfZHN0Lm9mZnNldDsNCglzcmMgPSAoKHU4ICopcGFnZV9hZGRy ZXNzKHMtPmRhdGEuc2dfc3JjLnBhZ2UpKSArIHMtPmRhdGEuc2dfc3JjLm9mZnNldDsNCglzaXpl ID0gcy0+ZGF0YS5zZ19zcmMubGVuZ3RoOw0KCWl2ID0gKCh1OCAqKXBhZ2VfYWRkcmVzcyhzLT5k YXRhLnNnX2l2LnBhZ2UpKSArIHMtPmRhdGEuc2dfaXYub2Zmc2V0Ow0KCQ0KCWVyciA9IGFlc19z ZXRfa2V5KHMtPmRhdGEucHJpdiwga2V5LCBrZXlsZW4pOw0KCWlmIChlcnIpDQoJCXJldHVybjsN Cg0KCXN3aXRjaCAocy0+Y2kubW9kZSkNCgl7DQoJCWNhc2UgQ1JZUFRPX01PREVfRUNCOg0KCQkJ YWVzX3BhZGxvY2tfZWNiKHMtPmRhdGEucHJpdiwgZHN0LCBzcmMsIGl2LCBzaXplLCBzLT5jaS5v cGVyYXRpb24pOw0KCQkJYnJlYWs7DQoJCWNhc2UgQ1JZUFRPX01PREVfQ0JDOg0KCQkJYWVzX3Bh ZGxvY2tfY2JjKHMtPmRhdGEucHJpdiwgZHN0LCBzcmMsIGl2LCBzaXplLCBzLT5jaS5vcGVyYXRp b24pOw0KCQkJYnJlYWs7DQoJCWNhc2UgQ1JZUFRPX01PREVfQ0ZCOg0KCQkJYWVzX3BhZGxvY2tf Y2ZiKHMtPmRhdGEucHJpdiwgZHN0LCBzcmMsIGl2LCBzaXplLCBzLT5jaS5vcGVyYXRpb24pOw0K CQkJYnJlYWs7DQoJCWNhc2UgQ1JZUFRPX01PREVfT0ZCOg0KCQkJYWVzX3BhZGxvY2tfb2ZiKHMt PmRhdGEucHJpdiwgZHN0LCBzcmMsIGl2LCBzaXplLCBzLT5jaS5vcGVyYXRpb24pOw0KCQkJYnJl YWs7DQoJfQ0KDQoJcy0+ZGF0YS5zZ19kc3QubGVuZ3RoID0gc2l6ZTsNCg0KCXJldHVybjsNCn0N Cg0Kc3RhdGljIHZvaWQgcGFkbG9ja19kYXRhX3JlYWR5KHN0cnVjdCBjcnlwdG9fZGV2aWNlICpk ZXYpDQp7DQoJc3RydWN0IGNyeXB0b19zZXNzaW9uICpzLCAqbjsNCg0KCWlmIChwYWRsb2NrX2Rh dGFfcmVhZHlfcmVlbnRyeSkNCgkJcmV0dXJuOw0KDQoJcGFkbG9ja19kYXRhX3JlYWR5X3JlZW50 cnkrKzsNCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgbiwgJmRldi0+c2Vzc2lvbl9saXN0 LCBkZXZfcXVldWVfZW50cnkpDQoJew0KCQlpZiAoIXNlc3Npb25fY29tcGxldGVkKHMpKQ0KCQl7 DQoJCQlzdGFydF9wcm9jZXNzX3Nlc3Npb24ocyk7DQoJCQlwcm9jZXNzX3Nlc3Npb24ocyk7DQoJ CQljcnlwdG9fc3RhdF9jb21wbGV0ZV9pbmMocyk7DQoJCQljb21wbGV0ZV9zZXNzaW9uKHMpOw0K CQkJc3RvcF9wcm9jZXNzX3Nlc3Npb24ocyk7DQoJCX0NCgl9DQoJcGFkbG9ja19kYXRhX3JlYWR5 X3JlZW50cnktLTsNCn0NCg0KaW50IHBhZGxvY2tfaW5pdF9hZXModm9pZCkNCnsNCgl1MzIgY3B1 aWQsIGVkeDsNCgl1MzIgdmFsID0gMHhDMDAwMDAwMDsNCg0KCWNwdWlkID0gY3B1aWRfZWF4KHZh bCk7DQoJZWR4ID0gY3B1aWRfZWR4KHZhbCk7DQoJcHJpbnRrKCJ2YWw9JXgsIGNwdWlkPSV4LCBl ZHg9JXguXG4iLCB2YWwsIGNwdWlkLCBlZHgpOw0KCWlmIChjcHVpZCA+PSB2YWwgKyAxKQ0KCXsN CgkJcHJpbnRrKCJCb2FyZCBzdXBwb3J0cyBBQ0UuXG4iKTsNCgl9DQoJZWxzZQ0KCXsNCgkJcHJp bnRrKCJCb2FyZCBkb2VzIG5vdCBzdXBwb3J0IEFDRS5cbiIpOw0KCQlyZXR1cm4gLUVOT0RFVjsN Cgl9DQoJDQoJcHJpbnRrKEtFUk5fTk9USUNFICJVc2luZyBWSUEgUGFkTG9jayBBQ0UgZm9yIEFF UyBhbGdvcml0aG0gKG11bHRpYmxvY2spLlxuIik7DQoNCglwYWRsb2NrX2RldmljZS5jYXBfbnVt YmVyID0gcGFkbG9ja19jYXBfbnVtYmVyOw0KCQ0KCWdlbl90YWJzKCk7DQoJcmV0dXJuIGNyeXB0 b19kZXZpY2VfYWRkKCZwYWRsb2NrX2RldmljZSk7DQp9DQoNCnZvaWQgcGFkbG9ja19maW5pX2Fl cyh2b2lkKQ0Kew0KCWNyeXB0b19kZXZpY2VfcmVtb3ZlKCZwYWRsb2NrX2RldmljZSk7DQp9DQo= --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=padlock-generic.c Content-Type: text/x-csrc; name=padlock-generic.c; charset=KOI8-R Content-Transfer-Encoding: base64 LyogDQogKiBDcnlwdG9ncmFwaGljIEFQSS4NCiAqDQogKiBTdXBwb3J0IGZvciBWSUEgUGFkTG9j ayBoYXJkd2FyZSBjcnlwdG8gZW5naW5lLg0KICoNCiAqIExpbnV4IGRldmVsb3BlcnM6DQogKiAg TWljaGFsIEx1ZHZpZyA8bWx1ZHZpZ0BzdXNlLmN6Pg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQogKiBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQ0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uDQogKi8NCg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4NCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L2Vycm5v Lmg+DQojaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+DQojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5o Pg0KDQojaW5jbHVkZSAicGFkbG9jay5oIg0KI2luY2x1ZGUgIi4uL2FjcnlwdG8uaCINCiNpbmNs dWRlICIuLi9jcnlwdG9fZGVmLmgiDQoNCiNkZWZpbmUgUEZYCSJwYWRsb2NrOiAiDQoNCnR5cGVk ZWYgdm9pZCAoeGNyeXB0X3QpKHU4ICppbnB1dCwgdTggKm91dHB1dCwgdTggKmtleSwgdTggKml2 LA0KCQkJdm9pZCAqY29udHJvbF93b3JkLCB1MzIgY291bnQpOw0KDQpzdGF0aWMgaW5saW5lIHZv aWQgcGFkbG9ja194Y3J5cHRfZWNiKHU4ICppbnB1dCwgdTggKm91dHB1dCwgdTggKmtleSwNCgkJ CQkgICAgICB1OCAqaXYsIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50KQ0Kew0KCWFzbSB2 b2xhdGlsZSAoInB1c2hmbDsgcG9wZmwiKTsJCS8qIGVuZm9yY2Uga2V5IHJlbG9hZC4gKi8NCglh c20gdm9sYXRpbGUgKCIuYnl0ZSAweGYzLDB4MGYsMHhhNywweGM4IgkvKiByZXAgeGNyeXB0ZWNi ICovDQoJCSAgICAgIDogIj1tIigqb3V0cHV0KSwgIitTIihpbnB1dCksICIrRCIob3V0cHV0KQ0K CQkgICAgICA6ICJkIihjb250cm9sX3dvcmQpLCAiYiIoa2V5KSwgImMiKGNvdW50KSk7DQp9DQoN CnN0YXRpYyBpbmxpbmUgdm9pZCBwYWRsb2NrX3hjcnlwdF9jYmModTggKmlucHV0LCB1OCAqb3V0 cHV0LCB1OCAqa2V5LA0KCQkJCSAgICAgIHU4ICppdiwgdm9pZCAqY29udHJvbF93b3JkLCB1MzIg Y291bnQpDQp7DQoJYXNtIHZvbGF0aWxlICgicHVzaGZsOyBwb3BmbCIpOwkJLyogZW5mb3JjZSBr ZXkgcmVsb2FkLiAqLw0KCWFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4ZjMsMHgwZiwweGE3LDB4ZDAi CS8qIHJlcCB4Y3J5cHRjYmMgKi8NCgkJICAgICAgOiAiPW0iKCpvdXRwdXQpLCAiK1MiKGlucHV0 KSwgIitEIihvdXRwdXQpDQoJCSAgICAgIDogImQiKGNvbnRyb2xfd29yZCksICJiIihrZXkpLCAi YyIoY291bnQpLCAiYSIoaXYpKTsNCn0NCg0Kc3RhdGljIGlubGluZSB2b2lkIHBhZGxvY2tfeGNy eXB0X2NmYih1OCAqaW5wdXQsIHU4ICpvdXRwdXQsIHU4ICprZXksDQoJCQkJICAgICAgdTggKml2 LCB2b2lkICpjb250cm9sX3dvcmQsIHUzMiBjb3VudCkNCnsNCglhc20gdm9sYXRpbGUgKCJwdXNo Zmw7IHBvcGZsIik7CQkvKiBlbmZvcmNlIGtleSByZWxvYWQuICovDQoJYXNtIHZvbGF0aWxlICgi LmJ5dGUgMHhmMywweDBmLDB4YTcsMHhlMCIJLyogcmVwIHhjcnlwdGNmYiAqLw0KCQkgICAgICA6 ICI9bSIoKm91dHB1dCksICIrUyIoaW5wdXQpLCAiK0QiKG91dHB1dCkNCgkJICAgICAgOiAiZCIo Y29udHJvbF93b3JkKSwgImIiKGtleSksICJjIihjb3VudCksICJhIihpdikpOw0KfQ0KDQpzdGF0 aWMgaW5saW5lIHZvaWQgcGFkbG9ja194Y3J5cHRfb2ZiKHU4ICppbnB1dCwgdTggKm91dHB1dCwg dTggKmtleSwNCgkJCQkgICAgICB1OCAqaXYsIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50 KQ0Kew0KCWFzbSB2b2xhdGlsZSAoInB1c2hmbDsgcG9wZmwiKTsJCS8qIGVuZm9yY2Uga2V5IHJl bG9hZC4gKi8NCglhc20gdm9sYXRpbGUgKCIuYnl0ZSAweGYzLDB4MGYsMHhhNywweGU4IgkvKiBy ZXAgeGNyeXB0b2ZiICovDQoJCSAgICAgIDogIj1tIigqb3V0cHV0KSwgIitTIihpbnB1dCksICIr RCIob3V0cHV0KQ0KCQkgICAgICA6ICJkIihjb250cm9sX3dvcmQpLCAiYiIoa2V5KSwgImMiKGNv dW50KSwgImEiKGl2KSk7DQp9DQoNCnZvaWQgKmNyeXB0b19hbGlnbmVkX2ttYWxsb2Moc2l6ZV90 IHNpemUsIGludCBtb2RlLCBzaXplX3QgYWxpZ25tZW50LCB2b2lkICoqaW5kZXgpDQp7DQogICAg ICAgY2hhciAqcHRyOw0KDQogICAgICAgcHRyID0ga21hbGxvYyhzaXplICsgYWxpZ25tZW50LCBt b2RlKTsNCiAgICAgICAqaW5kZXggPSBwdHI7DQogICAgICAgaWYgKGFsaWdubWVudCA+IDEgJiYg KChsb25nKXB0ciAmIChhbGlnbm1lbnQgLSAxKSkpIHsNCiAgICAgICAgICAgICAgIHB0ciArPSBh bGlnbm1lbnQgLSAoKGxvbmcpcHRyICYgKGFsaWdubWVudCAtIDEpKTsNCiAgICAgICB9DQoNCiAg ICAgICByZXR1cm4gcHRyOw0KfQ0KDQp2b2lkIHBhZGxvY2tfYWxpZ25lcih1OCAqb3V0X2FyZywg Y29uc3QgdTggKmluX2FyZywgY29uc3QgdTggKml2X2FyZywNCgkJICAgICB2b2lkICprZXksIHVu aW9uIGN3b3JkICpjd29yZCwNCgkJICAgICBzaXplX3QgbmJ5dGVzLCBzaXplX3QgYmxvY2tzaXpl LA0KCQkgICAgIGludCBlbmNkZWMsIGludCBtb2RlKQ0Kew0KCS8qIERvbid0IGJsaW5kbHkgbW9k aWZ5IHRoaXMgc3RydWN0dXJlIC0gdGhlIGl0ZW1zIG11c3QgDQoJICAgZml0IG9uIDE2LUJ5dGVz IGJvdW5kYXJpZXMhICovDQoJc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEgew0KCQl1OCBpdlti bG9ja3NpemVdOwkJLyogSW5pdGlhbGl6YXRpb24gdmVjdG9yICovDQoJfTsNCg0KCXU4ICppbiwg Km91dCwgKml2Ow0KCXZvaWQgKmluZGV4ID0gTlVMTDsNCgljaGFyIGJpZ2J1ZltzaXplb2Yoc3Ry dWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEpICsgMTZdOw0KCXN0cnVjdCBwYWRsb2NrX3hjcnlwdF9k YXRhICpkYXRhOw0KDQoJLyogUGxhY2UgJ2RhdGEnIGF0IHRoZSBmaXJzdCAxNi1CeXRlcyBhbGln bmVkIGFkZHJlc3MgaW4gJ2JpZ2J1ZicuICovDQoJaWYgKCgobG9uZyliaWdidWYpICYgMHgwRikN CgkJZGF0YSA9ICh2b2lkKikoYmlnYnVmICsgMTYgLSAoKGxvbmcpYmlnYnVmICYgMHgwRikpOw0K CWVsc2UNCgkJZGF0YSA9ICh2b2lkKiliaWdidWY7DQoNCglpZiAoKChsb25nKWluX2FyZykgJiAw eDBGKSB7DQoJCWluID0gY3J5cHRvX2FsaWduZWRfa21hbGxvYyhuYnl0ZXMsIEdGUF9LRVJORUws IDE2LCAmaW5kZXgpOw0KCQltZW1jcHkoaW4sIGluX2FyZywgbmJ5dGVzKTsNCgl9DQoJZWxzZQ0K CQlpbiA9ICh1OCopaW5fYXJnOw0KCQ0KCWlmICgoKGxvbmcpb3V0X2FyZykgJiAweDBGKSB7DQoJ CWlmIChpbmRleCkNCgkJCW91dCA9IGluOyAgICAgICAvKiB4Y3J5cHQgY2FuIHdvcmsgImluIHBs YWNlIiAqLw0KCQllbHNlDQoJCQlvdXQgPSBjcnlwdG9fYWxpZ25lZF9rbWFsbG9jKG5ieXRlcywg R0ZQX0tFUk5FTCwgMTYsICZpbmRleCk7DQoJfQ0KCWVsc2UNCgkJb3V0ID0gb3V0X2FyZzsNCg0K CS8qIEFsd2F5cyBtYWtlIGEgbG9jYWwgY29weSBvZiBJViAtIHhjcnlwdCBtYXkgY2hhbmdlIGl0 ISAqLw0KCWl2ID0gZGF0YS0+aXY7DQoJaWYgKGl2X2FyZykNCgkJbWVtY3B5KGl2LCBpdl9hcmcs IGJsb2Nrc2l6ZSk7DQoJDQoNCglkcHJpbnRrKCJkYXRhPSVwXG4iLCBkYXRhKTsNCglkcHJpbnRr KCJpbj0lcFxuIiwgaW4pOw0KCWRwcmludGsoIm91dD0lcFxuIiwgb3V0KTsNCglkcHJpbnRrKCJp dj0lcFxuIiwgaXYpOw0KCWRwcmludGsoIm5ieXRlcz0lZCwgYmxvY2tzaXplPSVkLlxuIiwgbmJ5 dGVzLCBibG9ja3NpemUpOw0KDQoJc3dpdGNoIChtb2RlKSB7DQoJCWNhc2UgQ1JZUFRPX01PREVf RUNCOg0KCQkJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGtleSwgaXYsIGN3b3JkLCBuYnl0 ZXMvYmxvY2tzaXplKTsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgQ1JZUFRPX01PREVfQ0JDOg0KCQkJ cGFkbG9ja194Y3J5cHRfY2JjKGluLCBvdXQsIGtleSwgaXYsIGN3b3JkLCBuYnl0ZXMvYmxvY2tz aXplKTsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgQ1JZUFRPX01PREVfQ0ZCOg0KCQkJcGFkbG9ja194 Y3J5cHRfY2ZiKGluLCBvdXQsIGtleSwgaXYsIGN3b3JkLCBuYnl0ZXMvYmxvY2tzaXplKTsNCgkJ CWJyZWFrOw0KDQoJCWNhc2UgQ1JZUFRPX01PREVfT0ZCOg0KCQkJcGFkbG9ja194Y3J5cHRfb2Zi KGluLCBvdXQsIGtleSwgaXYsIGN3b3JkLCBuYnl0ZXMvYmxvY2tzaXplKTsNCgkJCWJyZWFrOw0K DQoJCWRlZmF1bHQ6DQoJCQlCVUcoKTsNCgl9DQoNCgkvKiBDb3B5IHRoZSAxNi1CeXRlIGFsaWdu ZWQgb3V0cHV0IHRvIHRoZSBjYWxsZXIncyBidWZmZXIuICovDQoJaWYgKG91dCAhPSBvdXRfYXJn KQ0KCQltZW1jcHkob3V0X2FyZywgb3V0LCBuYnl0ZXMpOw0KDQoJaWYgKGluZGV4KQ0KCQlrZnJl ZShpbmRleCk7DQp9DQoNCnN0YXRpYyBpbnQgX19pbml0IHBhZGxvY2tfaW5pdCh2b2lkKQ0Kew0K CWludCByZXQgPSAtRU5PU1lTOw0KI2lmIDAJDQoJaWYgKCFjcHVfaGFzX3hjcnlwdCkgew0KCQlw cmludGsoS0VSTl9FUlIgUEZYICJWSUEgUGFkTG9jayBub3QgZGV0ZWN0ZWQuXG4iKTsNCgkJcmV0 dXJuIC1FTk9ERVY7DQoJfQ0KDQoJaWYgKCFjcHVfaGFzX3hjcnlwdF9lbmFibGVkKSB7DQoJCXBy aW50ayhLRVJOX0VSUiBQRlggIlZJQSBQYWRMb2NrIGRldGVjdGVkLCBidXQgbm90IGVuYWJsZWQu IEhtbSwgc3RyYW5nZS4uLlxuIik7DQoJCXJldHVybiAtRU5PREVWOw0KCX0NCiNlbmRpZg0KCWlm ICgocmV0ID0gcGFkbG9ja19pbml0X2FlcygpKSkgew0KCQlwcmludGsoS0VSTl9FUlIgUEZYICJW SUEgUGFkTG9jayBBRVMgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7DQoJCXJldHVybiByZXQ7 DQoJfQ0KDQoJaWYgKHJldCA9PSAtRU5PU1lTKQ0KCQlwcmludGsoS0VSTl9FUlIgUEZYICJIbW0s IFZJQSBQYWRMb2NrIHdhcyBjb21waWxlZCB3aXRob3V0IGFueSBhbGdvcml0aG0uXG4iKTsNCg0K CXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyB2b2lkIF9fZXhpdCBwYWRsb2NrX2Zpbmkodm9pZCkN CnsNCglwYWRsb2NrX2ZpbmlfYWVzKCk7DQp9DQoNCm1vZHVsZV9pbml0KHBhZGxvY2tfaW5pdCk7 DQptb2R1bGVfZXhpdChwYWRsb2NrX2ZpbmkpOw0KDQpNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBQ YWRMb2NrIGNyeXB0byBlbmdpbmUgc3VwcG9ydC4iKTsNCk1PRFVMRV9MSUNFTlNFKCJEdWFsIEJT RC9HUEwiKTsNCk1PRFVMRV9BVVRIT1IoIk1pY2hhbCBMdWR2aWciKTsNCn== --=-gAz1C7z/zhc3Hd8IdTzQ Content-Disposition: attachment; filename=padlock.h Content-Type: text/x-chdr; name=padlock.h; charset=KOI8-R Content-Transfer-Encoding: base64 LyoNCiAqIENyeXB0b2dyYXBoaWMgQVBJLg0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNo YWwgTHVkdmlnIDxtbHVkdmlnQHN1c2UuY3o+DQogKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCiAqIHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlDQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIA0KICogYW55IGxhdGVyIHZlcnNp b24uDQogKg0KICovDQoNCiNpZm5kZWYgX0NSWVBUT19QQURMT0NLX0gNCiNkZWZpbmUgX0NSWVBU T19QQURMT0NLX0gNCg0KI2RlZmluZSBBRVNfTUlOX0tFWV9TSVpFCTE2CS8qIGluIHU4IHVuaXRz ICovDQojZGVmaW5lIEFFU19NQVhfS0VZX1NJWkUJMzIJLyogZGl0dG8gKi8NCiNkZWZpbmUgQUVT X0JMT0NLX1NJWkUJCTE2CS8qIGRpdHRvICovDQojZGVmaW5lIEFFU19FWFRFTkRFRF9LRVlfU0la RQk2NAkvKiBpbiB1MzIgdW5pdHMgKi8NCiNkZWZpbmUgQUVTX0VYVEVOREVEX0tFWV9TSVpFX0IJ KEFFU19FWFRFTkRFRF9LRVlfU0laRSAqIHNpemVvZih1MzIpKQ0KDQpzdHJ1Y3QgYWVzX2N0eCB7 DQoJdTMyIGVfZGF0YVtBRVNfRVhURU5ERURfS0VZX1NJWkUrNF07DQoJdTMyIGRfZGF0YVtBRVNf RVhURU5ERURfS0VZX1NJWkUrNF07DQoJaW50IGtleV9sZW5ndGg7DQoJdTMyICpFOw0KCXUzMiAq RDsNCn07DQoNCiNkZWZpbmUgRV9LRVkgY3R4LT5FDQojZGVmaW5lIERfS0VZIGN0eC0+RA0KDQoN Ci8qIENvbnRyb2wgd29yZC4gKi8NCiNpZiAxDQp1bmlvbiBjd29yZCB7DQoJdTMyIGN3b3JkWzRd Ow0KCXN0cnVjdCB7DQoJCWludCByb3VuZHM6NDsNCgkJaW50IGFsZ286MzsNCgkJaW50IGtleWdl bjoxOw0KCQlpbnQgaW50ZXJtOjE7DQoJCWludCBlbmNkZWM6MTsNCgkJaW50IGtzaXplOjI7DQoJ fSBiOw0KfTsNCiNlbHNlDQp1bmlvbiBjd29yZCB7DQoJdTMyIGN3b3JkWzRdOw0KCXN0cnVjdCB7 DQoJCXVuc2lnbmVkCXJvdW5kczo0LA0KCQkJCWFsZ286MywNCgkJCQlrZXlnZW46MSwNCgkJCQlp bnRlcm06MSwNCgkJCQllbmNkZWM6MSwNCgkJCQlrc2l6ZToyOw0KCX0gYjsNCn07DQojZW5kaWYN Cg0KI2RlZmluZSBQRlgJInBhZGxvY2s6ICINCg0Kdm9pZCBwYWRsb2NrX2FsaWduZXIodTggKm91 dF9hcmcsIGNvbnN0IHU4ICppbl9hcmcsIGNvbnN0IHU4ICppdl9hcmcsDQoJCSAgICAgdm9pZCAq a2V5LCB1bmlvbiBjd29yZCAqY3dvcmQsDQoJCSAgICAgc2l6ZV90IG5ieXRlcywgc2l6ZV90IGJs b2Nrc2l6ZSwNCgkJICAgICBpbnQgZW5jZGVjLCBpbnQgbW9kZSk7DQoNCmludCBwYWRsb2NrX2lu aXRfYWVzKHZvaWQpOw0Kdm9pZCBwYWRsb2NrX2ZpbmlfYWVzKHZvaWQpOw0KDQojZW5kaWYJLyog X0NSWVBUT19QQURMT0NLX0ggKi8NCg== --=-gAz1C7z/zhc3Hd8IdTzQ-- --=-a71b/Hi3u7ltMlmkhSjh Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQBBgeGuIKTPhE+8wY0RAg8KAJ9CnINVLp8nTKYQr9J6+lEwTazN2gCfWnHr /AIPJfKnusnOJel3V3j+J8Q= =GqMF -----END PGP SIGNATURE----- --=-a71b/Hi3u7ltMlmkhSjh--