From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric DeVolder Subject: [RFC v1 6/8] kexec: support files for PECOFF Authenticode signature verification Date: Mon, 14 Jan 2019 13:48:03 -0600 Message-ID: <1547495285-28907-7-git-send-email-eric.devolder@oracle.com> References: <1547495285-28907-1-git-send-email-eric.devolder@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1547495285-28907-1-git-send-email-eric.devolder@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xen.org Cc: daniel.kiper@oracle.com, eric.devolder@oracle.com, kexec@lists.infradead.org, boris.ostrovsky@oracle.com List-Id: xen-devel@lists.xenproject.org VGhpcyBwYXRjaCBjb250YWlucyB0aGUgZmlsZXMgZnJvbSB0aGUgc3RhbmRhbG9uZSB1dGlsaXR5 IHRoYXQKYXJlIHRvIGJlIGludGVncmF0ZWQgaW50byBYZW4gdG8gcHJvdmlkZSBzaWduYXR1cmUg dmVyaWZpY2F0aW9uCm9mIGEgUEVDT0ZGIGZpbGUuCgotIFRydXN0ZWRDZXJ0LmggaXMgdGhlIHB1 YmxpYyByb290IGNlcnRpZmljYXRlIGZvciBPcmFjbGUgc2lnbmVkCiAgYmluYXJpZXMuIFRoaXMg Y3JlYXRlZCBieSB0YWtpbmcgdGhlIERFUiBlbmNvZGVkIGZpbGUgYXQKICBodHRwOi8vY2FjZXJ0 cy5kaWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0IGFuZAogIGNv bnZlcnRpbmcgaXQgaW50byB0aGlzIGNvbXBpbGFibGUgQyBoZWFkZXIgZmlsZS4KLSBkbGNsLmgg aXMgbXkgZG91YmxlIGxpbmtlZCBjaXJjdWxhciBsaXN0IHNldCBvZiBoZWxwZXIgbWFjcm9zLCBh bmQKICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBjb3JyZXNwb25kaW5nIFhlbiBsaXN0IGhhbmRs aW5nLgotIHBlY29mZi5oIGlzIGEgdHJhbnNjcmlwdGlvbiBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVz IGFuZCBjb25zdGFudHMKICBkZXNjcmliZWQgaW4gdGhlIE1pY3Jvc29mdCBzcGVjCiAgaHR0cHM6 Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM2ODA1 NDcodj12cy44NSkuYXNweC4KLSBwZWQuW2NoXSBpcyB0aGUgUEVDT0ZGIGRlY29kZXIvcGFyc2Vy IEkgd3JvdGUsIGFuZCBwcm9iYWJseSBjb3VsZAogIHN0YW5kIHRvIGJlIHJlcGxhY2VkIHdpdGgg YSBtb3JlIG1hdHVyZSBsaWJyYXJ5LgotIHZfb3BlbnNzbC5jIGlzIHRoZSAiZ2x1ZSIgY29kZSB0 aGF0IHV0aWxpemVzIE9wZW5TU0wgcm91dGluZXMgdG8KICBwZXJmb3JtIHNpZ25hdHVyZSB2ZXJp ZmljYXRpb24uIFRoaXMgZmlsZSBlc3NlbnRpYWxseSBjb250YWlucyB0aGUKICB0d28gZmlsZXMg aHR0cHM6Ly9naXRodWIuY29tL3ZhdGhwZWxhL3ZlcmlmeS9DcnlwdGxpYi9Qay9bQ3J5cHRQa2Nz Ny5jfENyeXB0QXV0aGVudGljb2RlLmNdCiAgd2hpY2ggdG9nZXRoZXIgcHJvdmlkZSB0aGUgc2ln bmF0dXJlIHZlcmlmaWNhdGlvbiBjYXBhYmlsaXR5LgoKU2lnbmVkLW9mZi1ieTogRXJpYyBEZVZv bGRlciA8ZXJpYy5kZXZvbGRlckBvcmFjbGUuY29tPgotLS0KIHhlbi9jb21tb24vVHJ1c3RlZENl cnQuaCB8ICAxMTMgKysrKwogeGVuL2NvbW1vbi9kbGNsLmggICAgICAgIHwgIDMyMyArKysrKysr KysrKwogeGVuL2NvbW1vbi9wZWNvZmYuaCAgICAgIHwgIDI4MyArKysrKysrKysrCiB4ZW4vY29t bW9uL3BlZC5jICAgICAgICAgfCAgNTc5ICsrKysrKysrKysrKysrKysrKysrCiB4ZW4vY29tbW9u L3BlZC5oICAgICAgICAgfCAgMTI4ICsrKysrCiB4ZW4vY29tbW9uL3Zfb3BlbnNzbC5jICAgfCAx MzQ4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDYgZmls ZXMgY2hhbmdlZCwgMjc3NCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2Nv bW1vbi9UcnVzdGVkQ2VydC5oCiBjcmVhdGUgbW9kZSAxMDA3NTUgeGVuL2NvbW1vbi9kbGNsLmgK IGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vY29tbW9uL3BlY29mZi5oCiBjcmVhdGUgbW9kZSAxMDA2 NDQgeGVuL2NvbW1vbi9wZWQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9jb21tb24vcGVkLmgK IGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vY29tbW9uL3Zfb3BlbnNzbC5jCgpkaWZmIC0tZ2l0IGEv eGVuL2NvbW1vbi9UcnVzdGVkQ2VydC5oIGIveGVuL2NvbW1vbi9UcnVzdGVkQ2VydC5oCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNzQ0ZTQKLS0tIC9kZXYvbnVsbAorKysg Yi94ZW4vY29tbW9uL1RydXN0ZWRDZXJ0LmgKQEAgLTAsMCArMSwxMTMgQEAKKwordWludDhfdCBU cnVzdGVkQ2VydFtdID0gCit7CisweDMwLCAgMHg4MiwgIDB4MDMsICAweEM1LCAgMHgzMCwgIDB4 ODIsICAweDAyLCAgMHhBRCwgIDB4QTAsICAKKzB4MDMsICAweDAyLCAgMHgwMSwgIDB4MDIsICAw eDAyLCAgMHgxMCwgIDB4MDIsICAweEFDLCAgMHg1QywgIAorMHgyNiwgIDB4NkEsICAweDBCLCAg MHg0MCwgIDB4OUIsICAweDhGLCAgMHgwQiwgIDB4NzksICAweEYyLCAgCisweEFFLCAgMHg0Niwg IDB4MjUsICAweDc3LCAgMHgzMCwgIDB4MEQsICAweDA2LCAgMHgwOSwgIDB4MkEsICAKKzB4ODYs ICAweDQ4LCAgMHg4NiwgIDB4RjcsICAweDBELCAgMHgwMSwgIDB4MDEsICAweDA1LCAgMHgwNSwg IAorMHgwMCwgIDB4MzAsICAweDZDLCAgMHgzMSwgIDB4MEIsICAweDMwLCAgMHgwOSwgIDB4MDYs ICAweDAzLCAgCisweDU1LCAgMHgwNCwgIDB4MDYsICAweDEzLCAgMHgwMiwgIDB4NTUsICAweDUz LCAgMHgzMSwgIDB4MTUsICAKKzB4MzAsICAweDEzLCAgMHgwNiwgIDB4MDMsICAweDU1LCAgMHgw NCwgIDB4MEEsICAweDEzLCAgMHgwQywgIAorMHg0NCwgIDB4NjksICAweDY3LCAgMHg2OSwgIDB4 NDMsICAweDY1LCAgMHg3MiwgIDB4NzQsICAweDIwLCAgCisweDQ5LCAgMHg2RSwgIDB4NjMsICAw eDMxLCAgMHgxOSwgIDB4MzAsICAweDE3LCAgMHgwNiwgIDB4MDMsICAKKzB4NTUsICAweDA0LCAg MHgwQiwgIDB4MTMsICAweDEwLCAgMHg3NywgIDB4NzcsICAweDc3LCAgMHgyRSwgIAorMHg2NCwg IDB4NjksICAweDY3LCAgMHg2OSwgIDB4NjMsICAweDY1LCAgMHg3MiwgIDB4NzQsICAweDJFLCAg CisweDYzLCAgMHg2RiwgIDB4NkQsICAweDMxLCAgMHgyQiwgIDB4MzAsICAweDI5LCAgMHgwNiwg IDB4MDMsICAKKzB4NTUsICAweDA0LCAgMHgwMywgIDB4MTMsICAweDIyLCAgMHg0NCwgIDB4Njks ICAweDY3LCAgMHg2OSwgIAorMHg0MywgIDB4NjUsICAweDcyLCAgMHg3NCwgIDB4MjAsICAweDQ4 LCAgMHg2OSwgIDB4NjcsICAweDY4LCAgCisweDIwLCAgMHg0MSwgIDB4NzMsICAweDczLCAgMHg3 NSwgIDB4NzIsICAweDYxLCAgMHg2RSwgIDB4NjMsICAKKzB4NjUsICAweDIwLCAgMHg0NSwgIDB4 NTYsICAweDIwLCAgMHg1MiwgIDB4NkYsICAweDZGLCAgMHg3NCwgIAorMHgyMCwgIDB4NDMsICAw eDQxLCAgMHgzMCwgIDB4MUUsICAweDE3LCAgMHgwRCwgIDB4MzAsICAweDM2LCAgCisweDMxLCAg MHgzMSwgIDB4MzEsICAweDMwLCAgMHgzMCwgIDB4MzAsICAweDMwLCAgMHgzMCwgIDB4MzAsICAK KzB4MzAsICAweDVBLCAgMHgxNywgIDB4MEQsICAweDMzLCAgMHgzMSwgIDB4MzEsICAweDMxLCAg MHgzMSwgIAorMHgzMCwgIDB4MzAsICAweDMwLCAgMHgzMCwgIDB4MzAsICAweDMwLCAgMHgzMCwg IDB4NUEsICAweDMwLCAgCisweDZDLCAgMHgzMSwgIDB4MEIsICAweDMwLCAgMHgwOSwgIDB4MDYs ICAweDAzLCAgMHg1NSwgIDB4MDQsICAKKzB4MDYsICAweDEzLCAgMHgwMiwgIDB4NTUsICAweDUz LCAgMHgzMSwgIDB4MTUsICAweDMwLCAgMHgxMywgIAorMHgwNiwgIDB4MDMsICAweDU1LCAgMHgw NCwgIDB4MEEsICAweDEzLCAgMHgwQywgIDB4NDQsICAweDY5LCAgCisweDY3LCAgMHg2OSwgIDB4 NDMsICAweDY1LCAgMHg3MiwgIDB4NzQsICAweDIwLCAgMHg0OSwgIDB4NkUsICAKKzB4NjMsICAw eDMxLCAgMHgxOSwgIDB4MzAsICAweDE3LCAgMHgwNiwgIDB4MDMsICAweDU1LCAgMHgwNCwgIAor MHgwQiwgIDB4MTMsICAweDEwLCAgMHg3NywgIDB4NzcsICAweDc3LCAgMHgyRSwgIDB4NjQsICAw eDY5LCAgCisweDY3LCAgMHg2OSwgIDB4NjMsICAweDY1LCAgMHg3MiwgIDB4NzQsICAweDJFLCAg MHg2MywgIDB4NkYsICAKKzB4NkQsICAweDMxLCAgMHgyQiwgIDB4MzAsICAweDI5LCAgMHgwNiwg IDB4MDMsICAweDU1LCAgMHgwNCwgIAorMHgwMywgIDB4MTMsICAweDIyLCAgMHg0NCwgIDB4Njks ICAweDY3LCAgMHg2OSwgIDB4NDMsICAweDY1LCAgCisweDcyLCAgMHg3NCwgIDB4MjAsICAweDQ4 LCAgMHg2OSwgIDB4NjcsICAweDY4LCAgMHgyMCwgIDB4NDEsICAKKzB4NzMsICAweDczLCAgMHg3 NSwgIDB4NzIsICAweDYxLCAgMHg2RSwgIDB4NjMsICAweDY1LCAgMHgyMCwgIAorMHg0NSwgIDB4 NTYsICAweDIwLCAgMHg1MiwgIDB4NkYsICAweDZGLCAgMHg3NCwgIDB4MjAsICAweDQzLCAgCisw eDQxLCAgMHgzMCwgIDB4ODIsICAweDAxLCAgMHgyMiwgIDB4MzAsICAweDBELCAgMHgwNiwgIDB4 MDksICAKKzB4MkEsICAweDg2LCAgMHg0OCwgIDB4ODYsICAweEY3LCAgMHgwRCwgIDB4MDEsICAw eDAxLCAgMHgwMSwgIAorMHgwNSwgIDB4MDAsICAweDAzLCAgMHg4MiwgIDB4MDEsICAweDBGLCAg MHgwMCwgIDB4MzAsICAweDgyLCAgCisweDAxLCAgMHgwQSwgIDB4MDIsICAweDgyLCAgMHgwMSwg IDB4MDEsICAweDAwLCAgMHhDNiwgIDB4Q0MsICAKKzB4RTUsICAweDczLCAgMHhFNiwgIDB4RkIs ICAweEQ0LCAgMHhCQiwgIDB4RTUsICAweDJELCAgMHgyRCwgIAorMHgzMiwgIDB4QTYsICAweERG LCAgMHhFNSwgIDB4ODEsICAweDNGLCAgMHhDOSwgIDB4Q0QsICAweDI1LCAgCisweDQ5LCAgMHhC NiwgIDB4NzEsICAweDJBLCAgMHhDMywgIDB4RDUsICAweDk0LCAgMHgzNCwgIDB4NjcsICAKKzB4 QTIsICAweDBBLCAgMHgxQywgIDB4QjAsICAweDVGLCAgMHg2OSwgIDB4QTYsICAweDQwLCAgMHhC MSwgIAorMHhDNCwgIDB4QjcsICAweEIyLCAgMHg4RiwgIDB4RDAsICAweDk4LCAgMHhBNCwgIDB4 QTksICAweDQxLCAgCisweDU5LCAgMHgzQSwgIDB4RDMsICAweERDLCAgMHg5NCwgIDB4RDYsICAw eDNDLCAgMHhEQiwgIDB4NzQsICAKKzB4MzgsICAweEE0LCAgMHg0QSwgIDB4Q0MsICAweDRELCAg MHgyNSwgIDB4ODIsICAweEY3LCAgMHg0QSwgIAorMHhBNSwgIDB4NTMsICAweDEyLCAgMHgzOCwg IDB4RUUsICAweEYzLCAgMHg0OSwgIDB4NkQsICAweDcxLCAgCisweDkxLCAgMHg3RSwgIDB4NjMs ICAweEI2LCAgMHhBQiwgIDB4QTYsICAweDVGLCAgMHhDMywgIDB4QTQsICAKKzB4ODQsICAweEY4 LCAgMHg0RiwgIDB4NjIsICAweDUxLCAgMHhCRSwgIDB4RjgsICAweEM1LCAgMHhFQywgIAorMHhE QiwgIDB4MzgsICAweDkyLCAgMHhFMywgIDB4MDYsICAweEU1LCAgMHgwOCwgIDB4OTEsICAweDBD LCAgCisweEM0LCAgMHgyOCwgIDB4NDEsICAweDU1LCAgMHhGQiwgIDB4Q0IsICAweDVBLCAgMHg4 OSwgIDB4MTUsICAKKzB4N0UsICAweDcxLCAgMHhFOCwgIDB4MzUsICAweEJGLCAgMHg0RCwgIDB4 NzIsICAweDA5LCAgMHgzRCwgIAorMHhCRSwgIDB4M0EsICAweDM4LCAgMHg1MCwgIDB4NUIsICAw eDc3LCAgMHgzMSwgIDB4MUIsICAweDhELCAgCisweEIzLCAgMHhDNywgIDB4MjQsICAweDQ1LCAg MHg5QSwgIDB4QTcsICAweEFDLCAgMHg2RCwgIDB4MDAsICAKKzB4MTQsICAweDVBLCAgMHgwNCwg IDB4QjcsICAweEJBLCAgMHgxMywgIDB4RUIsICAweDUxLCAgMHgwQSwgIAorMHg5OCwgIDB4NDEs ICAweDQxLCAgMHgyMiwgIDB4NEUsICAweDY1LCAgMHg2MSwgIDB4ODcsICAweDgxLCAgCisweDQx LCAgMHg1MCwgIDB4QTYsICAweDc5LCAgMHg1QywgIDB4ODksICAweERFLCAgMHgxOSwgIDB4NEEs ICAKKzB4NTcsICAweEQ1LCAgMHgyRSwgIDB4RTYsICAweDVELCAgMHgxQywgIDB4NTMsICAweDJD LCAgMHg3RSwgIAorMHg5OCwgIDB4Q0QsICAweDFBLCAgMHgwNiwgIDB4MTYsICAweEE0LCAgMHg2 OCwgIDB4NzMsICAweEQwLCAgCisweDM0LCAgMHgwNCwgIDB4MTMsICAweDVDLCAgMHhBMSwgIDB4 NzEsICAweEQzLCAgMHg1QSwgIDB4N0MsICAKKzB4NTUsICAweERCLCAgMHg1RSwgIDB4NjQsICAw eEUxLCAgMHgzNywgIDB4ODcsICAweDMwLCAgMHg1NiwgIAorMHgwNCwgIDB4RTUsICAweDExLCAg MHhCNCwgIDB4MjksICAweDgwLCAgMHgxMiwgIDB4RjEsICAweDc5LCAgCisweDM5LCAgMHg4OCwg IDB4QTIsICAweDAyLCAgMHgxMSwgIDB4N0MsICAweDI3LCAgMHg2NiwgIDB4QjcsICAKKzB4ODgs ICAweEI3LCAgMHg3OCwgIDB4RjIsICAweENBLCAgMHgwQSwgIDB4QTgsICAweDM4LCAgMHhBQiwg IAorMHgwQSwgIDB4NjQsICAweEMyLCAgMHhCRiwgIDB4NjYsICAweDVELCAgMHg5NSwgIDB4ODQs ICAweEMxLCAgCisweEExLCAgMHgyNSwgIDB4MUUsICAweDg3LCAgMHg1RCwgIDB4MUEsICAweDUw LCAgMHgwQiwgIDB4MjAsICAKKzB4MTIsICAweENDLCAgMHg0MSwgIDB4QkIsICAweDZFLCAgMHgw QiwgIDB4NTEsICAweDM4LCAgMHhCOCwgIAorMHg0QiwgIDB4Q0IsICAweDAyLCAgMHgwMywgIDB4 MDEsICAweDAwLCAgMHgwMSwgIDB4QTMsICAweDYzLCAgCisweDMwLCAgMHg2MSwgIDB4MzAsICAw eDBFLCAgMHgwNiwgIDB4MDMsICAweDU1LCAgMHgxRCwgIDB4MEYsICAKKzB4MDEsICAweDAxLCAg MHhGRiwgIDB4MDQsICAweDA0LCAgMHgwMywgIDB4MDIsICAweDAxLCAgMHg4NiwgIAorMHgzMCwg IDB4MEYsICAweDA2LCAgMHgwMywgIDB4NTUsICAweDFELCAgMHgxMywgIDB4MDEsICAweDAxLCAg CisweEZGLCAgMHgwNCwgIDB4MDUsICAweDMwLCAgMHgwMywgIDB4MDEsICAweDAxLCAgMHhGRiwg IDB4MzAsICAKKzB4MUQsICAweDA2LCAgMHgwMywgIDB4NTUsICAweDFELCAgMHgwRSwgIDB4MDQs ICAweDE2LCAgMHgwNCwgIAorMHgxNCwgIDB4QjEsICAweDNFLCAgMHhDMywgIDB4NjksICAweDAz LCAgMHhGOCwgIDB4QkYsICAweDQ3LCAgCisweDAxLCAgMHhENCwgIDB4OTgsICAweDI2LCAgMHgx QSwgIDB4MDgsICAweDAyLCAgMHhFRiwgIDB4NjMsICAKKzB4NjQsICAweDJCLCAgMHhDMywgIDB4 MzAsICAweDFGLCAgMHgwNiwgIDB4MDMsICAweDU1LCAgMHgxRCwgIAorMHgyMywgIDB4MDQsICAw eDE4LCAgMHgzMCwgIDB4MTYsICAweDgwLCAgMHgxNCwgIDB4QjEsICAweDNFLCAgCisweEMzLCAg MHg2OSwgIDB4MDMsICAweEY4LCAgMHhCRiwgIDB4NDcsICAweDAxLCAgMHhENCwgIDB4OTgsICAK KzB4MjYsICAweDFBLCAgMHgwOCwgIDB4MDIsICAweEVGLCAgMHg2MywgIDB4NjQsICAweDJCLCAg MHhDMywgIAorMHgzMCwgIDB4MEQsICAweDA2LCAgMHgwOSwgIDB4MkEsICAweDg2LCAgMHg0OCwg IDB4ODYsICAweEY3LCAgCisweDBELCAgMHgwMSwgIDB4MDEsICAweDA1LCAgMHgwNSwgIDB4MDAs ICAweDAzLCAgMHg4MiwgIDB4MDEsICAKKzB4MDEsICAweDAwLCAgMHgxQywgIDB4MUEsICAweDA2 LCAgMHg5NywgIDB4REMsICAweEQ3LCAgMHg5QywgIAorMHg5RiwgIDB4M0MsICAweDg4LCAgMHg2 NiwgIDB4MDYsICAweDA4LCAgMHg1NywgIDB4MjEsICAweERCLCAgCisweDIxLCAgMHg0NywgIDB4 RjgsICAweDJBLCAgMHg2NywgIDB4QUEsICAweEJGLCAgMHgxOCwgIDB4MzIsICAKKzB4NzYsICAw eDQwLCAgMHgxMCwgIDB4NTcsICAweEMxLCAgMHg4QSwgIDB4RjMsICAweDdBLCAgMHhEOSwgIAor MHgxMSwgIDB4NjUsICAweDhFLCAgMHgzNSwgIDB4RkEsICAweDlFLCAgMHhGQywgIDB4NDUsICAw eEI1LCAgCisweDlFLCAgMHhEOSwgIDB4NEMsICAweDMxLCAgMHg0QiwgIDB4QjgsICAweDkxLCAg MHhFOCwgIDB4NDMsICAKKzB4MkMsICAweDhFLCAgMHhCMywgIDB4NzgsICAweENFLCAgMHhEQiwg IDB4RTMsICAweDUzLCAgMHg3OSwgIAorMHg3MSwgIDB4RDYsICAweEU1LCAgMHgyMSwgIDB4OTQs ICAweDAxLCAgMHhEQSwgIDB4NTUsICAweDg3LCAgCisweDlBLCAgMHgyNCwgIDB4NjQsICAweEY2 LCAgMHg4QSwgIDB4NjYsICAweENDLCAgMHhERSwgIDB4OUMsICAKKzB4MzcsICAweENELCAgMHhB OCwgIDB4MzQsICAweEIxLCAgMHg2OSwgIDB4OUIsICAweDIzLCAgMHhDOCwgIAorMHg5RSwgIDB4 NzgsICAweDIyLCAgMHgyQiwgIDB4NzAsICAweDQzLCAgMHhFMywgIDB4NTUsICAweDQ3LCAgCisw eDMxLCAgMHg2MSwgIDB4MTksICAweEVGLCAgMHg1OCwgIDB4QzUsICAweDg1LCAgMHgyRiwgIDB4 NEUsICAKKzB4MzAsICAweEY2LCAgMHhBMCwgIDB4MzEsICAweDE2LCAgMHgyMywgIDB4QzgsICAw eEU3LCAgMHhFMiwgIAorMHg2NSwgIDB4MTYsICAweDMzLCAgMHhDQiwgIDB4QkYsICAweDFBLCAg MHgxQiwgIDB4QTAsICAweDNELCAgCisweEY4LCAgMHhDQSwgIDB4NUUsICAweDhCLCAgMHgzMSwg IDB4OEIsICAweDYwLCAgMHgwOCwgIDB4ODksICAKKzB4MkQsICAweDBDLCAgMHgwNiwgIDB4NUMs ICAweDUyLCAgMHhCNywgIDB4QzQsICAweEY5LCAgMHgwQSwgIAorMHg5OCwgIDB4RDEsICAweDE1 LCAgMHg1RiwgIDB4OUYsICAweDEyLCAgMHhCRSwgIDB4N0MsICAweDM2LCAgCisweDYzLCAgMHgz OCwgIDB4QkQsICAweDQ0LCAgMHhBNCwgIDB4N0YsICAweEU0LCAgMHgyNiwgIDB4MkIsICAKKzB4 MEEsICAweEM0LCAgMHg5NywgIDB4NjksICAweDBELCAgMHhFOSwgIDB4OEMsICAweEUyLCAgMHhD MCwgIAorMHgxMCwgIDB4NTcsICAweEI4LCAgMHhDOCwgIDB4NzYsICAweDEyLCAgMHg5MSwgIDB4 NTUsICAweEYyLCAgCisweDQ4LCAgMHg2OSwgIDB4RDgsICAweEJDLCAgMHgyQSwgIDB4MDIsICAw eDVCLCAgMHgwRiwgIDB4NDQsICAKKzB4RDQsICAweDIwLCAgMHgzMSwgIDB4REIsICAweEY0LCAg MHhCQSwgIDB4NzAsICAweDI2LCAgMHg1RCwgIAorMHg5MCwgIDB4NjAsICAweDlFLCAgMHhCQywg IDB4NEIsICAweDE3LCAgMHgwOSwgIDB4MkYsICAweEI0LCAgCisweENCLCAgMHgxRSwgIDB4NDMs ICAweDY4LCAgMHhDOSwgIDB4MDcsICAweDI3LCAgMHhDMSwgIDB4RDIsICAKKzB4NUMsICAweEY3 LCAgMHhFQSwgIDB4MjEsICAweEI5LCAgMHg2OCwgIDB4MTIsICAweDlDLCAgMHgzQywgIAorMHg5 QywgIDB4QkYsICAweDlFLCAgMHhGQywgIDB4ODAsICAweDVDLCAgMHg5QiwgIDB4NjMsICAweENE LCAgCisweEVDLCAgMHg0NywgIDB4QUEsICAweDI1LCAgMHgyNywgIDB4NjcsICAweEEwLCAgMHgz NywgIDB4RjMsICAKKzB4MDAsICAweDgyLCAgMHg3RCwgIDB4NTQsICAweEQ3LCAgMHhBOSwgIDB4 RjgsICAweEU5LCAgMHgyRSwgIAorMHgxMywgIDB4QTMsICAweDc3LCAgMHhFOCwgIDB4MUYsICAw eDRBLCAgCit9OworCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL2RsY2wuaCBiL3hlbi9jb21tb24v ZGxjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcwOWU1M2UKLS0tIC9k ZXYvbnVsbAorKysgYi94ZW4vY29tbW9uL2RsY2wuaApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAq ICBMaW5rZWQgbGlzdCBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBFcmljIERlVm9sZGVy CisgKgorICovCisKKyNpZm5kZWYgX0RTU19TUkNfSU5DTFVERV9ETENMX0gKKyNkZWZpbmUgX0RT U19TUkNfSU5DTFVERV9ETENMX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgbWFjcm8g YXBwZW5kcyBFTEVNRU5UIHRvIHRoZSBlbmQgb2YgYSBsaXN0CisgKi8KKyNkZWZpbmUgRExDTF9B UFBFTkQoVFlQRSwgUVVFVUUsIEVMRU1FTlQpCVwKKwlETENMX0FQUEVORF9OUChUWVBFLCBRVUVV RSwgRUxFTUVOVCwgbmV4dCwgcHJldikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgbWFj cm8gcmVtb3ZlcyBFTEVNRU5UIGZyb20gdGhlIGxpc3QuCisgKi8KKyNkZWZpbmUgRExDTF9SRU1P VkUoVFlQRSwgUVVFVUUsIEVMRU1FTlQpCVwKKwlETENMX1JFTU9WRV9OUChUWVBFLCBRVUVVRSwg RUxFTUVOVCwgbmV4dCwgcHJldikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgbWFjcm8g ZXh0cmFjdHMgRUxFTUVOVCBmcm9tIHRoZSBsaXN0LiBJdCBkb2Vzbid0CisgKiB1cGRhdGUgdGhl IGxpc3QgaGVhZC4KKyAqLworI2RlZmluZSBETENMX0VYVFJBQ1QoVFlQRSwgRUxFTUVOVCkJXAor CURMQ0xfRVhUUkFDVF9OUChUWVBFLCBFTEVNRU5ULCBuZXh0LCBwcmV2KQorCisvKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisvKgorICogVGhpcyBtYWNybyBpbnNlcnRzIEVMRU1FTlQgaW50byB0aGUgbGlzdCBiZWZv cmUgTkVMRU1FTlQKKyAqLworI2RlZmluZSBETENMX0lOU0VSVF9CRUZPUkUoVFlQRSwgRUxFTUVO VCwgTkVMRU1FTlQpCVwKKwlETENMX0lOU0VSVF9CRUZPUkVfTlAoVFlQRSwgRUxFTUVOVCwgTkVM RU1FTlQsIG5leHQsIHByZXYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIG1hY3JvIGlu c2VydHMgRUxFTUVOVCBpbnRvIHRoZSBsaXN0IGFmdGVyIFBFTEVNRU5UCisgKi8KKyNkZWZpbmUg RExDTF9JTlNFUlRfQUZURVIoVFlQRSwgRUxFTUVOVCwgUEVMRU1FTlQpCVwKKwlETENMX0lOU0VS VF9BRlRFUl9OUChUWVBFLCBFTEVNRU5ULCBQRUxFTUVOVCwgbmV4dCwgcHJldikKKworLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLworLyoKKyAqIFRoaXMgbWFjcm8gaW5zZXJ0cyBMSVNUIGludG8gdGhlIGxpc3QgYmVm b3JlIGVsZW1lbnQgTkVMRU1FTlQuCisgKi8KKyNkZWZpbmUgRExDTF9JTlNFUlRfTElTVF9CRUZP UkUoVFlQRSwgRUxFTUVOVCwgTkVMRU1FTlQpCVwKKwlETENMX0lOU0VSVF9MSVNUX0JFRk9SRV9O UChUWVBFLCBMSVNULCBOTElTVCwgbmV4dCwgcHJldikKKworLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAq IFRoaXMgbWFjcm8gaW5zZXJ0cyBMSVNUIGludG8gdGhlIGxpc3QgYWZ0ZXIgZWxlbWVudCBQRUxF TUVOVAorICovCisjZGVmaW5lIERMQ0xfSU5TRVJUX0xJU1RfQUZURVIoVFlQRSwgRUxFTUVOVCwg UEVMRU1FTlQpCVwKKwlETENMX0lOU0VSVF9MSVNUX0FGVEVSX05QKFRZUEUsIExJU1QsIFBMSVNU LCBuZXh0LCBwcmV2KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBtYWNybyBhcHBlbmRzIEVMRU1FTlQgdG8g W3RoZSBlbmQgb2ZdIGEgbGlzdAorICovCisjZGVmaW5lIERMQ0xfQVBQRU5EX05QKFRZUEUsIFFV RVVFLCBFTEVNRU5ULCBORVhULCBQUkVWKQlcCit7CQkJCQkJCQkJCVwKKwlUWVBFICpmZWwsICps ZWw7CQkJCVwKKwlpZiAoKGZlbCA9IFFVRVVFKSA9PSBOVUxMKQkJCVwKKwl7CQkJCQkJCQkJXAor CQlRVUVVRSA9IEVMRU1FTlQtPk5FWFQgPSBFTEVNRU5ULT5QUkVWID0gRUxFTUVOVDsJXAorCX0J CQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJXAorCXsJCQkJCQkJCQlcCisJCWxlbCA9IGZlbC0+UFJF VjsJCQkJXAorCQlsZWwtPk5FWFQgPSBFTEVNRU5UOwkJCVwKKwkJRUxFTUVOVC0+UFJFViA9IGxl bDsJCQlcCisJCUVMRU1FTlQtPk5FWFQgPSBmZWw7CQkJXAorCQlmZWwtPlBSRVYgPSBFTEVNRU5U OwkJCVwKKwl9CQkJCQkJCQkJXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBtYWNy byBwcmVwZW5kcyBFTEVNRU5UIHRvIFt0aGUgYmVnaW5uaW5nIG9mXSBhIGxpc3QKKyAqLworI2Rl ZmluZSBETENMX1BSRVBFTkRfTlAoVFlQRSwgUVVFVUUsIEVMRU1FTlQsIE5FWFQsIFBSRVYpCVwK K3sJCQkJCQkJCQkJXAorCVRZUEUgKmZlbCwgKmxlbDsJCQkJXAorCWlmICgoZmVsID0gUVVFVUUp ID09IE5VTEwpCQkJXAorCXsJCQkJCQkJCQlcCisJCVFVRVVFID0gRUxFTUVOVC0+TkVYVCA9IEVM RU1FTlQtPlBSRVYgPSBFTEVNRU5UOwlcCisJfQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQlcCisJ ewkJCQkJCQkJCVwKKwkJbGVsID0gZmVsLT5QUkVWOwkJCQlcCisJCWxlbC0+TkVYVCA9IEVMRU1F TlQ7CQkJXAorCQlFTEVNRU5ULT5QUkVWID0gbGVsOwkJCVwKKwkJRUxFTUVOVC0+TkVYVCA9IGZl bDsJCQlcCisJCWZlbC0+UFJFViA9IEVMRU1FTlQ7CQkJXAorCQlRVUVVRSA9IEVMRU1FTlQ7CSAg ICAJCVwKKwl9CQkJCQkJCQkJXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBtYWNy byByZW1vdmVzIEVMRU1FTlQgZnJvbSB0aGUgbGlzdC4KKyAqCisgKiBOT1RFOiBUaGlzIHJlcXVp cmVzIHRoYXQgRUxFTUVOVCBhY3R1YWxseSBiZSBvbiB0aGUgbGlzdCEKKyAqLworI2RlZmluZSBE TENMX1JFTU9WRV9OUChUWVBFLCBRVUVVRSwgRUxFTUVOVCwgTkVYVCwgUFJFVikJXAorewkJCQkJ CQkJCQlcCisJVFlQRSAqbmVsLCAqcGVsOwkJCQlcCisJaWYgKFFVRVVFICE9IE5VTEwpCQkJCQlc CisJewkJCQkJCQkJCVwKKwkJbmVsID0gRUxFTUVOVC0+TkVYVDsJCQlcCisJCXBlbCA9IEVMRU1F TlQtPlBSRVY7CQkJXAorCQlpZiAoUVVFVUUgPT0gRUxFTUVOVCkJCQlcCisJCXsJCQkJCQkJCVwK KwkJCS8qIEZJWCEhISEgc2hvdWxkIHVzZSAobmVsID09IHBlbCkgKi8JXAorICAgICAgICAgICAg LyppZiAobmVsID09IHBlbCkgKi8gICAgXAorCQkJaWYgKEVMRU1FTlQtPk5FWFQgPT0gRUxFTUVO VCkJCQlcCisJCQl7CQkJCQkJCVwKKwkJCQlFTEVNRU5ULT5ORVhUID0gRUxFTUVOVC0+UFJFViA9 IE5VTEw7CQlcCisJCQkJUVVFVUUgPSBOVUxMOwkJCVwKKwkJCX0JCQkJCQkJXAorCQkJZWxzZQkJ CQkJCVwKKwkJCXsJCQkJCQkJXAorCQkJCXBlbC0+TkVYVCA9IG5lbDsJCVwKKwkJCQluZWwtPlBS RVYgPSBwZWw7CQlcCisJCQkJUVVFVUUgPSBuZWw7CQkJXAorCQkJfQkJCQkJCQlcCisJCX0JCQkJ CQkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCXsJCQkJCQkJCVwKKwkJCXBlbC0+TkVYVCA9IG5lbDsJ CQlcCisJCQluZWwtPlBSRVYgPSBwZWw7CQkJXAorCQl9CQkJCQkJCQlcCisJfQkJCQkJCQkJCVwK K30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGluc2VydCBhbmQgZXh0cmFjdCBtYWNy b3Mgc2ltcGx5IG1hbmlwdWxhdGUgdGhlCisgKiBlbGVtZW50KHMpIHByb3ZpZGVkLiBUaGF0IGlz LCB0aGUgbGlzdCBoZWFkIGlzIG5vdCBtb2RpZmllZC4KKyAqIEZ1cnRoZXJtb3JlLCBpdCBpcyBS RVFVSVJFRCB0aGF0IHRoZSBFTEVNRU5UIGJlIHZhbGlkIChpZSBub3QgTlVMTCkKKyAqLworCisv KgorICogVGhpcyBtYWNybyBleHRyYWN0cyBFTEVNRU5UIGZyb20gdGhlIGxpc3QuIEl0IGRvZXNu J3QKKyAqIGNoYW5nZSB0aGUgbGlzdCBoZWFkLgorICoKKyAqIE5PVEU6IFRoaXMgcmVxdWlyZXMg dGhhdCB0aGUgZWxlbWVudCBhY3R1YWxseSBiZSBvbiB0aGUgbGlzdCEKKyAqLworI2RlZmluZSBE TENMX0VYVFJBQ1RfTlAoVFlQRSwgRUxFTUVOVCwgTkVYVCwgUFJFVikJXAorewkJCQkJCQkJCVwK KwlUWVBFICpuZWwsICpwZWw7CQkJXAorCW5lbCA9IEVMRU1FTlQtPk5FWFQ7CQkJXAorCXBlbCA9 IEVMRU1FTlQtPlBSRVY7CQkJXAorCXBlbC0+TkVYVCA9IG5lbDsJCQkJXAorCW5lbC0+UFJFViA9 IHBlbDsJCQkJXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBtYWNybyBpbnNlcnRz IEVMRU1FTlQgaW50byB0aGUgbGlzdCBiZWZvcmUgTkVMRU1FTlQuCisgKi8KKyNkZWZpbmUgRExD TF9JTlNFUlRfQkVGT1JFX05QKFRZUEUsIFFVRVVFLCBFTEVNRU5ULCBORUxFTUVOVCwgTkVYVCwg UFJFVikJXAorewkJCQkJCQkJCVwKKwlUWVBFICpwZWw7CQkJCQlcCisJcGVsID0gTkVMRU1FTlQt PlBSRVY7CQkJXAorCXBlbC0+TkVYVCA9IEVMRU1FTlQ7CQkJXAorCUVMRU1FTlQtPk5FWFQgPSBO RUxFTUVOVDsJCVwKKwlORUxFTUVOVC0+UFJFViA9IEVMRU1FTlQ7CQlcCisJRUxFTUVOVC0+UFJF ViA9IHBlbDsJCQlcCisgICAgaWYgKFFVRVVFID09IE5FTEVNRU5UKSAgICAgICAgICBcCisgICAg ICAgIFFVRVVFID0gRUxFTUVOVDsgICAgICAgICAgICBcCit9CisKKy8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8q CisgKiBUaGlzIG1hY3JvIGluc2VydHMgRUxFTUVOVCBpbnRvIHRoZSBsaXN0IGFmdGVyIFBFTEVN RU5ULgorICovCisjZGVmaW5lIERMQ0xfSU5TRVJUX0FGVEVSX05QKFRZUEUsIFFVRVVFLCBFTEVN RU5ULCBQRUxFTUVOVCwgTkVYVCwgUFJFVikJXAorewkJCQkJCQkJCVwKKyAgICBUWVBFICpuZWw7 CQkJCQkgICAgXAorCW5lbCA9IFBFTEVNRU5ULT5ORVhUOwkJCVwKKwlQRUxFTUVOVC0+TkVYVCA9 IEVMRU1FTlQ7CQlcCisJRUxFTUVOVC0+TkVYVCA9IG5lbDsJCQlcCisJbmVsLT5QUkVWID0gRUxF TUVOVDsJCQlcCisJRUxFTUVOVC0+UFJFViA9IFBFTEVNRU5UOyAJCVwKK30KKworLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLworLyoKKyAqIFRoaXMgbWFjcm8gaW5zZXJ0cyBFTEVNRU5UIGludG8gdGhlIGxpc3QgaW4g c29ydGVkIG9yZGVyIHZpYSBFWFBSLgorICovCisjZGVmaW5lIERMQ0xfSU5TRVJUX1NPUlRFRF9O UChUWVBFLCBRVUVVRSwgRUxFTUVOVCwgRVhQUiwgTkVYVCwgUFJFVikJXAorewkJCQkJCQkJCSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFICpjZWw7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg ICBpZiAoKGNlbCA9IFFVRVVFKSA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRExDTF9BUFBFTkRfTlAo VFlQRSwgUVVFVUUsIEVMRU1FTlQsIE5FWFQsIFBSRVYpOyAvKiBTdGFydCB0aGUgbGlzdCAqLyBc CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKGNlbCAhPSBO VUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg ICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChFWFBSKSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg ICAgICAgICBETENMX0lOU0VSVF9CRUZPUkVfTlAoVFlQRSwgUVVFVUUsIEVMRU1FTlQsIGNlbCwg TkVYVCwgUFJFVik7IC8qIEluc2VydCBpbiBsaXN0ICovIFwKKyAgICAgICAgICAgIGJyZWFrOyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg ICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChjZWwgPSBjZWwt Pk5FWFQpID09IFFVRVVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg ICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgICAgICAgICAgIERMQ0xfQVBQRU5EX05QKFRZUEUsIFFVRVVFLCBFTEVN RU5ULCBORVhULCBQUkVWKTsgLyogSW5zZXJ0IGF0IGVuZCBvZiBsaXN0ICovIFwKKyAgICAgICAg ICAgIGNlbCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyoKKyAq IFRoaXMgbWFjcm8gam9pbnMgdHdvIERMQ0xzIHRvZ2V0aGVyLCBieSBjb25jYXRlbmF0aW5nIExJ U1QyIGF0IHRoZQorICogZW5kIG9mIExJU1QxLgorICovCisjZGVmaW5lIERMQ0xfSk9JTl9OUChU WVBFLCBRVUVVRSwgTElTVDEsIExJU1QyLCBORVhULCBQUkVWKSBcCit7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKExJ U1QxICYmIExJU1QyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgIFRZUEUgKmZlbDEsICpmZWwyLCAqbGVsMSwgKmxlbDI7ICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgIGZlbDEgPSBMSVNUMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisgICAgICAgIGxlbDEgPSBmZWwxLT5QUkVWOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZlbDIgPSBMSVNUMjsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbDIgPSBmZWwyLT5QUkVWOyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZlbDEtPlBSRVYgPSBsZWwy OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbDItPk5FWFQg PSBmZWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbDEt Pk5FWFQgPSBmZWwyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg IGZlbDItPlBSRVYgPSBsZWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg ICAgICAgIFFVRVVFID0gTElTVDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChMSVNUMSkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBRVUVVRSA9IExJU1QxOyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBRVUVV RSA9IExJU1QyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IAor CisvKgorICogVGhpcyBtYWNybyBzcGxpdHMgUVVFVUUgaW50byB0d28gRExDTHMgYXQgZWxlbWVu dCBFTEVNRU5ULgorICogVGhpcyByZXF1aXJlcyB0aGF0IEVMRU1FTlQgYmUgb24gdGhlIFFVRVVF LiBXaGVuIGNvbXBsZXRlLAorICogRUxFTUVOVCBwb2ludHMgdG8gYSBsaXN0IChhcyBkb2VzIFFV RVVFKS4KKyAqLworI2RlZmluZSBETENMX1NQTElUX05QKFRZUEUsIFFVRVVFLCBFTEVNRU5ULCBO RVhULCBQUkVWKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFFVRVVFICYmIEVMRU1FTlQpICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgKmZlbDEsICpmZWwy LCAqbGVsMSwgKmxlbDI7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZlbDEgPSBRVUVV RTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZlbDIg PSBFTEVNRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg IGxlbDEgPSBmZWwyLT5QUkVWOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg ICAgICAgIGxlbDIgPSBmZWwxLT5QUkVWOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgICAgIGZlbDEtPlBSRVYgPSBsZWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisgICAgICAgIGxlbDEtPk5FWFQgPSBmZWwxOyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgICAgIGZlbDItPlBSRVYgPSBsZWwyOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbDItPk5FWFQgPSBmZWwyOyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwor LyoKKyAqIFRoZSBmb2xsb3dpbmcgaW5zZXJ0IG1hY3JvcyBvcGVyYXRlIG9uIGxpc3RzLCBidXQg ZG8gbm90IG1vZGlmeQorICogdGhlIGxpc3QgaGVhZC4KKyAqIEZ1cnRoZXJtb3JlLCBpdCBpcyBS RVFVSVJFRCB0aGF0IHRoZSBMSVNUIGJlIHZhbGlkIChpZSBub3QgTlVMTCkKKyAqLworCisvKgor ICogVGhpcyBtYWNybyBpbnNlcnRzIExJU1QgaW50byB0aGUgbGlzdCBCRUZPUkUgZWxlbWVudCBO RUxFTUVOVC4KKyAqLworI2RlZmluZSBETENMX0lOU0VSVF9MSVNUX0JFRk9SRV9OUChUWVBFLCBM SVNULCBORUxFTUVOVCwgTkVYVCwgUFJFVikJXAorewkJCQkJCQkJCVwKKwlUWVBFICpuZWwsICpw ZWwsICpsZiwgKmxsOwlcCisJbGYgPSBMSVNUOyBsbCA9IGxmLT5QUkVWOwkJXAorCW5lbCA9IE5F TEVNRU5UOyBwZWwgPSBuZWwtPlBSRVY7XAorCWxsLT5ORVhUID0gbmVsOwkJCQkJXAorCW5lbC0+ UFJFViA9IGxsOwkJCQkJXAorCXBlbC0+TkVYVCA9IGxmOwkJCQkJXAorCWxmLT5QUkVWID0gcGVs OwkJCQkJXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBtYWNybyBpbnNlcnRzIExJ U1QgaW50byB0aGUgbGlzdCBBRlRFUiBlbGVtZW50IFBFTEVNRU5UCisgKi8KKyNkZWZpbmUgRExD TF9JTlNFUlRfTElTVF9BRlRFUl9OUChUWVBFLCBMSVNULCBQRUxFTUVOVCwgTkVYVCwgUFJFVikJ XAorewkJCQkJCQkJCVwKKwlUWVBFICpuZWwsICpwZWwsICpsZiwgKmxsOwlcCisJbGYgPSBMSVNU OyBsbCA9IGxmLT5QUkVWOwkJXAorCXBlbCA9IFBFTEVNRU5UOyBuZWwgPSBwZWwtPk5FWFQ7XAor CWxsLT5ORVhUID0gbmVsOwkJCQkJXAorCW5lbC0+UFJFViA9IGxsOwkJCQkJXAorCXBlbC0+TkVY VCA9IGxmOwkJCQkJXAorCWxmLT5QUkVWID0gcGVsOwkJCQkJXAorfQorCisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CisgCisjZGVmaW5lIERMQ0xfRk9SX0VBQ0goVFlQRSwgTElTVCwgVkFSLCBORVhULCBQUkVWKSBc CisgICAgZm9yIChWQVIgPSBMSVNUOyBWQVI7IFZBUiA9IChWQVItPk5FWFQgPT0gTElTVCkgPyBO VUxMIDogVkFSLT5ORVhUKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZgkvKiBfRFNTX1NSQ19J TkNMVURFX0RMQ0xfSCAqLworCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3BlY29mZi5oIGIveGVu L2NvbW1vbi9wZWNvZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQ5 OThkCi0tLSAvZGV2L251bGwKKysrIGIveGVuL2NvbW1vbi9wZWNvZmYuaApAQCAtMCwwICsxLDI4 MyBAQAorCisvLyBnb29nbGUgbWljcm9zb2Z0IHBlY29mZiBmb3JtYXQKKy8vIHdpa2kgbWljcm9z b2Z0IHBlY29mZiBmb3JtYXQKKy8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xp YnJhcnkvd2luZG93cy9kZXNrdG9wL21zNjgwNTQ3KHY9dnMuODUpLmFzcHgKKy8vIGh0dHBzOi8v dXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvMS8xYi9Qb3J0YWJs ZV9FeGVjdXRhYmxlXzMyX2JpdF9TdHJ1Y3R1cmVfaW5fU1ZHX2ZpeGVkLnN2Zy8yMDAwcHgtUG9y dGFibGVfRXhlY3V0YWJsZV8zMl9iaXRfU3RydWN0dXJlX2luX1NWR19maXhlZC5zdmcucG5nCisK Ky8vIEZJWCEhISBNaWNyb3NvZnQgdHlwZSBuYW1lcworI2RlZmluZSBCWVRFIHVpbnQ4X3QKKyNk ZWZpbmUgV09SRCB1aW50MTZfdAorI2RlZmluZSBEV09SRCB1aW50MzJfdAorI2RlZmluZSBRV09S RCB1aW50NjRfdAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IGRvc19oZWFkZXJf cworeworICAgIEJZVEUgU2lnbmF0dXJlWzJdOworICAgIEJZVEUgaGVhZGVyWzU4XTsKKyAgICBE V09SRCBwZV9oZWFkZXJfb2Zmc2V0OworfSBkb3NfaGVhZGVyX3Q7CisKKyNkZWZpbmUgSU1BR0Vf RklMRV9TSUdOQVRVUkVfMCAweDRECisjZGVmaW5lIElNQUdFX0ZJTEVfU0lHTkFUVVJFXzEgMHg1 QQorCit0eXBlZGVmIHN0cnVjdCBjb2ZmX2hlYWRlcl9zCit7CisgICAgRFdPUkQgU2lnbmF0dXJl OworICAgIFdPUkQgTWFjaGluZTsKKyAgICBXT1JEIE51bWJlck9mU2VjdGlvbnM7CisgICAgRFdP UkQgVGltZURhdGVTdGFtcDsKKyAgICBEV09SRCBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgICBE V09SRCBOdW1iZXJPZlN5bWJvbFRhYmxlOworICAgIFdPUkQgU2l6ZW9mT3B0aW9uYWxIZWFkZXI7 CisgICAgV09SRCBDaGFyYWN0ZXJpc3RpY3M7Cit9IGNvZmZfaGVhZGVyX3Q7CisKKyNkZWZpbmUg SU1BR0VfRklMRV9NQUNISU5FX1VOS05PV04gMHgwIC8vIFRoZSBjb250ZW50cyBvZiB0aGlzIGZp ZWxkIGFyZSBhc3N1bWVkIHRvIGJlIGFwcGxpY2FibGUgdG8gYW55IG1hY2hpbmUgdHlwZQorI2Rl ZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfQU0zMyAweDFkMyAvLyBNYXRzdXNoaXRhIEFNMzMKKyNk ZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FNRDY0IDB4ODY2NCAvLyB4NjQgCisjZGVmaW5lIElN QUdFX0ZJTEVfTUFDSElORV9BUk0gMHgxYzAgLy8gQVJNIGxpdHRsZSBlbmRpYW4KKyNkZWZpbmUg SU1BR0VfRklMRV9NQUNISU5FX0FSTTY0IDB4YWE2NCAvLyBBUk02NCBsaXR0bGUgZW5kaWFuCisj ZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9BUk1OVCAweDFjNCAvLyBBUk0gVGh1bWItMiBsaXR0 bGUgZW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9FQkMgMHhlYmMgLy8gRUZJIGJ5 dGUgY29kZQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NiAweDE0YyAvLyBJbnRlbCAz ODYgb3IgbGF0ZXIgcHJvY2Vzc29ycyBhbmQgY29tcGF0aWJsZSBwcm9jZXNzb3JzCisjZGVmaW5l IElNQUdFX0ZJTEVfTUFDSElORV9JQTY0IDB4MjAwIC8vIEludGVsIEl0YW5pdW0gcHJvY2Vzc29y IGZhbWlseQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfTTMyUiAweDkwNDEgLy8gTWl0c3Vi aXNoaSBNMzJSIGxpdHRsZSBlbmRpYW4KKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX01JUFMx NiAweDI2NiAvLyBNSVBTMTYKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUgMHgz NjYgLy8gTUlQUyB3aXRoIEZQVQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfTUlQU0ZQVTE2 IDB4NDY2IC8vIE1JUFMxNiB3aXRoIEZQVQorI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUE9X RVJQQyAweDFmMCAvLyBQb3dlciBQQyBsaXR0bGUgZW5kaWFuCisjZGVmaW5lIElNQUdFX0ZJTEVf TUFDSElORV9QT1dFUlBDRlAgMHgxZjEgLy8gUG93ZXIgUEMgd2l0aCBmbG9hdGluZyBwb2ludCBz dXBwb3J0CisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMCAweDE2NiAvLyBNSVBTIGxp dHRsZSBlbmRpYW4gCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SSVNDVjMyIDB4NTAzMiAv LyBSSVNDLVYgMzItYml0IGFkZHJlc3Mgc3BhY2UKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5F X1JJU0NWNjQgMHg1MDY0IC8vIFJJU0MtViA2NC1iaXQgYWRkcmVzcyBzcGFjZQorI2RlZmluZSBJ TUFHRV9GSUxFX01BQ0hJTkVfUklTQ1YxMjggMHg1MTI4IC8vIFJJU0MtViAxMjgtYml0IGFkZHJl c3Mgc3BhY2UKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1NIMyAweDFhMiAvLyBIaXRhY2hp IFNIMyAKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1NIM0RTUCAweDFhMyAvLyBIaXRhY2hp IFNIMyBEU1AgCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9TSDQgMHgxYTYgLy8gSGl0YWNo aSBTSDQgCisjZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9TSDUgMHgxYTggLy8gSGl0YWNoaSBT SDUKKyNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX1RIVU1CIDB4MWMyIC8vIFRodW1iCisjZGVm aW5lIElNQUdFX0ZJTEVfTUFDSElORV9XQ0VNSVBTVjIgMHgxNjkgLy8gTUlQUyBsaXR0bGUtZW5k aWFuIFdDRSB2MiAKKworI2RlZmluZSBJTUFHRV9GSUxFX1JFTE9DU19TVFJJUFBFRCAweDAwMDEg Ly8gSW1hZ2Ugb25seSwgV2luZG93cyBDRSwgYW5kIE1pY3Jvc29mdCBXaW5kb3dzIE5UIGFuZCBs YXRlci4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBjb250YWluIGJhc2Ug cmVsb2NhdGlvbnMgYW5kIG11c3QgdGhlcmVmb3JlIGJlIGxvYWRlZCBhdCBpdHMgcHJlZmVycmVk IGJhc2UgYWRkcmVzcy4gSWYgdGhlIGJhc2UgYWRkcmVzcyBpcyBub3QgYXZhaWxhYmxlLCB0aGUg bG9hZGVyIHJlcG9ydHMgYW4gZXJyb3IuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBsaW5r ZXIgaXMgdG8gc3RyaXAgYmFzZSByZWxvY2F0aW9ucyBmcm9tIGV4ZWN1dGFibGUgKEVYRSkgZmls ZXMuCisjZGVmaW5lIElNQUdFX0ZJTEVfRVhFQ1VUQUJMRV9JTUFHRSAweDAwMDIgLy8gSW1hZ2Ug b25seS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgZmlsZSBpcyB2YWxpZCBhbmQgY2Fu IGJlIHJ1bi4gSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIGl0IGluZGljYXRlcyBhIGxpbmtlciBl cnJvci4gIAorI2RlZmluZSBJTUFHRV9GSUxFX0xJTkVfTlVNU19TVFJJUFBFRCAweDAwMDQgLy8g Q09GRiBsaW5lIG51bWJlcnMgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoaXMgZmxhZyBpcyBkZXByZWNh dGVkIGFuZCBzaG91bGQgYmUgemVyby4KKyNkZWZpbmUgSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NU UklQUEVEIDB4MDAwOCAvLyBDT0ZGIHN5bWJvbCB0YWJsZSBlbnRyaWVzIGZvciBsb2NhbCBzeW1i b2xzIGhhdmUgYmVlbiByZW1vdmVkLiBUaGlzIGZsYWcgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxk IGJlIHplcm8uCisjZGVmaW5lIElNQUdFX0ZJTEVfQUdHUkVTU0lWRV9XU19UUklNIDB4MDAxMCAv LyBPYnNvbGV0ZS4gQWdncmVzc2l2ZWx5IHRyaW0gd29ya2luZyBzZXQuIFRoaXMgZmxhZyBpcyBk ZXByZWNhdGVkIGZvciBXaW5kb3dzIDIwMDAgYW5kIGxhdGVyIGFuZCBtdXN0IGJlIHplcm8uCisj ZGVmaW5lIElNQUdFX0ZJTEVfTEFSR0VfQUREUkVTU19BV0FSRSAweDAwMjAgLy8gQXBwbGljYXRp b24gY2FuIGhhbmRsZSA+IDItR0IgYWRkcmVzc2VzLgorLy8jZGVmaW5lIDB4MDA0MCBUaGlzIGZs YWcgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisjZGVmaW5lIElNQUdFX0ZJTEVfQllURVNf UkVWRVJTRURfTE8gMHgwMDgwIC8vIExpdHRsZSBlbmRpYW46IHRoZSBsZWFzdCBzaWduaWZpY2Fu dCBiaXQgKExTQikgcHJlY2VkZXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChNU0IpIGluIG1l bW9yeS4gVGhpcyBmbGFnIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSB6ZXJvLgorI2RlZmlu ZSBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgMHgwMTAwIC8vIE1hY2hpbmUgaXMgYmFzZWQgb24g YSAzMi1iaXQtd29yZCBhcmNoaXRlY3R1cmUuICAKKyNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19T VFJJUFBFRCAweDAyMDAgLy8gRGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHJlbW92ZWQgZnJvbSB0 aGUgaW1hZ2UgZmlsZS4KKyNkZWZpbmUgSU1BR0VfRklMRV9SRU1PVkFCTEVfUlVOX0ZST01fU1dB UCAweDA0MDAgLy8gSWYgdGhlIGltYWdlIGlzIG9uIHJlbW92YWJsZSBtZWRpYSwgZnVsbHkgbG9h ZCBpdCBhbmQgY29weSBpdCB0byB0aGUgc3dhcCBmaWxlLgorI2RlZmluZSBJTUFHRV9GSUxFX05F VF9SVU5fRlJPTV9TV0FQIDB4MDgwMCAvLyBJZiB0aGUgaW1hZ2UgaXMgb24gbmV0d29yayBtZWRp YSwgZnVsbHkgbG9hZCBpdCBhbmQgY29weSBpdCB0byB0aGUgc3dhcCBmaWxlLgorI2RlZmluZSBJ TUFHRV9GSUxFX1NZU1RFTSAweDEwMDAgLy8gVGhlIGltYWdlIGZpbGUgaXMgYSBzeXN0ZW0gZmls ZSwgbm90IGEgdXNlciBwcm9ncmFtLgorI2RlZmluZSBJTUFHRV9GSUxFX0RMTCAweDIwMDAgLy8g VGhlIGltYWdlIGZpbGUgaXMgYSBkeW5hbWljLWxpbmsgbGlicmFyeSAoRExMKS4gU3VjaCBmaWxl cyBhcmUgY29uc2lkZXJlZCBleGVjdXRhYmxlIGZpbGVzIGZvciBhbG1vc3QgYWxsIHB1cnBvc2Vz LCBhbHRob3VnaCB0aGV5IGNhbm5vdCBiZSBkaXJlY3RseSBydW4uCisjZGVmaW5lIElNQUdFX0ZJ TEVfVVBfU1lTVEVNX09OTFkgMHg0MDAwIC8vIFRoZSBmaWxlIHNob3VsZCBiZSBydW4gb25seSBv biBhIHVuaXByb2Nlc3NvciBtYWNoaW5lLgorI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVS U0VEX0hJIDB4ODAwMCAvLyBCaWcgZW5kaWFuOiB0aGUgTVNCIHByZWNlZGVzIHRoZSBMU0IgaW4g bWVtb3J5LiBUaGlzIGZsYWcgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIHplcm8uIAorCit0 eXBlZGVmIHN0cnVjdCBjb2ZmX2ZpZWxkc19zCit7CisgICAgV09SRCBNYWdpYzsKKyAgICBCWVRF IE1ham9yTGlua2VyVmVyc2lvbjsKKyAgICBCWVRFIE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgICBE V09SRCBTaXplT2ZDb2RlOworICAgIERXT1JEIFNpemVPZkluaXRpYWxpemVkRGF0YTsKKyAgICBE V09SRCBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgICBEV09SRCBBZGRyZXNzT2ZFbnRyeVBv aW50OworICAgIERXT1JEIEJhc2VPZkNvZGU7Cit9IGNvZmZfZmllbGRzX3Q7CisKKyNkZWZpbmUg SU1BR0VfTUFHSUNfUEUzMiAweDEwYgorI2RlZmluZSBJTUFHRV9NQUdJQ19QRTMyUExVUyAweDIw YgorCit0eXBlZGVmIHN0cnVjdCBwZTMyX2NvZmZfZmllbGRzX3MKK3sKKyAgICBEV09SRCBCYXNl T2ZEYXRhOworICAgIERXT1JEIEltYWdlQmFzZTsKKyAgICBEV09SRCBTZWN0aW9uQWxpZ25tZW50 OworICAgIERXT1JEIEZpbGVBbGlnbm1lbnQ7CisgICAgV09SRCBNYWpvck9wZXJhdGluZ1N5c3Rl bVZlcnNpb247CisgICAgV09SRCBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgICAgV09S RCBNYWpvckltYWdlVmVyc2lvbjsKKyAgICBXT1JEIE1pbm9ySW1hZ2VWZXJzaW9uOworICAgIFdP UkQgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOworICAgIFdPUkQgTWlub3JTdWJzeXN0ZW1WZXJzaW9u OworICAgIERXT1JEIFdpbjMyVmVyc2lvblZhbHVlOworICAgIERXT1JEIFNpemVPZkltYWdlOwor ICAgIERXT1JEIFNpemVPZkhlYWRlcnM7CisgICAgRFdPUkQgQ2hlY2tTdW07CisgICAgV09SRCBT dWJzeXN0ZW07CisgICAgV09SRCBEbGxDaGFyYWN0ZXJpc3RpY3M7CisgICAgRFdPUkQgU2l6ZU9m U3RhY2tSZXNlcnZlOworICAgIERXT1JEIFNpemVPZlN0YWNrQ29tbWl0OworICAgIERXT1JEIFNp emVPZkhlYXBSZXNlcnZlOworICAgIERXT1JEIFNpemVPZkhlYXBDb21taXQ7CisgICAgRFdPUkQg TG9hZGVyRmxhZ3M7CisgICAgRFdPUkQgTnVtYmVyT2ZSdmFBbmRTaXplczsKK30gcGUzMl9jb2Zm X2ZpZWxkc190OworCit0eXBlZGVmIHN0cnVjdCBwZTMycGx1c19jb2ZmX2ZpZWxkc19zCit7Cisg ICAgUVdPUkQgSW1hZ2VCYXNlOworICAgIERXT1JEIFNlY3Rpb25BbGlnbm1lbnQ7CisgICAgRFdP UkQgRmlsZUFsaWdubWVudDsKKyAgICBXT1JEIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsK KyAgICBXT1JEIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgICBXT1JEIE1ham9ySW1h Z2VWZXJzaW9uOworICAgIFdPUkQgTWlub3JJbWFnZVZlcnNpb247CisgICAgV09SRCBNYWpvclN1 YnN5c3RlbVZlcnNpb247CisgICAgV09SRCBNaW5vclN1YnN5c3RlbVZlcnNpb247CisgICAgRFdP UkQgV2luMzJWZXJzaW9uVmFsdWU7CisgICAgRFdPUkQgU2l6ZU9mSW1hZ2U7CisgICAgRFdPUkQg U2l6ZU9mSGVhZGVyczsKKyAgICBEV09SRCBDaGVja1N1bTsKKyAgICBXT1JEIFN1YnN5c3RlbTsK KyAgICBXT1JEIERsbENoYXJhY3RlcmlzdGljczsKKyAgICBRV09SRCBTaXplT2ZTdGFja1Jlc2Vy dmU7CisgICAgUVdPUkQgU2l6ZU9mU3RhY2tDb21taXQ7CisgICAgUVdPUkQgU2l6ZU9mSGVhcFJl c2VydmU7CisgICAgUVdPUkQgU2l6ZU9mSGVhcENvbW1pdDsKKyAgICBEV09SRCBMb2FkZXJGbGFn czsKKyAgICBEV09SRCBOdW1iZXJPZlJ2YUFuZFNpemVzOworfSBwZTMycGx1c19jb2ZmX2ZpZWxk c190OworCit0eXBlZGVmIHVuaW9uIHBlX2NvZmZfZmllbGRzX3UKK3sKKyAgICBwZTMyX2NvZmZf ZmllbGRzX3QgcGUzMjsKKyAgICBwZTMycGx1c19jb2ZmX2ZpZWxkc190IHBlMzJwbHVzOworfSBw ZV9jb2ZmX2ZpZWxkc190OworCisjZGVmaW5lIElNQUdFX1NVQlNZU1RFTV9VTktOT1dOIDAgLy8g QW4gdW5rbm93biBzdWJzeXN0ZW0KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX05BVElWRSAxIC8v IERldmljZSBkcml2ZXJzIGFuZCBuYXRpdmUgV2luZG93cyBwcm9jZXNzZXMKKyNkZWZpbmUgSU1B R0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJIDIgLy8gVGhlIFdpbmRvd3MgZ3JhcGhpY2FsIHVzZXIg aW50ZXJmYWNlIChHVUkpIHN1YnN5c3RlbQorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fV0lORE9X U19DVUkgMyAvLyBUaGUgV2luZG93cyBjaGFyYWN0ZXIgc3Vic3lzdGVtCisjZGVmaW5lIElNQUdF X1NVQlNZU1RFTV9PUzJfQ1VJIDUgLy8gVGhlIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbQorI2Rl ZmluZSBJTUFHRV9TVUJTWVNURU1fUE9TSVhfQ1VJIDcgLy8gVGhlIFBvc2l4IGNoYXJhY3RlciBz dWJzeXN0ZW0KKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX05BVElWRV9XSU5ET1dTIDggLy8gTmF0 aXZlIFdpbjl4IGRyaXZlciAKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ0VfR1VJ IDkgLy8gV2luZG93cyBDRSAKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX0VGSV9BUFBMSUNBVElP TiAxMCAvLyBBbiBFeHRlbnNpYmxlIEZpcm13YXJlIEludGVyZmFjZSAoRUZJKSBhcHBsaWNhdGlv bgorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fRUZJX0JPT1RfU0VSVklDRV9EUklWRVIgMTEgLy8g QW4gRUZJIGRyaXZlciB3aXRoIGJvb3Qgc2VydmljZXMKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVN X0VGSV9SVU5USU1FX0RSSVZFUiAxMiAvLyBBbiBFRkkgZHJpdmVyIHdpdGggcnVuLXRpbWUgc2Vy dmljZXMKKyNkZWZpbmUgSU1BR0VfU1VCU1lTVEVNX0VGSV9ST00gMTMgLy8gQW4gRUZJIFJPTSBp bWFnZQorI2RlZmluZSBJTUFHRV9TVUJTWVNURU1fWEJPWCAxNCAvLyBYQk9YCisjZGVmaW5lIElN QUdFX1NVQlNZU1RFTV9XSU5ET1dTX0JPT1RfQVBQTElDQVRJT04gMTYgLy8gV2luZG93cyBib290 IGFwcGxpY2F0aW9uLiAKKworLy8gMHgwMDAxIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCisvLyAw eDAwMDIgUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKy8vIDB4MDAwNCBSZXNlcnZlZCwgbXVzdCBi ZSB6ZXJvLiAKKy8vIDB4MDAwOCBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLgorI2RlZmluZSBJTUFH RV9ETExDSEFSQUNURVJJU1RJQ1NfSElHSF9FTlRST1BZX1ZBIDB4MDAyMCAvLyBJbWFnZSBjYW4g aGFuZGxlIGEgaGlnaCBlbnRyb3B5IDY0LWJpdCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisjZGVm aW5lIElNQUdFX0RMTENIQVJBQ1RFUklTVElDU19EWU5BTUlDX0JBU0UgMHgwMDQwIC8vIERMTCBj YW4gYmUgcmVsb2NhdGVkIGF0IGxvYWQgdGltZS4KKyNkZWZpbmUgSU1BR0VfRExMQ0hBUkFDVEVS SVNUSUNTX0ZPUkNFX0lOVEVHUklUWSAweDAwODAgLy8gQ29kZSBJbnRlZ3JpdHkgY2hlY2tzIGFy ZSBlbmZvcmNlZC4KKyNkZWZpbmUgSU1BR0VfRExMQ0hBUkFDVEVSSVNUSUNTX05YX0NPTVBBVCAw eDAxMDAgLy8gSW1hZ2UgaXMgTlggY29tcGF0aWJsZS4KKyNkZWZpbmUgSU1BR0VfRExMQ0hBUkFD VEVSSVNUSUNTX05PX0lTT0xBVElPTiAweDAyMDAgLy8gSXNvbGF0aW9uIGF3YXJlLCBidXQgZG8g bm90IGlzb2xhdGUgdGhlIGltYWdlLiAKKyNkZWZpbmUgSU1BR0VfRExMQ0hBUkFDVEVSSVNUSUNT X05PX1NFSCAweDA0MDAgLy8gRG9lcyBub3QgdXNlIHN0cnVjdHVyZWQgZXhjZXB0aW9uIChTRSkg aGFuZGxpbmcuIE5vIFNFIGhhbmRsZXIgbWF5IGJlIGNhbGxlZCBpbiB0aGlzIGltYWdlLgorI2Rl ZmluZSBJTUFHRV9ETExDSEFSQUNURVJJU1RJQ1NfTk9fQklORCAweDA4MDAgLy8gRG8gbm90IGJp bmQgdGhlIGltYWdlLgorI2RlZmluZSBJTUFHRV9ETExDSEFSQUNURVJJU1RJQ1NfUFBDT05UQUlO RVIgMHgxMDAwIC8vIEltYWdlIG11c3QgZXhlY3V0ZSBpbiBhbiBBcHBDb250YWluZXIuCisjZGVm aW5lIElNQUdFX0RMTENIQVJBQ1RFUklTVElDU19XRE1fRFJJVkVSIDB4MjAwMCAvLyBBIFdETSBk cml2ZXIuCisjZGVmaW5lIElNQUdFX0RMTENIQVJBQ1RFUklTVElDU19HVUFSRF9DRiAweDQwMDAg Ly8gSW1hZ2Ugc3VwcG9ydHMgQ29udHJvbCBGbG93IEd1YXJkLgorI2RlZmluZSBJTUFHRV9ETExD SEFSQUNURVJJU1RJQ1NfVEVSTUlOQUxfU0VSVkVSX0FXQVJFIDB4ODAwMCAvLyBUZXJtaW5hbCBT ZXJ2ZXIgYXdhcmUuIAorCit0eXBlZGVmIHN0cnVjdCBkYXRhX2RpcmVjdG9yeV9lbnRyeV9zCit7 CisgICAgRFdPUkQgVmlydHVhbEFkZHJlc3M7CisgICAgRFdPUkQgU2l6ZTsKK30gZGF0YV9kaXJl Y3RvcnlfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfZGF0YV9kaXJlY3Rvcnlfcwor eworICAgIGRhdGFfZGlyZWN0b3J5X2VudHJ5X3QgRXhwb3J0VGFibGU7CisgICAgZGF0YV9kaXJl Y3RvcnlfZW50cnlfdCBJbXBvcnRUYWJsZTsKKyAgICBkYXRhX2RpcmVjdG9yeV9lbnRyeV90IFJl c291cmNlVGFibGU7CisgICAgZGF0YV9kaXJlY3RvcnlfZW50cnlfdCBFeGNlcHRpb25UYWJsZTsK KyAgICBkYXRhX2RpcmVjdG9yeV9lbnRyeV90IENlcnRpZmljYXRlVGFibGU7CisgICAgZGF0YV9k aXJlY3RvcnlfZW50cnlfdCBCYXNlUmVsb2NhdGlvblRhYmxlOworICAgIGRhdGFfZGlyZWN0b3J5 X2VudHJ5X3QgRGVidWc7CisgICAgZGF0YV9kaXJlY3RvcnlfZW50cnlfdCBBcmNoaXRlY3R1cmU7 CisgICAgZGF0YV9kaXJlY3RvcnlfZW50cnlfdCBHbG9iYWxQdHI7CisgICAgZGF0YV9kaXJlY3Rv cnlfZW50cnlfdCBUTFNUYWJsZTsKKyAgICBkYXRhX2RpcmVjdG9yeV9lbnRyeV90IExvYWRDb25m aWdUYWJsZTsKKyAgICBkYXRhX2RpcmVjdG9yeV9lbnRyeV90IEJvdW5kSW1wb3J0OworICAgIGRh dGFfZGlyZWN0b3J5X2VudHJ5X3QgSW1wb3J0QWRkcmVzc1RhYmxlOworICAgIGRhdGFfZGlyZWN0 b3J5X2VudHJ5X3QgRGVsYXlJbXBvcnREZXNjcmlwdG9yOworICAgIGRhdGFfZGlyZWN0b3J5X2Vu dHJ5X3QgQ0xSUnVudGltZUhlYWRlcjsKKyAgICBkYXRhX2RpcmVjdG9yeV9lbnRyeV90IFJlc2Vy dmVkOworfSBpbWFnZV9kYXRhX2RpcmVjdG9yeV90OworCit0eXBlZGVmIHN0cnVjdCBwZWNvZmZf c2VjdGlvbl9zCit7CisgICAgQllURSBOYW1lWzhdOworICAgIERXT1JEIFZpcnR1YWxTaXplOwor ICAgIERXT1JEIFZpcnR1YWxBZGRyZXNzOworICAgIERXT1JEIFNpemVPZlJhd0RhdGE7CisgICAg RFdPUkQgUG9pbnRlclRvUmF3RGF0YTsKKyAgICBEV09SRCBQb2ludGVyVG9SZWxvY2F0aW9uczsK KyAgICBEV09SRCBQb2ludGVyVG9MaW5lbnVtYmVyczsKKyAgICBXT1JEIE51bWJlck9mUmVsb2Nh dGlvbnM7CisgICAgV09SRCBOdW1iZXJPZkxpbmVudW1iZXJzOworICAgIERXT1JEIENoYXJhY3Rl cmlzdGljczsKK30gcGVjb2ZmX3NlY3Rpb25fdDsKKworLy8gMHgwMDAwMDAwMCBSZXNlcnZlZCBm b3IgZnV0dXJlIHVzZS4KKy8vIDB4MDAwMDAwMDEgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisv LyAweDAwMDAwMDAyIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorLy8gMHgwMDAwMDAwNCBSZXNl cnZlZCBmb3IgZnV0dXJlIHVzZS4KKyNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEIDB4MDAw MDAwMDggLy8gVGhlIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBwYWRkZWQgdG8gdGhlIG5leHQgYm91 bmRhcnkuIFRoaXMgZmxhZyBpcyBvYnNvbGV0ZSBhbmQgaXMgcmVwbGFjZWQgYnkgSU1BR0VfU0NO X0FMSUdOXzFCWVRFUy4gVGhpcyBpcyB2YWxpZCBvbmx5IGZvciBvYmplY3QgZmlsZXMuCisvLyAw eDAwMDAwMDEwIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgCisjZGVmaW5lIElNQUdFX1NDTl9D TlRfQ09ERSAweDAwMDAwMDIwIC8vIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGV4ZWN1dGFibGUgY29k ZS4KKyNkZWZpbmUgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBIDB4MDAwMDAwNDAgLy8g VGhlIHNlY3Rpb24gY29udGFpbnMgaW5pdGlhbGl6ZWQgZGF0YS4KKyNkZWZpbmUgSU1BR0VfU0NO X0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgMHgwMDAwMDA4MCAvLyBUaGUgc2VjdGlvbiBjb250YWlu cyB1bmluaXRpYWxpemVkIGRhdGEuCisjZGVmaW5lIElNQUdFX1NDTl9MTktfT1RIRVIgMHgwMDAw MDEwMCAvLyBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19J TkZPIDB4MDAwMDAyMDAgLy8gVGhlIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgb3Igb3RoZXIg aW5mb3JtYXRpb24uIFRoZSAuZHJlY3R2ZSBzZWN0aW9uIGhhcyB0aGlzIHR5cGUuIFRoaXMgaXMg dmFsaWQgZm9yIG9iamVjdCBmaWxlcyBvbmx5LgorLy8gMHgwMDAwMDQwMCBSZXNlcnZlZCBmb3Ig ZnV0dXJlIHVzZS4gIAorI2RlZmluZSBJTUFHRV9TQ05fTE5LX1JFTU9WRSAweDAwMDAwODAwIC8v IFRoZSBzZWN0aW9uIHdpbGwgbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBpbWFnZS4gVGhpcyBpcyB2 YWxpZCBvbmx5IGZvciBvYmplY3QgZmlsZXMuCisjZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFU IDB4MDAwMDEwMDAgLy8gVGhlIHNlY3Rpb24gY29udGFpbnMgQ09NREFUIGRhdGEuIEZvciBtb3Jl IGluZm9ybWF0aW9uLCBzZWUgQ09NREFUIFNlY3Rpb25zIChPYmplY3QgT25seSkuIFRoaXMgaXMg dmFsaWQgb25seSBmb3Igb2JqZWN0IGZpbGVzLgorI2RlZmluZSBJTUFHRV9TQ05fR1BSRUwgMHgw MDAwODAwMCAvLyBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHJlZmVyZW5jZWQgdGhyb3VnaCB0 aGUgZ2xvYmFsIHBvaW50ZXIgKEdQKS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9QVVJHRUFCTEUg MHgwMDAyMDAwMCAvLyBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyNkZWZpbmUgSU1BR0VfU0NO X01FTV8xNkJJVCAweDAwMDIwMDAwIC8vIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorI2RlZmlu ZSBJTUFHRV9TQ05fTUVNX0xPQ0tFRCAweDAwMDQwMDAwIC8vIFJlc2VydmVkIGZvciBmdXR1cmUg dXNlLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1BSRUxPQUQgMHgwMDA4MDAwMCAvLyBSZXNlcnZl ZCBmb3IgZnV0dXJlIHVzZS4gIAorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTIDB4MDAx MDAwMDAgLy8gQWxpZ24gZGF0YSBvbiBhIDEtYnl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Ig b2JqZWN0IGZpbGVzLgorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMkJZVEVTIDB4MDAyMDAwMDAg Ly8gQWxpZ24gZGF0YSBvbiBhIDItYnl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Igb2JqZWN0 IGZpbGVzLgorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTIDB4MDAzMDAwMDAgLy8gQWxp Z24gZGF0YSBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Igb2JqZWN0IGZpbGVz LgorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fOEJZVEVTIDB4MDA0MDAwMDAgLy8gQWxpZ24gZGF0 YSBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIFZhbGlkIG9ubHkgZm9yIG9iamVjdCBmaWxlcy4KKyNk ZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgMHgwMDUwMDAwMCAvLyBBbGlnbiBkYXRhIG9u IGEgMTYtYnl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Igb2JqZWN0IGZpbGVzLgorI2RlZmlu ZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAweDAwNjAwMDAwIC8vIEFsaWduIGRhdGEgb24gYSAz Mi1ieXRlIGJvdW5kYXJ5LiBWYWxpZCBvbmx5IGZvciBvYmplY3QgZmlsZXMuCisjZGVmaW5lIElN QUdFX1NDTl9BTElHTl82NEJZVEVTIDB4MDA3MDAwMDAgLy8gQWxpZ24gZGF0YSBvbiBhIDY0LWJ5 dGUgYm91bmRhcnkuIFZhbGlkIG9ubHkgZm9yIG9iamVjdCBmaWxlcy4gIAorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fMTI4QllURVMgMHgwMDgwMDAwMCAvLyBBbGlnbiBkYXRhIG9uIGEgMTI4LWJ5 dGUgYm91bmRhcnkuIFZhbGlkIG9ubHkgZm9yIG9iamVjdCBmaWxlcy4gIAorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fMjU2QllURVMgMHgwMDkwMDAwMCAvLyBBbGlnbiBkYXRhIG9uIGEgMjU2LWJ5 dGUgYm91bmRhcnkuIFZhbGlkIG9ubHkgZm9yIG9iamVjdCBmaWxlcy4gIAorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fNTEyQllURVMgMHgwMEEwMDAwMCAvLyBBbGlnbiBkYXRhIG9uIGEgNTEyLWJ5 dGUgYm91bmRhcnkuIFZhbGlkIG9ubHkgZm9yIG9iamVjdCBmaWxlcy4gIAorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fMTAyNEJZVEVTIDB4MDBCMDAwMDAgLy8gQWxpZ24gZGF0YSBvbiBhIDEwMjQt Ynl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Igb2JqZWN0IGZpbGVzLgorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fMjA0OEJZVEVTIDB4MDBDMDAwMDAgLy8gQWxpZ24gZGF0YSBvbiBhIDIwNDgt Ynl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Igb2JqZWN0IGZpbGVzLgorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fNDA5NkJZVEVTIDB4MDBEMDAwMDAgLy8gQWxpZ24gZGF0YSBvbiBhIDQwOTYt Ynl0ZSBib3VuZGFyeS4gVmFsaWQgb25seSBmb3Igb2JqZWN0IGZpbGVzLgorI2RlZmluZSBJTUFH RV9TQ05fQUxJR05fODE5MkJZVEVTIDB4MDBFMDAwMDAgLy8gQWxpZ24gZGF0YSBvbiBhbiA4MTky LWJ5dGUgYm91bmRhcnkuIFZhbGlkIG9ubHkgZm9yIG9iamVjdCBmaWxlcy4KKyNkZWZpbmUgSU1B R0VfU0NOX0xOS19OUkVMT0NfT1ZGTCAweDAxMDAwMDAwIC8vIFRoZSBzZWN0aW9uIGNvbnRhaW5z IGV4dGVuZGVkIHJlbG9jYXRpb25zLgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxF IDB4MDIwMDAwMDAgLy8gVGhlIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZCBhcyBuZWVkZWQuCisj ZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAweDA0MDAwMDAwIC8vIFRoZSBzZWN0aW9u IGNhbm5vdCBiZSBjYWNoZWQuCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX1BBR0VEIDB4MDgw MDAwMDAgLy8gVGhlIHNlY3Rpb24gaXMgbm90IHBhZ2VhYmxlLgorI2RlZmluZSBJTUFHRV9TQ05f TUVNX1NIQVJFRCAweDEwMDAwMDAwIC8vIFRoZSBzZWN0aW9uIGNhbiBiZSBzaGFyZWQgaW4gbWVt b3J5LgorI2RlZmluZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgMHgyMDAwMDAwMCAvLyBUaGUgc2Vj dGlvbiBjYW4gYmUgZXhlY3V0ZWQgYXMgY29kZS4KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFE IDB4NDAwMDAwMDAgLy8gVGhlIHNlY3Rpb24gY2FuIGJlIHJlYWQuCisjZGVmaW5lIElNQUdFX1ND Tl9NRU1fV1JJVEUgMHg4MDAwMDAwMCAvLyBUaGUgc2VjdGlvbiBjYW4gYmUgd3JpdHRlbiB0by4g CisKK3R5cGVkZWYgc3RydWN0IGF0dHJpYnV0ZV9jZXJ0aWZpY2F0ZV9zCit7CisgICAgRFdPUkQg ZHdMZW5ndGg7CisgICAgV09SRCB3UmV2aXNpb247CisgICAgV09SRCB3Q2VydGlmaWNhdGVUeXBl OworfSBhdHRyaWJ1dGVfY2VydGlmaWNhdGVfdDsKKworI2RlZmluZSBXSU5fQ0VSVF9SRVZJU0lP Tl8xXzAgMHgwMTAwIC8vIFZlcnNpb24gMSwgbGVnYWN5IHZlcnNpb24gb2YgdGhlIFdpbl9DZXJ0 aWZpY2F0ZSBzdHJ1Y3R1cmUuIEl0IGlzIHN1cHBvcnRlZCBvbmx5IGZvciBwdXJwb3NlcyBvZiB2 ZXJpZnlpbmcgbGVnYWN5IEF1dGhlbnRpY29kZSBzaWduYXR1cmVzCisjZGVmaW5lIFdJTl9DRVJU X1JFVklTSU9OXzJfMCAweDAyMDAgLy8gVmVyc2lvbiAyIGlzIHRoZSBjdXJyZW50IHZlcnNpb24g b2YgdGhlIFdpbl9DZXJ0aWZpY2F0ZSBzdHJ1Y3R1cmUuCisKKyNkZWZpbmUgV0lOX0NFUlRfVFlQ RV9YNTA5IDB4MDAwMSAvLyBiQ2VydGlmaWNhdGUgY29udGFpbnMgYW4gWC41MDkgQ2VydGlmaWNh dGUgTm90IFN1cHBvcnRlZAorI2RlZmluZSBXSU5fQ0VSVF9UWVBFX1BLQ1NfU0lHTkVEX0RBVEEg MHgwMDAyIC8vIGJDZXJ0aWZpY2F0ZSBjb250YWlucyBhIFBLQ1MjNyBTaWduZWREYXRhIHN0cnVj dHVyZQorI2RlZmluZSBXSU5fQ0VSVF9UWVBFX1JFU0VSVkVEXzEgMHgwMDAzIC8vIFJlc2VydmVk CisjZGVmaW5lIFdJTl9DRVJUX1RZUEVfVFNfU1RBQ0tfU0lHTkVEIDB4MDAwNCAvLyBUZXJtaW5h bCBTZXJ2ZXIgUHJvdG9jb2wgU3RhY2sgQ2VydGlmaWNhdGUgc2lnbmluZyBOb3QgU3VwcG9ydGVk CisKKworCisjZGVmaW5lIFBFX0NPRkZfSU1BR0UgMHgwMDAwNDU1MCAvLyAuLkVQIChvciBQRS4u IGluIEVCKQorCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3BlZC5jIGIveGVuL2NvbW1vbi9wZWQu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRiOTcxCi0tLSAvZGV2L251 bGwKKysrIGIveGVuL2NvbW1vbi9wZWQuYwpAQCAtMCwwICsxLDU3OSBAQAorCisjaWZuZGVmIF9f WEVOX18KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUg PHN5cy90eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx4ZW4vbGliLmg+CisjZW5kaWYKKworI2lu Y2x1ZGUgImRsY2wuaCIKKworLy8gZ29vZ2xlIG1pY3Jvc29mdCBwZWNvZmYgZm9ybWF0CisvLyB3 aWtpIG1pY3Jvc29mdCBwZWNvZmYgZm9ybWF0CisjaW5jbHVkZSAicGVkLmgiCisKKy8vIEZJWCEh ISBzZWUgZGlzY3Vzc2lvbiB3cnQvIHR5cGVvZigpCisjZGVmaW5lIG1pbihBLEIpICgoKEEpPChC KSkgPyAoQSkgOiAoQikpCisjZGVmaW5lIG1heChBLEIpICgoKEEpPihCKSkgPyAoQSkgOiAoQikp CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTEFCRUwgIiUzNXM6ICIKKyNkZWZpbmUgQ0hLRFVN UChmaWVsZCwgdmFsdWUpIFBSSU5USyhMQUJFTCAiMHglMDJYICVjICVkXG4iLCBmaWVsZCwgdmFs dWUsICh2YWx1ZSA+PSAnICcgJiYgdmFsdWUgPD0gJ34nKSA/IHZhbHVlIDogJy4nLCB2YWx1ZSkK KyNkZWZpbmUgRklFTERfQihmaWVsZCwgdmFsdWUpIFBSSU5USyhMQUJFTCAiMHglMDJYICVjICVk XG4iLCAjZmllbGQsIHZhbHVlLCAodmFsdWUgPj0gJyAnICYmIHZhbHVlIDw9ICd+JykgPyB2YWx1 ZSA6ICcuJywgdmFsdWUpCisjZGVmaW5lIEZJRUxEX1coZmllbGQsIHZhbHVlKSBQUklOVEsoTEFC RUwgIjB4JTA0WFxuIiwgI2ZpZWxkLCB2YWx1ZSkKKyNkZWZpbmUgRklFTERfRChmaWVsZCwgdmFs dWUpIFBSSU5USyhMQUJFTCAiMHglMDhYXG4iLCAjZmllbGQsIHZhbHVlKQorI2RlZmluZSBGSUVM RF9RKGZpZWxkLCB2YWx1ZSkgUFJJTlRLKExBQkVMICIweCUwMTZsbFhcbiIsICNmaWVsZCwgKHVu c2lnbmVkIGxvbmcgbG9uZyl2YWx1ZSkKKworI2RlZmluZSBDSEtCSVQodmFyLCBiaXQpIGlmICgo dmFyKSAgJiAoYml0KSkgQ0hLRFVNUCgjYml0LCBiaXQpCisjZGVmaW5lIENIS0RFRih2YXIsIGRl ZikgaWYgKCh2YXIpID09IChkZWYpKSBDSEtEVU1QKCNkZWYsIGRlZikKKworLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5l IHhPRkZTRVRfT0YoVFlQRSwgTUVNQkVSKSB7IG9mZnNldF90IG87IFRZUEUgKnAgPSAoVFlQRSAq KTA7IG8gPSAoJnAtPk1FTUJFUiAtIHApOyBvOyB9CisjZGVmaW5lIE9GRlNFVF9PRihQVFIsIE1F TUJFUikgKCgoQllURSAqKSZQVFItPk1FTUJFUikgLSAoKEJZVEUgKilQVFIpKQorCisvKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovCityYW5nZV90ICoKK3BlY29mZl9hcHBlbmRfcmFuZ2UgKHBlY29mZl9pbWFnZV90ICpw ZSwgRFdPUkQgb2Zmc2V0LCBEV09SRCBsZW5ndGgsIEJZVEUgKmRhdGEsIGNvbnN0IGNoYXIgKmRl c2NyaXB0aW9uKQoreworICAgIHJhbmdlX3QgKnJhbmdlID0gTlVMTDsKKy8vUFJJTlRLKCJSQU5H RSAlNnUgJTZ1ICVzXG4iLCBvZmZzZXQsIGxlbmd0aCwgZGVzY3JpcHRpb24pOworICAgIGlmIChs ZW5ndGgpCisgICAgeworICAgICAgICByYW5nZSA9IHpzYWxsb2MocmFuZ2VfdCk7CisgICAgICAg IHJhbmdlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJhbmdlLT5sZW5ndGggPSBsZW5ndGg7 CisgICAgICAgIHJhbmdlLT5kYXRhID0gZGF0YTsKKyAgICAgICAgcmFuZ2UtPmRlc2NyaXB0aW9u ID0gZGVzY3JpcHRpb247CisgICAgICAgIERMQ0xfQVBQRU5EKHJhbmdlX3QsIHBlLT5yYW5nZXMs IHJhbmdlKTsKKyAgICB9CisgICAgcmV0dXJuIHJhbmdlOworfQorCisvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitw ZWNvZmZfaW1hZ2VfdCAqCitwZWNvZmZfaW1hZ2VfYWxsb2MgKHVpbnQ4X3QgKmltYWdlQmFzZSwg c2l6ZV90IGltYWdlU2l6ZSkKK3sKKyAgICBwZWNvZmZfaW1hZ2VfdCAqcGUgPSB6c2FsbG9jKHBl Y29mZl9pbWFnZV90KTsKKyAgICBpZiAocGUpCisgICAgeworICAgICAgICBwZS0+aW1hZ2VCYXNl ID0gaW1hZ2VCYXNlOworICAgICAgICBwZS0+aW1hZ2VTaXplID0gaW1hZ2VTaXplOworICAgIH0K KyAgICByZXR1cm4gcGU7Cit9CisKK3ZvaWQKK3BlY29mZl9pbWFnZV9mcmVlIChwZWNvZmZfaW1h Z2VfdCAqcGUpCit7CisgICAgaWYgKHBlKQorICAgIHsKKyAgICAgICAgcmFuZ2VfdCAqcmFuZ2U7 CisgICAgICAgIERMQ0xfRk9SX0VBQ0gocmFuZ2VfdCwgcGUtPnJhbmdlcywgcmFuZ2UsIG5leHQs IHByZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIERMQ0xfUkVNT1ZFKHJhbmdlX3QsIHBlLT5y YW5nZXMsIHJhbmdlKTsKKyAgICAgICAgICAgIHpzZnJlZShyYW5nZSk7CisgICAgICAgICAgICAv LyBGSVghISEgYWNjZXNzaW5nIHJhbmdlLT5uZXh0IGFmdGVyIGZyZWUoKQorICAgICAgICB9Cisg ICAgICAgIHpzZnJlZShwZSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9p ZCAqCitwZV9tYWtlX3BvaW50ZXIgKHBlY29mZl9pbWFnZV90ICpwZSwgc2l6ZV90IHNpemUpCit7 CisgICAgdm9pZCAqcCA9IE5VTEw7CisKKyAgICBpZiAoKHBlLT5vZmZzZXQgPj0gcGUtPmltYWdl U2l6ZSkgfHwgKHBlLT5vZmZzZXQrc2l6ZSA+IHBlLT5pbWFnZVNpemUpKQorICAgIHsKKyAgICAg ICAgUFJJTlRLKCJFcnJvcjogb2Zmc2V0ICVsdSA+IGltYWdlU2l6ZSAlbHVcbiIsIHBlLT5vZmZz ZXQsIHBlLT5pbWFnZVNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwID0g KHZvaWQgKikocGUtPmltYWdlQmFzZSArIHBlLT5vZmZzZXQpOworICAgICAgICBwZS0+b2Zmc2V0 ICs9IHNpemU7CisgICAgfQorICAgIHJldHVybiBwOworfQorI2RlZmluZSBta3B0cihUWVBFKSAo VFlQRSAqKXBlX21ha2VfcG9pbnRlcihwZSwgc2l6ZW9mKFRZUEUpKQorCisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CitwZWNvZmZfaW1hZ2VfdCAqCitwZWNvZmZfaW1hZ2VfZGVjb2RlICh1aW50OF90ICppbWFnZUJh c2UsIHNpemVfdCBpbWFnZVNpemUpCit7CisgICAgcGVjb2ZmX2ltYWdlX3QgKnBlOworICAgIGRv c19oZWFkZXJfdCAqZGg7CisKKyAgICBwZSA9IHBlY29mZl9pbWFnZV9hbGxvYyhpbWFnZUJhc2Us IGltYWdlU2l6ZSk7CisKKyAgICAvLyBNU0RPUyBoZWFkZXIvc3R1YgorICAgIHBlLT5kaGMuZmls ZU9mZnNldCA9IHBlLT5vZmZzZXQ7CisgICAgaWYgKE5VTEwgPT0gKHBlLT5kaGMuZGggPSBta3B0 cihkb3NfaGVhZGVyX3QpKSkgZ290byBlcnJvcjsKKyAgICBkaCA9IHBlLT5kaGMuZGg7CisgICAg RklFTERfQihTaWduYXR1cmUsIGRoLT5TaWduYXR1cmVbMF0pOworICAgIEZJRUxEX0IoU2lnbmF0 dXJlLCBkaC0+U2lnbmF0dXJlWzFdKTsKKyAgICBGSUVMRF9EKFBFX0hlYWRlcl9PZmZzZXQsIGRo LT5wZV9oZWFkZXJfb2Zmc2V0KTsKKworICAgIGlmICgoSU1BR0VfRklMRV9TSUdOQVRVUkVfMCA9 PSBkaC0+U2lnbmF0dXJlWzBdKSAmJgorICAgICAgICAoSU1BR0VfRklMRV9TSUdOQVRVUkVfMSA9 PSBkaC0+U2lnbmF0dXJlWzFdKSkKKyAgICB7CisgICAgICAgIGNvZmZfaGVhZGVyX3QgKmNoOwor CisgICAgICAgIC8vIFJlYWQgaW4gRE9TIHN0dWIKKyAgICAgICAgaWYgKE5VTEwgPT0gKHBlLT5k aGMuZHMgPSBta3B0cih1aW50OF90KSkpIGdvdG8gZXJyb3I7CisgICAgICAgIHBlLT5vZmZzZXQg PSBkaC0+cGVfaGVhZGVyX29mZnNldDsKKworICAgICAgICAvLyBDT0ZGIGhlYWRlcgorICAgICAg ICBwZS0+Y2hjLmZpbGVPZmZzZXQgPSBwZS0+b2Zmc2V0OworICAgICAgICBpZiAoTlVMTCA9PSAo cGUtPmNoYy5jaCA9IG1rcHRyKGNvZmZfaGVhZGVyX3QpKSkgZ290byBlcnJvcjsKKyAgICAgICAg Y2ggPSBwZS0+Y2hjLmNoOworCisgICAgICAgIEZJRUxEX0QoU2lnbmF0dXJlLCBjaC0+U2lnbmF0 dXJlKTsKKyAgICAgICAgRklFTERfVyhNYWNoaW5lLCBjaC0+TWFjaGluZSk7CisKKyAgICAgICAg aWYgKFBFX0NPRkZfSU1BR0UgIT0gY2gtPlNpZ25hdHVyZSkKKyAgICAgICAgeworICAgICAgICAg ICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElN QUdFX0ZJTEVfTUFDSElORV9VTktOT1dOKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJ TUFHRV9GSUxFX01BQ0hJTkVfQU0zMyk7CisgICAgICAgIENIS0RFRihjaC0+TWFjaGluZSwgSU1B R0VfRklMRV9NQUNISU5FX0FNRDY0KTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFH RV9GSUxFX01BQ0hJTkVfQVJNKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9G SUxFX01BQ0hJTkVfQVJNNjQpOworICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElNQUdFX0ZJ TEVfTUFDSElORV9BUk1OVCk7CisgICAgICAgIENIS0RFRihjaC0+TWFjaGluZSwgSU1BR0VfRklM RV9NQUNISU5FX0VCQyk7CisgICAgICAgIENIS0RFRihjaC0+TWFjaGluZSwgSU1BR0VfRklMRV9N QUNISU5FX0kzODYpOworICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElNQUdFX0ZJTEVfTUFD SElORV9JQTY0KTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxFX01BQ0hJ TkVfTTMyUik7CisgICAgICAgIENIS0RFRihjaC0+TWFjaGluZSwgSU1BR0VfRklMRV9NQUNISU5F X01JUFMxNik7CisgICAgICAgIENIS0RFRihjaC0+TWFjaGluZSwgSU1BR0VfRklMRV9NQUNISU5F X01JUFNGUFUpOworICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElNQUdFX0ZJTEVfTUFDSElO RV9NSVBTRlBVMTYpOworICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElNQUdFX0ZJTEVfTUFD SElORV9QT1dFUlBDKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxFX01B Q0hJTkVfUE9XRVJQQ0ZQKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxF X01BQ0hJTkVfUjQwMDApOworICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElNQUdFX0ZJTEVf TUFDSElORV9SSVNDVjMyKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxF X01BQ0hJTkVfUklTQ1Y2NCk7CisgICAgICAgIENIS0RFRihjaC0+TWFjaGluZSwgSU1BR0VfRklM RV9NQUNISU5FX1JJU0NWMTI4KTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9G SUxFX01BQ0hJTkVfU0gzKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxF X01BQ0hJTkVfU0gzRFNQKTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxF X01BQ0hJTkVfU0g0KTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxFX01B Q0hJTkVfU0g1KTsKKyAgICAgICAgQ0hLREVGKGNoLT5NYWNoaW5lLCBJTUFHRV9GSUxFX01BQ0hJ TkVfVEhVTUIpOworICAgICAgICBDSEtERUYoY2gtPk1hY2hpbmUsIElNQUdFX0ZJTEVfTUFDSElO RV9XQ0VNSVBTVjIpOworICAgICAgICBGSUVMRF9XKE51bWJlck9mU2VjdGlvbnMsIGNoLT5OdW1i ZXJPZlNlY3Rpb25zKTsKKyAgICAgICAgRklFTERfRChUaW1lRGF0ZVN0YW1wLCBjaC0+VGltZURh dGVTdGFtcCk7CisgICAgICAgIEZJRUxEX0QoUG9pbnRlclRvU3ltYm9sVGFibGUsIGNoLT5Qb2lu dGVyVG9TeW1ib2xUYWJsZSk7CisgICAgICAgIEZJRUxEX0QoTnVtYmVyT2ZTeW1ib2xUYWJsZSwg Y2gtPk51bWJlck9mU3ltYm9sVGFibGUpOworICAgICAgICBGSUVMRF9XKFNpemVvZk9wdGlvbmFs SGVhZGVyLCBjaC0+U2l6ZW9mT3B0aW9uYWxIZWFkZXIpOworICAgICAgICBGSUVMRF9XKENoYXJh Y3RlcmlzdGljcywgY2gtPkNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgIENIS0JJVChjaC0+Q2hh cmFjdGVyaXN0aWNzLCBJTUFHRV9GSUxFX1JFTE9DU19TVFJJUFBFRCk7CisgICAgICAgIENIS0JJ VChjaC0+Q2hhcmFjdGVyaXN0aWNzLCBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UpOworICAg ICAgICBDSEtCSVQoY2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9MSU5FX05VTVNfU1RS SVBQRUQpOworICAgICAgICBDSEtCSVQoY2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9M T0NBTF9TWU1TX1NUUklQUEVEKTsKKyAgICAgICAgQ0hLQklUKGNoLT5DaGFyYWN0ZXJpc3RpY3Ms IElNQUdFX0ZJTEVfQUdHUkVTU0lWRV9XU19UUklNKTsKKyAgICAgICAgQ0hLQklUKGNoLT5DaGFy YWN0ZXJpc3RpY3MsIElNQUdFX0ZJTEVfTEFSR0VfQUREUkVTU19BV0FSRSApOworICAgICAgICBD SEtCSVQoY2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9MTyk7 CisgICAgICAgIENIS0JJVChjaC0+Q2hhcmFjdGVyaXN0aWNzLCBJTUFHRV9GSUxFXzMyQklUX01B Q0hJTkUpOworICAgICAgICBDSEtCSVQoY2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9E RUJVR19TVFJJUFBFRCk7CisgICAgICAgIENIS0JJVChjaC0+Q2hhcmFjdGVyaXN0aWNzLCBJTUFH RV9GSUxFX1JFTU9WQUJMRV9SVU5fRlJPTV9TV0FQKTsKKyAgICAgICAgQ0hLQklUKGNoLT5DaGFy YWN0ZXJpc3RpY3MsIElNQUdFX0ZJTEVfTkVUX1JVTl9GUk9NX1NXQVApOworICAgICAgICBDSEtC SVQoY2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9TWVNURU0pOworICAgICAgICBDSEtC SVQoY2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9ETEwpOworICAgICAgICBDSEtCSVQo Y2gtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfRklMRV9VUF9TWVNURU1fT05MWSk7CisgICAgICAg IENIS0JJVChjaC0+Q2hhcmFjdGVyaXN0aWNzLCBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0hJ KTsKKworICAgICAgICBpZiAoY2gtPlNpemVvZk9wdGlvbmFsSGVhZGVyKSAvLyByZXF1aXJlZCBm b3IgSW1hZ2UKKyAgICAgICAgeworICAgICAgICAgICAgV09SRCBTdWJzeXN0ZW0gPSAwOworCisg ICAgICAgICAgICAvLyBDT0ZGIGZpZWxkcworICAgICAgICAgICAgcGUtPmNmYy5maWxlT2Zmc2V0 ID0gcGUtPm9mZnNldDsKKyAgICAgICAgICAgIGlmIChOVUxMID09IChwZS0+Y2ZjLmNmID0gbWtw dHIoY29mZl9maWVsZHNfdCkpKSBnb3RvIGVycm9yOworCisgICAgICAgICAgICBGSUVMRF9XKE1h Z2ljLCBwZS0+Y2ZjLmNmLT5NYWdpYyk7CisgICAgICAgICAgICBGSUVMRF9CKE1ham9yTGlua2Vy VmVyc2lvbiwgcGUtPmNmYy5jZi0+TWFqb3JMaW5rZXJWZXJzaW9uKTsKKyAgICAgICAgICAgIEZJ RUxEX0IoTWlub3JMaW5rZXJWZXJzaW9uLCBwZS0+Y2ZjLmNmLT5NaW5vckxpbmtlclZlcnNpb24p OworICAgICAgICAgICAgRklFTERfRChTaXplT2ZDb2RlLCBwZS0+Y2ZjLmNmLT5TaXplT2ZDb2Rl KTsKKyAgICAgICAgICAgIEZJRUxEX0QoU2l6ZU9mSW5pdGlhbGl6ZWREYXRhLCBwZS0+Y2ZjLmNm LT5TaXplT2ZJbml0aWFsaXplZERhdGEpOworICAgICAgICAgICAgRklFTERfRChTaXplT2ZVbmlu aXRpYWxpemVkRGF0YSwgcGUtPmNmYy5jZi0+U2l6ZU9mVW5pbml0aWFsaXplZERhdGEpOworICAg ICAgICAgICAgRklFTERfRChBZGRyZXNzT2ZFbnRyeVBvaW50LCBwZS0+Y2ZjLmNmLT5BZGRyZXNz T2ZFbnRyeVBvaW50KTsKKyAgICAgICAgICAgIEZJRUxEX0QoQmFzZU9mQ29kZSwgcGUtPmNmYy5j Zi0+QmFzZU9mQ29kZSk7CisKKyAgICAgICAgICAgIC8vIE9wdGlvbmFsIEhlYWRlciBXaW5kb3dz LVNwZWNpZmljIGZpZWxkcyAoSW1hZ2UgT25seSkKKyAgICAgICAgICAgIHBlLT5wZWNmYy5maWxl T2Zmc2V0ID0gcGUtPm9mZnNldDsKKworICAgICAgICAgICAgaWYgKGlzX3BlMzIoKSkKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZTMyX2NvZmZfZmllbGRzX3QgKnBlY2Y7CisgICAg ICAgICAgICAgICAgcGUtPnBlY2ZjLmZpbGVPZmZzZXQgPSBwZS0+b2Zmc2V0OworICAgICAgICAg ICAgICAgIGlmIChOVUxMID09IChwZS0+cGVjZmMucGUzMiA9IG1rcHRyKHBlMzJfY29mZl9maWVs ZHNfdCkpKSBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHBlY2YgPSBwZS0+cGVjZmMucGUz MjsKKworICAgICAgICAgICAgICAgIEZJRUxEX0QoQmFzZU9mRGF0YSwgcGVjZi0+QmFzZU9mRGF0 YSk7CisgICAgICAgICAgICAgICAgRklFTERfRChJbWFnZUJhc2UsIHBlY2YtPkltYWdlQmFzZSk7 CisgICAgICAgICAgICAgICAgRklFTERfRChTZWN0aW9uQWxpZ25tZW50LCBwZWNmLT5TZWN0aW9u QWxpZ25tZW50KTsKKyAgICAgICAgICAgICAgICBGSUVMRF9EKEZpbGVBbGlnbm1lbnQsIHBlY2Yt PkZpbGVBbGlnbm1lbnQpOworICAgICAgICAgICAgICAgIEZJRUxEX1coTWFqb3JPcGVyYXRpbmdT eXN0ZW1WZXJzaW9uLCBwZWNmLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOworICAgICAg ICAgICAgICAgIEZJRUxEX1coTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCBwZWNmLT5NaW5v ck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOworICAgICAgICAgICAgICAgIEZJRUxEX1coTWFqb3JJ bWFnZVZlcnNpb24sIHBlY2YtPk1ham9ySW1hZ2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBG SUVMRF9XKE1pbm9ySW1hZ2VWZXJzaW9uLCBwZWNmLT5NaW5vckltYWdlVmVyc2lvbik7CisgICAg ICAgICAgICAgICAgRklFTERfVyhNYWpvclN1YnN5c3RlbVZlcnNpb24sIHBlY2YtPk1ham9yU3Vi c3lzdGVtVmVyc2lvbik7CisgICAgICAgICAgICAgICAgRklFTERfVyhNaW5vclN1YnN5c3RlbVZl cnNpb24sIHBlY2YtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7CisgICAgICAgICAgICAgICAgRklF TERfRChXaW4zMlZlcnNpb25WYWx1ZSwgcGVjZi0+V2luMzJWZXJzaW9uVmFsdWUpOworICAgICAg ICAgICAgICAgIEZJRUxEX0QoU2l6ZU9mSW1hZ2UsIHBlY2YtPlNpemVPZkltYWdlKTsKKyAgICAg ICAgICAgICAgICBGSUVMRF9EKFNpemVPZkhlYWRlcnMsIHBlY2YtPlNpemVPZkhlYWRlcnMpOwor ICAgICAgICAgICAgICAgIEZJRUxEX0QoQ2hlY2tTdW0sIHBlY2YtPkNoZWNrU3VtKTsKKyAgICAg ICAgICAgICAgICBGSUVMRF9XKFN1YnN5c3RlbSwgcGVjZi0+U3Vic3lzdGVtKTsKKyAgICAgICAg ICAgICAgICBGSUVMRF9XKERsbENoYXJhY3RlcmlzdGljcywgcGVjZi0+RGxsQ2hhcmFjdGVyaXN0 aWNzKTsKKyAgICAgICAgICAgICAgICBGSUVMRF9EKFNpemVPZlN0YWNrUmVzZXJ2ZSwgcGVjZi0+ U2l6ZU9mU3RhY2tSZXNlcnZlKTsKKyAgICAgICAgICAgICAgICBGSUVMRF9EKFNpemVPZlN0YWNr Q29tbWl0LCBwZWNmLT5TaXplT2ZTdGFja0NvbW1pdCk7CisgICAgICAgICAgICAgICAgRklFTERf RChTaXplT2ZIZWFwUmVzZXJ2ZSwgcGVjZi0+U2l6ZU9mSGVhcFJlc2VydmUpOworICAgICAgICAg ICAgICAgIEZJRUxEX0QoU2l6ZU9mSGVhcENvbW1pdCwgcGVjZi0+U2l6ZU9mSGVhcENvbW1pdCk7 CisgICAgICAgICAgICAgICAgRklFTERfRChMb2FkZXJGbGFncywgcGVjZi0+TG9hZGVyRmxhZ3Mp OworICAgICAgICAgICAgICAgIEZJRUxEX0QoTnVtYmVyT2ZSdmFBbmRTaXplcywgcGVjZi0+TnVt YmVyT2ZSdmFBbmRTaXplcyk7CisgICAgICAgICAgICAgICAgU3Vic3lzdGVtID0gcGVjZi0+U3Vi c3lzdGVtOworICAgICAgICAgICAgICAgIHBlLT5OdW1iZXJPZlJ2YUFuZFNpemVzID0gcGVjZi0+ TnVtYmVyT2ZSdmFBbmRTaXplczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZTMycGx1c19jb2ZmX2ZpZWxkc190ICpwZWNm OworICAgICAgICAgICAgICAgIHBlLT5wZWNmYy5maWxlT2Zmc2V0ID0gcGUtPm9mZnNldDsKKyAg ICAgICAgICAgICAgICBpZiAoTlVMTCA9PSAocGUtPnBlY2ZjLnBlMzJwbHVzID0gbWtwdHIocGUz MnBsdXNfY29mZl9maWVsZHNfdCkpKSBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHBlY2Yg PSBwZS0+cGVjZmMucGUzMnBsdXM7CisKKyAgICAgICAgICAgICAgICBGSUVMRF9RKEltYWdlQmFz ZSwgcGVjZi0+SW1hZ2VCYXNlKTsKKyAgICAgICAgICAgICAgICBGSUVMRF9EKFNlY3Rpb25BbGln bm1lbnQsIHBlY2YtPlNlY3Rpb25BbGlnbm1lbnQpOworICAgICAgICAgICAgICAgIEZJRUxEX0Qo RmlsZUFsaWdubWVudCwgcGVjZi0+RmlsZUFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgRklF TERfVyhNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIHBlY2YtPk1ham9yT3BlcmF0aW5nU3lz dGVtVmVyc2lvbik7CisgICAgICAgICAgICAgICAgRklFTERfVyhNaW5vck9wZXJhdGluZ1N5c3Rl bVZlcnNpb24sIHBlY2YtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7CisgICAgICAgICAg ICAgICAgRklFTERfVyhNYWpvckltYWdlVmVyc2lvbiwgcGVjZi0+TWFqb3JJbWFnZVZlcnNpb24p OworICAgICAgICAgICAgICAgIEZJRUxEX1coTWlub3JJbWFnZVZlcnNpb24sIHBlY2YtPk1pbm9y SW1hZ2VWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGSUVMRF9XKE1ham9yU3Vic3lzdGVtVmVy c2lvbiwgcGVjZi0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBGSUVM RF9XKE1pbm9yU3Vic3lzdGVtVmVyc2lvbiwgcGVjZi0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsK KyAgICAgICAgICAgICAgICBGSUVMRF9EKFdpbjMyVmVyc2lvblZhbHVlLCBwZWNmLT5XaW4zMlZl cnNpb25WYWx1ZSk7CisgICAgICAgICAgICAgICAgRklFTERfRChTaXplT2ZJbWFnZSwgcGVjZi0+ U2l6ZU9mSW1hZ2UpOworICAgICAgICAgICAgICAgIEZJRUxEX0QoU2l6ZU9mSGVhZGVycywgcGVj Zi0+U2l6ZU9mSGVhZGVycyk7CisgICAgICAgICAgICAgICAgRklFTERfRChDaGVja1N1bSwgcGVj Zi0+Q2hlY2tTdW0pOworICAgICAgICAgICAgICAgIEZJRUxEX1coU3Vic3lzdGVtLCBwZWNmLT5T dWJzeXN0ZW0pOworICAgICAgICAgICAgICAgIEZJRUxEX1coRGxsQ2hhcmFjdGVyaXN0aWNzLCBw ZWNmLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgICAgIEZJRUxEX1EoU2l6ZU9m U3RhY2tSZXNlcnZlLCBwZWNmLT5TaXplT2ZTdGFja1Jlc2VydmUpOworICAgICAgICAgICAgICAg IEZJRUxEX1EoU2l6ZU9mU3RhY2tDb21taXQsIHBlY2YtPlNpemVPZlN0YWNrQ29tbWl0KTsKKyAg ICAgICAgICAgICAgICBGSUVMRF9RKFNpemVPZkhlYXBSZXNlcnZlLCBwZWNmLT5TaXplT2ZIZWFw UmVzZXJ2ZSk7CisgICAgICAgICAgICAgICAgRklFTERfUShTaXplT2ZIZWFwQ29tbWl0LCBwZWNm LT5TaXplT2ZIZWFwQ29tbWl0KTsKKyAgICAgICAgICAgICAgICBGSUVMRF9EKExvYWRlckZsYWdz LCBwZWNmLT5Mb2FkZXJGbGFncyk7CisgICAgICAgICAgICAgICAgRklFTERfRChOdW1iZXJPZlJ2 YUFuZFNpemVzLCBwZWNmLT5OdW1iZXJPZlJ2YUFuZFNpemVzKTsKKyAgICAgICAgICAgICAgICBT dWJzeXN0ZW0gPSBwZWNmLT5TdWJzeXN0ZW07CisgICAgICAgICAgICAgICAgcGUtPk51bWJlck9m UnZhQW5kU2l6ZXMgPSBwZWNmLT5OdW1iZXJPZlJ2YUFuZFNpemVzOworICAgICAgICAgICAgfQor ICAgICAgICAgICAgQ0hLREVGKFN1YnN5c3RlbSwgSU1BR0VfU1VCU1lTVEVNX1VOS05PV04pOwor ICAgICAgICAgICAgQ0hLREVGKFN1YnN5c3RlbSwgSU1BR0VfU1VCU1lTVEVNX05BVElWRSk7Cisg ICAgICAgICAgICBDSEtERUYoU3Vic3lzdGVtLCBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19HVUkp OworICAgICAgICAgICAgQ0hLREVGKFN1YnN5c3RlbSwgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1Nf Q1VJKTsKKyAgICAgICAgICAgIENIS0RFRihTdWJzeXN0ZW0sIElNQUdFX1NVQlNZU1RFTV9PUzJf Q1VJKTsKKyAgICAgICAgICAgIENIS0RFRihTdWJzeXN0ZW0sIElNQUdFX1NVQlNZU1RFTV9QT1NJ WF9DVUkpOworICAgICAgICAgICAgQ0hLREVGKFN1YnN5c3RlbSwgSU1BR0VfU1VCU1lTVEVNX05B VElWRV9XSU5ET1dTKTsKKyAgICAgICAgICAgIENIS0RFRihTdWJzeXN0ZW0sIElNQUdFX1NVQlNZ U1RFTV9XSU5ET1dTX0NFX0dVSSk7CisgICAgICAgICAgICBDSEtERUYoU3Vic3lzdGVtLCBJTUFH RV9TVUJTWVNURU1fRUZJX0FQUExJQ0FUSU9OKTsKKyAgICAgICAgICAgIENIS0RFRihTdWJzeXN0 ZW0sIElNQUdFX1NVQlNZU1RFTV9FRklfQk9PVF9TRVJWSUNFX0RSSVZFUik7CisgICAgICAgICAg ICBDSEtERUYoU3Vic3lzdGVtLCBJTUFHRV9TVUJTWVNURU1fRUZJX1JVTlRJTUVfRFJJVkVSKTsK KyAgICAgICAgICAgIENIS0RFRihTdWJzeXN0ZW0sIElNQUdFX1NVQlNZU1RFTV9FRklfUk9NKTsK KyAgICAgICAgICAgIENIS0RFRihTdWJzeXN0ZW0sIElNQUdFX1NVQlNZU1RFTV9YQk9YKTsKKyAg ICAgICAgICAgIENIS0RFRihTdWJzeXN0ZW0sIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0JPT1Rf QVBQTElDQVRJT04pOworCisgICAgICAgICAgICAvLyBEYXRhIGRpcmVjdG9yeSBlbnRyaWVzCisg ICAgICAgICAgICBwZS0+aWRkYy5maWxlT2Zmc2V0ID0gcGUtPm9mZnNldDsKKyAgICAgICAgICAg IGlmIChOVUxMID09IChwZS0+aWRkYy5kZCA9IG1rcHRyKGltYWdlX2RhdGFfZGlyZWN0b3J5X3Qp KSkgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHBlLT5vZmZzZXQgLT0gc2l6ZW9mKGltYWdlX2Rh dGFfZGlyZWN0b3J5X3QpOyAvLyByZXNldAorICAgICAgICAgICAgcGUtPm9mZnNldCArPSAocGUt Pk51bWJlck9mUnZhQW5kU2l6ZXMgKiBzaXplb2YoZGF0YV9kaXJlY3RvcnlfZW50cnlfdCkpOwor CisjZGVmaW5lIERERShuYW1lKSBcCisgICAgICAgICAgICBGSUVMRF9EKG5hbWUjI1J2YSwgcGUt PmlkZGMuZGQtPm5hbWUuVmlydHVhbEFkZHJlc3MpOyBcCisgICAgICAgICAgICBGSUVMRF9EKG5h bWUjI1NpemUsIHBlLT5pZGRjLmRkLT5uYW1lLlNpemUpOworICAgICAgICAgICAgZm9yICh1bnNp Z25lZCBpZHggPSAwOyBpZHggPCBwZS0+TnVtYmVyT2ZSdmFBbmRTaXplczsgKytpZHgpCisgICAg ICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpZHgpCisgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgIGNhc2UgMDogRERFKEV4cG9ydFRhYmxlKTsgYnJlYWs7CisgICAg ICAgICAgICAgICAgY2FzZSAxOiBEREUoSW1wb3J0VGFibGUpOyBicmVhazsKKyAgICAgICAgICAg ICAgICBjYXNlIDI6IERERShSZXNvdXJjZVRhYmxlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAg Y2FzZSAzOiBEREUoRXhjZXB0aW9uVGFibGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNl IDQ6IERERShDZXJ0aWZpY2F0ZVRhYmxlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1 OiBEREUoQmFzZVJlbG9jYXRpb25UYWJsZSk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Ug NjogRERFKERlYnVnKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3OiBEREUoQXJjaGl0 ZWN0dXJlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4OiBEREUoR2xvYmFsUHRyKTsg YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5OiBEREUoVExTVGFibGUpOyBicmVhazsKKyAg ICAgICAgICAgICAgICBjYXNlIDEwOiBEREUoTG9hZENvbmZpZ1RhYmxlKTsgYnJlYWs7CisgICAg ICAgICAgICAgICAgY2FzZSAxMTogRERFKEJvdW5kSW1wb3J0KTsgYnJlYWs7CisgICAgICAgICAg ICAgICAgY2FzZSAxMjogRERFKEltcG9ydEFkZHJlc3NUYWJsZSk7IGJyZWFrOworICAgICAgICAg ICAgICAgIGNhc2UgMTM6IERERShEZWxheUltcG9ydERlc2NyaXB0b3IpOyBicmVhazsKKyAgICAg ICAgICAgICAgICBjYXNlIDE0OiBEREUoQ0xSUnVudGltZUhlYWRlcik7IGJyZWFrOworICAgICAg ICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSAxNTogRERFKFJlc2VydmVk KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisK KyAgICAgICAgLy8gU2VjdGlvbiBoZWFkZXJzCisgICAgICAgIHBlLT5TZWN0aW9uSGVhZGVyQmFz ZSA9IHBlLT5vZmZzZXQ7CisgICAgICAgIGZvciAodW5zaWduZWQgaWR4ID0gMDsgaWR4IDwgY2gt Pk51bWJlck9mU2VjdGlvbnM7ICsraWR4KQorICAgICAgICB7CisgICAgICAgICAgICBwZWNvZmZf c2VjdGlvbl9jdCAqc2M7CisgICAgICAgICAgICBwZWNvZmZfc2VjdGlvbl90ICpzOworICAgICAg ICAgICAgRFdPUkQgYWxpZ247ICh2b2lkKWFsaWduOworCisgICAgICAgICAgICBzYyA9ICZwZS0+ c2VjdGlvbmNzW2lkeF07CisgICAgICAgICAgICBETENMX0FQUEVORChwZWNvZmZfc2VjdGlvbl9j dCwgcGUtPnNlY3Rpb25zLCBzYyk7CisKKyAgICAgICAgICAgIHBlLT5vZmZzZXQgPSBwZS0+U2Vj dGlvbkhlYWRlckJhc2UgKyAoaWR4ICogc2l6ZW9mKHBlY29mZl9zZWN0aW9uX3QpKTsKKyAgICAg ICAgICAgIHNjLT5maWxlT2Zmc2V0ID0gcGUtPm9mZnNldDsKKyAgICAgICAgICAgIGlmIChOVUxM ID09IChzYy0+cyA9IG1rcHRyKHBlY29mZl9zZWN0aW9uX3QpKSkgZ290byBlcnJvcjsKKyAgICAg ICAgICAgIHMgPSBzYy0+czsKKworICAgICAgICAgICAgaWYgKHMtPlNpemVPZlJhd0RhdGEpCisg ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGUtPm9mZnNldCA9IHMtPlBvaW50ZXJUb1Jh d0RhdGE7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gKHNjLT5kYXRhID0gbWtwdHIodWlu dDhfdCkpKSBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOYW1l CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgc2l6ZW9mKHMtPk5hbWUpOyAr K2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRklFTERfQihOYW1lLCBzLT5OYW1l W2tdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZJRUxEX0QoVmlydHVhbFNpemUsIHMt PlZpcnR1YWxTaXplKTsKKyAgICAgICAgICAgIEZJRUxEX0QoVmlydHVhbEFkZHJlc3MsIHMtPlZp cnR1YWxBZGRyZXNzKTsKKyAgICAgICAgICAgIEZJRUxEX0QoU2l6ZU9mUmF3RGF0YSwgcy0+U2l6 ZU9mUmF3RGF0YSk7CisgICAgICAgICAgICBGSUVMRF9EKFBvaW50ZXJUb1Jhd0RhdGEsIHMtPlBv aW50ZXJUb1Jhd0RhdGEpOworICAgICAgICAgICAgRklFTERfRChQb2ludGVyVG9SZWxvY2F0aW9u cywgcy0+UG9pbnRlclRvUmVsb2NhdGlvbnMpOworICAgICAgICAgICAgRklFTERfRChQb2ludGVy VG9MaW5lbnVtYmVycywgcy0+UG9pbnRlclRvTGluZW51bWJlcnMpOworICAgICAgICAgICAgRklF TERfVyhOdW1iZXJPZlJlbG9jYXRpb25zLCBzLT5OdW1iZXJPZlJlbG9jYXRpb25zKTsKKyAgICAg ICAgICAgIEZJRUxEX1coTnVtYmVyT2ZMaW5lbnVtYmVycywgcy0+TnVtYmVyT2ZMaW5lbnVtYmVy cyk7CisgICAgICAgICAgICBGSUVMRF9EKENoYXJhY3RlcmlzdGljcywgcy0+Q2hhcmFjdGVyaXN0 aWNzKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9U WVBFX05PX1BBRCk7CisgICAgICAgICAgICBDSEtCSVQocy0+Q2hhcmFjdGVyaXN0aWNzLCBJTUFH RV9TQ05fQ05UX0NPREUpOworICAgICAgICAgICAgQ0hLQklUKHMtPkNoYXJhY3RlcmlzdGljcywg SU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5D aGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKTsKKyAgICAg ICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9MTktfT1RIRVIpOwor ICAgICAgICAgICAgQ0hLQklUKHMtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfU0NOX0xOS19JTkZP KTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9MTktf UkVNT1ZFKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1ND Tl9MTktfQ09NREFUKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElN QUdFX1NDTl9HUFJFTCk7CisgICAgICAgICAgICBDSEtCSVQocy0+Q2hhcmFjdGVyaXN0aWNzLCBJ TUFHRV9TQ05fTUVNX1BVUkdFQUJMRSk7CisgICAgICAgICAgICBDSEtCSVQocy0+Q2hhcmFjdGVy aXN0aWNzLCBJTUFHRV9TQ05fTUVNXzE2QklUKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFy YWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9NRU1fTE9DS0VEKTsKKyAgICAgICAgICAgIENIS0JJVChz LT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9NRU1fUFJFTE9BRCk7CisgICAgICAgICAgICBh bGlnbiA9IHMtPkNoYXJhY3RlcmlzdGljcyAmIChJTUFHRV9TQ05fQUxJR05fODE5MkJZVEVTfElN QUdFX1NDTl9BTElHTl8xQllURVMpOworICAgICAgICAgICAgQ0hLREVGKGFsaWduLCBJTUFHRV9T Q05fQUxJR05fMUJZVEVTKTsKKyAgICAgICAgICAgIENIS0RFRihhbGlnbiwgSU1BR0VfU0NOX0FM SUdOXzJCWVRFUyk7CisgICAgICAgICAgICBDSEtERUYoYWxpZ24sIElNQUdFX1NDTl9BTElHTl80 QllURVMpOworICAgICAgICAgICAgQ0hLREVGKGFsaWduLCBJTUFHRV9TQ05fQUxJR05fOEJZVEVT KTsKKyAgICAgICAgICAgIENIS0RFRihhbGlnbiwgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMpOwor ICAgICAgICAgICAgQ0hLREVGKGFsaWduLCBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyk7CisgICAg ICAgICAgICBDSEtERUYoYWxpZ24sIElNQUdFX1NDTl9BTElHTl82NEJZVEVTKTsKKyAgICAgICAg ICAgIENIS0RFRihhbGlnbiwgSU1BR0VfU0NOX0FMSUdOXzEyOEJZVEVTKTsKKyAgICAgICAgICAg IENIS0RFRihhbGlnbiwgSU1BR0VfU0NOX0FMSUdOXzI1NkJZVEVTKTsKKyAgICAgICAgICAgIENI S0RFRihhbGlnbiwgSU1BR0VfU0NOX0FMSUdOXzUxMkJZVEVTKTsKKyAgICAgICAgICAgIENIS0RF RihhbGlnbiwgSU1BR0VfU0NOX0FMSUdOXzEwMjRCWVRFUyk7CisgICAgICAgICAgICBDSEtERUYo YWxpZ24sIElNQUdFX1NDTl9BTElHTl8yMDQ4QllURVMpOworICAgICAgICAgICAgQ0hLREVGKGFs aWduLCBJTUFHRV9TQ05fQUxJR05fNDA5NkJZVEVTKTsKKyAgICAgICAgICAgIENIS0RFRihhbGln biwgSU1BR0VfU0NOX0FMSUdOXzgxOTJCWVRFUyk7CisgICAgICAgICAgICBDSEtCSVQocy0+Q2hh cmFjdGVyaXN0aWNzLCBJTUFHRV9TQ05fTE5LX05SRUxPQ19PVkZMKTsKKyAgICAgICAgICAgIENI S0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUpOworICAg ICAgICAgICAgQ0hLQklUKHMtPkNoYXJhY3RlcmlzdGljcywgSU1BR0VfU0NOX01FTV9OT1RfQ0FD SEVEKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElNQUdFX1NDTl9N RU1fTk9UX1BBR0VEKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3RpY3MsIElN QUdFX1NDTl9NRU1fU0hBUkVEKTsKKyAgICAgICAgICAgIENIS0JJVChzLT5DaGFyYWN0ZXJpc3Rp Y3MsIElNQUdFX1NDTl9NRU1fRVhFQ1VURSk7CisgICAgICAgICAgICBDSEtCSVQocy0+Q2hhcmFj dGVyaXN0aWNzLCBJTUFHRV9TQ05fTUVNX1JFQUQpOworICAgICAgICAgICAgQ0hLQklUKHMtPkNo YXJhY3RlcmlzdGljcywgSU1BR0VfU0NOX01FTV9XUklURSk7CisgICAgICAgICAgICBpZiAoc2Mt PmRhdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBrID0g MDsgayA8IDg7ICsraykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZJ RUxEX0IoU0VDVElPTl9CWVRFLCBzYy0+ZGF0YVtrXSk7CisgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2VydGlmaWNhdGUgVGFibGUgaGFu ZGxpbmcKKyAgICAgICAgaWYgKHBlLT5pZGRjLmRkLT5DZXJ0aWZpY2F0ZVRhYmxlLlZpcnR1YWxB ZGRyZXNzKQorICAgICAgICB7CisvLyBGSVghISEgbm90IGFsbG93aW5nIGZvciBtb3JlIHRoYW4g b25lIGNlcnQhISEKKyAgICAgICAgICAgIGF0dHJpYnV0ZV9jZXJ0aWZpY2F0ZV90ICphYzsKKyAg ICAgICAgICAgIHBlLT5vZmZzZXQgPSBwZS0+aWRkYy5kZC0+Q2VydGlmaWNhdGVUYWJsZS5WaXJ0 dWFsQWRkcmVzczsKKyAgICAgICAgICAgIGlmIChOVUxMID09IChwZS0+Y2VydC5hYyA9IG1rcHRy KGF0dHJpYnV0ZV9jZXJ0aWZpY2F0ZV90KSkpIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBhYyA9 IHBlLT5jZXJ0LmFjOworCisgICAgICAgICAgICBGSUVMRF9EKGR3TGVuZ3RoLCBhYy0+ZHdMZW5n dGgpOworICAgICAgICAgICAgRklFTERfVyh3UmV2aXNpb24sIGFjLT53UmV2aXNpb24pOworICAg ICAgICAgICAgRklFTERfVyh3Q2VydGlmaWNhdGVUeXBlLCBhYy0+d0NlcnRpZmljYXRlVHlwZSk7 CisgICAgICAgICAgICBDSEtERUYoYWMtPndSZXZpc2lvbiwgV0lOX0NFUlRfUkVWSVNJT05fMV8w KTsKKyAgICAgICAgICAgIENIS0RFRihhYy0+d1JldmlzaW9uLCBXSU5fQ0VSVF9SRVZJU0lPTl8y XzApOworICAgICAgICAgICAgQ0hLREVGKGFjLT53Q2VydGlmaWNhdGVUeXBlLCBXSU5fQ0VSVF9U WVBFX1g1MDkpOworICAgICAgICAgICAgQ0hLREVGKGFjLT53Q2VydGlmaWNhdGVUeXBlLCBXSU5f Q0VSVF9UWVBFX1BLQ1NfU0lHTkVEX0RBVEEpOworICAgICAgICAgICAgQ0hLREVGKGFjLT53Q2Vy dGlmaWNhdGVUeXBlLCBXSU5fQ0VSVF9UWVBFX1JFU0VSVkVEXzEpOworICAgICAgICAgICAgQ0hL REVGKGFjLT53Q2VydGlmaWNhdGVUeXBlLCBXSU5fQ0VSVF9UWVBFX1RTX1NUQUNLX1NJR05FRCk7 CisgICAgICAgICAgICAvLyBGSVghISEgdmVyaWZ5IGR3TGVuZ3RoIDwgQ2VydGlmaWNhdGVUYWJs ZS5TaXplCisgICAgICAgICAgICBpZiAoTlVMTCA9PSAocGUtPmNlcnQuZGF0YSA9IG1rcHRyKHVp bnQ4X3QpKSkgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICAg ICAgZ290byBlcnJvcjsKKworICAgIHJldHVybiBwZTsKKworICAgIGVycm9yOgorICAgICAgICBp ZiAocGUpIHBlY29mZl9pbWFnZV9mcmVlKHBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisK Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KK3ZvaWQKK3BlY29mZl9zZXR1cF92ZXJpZnkgKHBlY29mZl9pbWFnZV90 ICpwZSkKK3sKKyAgICBpZiAocGUgJiYgcGUtPmlkZGMuZGQtPkNlcnRpZmljYXRlVGFibGUuVmly dHVhbEFkZHJlc3MpCisgICAgeworICAgICAgICAvLyBHZW5lcmF0ZSBzaWduYXR1cmUgYnl0ZSBz dHJlYW0KKyAgICAgICAgLy8gU2VlIFdpbmRvd3MgQXV0aGVudGljb2RlIFBvcnRhYmxlIEV4ZWN1 dGFibGUgU2lnbmF0dXJlIEZvcm1hdAorICAgICAgICAvLyAnQ2FsY3VsYXRpbmcgdGhlIFBFIElt YWdlIEhhc2gnCisgICAgICAgIERXT1JEIG9mZjEsIGxlbjE7CisgICAgICAgIERXT1JEIG9mZjIs IGxlbjI7CisgICAgICAgIEJZVEUgKmRhdDEsICpkYXQyOworICAgICAgICBwZWNvZmZfc2VjdGlv bl9jdCAqc2M7CisgICAgICAgIHBlY29mZl9zZWN0aW9uX3QgKnM7CisgICAgICAgIERXT1JEIFN0 YXJ0T2ZSYXdEYXRhID0gfjA7CisgICAgICAgIERXT1JEIEVuZE9mUmF3RGF0YSA9IDA7CisgICAg ICAgIERXT1JEIEVuZE9mSW1hZ2VIZWFkZXIgPSAwOworICAgICAgICB1bnNpZ25lZCBTVU1fT0Zf QllURVNfSEFTSEVEOworICAgICAgICBCWVRFICpidWY7CisgICAgICAgIHVuc2lnbmVkIEZJTEVf U0laRTsKKyAgICAgICAgdW5zaWduZWQgRVhUUkE7CisgICAgICAgIHJhbmdlX3QgKnJhbmdlOwor ICAgICAgICBpbnQgc29ydGVkOworCisgICAgICAgIC8vIERPUyBoZWFkZXIgYW5kIHN0dWIKKyAg ICAgICAgb2ZmMSA9IHBlLT5kaGMuZmlsZU9mZnNldDsKKyAgICAgICAgbGVuMSA9IHNpemVvZihk b3NfaGVhZGVyX3QpOworICAgICAgICBkYXQxID0gKEJZVEUgKilwZS0+ZGhjLmRoOworICAgICAg ICBvZmYyID0gb2ZmMSArIGxlbjE7CisgICAgICAgIGxlbjIgPSBwZS0+Y2hjLmZpbGVPZmZzZXQg LSBzaXplb2YoZG9zX2hlYWRlcl90KTsKKyAgICAgICAgZGF0MiA9IHBlLT5kaGMuZHM7CisgICAg ICAgIHBlY29mZl9hcHBlbmRfcmFuZ2UocGUsIG9mZjEsIGxlbjEsIGRhdDEsICJET1MgaGVhZGVy Iik7CisgICAgICAgIHBlY29mZl9hcHBlbmRfcmFuZ2UocGUsIG9mZjIsIGxlbjIsIGRhdDIsICJE T1Mgc3R1YiIpOworICAgICAgICAvLyBDT0ZGIGhlYWRlcnMKKyAgICAgICAgcGVjb2ZmX2FwcGVu ZF9yYW5nZShwZSwgcGUtPmNoYy5maWxlT2Zmc2V0LCBzaXplb2YoY29mZl9oZWFkZXJfdCksIChC WVRFICopcGUtPmNoYy5jaCwgIkNPRkYgaGVhZGVyIik7CisgICAgICAgIC8vIENPRkYgZmllbGRz CisgICAgICAgIHBlY29mZl9hcHBlbmRfcmFuZ2UocGUsIHBlLT5jZmMuZmlsZU9mZnNldCwgc2l6 ZW9mKGNvZmZfZmllbGRzX3QpLCAoQllURSAqKXBlLT5jZmMuY2YsICJDT0ZGIGZpZWxkcyIpOwor ICAgICAgICAvLyBXaW5kb3dzIHNwZWNpZmljIGZpZWxkcywgZXhjbHVkaW5nIENoZWNrc3VtCisg ICAgICAgIGlmIChpc19wZTMyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZjEgPSBwZS0+ cGVjZmMuZmlsZU9mZnNldDsKKyAgICAgICAgICAgIGxlbjEgPSBPRkZTRVRfT0YocGUtPnBlY2Zj LnBlMzIsIENoZWNrU3VtKTsKKyAgICAgICAgICAgIGRhdDEgPSAoQllURSAqKXBlLT5wZWNmYy5w ZTMyOworICAgICAgICAgICAgb2ZmMiA9IG9mZjEgKyBsZW4xICsgc2l6ZW9mKERXT1JEKTsKKyAg ICAgICAgICAgIGxlbjIgPSBzaXplb2YocGUzMl9jb2ZmX2ZpZWxkc190KSAtIE9GRlNFVF9PRihw ZS0+cGVjZmMucGUzMiwgU3Vic3lzdGVtKTsKKyAgICAgICAgICAgIGRhdDIgPSBkYXQxICsgbGVu MSArIHNpemVvZihEV09SRCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7Cisg ICAgICAgICAgICBvZmYxID0gcGUtPnBlY2ZjLmZpbGVPZmZzZXQ7CisgICAgICAgICAgICBsZW4x ID0gT0ZGU0VUX09GKHBlLT5wZWNmYy5wZTMycGx1cywgQ2hlY2tTdW0pOworICAgICAgICAgICAg ZGF0MSA9IChCWVRFICopcGUtPnBlY2ZjLnBlMzJwbHVzOworICAgICAgICAgICAgb2ZmMiA9IG9m ZjEgKyBsZW4xICsgc2l6ZW9mKERXT1JEKTsKKyAgICAgICAgICAgIGxlbjIgPSBzaXplb2YocGUz MnBsdXNfY29mZl9maWVsZHNfdCkgLSBPRkZTRVRfT0YocGUtPnBlY2ZjLnBlMzJwbHVzLCBTdWJz eXN0ZW0pOworICAgICAgICAgICAgZGF0MiA9IGRhdDEgKyBsZW4xICsgc2l6ZW9mKERXT1JEKTsK KyAgICAgICAgfQorICAgICAgICBwZWNvZmZfYXBwZW5kX3JhbmdlKHBlLCBvZmYxLCBsZW4xLCBk YXQxLCAiV2luLXNwZWNpZmljIENPRkYsIG1pbnVzIENoZWNrc3VtIik7CisgICAgICAgIHBlY29m Zl9hcHBlbmRfcmFuZ2UocGUsIG9mZjIsIGxlbjIsIGRhdDIsICJXaW4tc3BlY2lmaWMgQ09GRiwg bWludXMgQ2hlY2tzdW0iKTsKKyAgICAgICAgLy8gSW1hZ2UgRGF0YSBEaXJlY3RvcmllcywgZXhj bHVkaW5nIENlcnRpZmljYXRlVGFibGUKKyAgICAgICAgb2ZmMSA9IHBlLT5pZGRjLmZpbGVPZmZz ZXQ7CisgICAgICAgIGxlbjEgPSBPRkZTRVRfT0YocGUtPmlkZGMuZGQsIENlcnRpZmljYXRlVGFi bGUpOworICAgICAgICBkYXQxID0gKEJZVEUgKilwZS0+aWRkYy5kZDsKKyAgICAgICAgb2ZmMiA9 IG9mZjEgKyBsZW4xICsgc2l6ZW9mKGRhdGFfZGlyZWN0b3J5X2VudHJ5X3QpOworICAgICAgICBs ZW4yID0gc2l6ZW9mKHBlMzJwbHVzX2NvZmZfZmllbGRzX3QpIC0gT0ZGU0VUX09GKHBlLT5wZWNm Yy5wZTMycGx1cywgU3Vic3lzdGVtKTsKKyAgICAgICAgbGVuMiA9IHBlLT5OdW1iZXJPZlJ2YUFu ZFNpemVzICogc2l6ZW9mKGRhdGFfZGlyZWN0b3J5X2VudHJ5X3QpOworICAgICAgICBsZW4yIC09 IE9GRlNFVF9PRihwZS0+aWRkYy5kZCwgQmFzZVJlbG9jYXRpb25UYWJsZSk7CisgICAgICAgIGRh dDIgPSBkYXQxICsgbGVuMSArIHNpemVvZihkYXRhX2RpcmVjdG9yeV9lbnRyeV90KTsKKyAgICAg ICAgcGVjb2ZmX2FwcGVuZF9yYW5nZShwZSwgb2ZmMSwgbGVuMSwgZGF0MSwgIkRhdGEgRGlyZWN0 b3J5LCBtaW51cyBDZXJ0aWZpY2F0ZVRhYmxlIik7CisgICAgICAgIHBlY29mZl9hcHBlbmRfcmFu Z2UocGUsIG9mZjIsIGxlbjIsIGRhdDIsICJEYXRhIERpcmVjdG9yeSwgbWludXMgQ2VydGlmaWNh dGVUYWJsZSIpOworICAgICAgICAvLyBTZWN0aW9uIEhlYWRlcnMgLSBhcmUgdG8gYmUgc29ydGVk IGFjY29yZGluZyB0byBQb2ludGVyVG9SYXdEYXRhCisgICAgICAgIC8vIEZJWCEhISB0aGlzIGNv ZGUgZG9lcyBub3QgcHJvcGVybHkgc29ydCB0aGUgbGlzdCBvZiBzZWN0aW9uIGhlYWRlcnMKKyAg ICAgICAgU1VNX09GX0JZVEVTX0hBU0hFRCA9IGlzX3BlMzIoKSA/IHBlLT5wZWNmYy5wZTMyLT5T aXplT2ZIZWFkZXJzIDogcGUtPnBlY2ZjLnBlMzJwbHVzLT5TaXplT2ZIZWFkZXJzOworICAgICAg ICBETENMX0ZPUl9FQUNIKHBlY29mZl9zZWN0aW9uX2N0LCBwZS0+c2VjdGlvbnMsIHNjLCBuZXh0 LCBwcmV2KQorICAgICAgICB7CisgICAgICAgICAgICBzID0gc2MtPnM7CisgICAgICAgICAgICBw ZWNvZmZfYXBwZW5kX3JhbmdlKHBlLCBzYy0+ZmlsZU9mZnNldCwgc2l6ZW9mKHBlY29mZl9zZWN0 aW9uX3QpLCAoQllURSAqKXMsICJTZWN0aW9uSGVhZGVyIik7CisgICAgICAgICAgICBpZiAocy0+ U2l6ZU9mUmF3RGF0YSkKKyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICBQUklOVEsoTEFC RUwgIlxuIiwgcy0+TmFtZSk7CisgICAgICAgICAgICAgICAgcGVjb2ZmX2FwcGVuZF9yYW5nZShw ZSwgcy0+UG9pbnRlclRvUmF3RGF0YSwgcy0+U2l6ZU9mUmF3RGF0YSwgc2MtPmRhdGEsICJTZWN0 aW9uQ29udGVudCIpOworICAgICAgICAgICAgICAgIFNVTV9PRl9CWVRFU19IQVNIRUQgKz0gcy0+ U2l6ZU9mUmF3RGF0YTsKKyAgICAgICAgICAgICAgICBTdGFydE9mUmF3RGF0YSA9IG1pbihzLT5Q b2ludGVyVG9SYXdEYXRhLCBTdGFydE9mUmF3RGF0YSk7CisgICAgICAgICAgICAgICAgRW5kT2ZS YXdEYXRhID0gbWF4KHMtPlBvaW50ZXJUb1Jhd0RhdGEgKyBzLT5TaXplT2ZSYXdEYXRhLCBTdGFy dE9mUmF3RGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRW5kT2ZJbWFn ZUhlYWRlciA9IHBlLT5TZWN0aW9uSGVhZGVyQmFzZSArIChwZS0+Y2hjLmNoLT5OdW1iZXJPZlNl Y3Rpb25zICogc2l6ZW9mKHBlY29mZl9zZWN0aW9uX3QpKTsKKy8vICAgICAgUFJJTlRLKCJFbmQg b2YgSW1hZ2UgSGVkcjogJTA4WFxuIiwgRW5kT2ZJbWFnZUhlYWRlcik7CisvLyAgICAgIFBSSU5U SygiU3RhcnQgb2YgUmF3IERhdGE6ICUwOFhcbiIsIFN0YXJ0T2ZSYXdEYXRhKTsKKyAgICAgICAg cGUtPm9mZnNldCA9IEVuZE9mSW1hZ2VIZWFkZXI7CisgICAgICAgIGJ1ZiA9IG1rcHRyKEJZVEUp OworICAgICAgICBwZWNvZmZfYXBwZW5kX3JhbmdlKHBlLCBFbmRPZkltYWdlSGVhZGVyLCBTdGFy dE9mUmF3RGF0YSAtIEVuZE9mSW1hZ2VIZWFkZXIsIGJ1ZiwgIlBhZGRpbmcgYWZ0ZXIgSGVhZGVy IHRvIFJhdyBEYXRhIik7CisKKyAgICAgICAgLy8gVGhlIHN0YXJ0IG9mIHJhdyBkYXRhIG9mZmlj aWFsbHkgZW5kcyB0aGUgaW1hZ2UgaGVhZGVyCisgICAgICAgIEZJTEVfU0laRSA9IHBlLT5pbWFn ZVNpemU7CisgICAgICAgIEVYVFJBID0gRklMRV9TSVpFIC0gKChwZS0+aWRkYy5kZC0+Q2VydGlm aWNhdGVUYWJsZS5TaXplKSArIFNVTV9PRl9CWVRFU19IQVNIRUQpOworICAgICAgICBQUklOVEso IkZJTEVfU0laRSAldSgleCkgU09CSCAldSBFWFRSQSAldVxuIiwgRklMRV9TSVpFLCBGSUxFX1NJ WkUsIFNVTV9PRl9CWVRFU19IQVNIRUQsIEVYVFJBKTsKKyAgICAgICAgaWYgKEVYVFJBKQorICAg ICAgICB7CisgICAgICAgICAgICAvLyBGSVg/Pz8gTm90IGNsZWFyIGlmIHNob3VsZCBiZSBzb3J0 ZWQgKHNwZWMgb25seSBkZXNjcmliZXMgc29ydGluZyBzZWN0aW9ucykKKyAgICAgICAgICAgIEJZ VEUgKmJ1ZjsKKyAgICAgICAgICAgIHBlLT5vZmZzZXQgPSBFbmRPZlJhd0RhdGE7CisgICAgICAg ICAgICBidWYgPSBta3B0cihCWVRFKTsKKyAgICAgICAgICAgIHBlY29mZl9hcHBlbmRfcmFuZ2Uo cGUsIEVuZE9mUmF3RGF0YSwgRVhUUkEsIGJ1ZiwgIkV4dHJhIik7CisgICAgICAgIH0KKworICAg ICAgICAvLyBGSVghISEgTXVzdCBzb3J0IHNlY3Rpb25zIGFjY29yZGluZyB0byBmaWxlIG9mZnNl dAorICAgICAgICAvLyBTaW1wbGUgYnJ1dGUgZm9yY2UgbGluZWFyIHNvcnQKKyAgICAgICAgZG8K KyAgICAgICAgeworICAgICAgICAgICAgc29ydGVkID0gMTsKKyAgICAgICAgICAgIERMQ0xfRk9S X0VBQ0gocmFuZ2VfdCwgcGUtPnJhbmdlcywgcmFuZ2UsIG5leHQsIHByZXYpCisgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgaWYgKChyYW5nZS0+bmV4dCAhPSBwZS0+cmFuZ2VzKSAmJiAo cmFuZ2UtPm9mZnNldCA+IHJhbmdlLT5uZXh0LT5vZmZzZXQpKQorICAgICAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgICAgICAgRExDTF9SRU1PVkUocmFuZ2VfdCwgcGUtPnJhbmdlcywgcmFu Z2UpOworICAgICAgICAgICAgICAgICAgICBETENMX0FQUEVORChyYW5nZV90LCBwZS0+cmFuZ2Vz LCByYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIHNvcnRlZCA9IDA7CisgICAgICAgICAgICAg ICAgICAgIC8vYnJlYWs7IC0gc2FmZSB0byBjb250aW51ZSB0byB0cmF2ZXJzZSBsaXN0CisgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICghc29ydGVkKTsK KworI2lmIDAKKyAgICAgICAgLy8gTm93IG91dHB1dCBzaWduYXR1cmUgYnl0ZSBzdHJlYW0KKyAg ICAgICAgeworICAgICAgICAgICAgcmFuZ2VfdCAqcmFuZ2U7CisgICAgICAgICAgICByYW5nZV90 ICpwcmV2UmFuZ2UgPSBOVUxMOworICAgICAgICAgICAgRExDTF9GT1JfRUFDSChyYW5nZV90LCBw ZS0+cmFuZ2VzLCByYW5nZSwgbmV4dCwgcHJldikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg ICAgICBpZiAocHJldlJhbmdlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg ICAgaWYgKChwcmV2UmFuZ2UtPm9mZnNldCArIHByZXZSYW5nZS0+bGVuZ3RoKSAhPSByYW5nZS0+ b2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRLKCJXYXJuaW5nOiBub3QgY29u c2VjdXRpdmUhXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUFJJTlRL KCJkaWdlc3RpbmcgJXggKyAleCAoJXgpIDogJXNcbiIsIHJhbmdlLT5vZmZzZXQsIHJhbmdlLT5s ZW5ndGgsIHJhbmdlLT5vZmZzZXQgKyByYW5nZS0+bGVuZ3RoLCByYW5nZS0+ZGVzY3JpcHRpb24p OworICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgfQorICAg ICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEv eGVuL2NvbW1vbi9wZWQuaCBiL3hlbi9jb21tb24vcGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uNWI0MTIxZgotLS0gL2Rldi9udWxsCisrKyBiL3hlbi9jb21tb24vcGVk LmgKQEAgLTAsMCArMSwxMjggQEAKKworI2lmbmRlZiBQRURfSAorCisvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisK KyNpZm5kZWYgX19YRU5fXworI2RlZmluZSB6dGFsbG9jKFRZUEUsIFNJWkUpIChUWVBFICopY2Fs bG9jKCAxLCBTSVpFICkKKyNkZWZpbmUgenNhbGxvYyhUWVBFKSB6dGFsbG9jKFRZUEUsIHNpemVv ZihUWVBFKSApCisjZGVmaW5lIHpzZnJlZShQKSBmcmVlKFApCisjaW5jbHVkZSA8c3RkaW50Lmg+ CisjZGVmaW5lIFBSSU5USyhGTVQuLi4pIHByaW50ZihGTVQpCisKKyNlbHNlCisjZGVmaW5lIHpz YWxsb2MoVFlQRSkgeHphbGxvY19hcnJheShUWVBFLCAxKQorI2RlZmluZSB6c2ZyZWUoUCkgeGZy ZWUoUCkKKyNpbmNsdWRlIDx4ZW4vdHlwZXMuaD4KKyNkZWZpbmUgUFJJTlRLKEZNVC4uLikgcHJp bnRrKEZNVCkKKworI2VuZGlmCisKKy8vI2RlZmluZSBtYWxsb2MgTUFMTE9DX0RPX05PVF9VU0UK Ky8vI2RlZmluZSBmcmVlIEZSRUVfRE9fTk9UX1VTRQorCisjaW5jbHVkZSAicGVjb2ZmLmgiCisK Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KK3N0cnVjdCBwZWNvZmZfaW1hZ2VfczsKKwordHlwZWRlZiBzdHJ1Y3Qg cmFuZ2VfcworeworICAgIERXT1JEIG9mZnNldDsgLy8gZnJvbSBmaWxlCisgICAgRFdPUkQgbGVu Z3RoOyAvLyBpbmNsdXNpdmUKKyAgICBCWVRFICpkYXRhOyAvLyB0byBpbi1tZW1vcnkgY29weSBv ZiBmaWxlCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247IC8vIGZvciBkZWJ1ZworCisgICAg c3RydWN0IHJhbmdlX3MgKm5leHQ7CisgICAgc3RydWN0IHJhbmdlX3MgKnByZXY7Cit9IHJhbmdl X3Q7CisKK3JhbmdlX3QgKgorcGVjb2ZmX2FwcGVuZF9yYW5nZSAoc3RydWN0IHBlY29mZl9pbWFn ZV9zICpwZSwgRFdPUkQgb2Zmc2V0LCBEV09SRCBsZW5ndGgsIEJZVEUgKmRhdGEsIGNvbnN0IGNo YXIgKmRlc2NyaXB0aW9uKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gTk9URTogVGhlIF9jcyBtZWFu cyBjb250YWluZXIgc3RydWN0LCBhcyBpbiBpdCBjb250YWlucyB0aGUgZmlyc3QKKy8vIG1lbWJl ciBwbHVzIGl0ZW1zIHJlbGF0ZWQgdG8gaXQgdGhhdCBJIG5lZWQgaW4gdGhlIGNvZGUKK3R5cGVk ZWYgc3RydWN0IGRvc19oZWFkZXJfY3MKK3sKKyAgICBkb3NfaGVhZGVyX3QgKmRoOworICAgIEJZ VEUgKmRzOworICAgIERXT1JEIGZpbGVPZmZzZXQ7Cit9IGRvc19oZWFkZXJfY3Q7CisKK3R5cGVk ZWYgc3RydWN0IGNvZmZfaGVhZGVyX2NzCit7CisgICAgY29mZl9oZWFkZXJfdCAqY2g7CisgICAg RFdPUkQgZmlsZU9mZnNldDsKK30gY29mZl9oZWFkZXJfY3Q7CisKK3R5cGVkZWYgc3RydWN0IGNv ZmZfZmllbGRzX2NzCit7CisgICAgY29mZl9maWVsZHNfdCAqY2Y7CisjZGVmaW5lIGlzX3BlMzIo KSAoSU1BR0VfTUFHSUNfUEUzMiA9PSBwZS0+Y2ZjLmNmLT5NYWdpYykKKyAgICBEV09SRCBmaWxl T2Zmc2V0OworfSBjb2ZmX2ZpZWxkc19jdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGVfY29mZl9maWVs ZHNfY3MKK3sKKyAgICBwZTMyX2NvZmZfZmllbGRzX3QgKnBlMzI7CisgICAgcGUzMnBsdXNfY29m Zl9maWVsZHNfdCAqcGUzMnBsdXM7CisgICAgRFdPUkQgZmlsZU9mZnNldDsKK30gcGVfY29mZl9m aWVsZHNfY3Q7CisKK3R5cGVkZWYgc3RydWN0IGltYWdlX2RhdGFfZGlyZWN0b3J5X2NzCit7Cisg ICAgaW1hZ2VfZGF0YV9kaXJlY3RvcnlfdCAqZGQ7CisgICAgRFdPUkQgZmlsZU9mZnNldDsKK30g aW1hZ2VfZGF0YV9kaXJlY3RvcnlfY3Q7CisKK3R5cGVkZWYgc3RydWN0IHBlY29mZl9zZWN0aW9u X2NzCit7CisgICAgcGVjb2ZmX3NlY3Rpb25fdCAqczsKKyAgICBCWVRFICpkYXRhOworICAgIERX T1JEIGZpbGVPZmZzZXQ7CisgICAgc3RydWN0IHBlY29mZl9zZWN0aW9uX2NzICpuZXh0LCAqcHJl djsKK30gcGVjb2ZmX3NlY3Rpb25fY3Q7CisKK3R5cGVkZWYgc3RydWN0IGF0dHJpYnV0ZV9jZXJ0 aWZpY2F0ZV9jcworeworICAgIGF0dHJpYnV0ZV9jZXJ0aWZpY2F0ZV90ICphYzsKKyAgICBCWVRF ICpkYXRhOworfSBhdHRyaWJ1dGVfY2VydGlmaWNhdGVfY3Q7CisKK3R5cGVkZWYgc3RydWN0IHBl Y29mZl9pbWFnZV9zCit7CisgICAgLy8gRm9yIG1hbmFnaW5nIHBhcnNlL2RlY29kZQorICAgIHVp bnQ4X3QgKmltYWdlQmFzZTsKKyAgICBzaXplX3QgaW1hZ2VTaXplOworICAgIHNpemVfdCBvZmZz ZXQ7CisKKyAgICBkb3NfaGVhZGVyX2N0IGRoYzsKKyAgICBjb2ZmX2hlYWRlcl9jdCBjaGM7Cisg ICAgY29mZl9maWVsZHNfY3QgY2ZjOworICAgIHBlX2NvZmZfZmllbGRzX2N0IHBlY2ZjOworICAg IGltYWdlX2RhdGFfZGlyZWN0b3J5X2N0IGlkZGM7CisjaWZuZGVmIFBFQ09GRl9NQVhfU0VDVElP TlMKKyNkZWZpbmUgUEVDT0ZGX01BWF9TRUNUSU9OUyAzMgorI2VuZGlmCisgICAgcGVjb2ZmX3Nl Y3Rpb25fY3Qgc2VjdGlvbmNzW1BFQ09GRl9NQVhfU0VDVElPTlNdOworICAgIGF0dHJpYnV0ZV9j ZXJ0aWZpY2F0ZV9jdCBjZXJ0OworCisgICAgRFdPUkQgU2VjdGlvbkhlYWRlckJhc2U7CisKKyAg ICAvLyBmb3IgaGFzaCBjb21wdXRhdGlvbi92ZXJpZmljYXRpb24KKyAgICByYW5nZV90ICpyYW5n ZXM7CisgICAgRFdPUkQgTnVtYmVyT2ZSdmFBbmRTaXplczsKKyAgICBwZWNvZmZfc2VjdGlvbl9j dCAqc2VjdGlvbnM7CisKKworfSBwZWNvZmZfaW1hZ2VfdDsKKworcGVjb2ZmX2ltYWdlX3QgKiBw ZWNvZmZfaW1hZ2VfYWxsb2MgKHVpbnQ4X3QgKmltYWdlQmFzZSwgc2l6ZV90IGltYWdlU2l6ZSk7 Cit2b2lkIHBlY29mZl9pbWFnZV9mcmVlIChwZWNvZmZfaW1hZ2VfdCAqcGUpOworCitwZWNvZmZf aW1hZ2VfdCAqIHBlY29mZl9pbWFnZV9kZWNvZGUgKHVpbnQ4X3QgKmltYWdlQmFzZSwgc2l6ZV90 IGltYWdlU2l6ZSk7Cit2b2lkIHBlY29mZl9zZXR1cF92ZXJpZnkgKHBlY29mZl9pbWFnZV90ICpw ZSk7CisKKyNlbmRpZiAvLyBQRURfSAorCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3Zfb3BlbnNz bC5jIGIveGVuL2NvbW1vbi92X29wZW5zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi45YmNiYTJlCi0tLSAvZGV2L251bGwKKysrIGIveGVuL2NvbW1vbi92X29wZW5zc2wu YwpAQCAtMCwwICsxLDEzNDggQEAKKworI2lmZGVmIF9fWEVOX18KKyNkZWZpbmUgT1BFTlNTTF8x XzEKKy8vI2RlZmluZSBPUEVOU1NMX05PX0ZQX0FQSQorLy8jZGVmaW5lIE9QRU5TU0xfTk9fU0NU UAorLy8jZGVmaW5lIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVk ZSAicGVkLmgiCisjaW5jbHVkZSAiZGxjbC5oIgorI2RlZmluZSBDb3B5TWVtKFNSQyxERVNULFNJ WkUpIG1lbWNweSgodm9pZCAqKURFU1QsKGNvbnN0IHZvaWQgKilTUkMsU0laRSkKKyNkZWZpbmUg UFJJTlRLKEZNVC4uLikgcHJpbnRrKEZNVCkKKyNlbHNlCisjZGVmaW5lIFBSSU5USyhGTVQuLi4p IHByaW50ZihGTVQpCisjZW5kaWYKKworI2RlZmluZSBJTlQ4IGludDhfdAorI2RlZmluZSBJTlQx NiBpbnQxNl90CisjZGVmaW5lIElOVDMyIGludDMyX3QKKyNkZWZpbmUgSU5UNjQgaW50NjRfdAor I2RlZmluZSBJTlROIHNpZ25lZCBsb25nCisjZGVmaW5lIFVJTlQ4IHVpbnQ4X3QKKyNkZWZpbmUg VUlOVDE2IHVpbnQxNl90CisjZGVmaW5lIFVJTlQzMiB1aW50MzJfdAorI2RlZmluZSBVSU5UNjQg dWludDY0X3QKKyNkZWZpbmUgVUlOVE4gdW5zaWduZWQgbG9uZworI2RlZmluZSBCT09MRUFOIGlu dAorI2RlZmluZSBFRklBUEkKKyNkZWZpbmUgQ09OU1QgY29uc3QKKyNkZWZpbmUgSU4KKyNkZWZp bmUgT1VUCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorI2lmbmRlZiBU UlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjZGVmaW5lIENvbXBhcmVNZW0oQSxCLFNJWkUp IG1lbWNtcChBLEIsU0laRSkKKyNpZm5kZWYgQ29weU1lbQorI2RlZmluZSBDb3B5TWVtKFNSQyxE RVNULFNJWkUpIG1lbWNweShERVNULFNSQyxTSVpFKQorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNz bC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3Ns L3BrY3M3Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94 NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Ntcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJy Lmg+CisKKy8vI2lmbmRlZiBPUEVOU1NMX0FQSV9DT01QQVQKKy8vI2RlZmluZSBPUEVOU1NMX0FQ SV9DT01QQVQgMHgxMDAwMDAwMEwKKy8vI2VuZGlmCisvLyMgaWYgT1BFTlNTTF9BUElfQ09NUEFU IDwgMHgxMDEwMDAwMEwKKy8vIyBlbmRpZgorCitzdGF0aWMgaW50IGNlcnRfaW5fc3RvcmUoWDUw OSAqY2VydCwgWDUwOV9TVE9SRV9DVFggKmN0eCkKK3sKKyNpZm5kZWYgT1BFTlNTTF8xXzEKKyAg ICBYNTA5X09CSkVDVCBvYmo7CisKKyAgICBvYmoudHlwZSA9IFg1MDlfTFVfWDUwOTsKKyAgICBv YmouZGF0YS54NTA5ID0gY2VydDsKKworICAgIHJldHVybiBYNTA5X09CSkVDVF9yZXRyaWV2ZV9t YXRjaChjdHgtPmN0eC0+b2JqcywgJm9iaikgIT0gTlVMTDsKKyNlbHNlCisgICAgWDUwOV9PQkpF Q1QgKm9iajsKKyAgICBpbnQgcmMgPSAwOworICAgIGlmICgob2JqID0gWDUwOV9PQkpFQ1RfbmV3 KCkpICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoWDUwOV9PQkpFQ1Rfc2V0MV9YNTA5KG9i aiwgY2VydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNUQUNLX09GKFg1MDlfT0JKRUNUKSAq b2JqczsKKyAgICAgICAgICAgIG9ianMgPSBYNTA5X1NUT1JFX2dldDBfb2JqZWN0cyggWDUwOV9T VE9SRV9DVFhfZ2V0MF9zdG9yZShjdHgpICk7CisgICAgICAgICAgICByYyA9IFg1MDlfT0JKRUNU X3JldHJpZXZlX21hdGNoKG9ianMsIG9iaikgIT0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBY NTA5X09CSkVDVF9mcmVlKG9iaik7CisgICAgfQorICAgIHJldHVybiByYzsKKyNlbmRpZgorfQor CisvKiogQGZpbGUKKyAgUEtDUyM3IFNpZ25lZERhdGEgVmVyaWZpY2F0aW9uIFdyYXBwZXIgSW1w bGVtZW50YXRpb24gb3ZlciBPcGVuU1NMLgorCisgIENhdXRpb246IFRoaXMgbW9kdWxlIHJlcXVp cmVzIGFkZGl0aW9uYWwgcmV2aWV3IHdoZW4gbW9kaWZpZWQuCisgIFRoaXMgbGlicmFyeSB3aWxs IGhhdmUgZXh0ZXJuYWwgaW5wdXQgLSBzaWduYXR1cmUgKGUuZy4gVUVGSSBBdXRoZW50aWNhdGVk CisgIFZhcmlhYmxlKS4gSXQgbWF5IGJ5IGlucHV0IGluIFNNTSBtb2RlLgorICBUaGlzIGV4dGVy bmFsIGlucHV0IG11c3QgYmUgdmFsaWRhdGVkIGNhcmVmdWxseSB0byBhdm9pZCBzZWN1cml0eSBp c3N1ZSBsaWtlCisgIGJ1ZmZlciBvdmVyZmxvdywgaW50ZWdlciBvdmVyZmxvdy4KKworICBXcmFw UGtjczdEYXRhKCksIFBrY3M3R2V0U2lnbmVycygpLCBQa2NzN1ZlcmlmeSgpIHdpbGwgZ2V0IFVF RkkgQXV0aGVudGljYXRlZAorICBWYXJpYWJsZSBhbmQgd2lsbCBkbyBiYXNpYyBjaGVjayBmb3Ig ZGF0YSBzdHJ1Y3R1cmUuCisKK0NvcHlyaWdodCAoYykgMjAwOSAtIDIwMTIsIEludGVsIENvcnBv cmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjxCUj4KK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFj Y29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5k ZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQord2hpY2ggYWNj b21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNl IG1heSBiZSBmb3VuZCBhdAoraHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNl bnNlLnBocAorCitUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VO U0UgT04gQU4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRB VElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuCisKKyoqLworLyoK KyNpbmNsdWRlICJJbnRlcm5hbENyeXB0TGliLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL29iamVj dHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3 Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisqLworVUlOVDggbU9pZFZhbHVlWzldID0geyAweDJB LCAweDg2LCAweDQ4LCAweDg2LCAweEY3LCAweDBELCAweDAxLCAweDA3LCAweDAyIH07CisKKy8q KgorICBWZXJpZmljYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gdG8gb3ZlcnJpZGUgYW55IGV4aXN0 aW5nIGNhbGxiYWNrcyBpbiBPcGVuU1NMCisgIGZvciBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGUg c3VwcG9ydHMuCisKKyAgQHBhcmFtW2luXSAgU3RhdHVzICAgT3JpZ2luYWwgc3RhdHVzIGJlZm9y ZSBjYWxsaW5nIHRoaXMgY2FsbGJhY2suCisgIEBwYXJhbVtpbl0gIENvbnRleHQgIFg1MDkgc3Rv cmUgY29udGV4dC4KKworICBAcmV0dmFsICAgICAxICAgICAgICBDdXJyZW50IFg1MDkgY2VydGlm aWNhdGUgaXMgdmVyaWZpZWQgc3VjY2Vzc2Z1bGx5LgorICBAcmV0dmFsICAgICAwICAgICAgICBW ZXJpZmljYXRpb24gZmFpbGVkLgorCisqKi8KK2ludAorWDUwOVZlcmlmeUNiICgKKyAgSU4gaW50 ICAgICAgICAgICAgU3RhdHVzLAorICBJTiBYNTA5X1NUT1JFX0NUWCAqQ29udGV4dAorICApCit7 CisjaWYgMAorICBYNTA5X09CSkVDVCAgKk9iajsKKyAgSU5UTiAgICAgICAgIEVycm9yOworICBJ TlROICAgICAgICAgSW5kZXg7CisgIElOVE4gICAgICAgICBDb3VudDsKKworICBPYmogICA9IE5V TEw7CisgIEVycm9yID0gKElOVE4pIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvciAoQ29udGV4dCk7 CisKKyAgLy8KKyAgLy8gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUIGFuZCBY NTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSXworICAvLyBDRVJUX0xPQ0FMTFkgbWVhbiBh IFg1MDkgY2VydGlmaWNhdGUgaXMgbm90IHNlbGYgc2lnbmVkIGFuZCBpdHMgaXNzdWVyCisgIC8v IGNhbiBub3QgYmUgZm91bmQgaW4gWDUwOV92ZXJpZnlfY2VydCBvZiBYNTA5X3ZmeS5jLgorICAv LyBJbiBvcmRlciB0byBzdXBwb3J0IGludGVybWVkaWF0ZSBjZXJ0aWZpY2F0ZSBub2RlLCB3ZSBv dmVycmlkZSB0aGUKKyAgLy8gZXJyb3JzIGlmIHRoZSBjZXJ0aWZpY2F0aW9uIGlzIG9idGFpbmVk IGZyb20gWDUwOSBzdG9yZSwgaS5lLiBpdCBpcworICAvLyBhIHRydXN0ZWQgY2VyaXRpZmNhdGUg bm9kZSB0aGF0IGlzIGVucm9sbGVkIGJ5IHVzZXIuCisgIC8vIEJlc2lkZXMsWDUwOV9WX0VSUl9D RVJUX1VOVFJVU1RFRCBhbmQgWDUwOV9WX0VSUl9VTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFU VVJFCisgIC8vIGFyZSBhbHNvIGlnbm9yZWQgdG8gZW5hYmxlIHN1Y2ggZmVhdHVyZS4KKyAgLy8K KyAgaWYgKChFcnJvciA9PSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQpIHx8 CisgICAgICAoRXJyb3IgPT0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xP Q0FMTFkpKSB7CisgICAgT2JqID0gKFg1MDlfT0JKRUNUICopIG1hbGxvYyAoc2l6ZW9mIChYNTA5 X09CSkVDVCkpOworICAgIGlmIChPYmogPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAg fQorCisgICAgT2JqLT50eXBlICAgICAgPSBYNTA5X0xVX1g1MDk7CisgICAgT2JqLT5kYXRhLng1 MDkgPSBDb250ZXh0LT5jdXJyZW50X2NlcnQ7CisKKyAgICBDUllQVE9fd19sb2NrIChDUllQVE9f TE9DS19YNTA5X1NUT1JFKTsKKworICAgIGlmIChYNTA5X09CSkVDVF9yZXRyaWV2ZV9tYXRjaCAo Q29udGV4dC0+Y3R4LT5vYmpzLCBPYmopKSB7CisgICAgICBTdGF0dXMgPSAxOworICAgIH0gZWxz ZSB7CisgICAgICAvLworICAgICAgLy8gSWYgYW55IGNlcnRpZmljYXRlIGluIHRoZSBjaGFpbiBp cyBlbnJvbGxlZCBhcyB0cnVzdGVkIGNlcnRpZmljYXRlLAorICAgICAgLy8gcGFzcyB0aGUgY2Vy dGlmaWNhdGUgdmVyaWZpY2F0aW9uLgorICAgICAgLy8KKyAgICAgIGlmIChFcnJvciA9PSBYNTA5 X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlRfTE9DQUxMWSkgeworICAgICAgICBDb3Vu dCA9IChJTlROKSBza19YNTA5X251bSAoQ29udGV4dC0+Y2hhaW4pOworICAgICAgICBmb3IgKElu ZGV4ID0gMDsgSW5kZXggPCBDb3VudDsgSW5kZXgrKykgeworICAgICAgICAgIE9iai0+ZGF0YS54 NTA5ID0gc2tfWDUwOV92YWx1ZSAoQ29udGV4dC0+Y2hhaW4sIChpbnQpIEluZGV4KTsKKyAgICAg ICAgICBpZiAoWDUwOV9PQkpFQ1RfcmV0cmlldmVfbWF0Y2ggKENvbnRleHQtPmN0eC0+b2Jqcywg T2JqKSkgeworICAgICAgICAgICAgU3RhdHVzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIENSWVBUT193X3VubG9j ayAoQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisgIH0KKworICBpZiAoKEVycm9yID09IFg1MDlf Vl9FUlJfQ0VSVF9VTlRSVVNURUQpIHx8CisgICAgICAoRXJyb3IgPT0gWDUwOV9WX0VSUl9VTkFC TEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFKSkgeworICAgIFN0YXR1cyA9IDE7CisgIH0KKwor ICBpZiAoT2JqICE9IE5VTEwpIHsKKyAgICBPUEVOU1NMX2ZyZWUgKE9iaik7CisgIH0KKyNlbHNl CisgICAgaW50IGVyciA9IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihDb250ZXh0KTsKKyNpZmRl ZiBPUEVOU1NMXzFfMQorICAgIFg1MDkgKmNlcnQgPSBYNTA5X1NUT1JFX0NUWF9nZXQwX2NlcnQo Q29udGV4dCk7CisgICAgdWludDMyX3QgZXhfeGt1c2FnZSA9IFg1MDlfZ2V0X2V4dGVuZGVkX2tl eV91c2FnZShjZXJ0KTsKKyNlbmRpZgorICAgIC8qIGFsc28gYWNjZXB0IGNvZGUtc2lnbmluZyBr ZXlzICovCisgICAgaWYgKGVyciA9PSBYNTA5X1ZfRVJSX0lOVkFMSURfUFVSUE9TRQorI2lmbmRl ZiBPUEVOU1NMXzFfMQorICAgICAgICAgICAgJiYgQ29udGV4dC0+Y2VydC0+ZXhfeGt1c2FnZSA9 PSBYS1VfQ09ERV9TSUdOCisjZWxzZQorICAgICAgICAgICAgJiYgZXhfeGt1c2FnZSA9PSBYS1Vf Q09ERV9TSUdOCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICBTdGF0dXMgPSAxOworCisgICAg LyogYWxsIGNlcnRzIGdpdmVuIHdpdGggdGhlIC0tY2VydCBhcmd1bWVudCBhcmUgdHJ1c3RlZCAq LworICAgIGVsc2UgaWYgKGVyciA9PSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NF UlRfTE9DQUxMWSB8fAorICAgICAgICAgICAgZXJyID09IFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dF VF9JU1NVRVJfQ0VSVCB8fAorICAgICAgICAgICAgZXJyID09IFg1MDlfVl9FUlJfQ0VSVF9VTlRS VVNURUQpIHsKKyNpZm5kZWYgT1BFTlNTTF8xXzEKKyAgICAgICAgaWYgKGNlcnRfaW5fc3RvcmUo Q29udGV4dC0+Y3VycmVudF9jZXJ0LCBDb250ZXh0KSkKKyNlbHNlCisgICAgICAgIGlmIChjZXJ0 X2luX3N0b3JlKFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoQ29udGV4dCksIENvbnRl eHQpKQorI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSAxOworICAgIH0KKyAgICAvKiBVRUZJ IGRvZXNuJ3QgY2FyZSBhYm91dCBleHBpcmVkIHNpZ25hdHVyZXMsIHNvIHdlIHNob3VsZG4ndCBl aXRoZXIuICovCisgICAgZWxzZSBpZiAoZXJyID09IFg1MDlfVl9FUlJfQ0VSVF9IQVNfRVhQSVJF RCB8fAorICAgICAgICAgICAgZXJyID09IFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVG T1JFX0ZJRUxEIHx8CisgICAgICAgICAgICBlcnIgPT0gWDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRf VkFMSUQgfHwKKyAgICAgICAgICAgIGVyciA9PSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9U X0FGVEVSX0ZJRUxEKSB7CisgICAgICAgIFN0YXR1cyA9IDE7CisgICAgfQorI2VuZGlmCisgICAg cmV0dXJuIFN0YXR1czsKK30KKworLyoqCisgIENyZWF0ZXMgYSBQS0NTIzcgc2lnbmVkRGF0YSBh cyBkZXNjcmliZWQgaW4gIlBLQ1MgIzc6IENyeXB0b2dyYXBoaWMgTWVzc2FnZQorICBTeW50YXgg U3RhbmRhcmQsIHZlcnNpb24gMS41Ii4gVGhpcyBpbnRlcmZhY2UgaXMgb25seSBpbnRlbmRlZCB0 byBiZSB1c2VkIGZvcgorICBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIFBLQ1MjNyBmdW5jdGlvbmFs aXR5IHZhbGlkYXRpb24uCisKKyAgQHBhcmFtW2luXSAgUHJpdmF0ZUtleSAgICAgICBQb2ludGVy IHRvIHRoZSBQRU0tZm9ybWF0dGVkIHByaXZhdGUga2V5IGRhdGEgZm9yCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZGF0YSBzaWduaW5nLgorICBAcGFyYW1baW5dICBQcml2YXRlS2V5 U2l6ZSAgIFNpemUgb2YgdGhlIFBFTSBwcml2YXRlIGtleSBkYXRhIGluIGJ5dGVzLgorICBAcGFy YW1baW5dICBLZXlQYXNzd29yZCAgICAgIE5VTEwtdGVybWluYXRlZCBwYXNzcGhyYXNlIHVzZWQg Zm9yIGVuY3J5cHRlZCBQRU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgZGF0 YS4KKyAgQHBhcmFtW2luXSAgSW5EYXRhICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb250ZW50 IHRvIGJlIHNpZ25lZC4KKyAgQHBhcmFtW2luXSAgSW5EYXRhU2l6ZSAgICAgICBTaXplIG9mIElu RGF0YSBpbiBieXRlcy4KKyAgQHBhcmFtW2luXSAgU2lnbkNlcnQgICAgICAgICBQb2ludGVyIHRv IHNpZ25lcidzIERFUi1lbmNvZGVkIGNlcnRpZmljYXRlIHRvIHNpZ24gd2l0aC4KKyAgQHBhcmFt W2luXSAgT3RoZXJDZXJ0cyAgICAgICBQb2ludGVyIHRvIGFuIG9wdGlvbmFsIGFkZGl0aW9uYWwg c2V0IG9mIGNlcnRpZmljYXRlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu Y2x1ZGUgaW4gdGhlIFBLQ1MjNyBzaWduZWREYXRhIChlLmcuIGFueSBpbnRlcm1lZGlhdGUKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQXMgaW4gdGhlIGNoYWluKS4KKyAgQHBhcmFt W291dF0gU2lnbmVkRGF0YSAgICAgICBQb2ludGVyIHRvIG91dHB1dCBQS0NTIzcgc2lnbmVkRGF0 YS4KKyAgQHBhcmFtW291dF0gU2lnbmVkRGF0YVNpemUgICBTaXplIG9mIFNpZ25lZERhdGEgaW4g Ynl0ZXMuCisKKyAgQHJldHZhbCAgICAgVFJVRSAgICAgICAgICAgICBQS0NTIzcgZGF0YSBzaWdu aW5nIHN1Y2NlZWRlZC4KKyAgQHJldHZhbCAgICAgRkFMU0UgICAgICAgICAgICBQS0NTIzcgZGF0 YSBzaWduaW5nIGZhaWxlZC4KKworKiovCisjaWYgMAorQk9PTEVBTgorRUZJQVBJCitQa2NzN1Np Z24gKAorICBJTiAgIENPTlNUIFVJTlQ4ICAqUHJpdmF0ZUtleSwKKyAgSU4gICBVSU5UTiAgICAg ICAgUHJpdmF0ZUtleVNpemUsCisgIElOICAgQ09OU1QgVUlOVDggICpLZXlQYXNzd29yZCwKKyAg SU4gICBVSU5UOCAgICAgICAgKkluRGF0YSwKKyAgSU4gICBVSU5UTiAgICAgICAgSW5EYXRhU2l6 ZSwKKyAgSU4gICBVSU5UOCAgICAgICAgKlNpZ25DZXJ0LAorICBJTiAgIFVJTlQ4ICAgICAgICAq T3RoZXJDZXJ0cyAgICAgIE9QVElPTkFMLAorICBPVVQgIFVJTlQ4ICAgICAgICAqKlNpZ25lZERh dGEsCisgIE9VVCAgVUlOVE4gICAgICAgICpTaWduZWREYXRhU2l6ZQorICApCit7CisgIEJPT0xF QU4gICBTdGF0dXM7CisgIEVWUF9QS0VZICAqS2V5OworICBCSU8gICAgICAgKkRhdGFCaW87Cisg IFBLQ1M3ICAgICAqUGtjczc7CisgIFVJTlQ4ICAgICAqUnNhQ29udGV4dDsKKyAgVUlOVDggICAg ICpQN0RhdGE7CisgIFVJTlROICAgICBQN0RhdGFTaXplOworICBVSU5UOCAgICAgKlRtcDsKKwor ICAvLworICAvLyBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzLgorICAvLworICBpZiAoUHJpdmF0ZUtl eSA9PSBOVUxMIHx8IEtleVBhc3N3b3JkID09IE5VTEwgfHwgSW5EYXRhID09IE5VTEwgfHwKKyAg ICBTaWduQ2VydCA9PSBOVUxMIHx8IFNpZ25lZERhdGEgPT0gTlVMTCB8fCBTaWduZWREYXRhU2l6 ZSA9PSBOVUxMIHx8IEluRGF0YVNpemUgPiBJTlRfTUFYKSB7CisgICAgcmV0dXJuIEZBTFNFOwor ICB9CisKKyAgUnNhQ29udGV4dCA9IE5VTEw7CisgIEtleSAgICAgICAgPSBOVUxMOworICBQa2Nz NyAgICAgID0gTlVMTDsKKyAgRGF0YUJpbyAgICA9IE5VTEw7CisgIFN0YXR1cyAgICAgPSBGQUxT RTsKKworICAvLworICAvLyBSZXRyaWV2ZSBSU0EgcHJpdmF0ZSBrZXkgZnJvbSBQRU0gZGF0YS4K KyAgLy8KKyAgU3RhdHVzID0gUnNhR2V0UHJpdmF0ZUtleUZyb21QZW0gKAorICAgICAgICAgICAg IFByaXZhdGVLZXksCisgICAgICAgICAgICAgUHJpdmF0ZUtleVNpemUsCisgICAgICAgICAgICAg KENPTlNUIENIQVI4ICopIEtleVBhc3N3b3JkLAorICAgICAgICAgICAgIChWT0lEICoqKSAmUnNh Q29udGV4dAorICAgICAgICAgICAgICk7CisgIGlmICghU3RhdHVzKSB7CisgICAgcmV0dXJuIFN0 YXR1czsKKyAgfQorCisgIC8vCisgIC8vIFJlZ2lzdGVyICYgSW5pdGlhbGl6ZSBuZWNlc3Nhcnkg ZGlnZXN0IGFsZ29yaXRobXMgYW5kIFBSTkcgZm9yIFBLQ1MjNyBIYW5kbGluZworICAvLworICBF VlBfYWRkX2RpZ2VzdCAoRVZQX21kNSgpKTsKKyAgRVZQX2FkZF9kaWdlc3QgKEVWUF9zaGExKCkp OworICBFVlBfYWRkX2RpZ2VzdCAoRVZQX3NoYTI1NigpKTsKKyAgUmFuZG9tU2VlZCAoTlVMTCwg MCk7CisKKyAgLy8KKyAgLy8gQ29uc3RydWN0IE9wZW5TU0wgRVZQX1BLRVkgZm9yIHByaXZhdGUg a2V5LgorICAvLworICBLZXkgPSBFVlBfUEtFWV9uZXcgKCk7CisgIGlmIChLZXkgPT0gTlVMTCkg eworICAgIFN0YXR1cyA9IEZBTFNFOworICAgIGdvdG8gX0V4aXQ7CisgIH0KKyAgS2V5LT5zYXZl X3R5cGUgPSBFVlBfUEtFWV9SU0E7CisgIEtleS0+dHlwZSAgICAgID0gRVZQX1BLRVlfdHlwZSAo RVZQX1BLRVlfUlNBKTsKKyAgS2V5LT5wa2V5LnJzYSAgPSAoUlNBICopIFJzYUNvbnRleHQ7CisK KyAgLy8KKyAgLy8gQ29udmVydCB0aGUgZGF0YSB0byBiZSBzaWduZWQgdG8gQklPIGZvcm1hdC4g CisgIC8vCisgIERhdGFCaW8gPSBCSU9fbmV3IChCSU9fc19tZW0gKCkpOworICBCSU9fd3JpdGUg KERhdGFCaW8sIEluRGF0YSwgKGludCkgSW5EYXRhU2l6ZSk7CisKKyAgLy8KKyAgLy8gQ3JlYXRl IHRoZSBQS0NTIzcgc2lnbmVkRGF0YSBzdHJ1Y3R1cmUuCisgIC8vCisgIFBrY3M3ID0gUEtDUzdf c2lnbiAoCisgICAgICAgICAgICAoWDUwOSAqKSBTaWduQ2VydCwKKyAgICAgICAgICAgIEtleSwK KyAgICAgICAgICAgIChTVEFDS19PRihYNTA5KSAqKSBPdGhlckNlcnRzLAorICAgICAgICAgICAg RGF0YUJpbywKKyAgICAgICAgICAgIFBLQ1M3X0JJTkFSWSB8IFBLQ1M3X05PQVRUUiB8IFBLQ1M3 X0RFVEFDSEVECisgICAgICAgICAgICApOworICBpZiAoUGtjczcgPT0gTlVMTCkgeworICAgIFN0 YXR1cyA9IEZBTFNFOworICAgIGdvdG8gX0V4aXQ7CisgIH0KKworICAvLworICAvLyBDb252ZXJ0 IFBLQ1MjNyBzaWduZWREYXRhIHN0cnVjdHVyZSBpbnRvIERFUi1lbmNvZGVkIGJ1ZmZlci4KKyAg Ly8KKyAgUDdEYXRhU2l6ZSA9IGkyZF9QS0NTNyAoUGtjczcsIE5VTEwpOworICBpZiAoUDdEYXRh U2l6ZSA8PSAxOSkgeworICAgIFN0YXR1cyA9IEZBTFNFOworICAgIGdvdG8gX0V4aXQ7CisgIH0K KworICBQN0RhdGEgICAgID0gbWFsbG9jIChQN0RhdGFTaXplKTsKKyAgaWYgKFA3RGF0YSA9PSBO VUxMKSB7CisgICAgU3RhdHVzID0gRkFMU0U7CisgICAgZ290byBfRXhpdDsKKyAgfQorCisgIFRt cCAgICAgICAgPSBQN0RhdGE7CisgIFA3RGF0YVNpemUgPSBpMmRfUEtDUzcgKFBrY3M3LCAodW5z aWduZWQgY2hhciAqKikgJlRtcCk7CisKKyAgLy8KKyAgLy8gU3RyaXAgQ29udGVudEluZm8gdG8g Y29udGVudCBvbmx5IGZvciBzaWduZWRkYXRhLiBUaGUgZGF0YSBiZSB0cmltbWVkIG9mZgorICAv LyBpcyB0b3RhbGx5IDE5IGJ5dGVzLgorICAvLworICAqU2lnbmVkRGF0YVNpemUgPSBQN0RhdGFT aXplIC0gMTk7CisgICpTaWduZWREYXRhICAgICA9IG1hbGxvYyAoKlNpZ25lZERhdGFTaXplKTsK KyAgaWYgKCpTaWduZWREYXRhID09IE5VTEwpIHsKKyAgICBTdGF0dXMgPSBGQUxTRTsKKyAgICBP UEVOU1NMX2ZyZWUgKFA3RGF0YSk7CisgICAgZ290byBfRXhpdDsKKyAgfQorCisgIENvcHlNZW0g KCpTaWduZWREYXRhLCBQN0RhdGEgKyAxOSwgKlNpZ25lZERhdGFTaXplKTsKKyAgCisgIE9QRU5T U0xfZnJlZSAoUDdEYXRhKTsKKworICBTdGF0dXMgPSBUUlVFOworCitfRXhpdDoKKyAgLy8KKyAg Ly8gUmVsZWFzZSBSZXNvdXJjZXMKKyAgLy8KKyAgaWYgKFJzYUNvbnRleHQgIT0gTlVMTCkgewor ICAgIFJzYUZyZWUgKFJzYUNvbnRleHQpOworICAgIGlmIChLZXkgIT0gTlVMTCkgeworICAgICAg S2V5LT5wa2V5LnJzYSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKEtleSAhPSBOVUxMKSB7 CisgICAgRVZQX1BLRVlfZnJlZSAoS2V5KTsKKyAgfQorCisgIGlmIChEYXRhQmlvICE9IE5VTEwp IHsKKyAgICBCSU9fZnJlZSAoRGF0YUJpbyk7CisgIH0KKworICBpZiAoUGtjczcgIT0gTlVMTCkg eworICAgIFBLQ1M3X2ZyZWUgKFBrY3M3KTsKKyAgfQorCisgIHJldHVybiBTdGF0dXM7Cit9Cisj ZW5kaWYKKworLyoqCisgIENoZWNrIGlucHV0IFA3RGF0YSBpcyBhIHdyYXBwZWQgQ29udGVudElu Zm8gc3RydWN0dXJlIG9yIG5vdC4gSWYgbm90IGNvbnN0cnVjdAorICBhIG5ldyBzdHJ1Y3R1cmUg dG8gd3JhcCBQN0RhdGEuCisKKyAgQ2F1dGlvbjogVGhpcyBmdW5jdGlvbiBtYXkgcmVjZWl2ZSB1 bnRydXN0ZWQgaW5wdXQuCisgIFVFRkkgQXV0aGVudGljYXRlZCBWYXJpYWJsZSBpcyBleHRlcm5h bCBpbnB1dCwgc28gdGhpcyBmdW5jdGlvbiB3aWxsIGRvIGJhc2ljCisgIGNoZWNrIGZvciBQS0NT IzcgZGF0YSBzdHJ1Y3R1cmUuCisKKyAgQHBhcmFtW2luXSAgUDdEYXRhICAgICAgIFBvaW50ZXIg dG8gdGhlIFBLQ1MjNyBtZXNzYWdlIHRvIHZlcmlmeS4KKyAgQHBhcmFtW2luXSAgUDdMZW5ndGgg ICAgIExlbmd0aCBvZiB0aGUgUEtDUyM3IG1lc3NhZ2UgaW4gYnl0ZXMuCisgIEBwYXJhbVtvdXRd IFdyYXBGbGFnICAgICBJZiBUUlVFIFA3RGF0YSBpcyBhIENvbnRlbnRJbmZvIHN0cnVjdHVyZSwg b3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0UuCisgIEBw YXJhbVtvdXRdIFdyYXBEYXRhICAgICBJZiByZXR1cm4gc3RhdHVzIG9mIHRoaXMgZnVuY3Rpb24g aXMgVFJVRTogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSB3aGVuIFdyYXBGbGFnIGlz IFRSVUUsIHBvaW50ZXIgdG8gUDdEYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgMikg d2hlbiBXcmFwRmxhZyBpcyBGQUxTRSwgcG9pbnRlciB0byBhIG5ldyBDb250ZW50SW5mbworICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlLiBJdCdzIGNhbGxlcidzIHJlc3BvbnNp YmlsaXR5IHRvIGZyZWUgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLgor ICBAcGFyYW1bb3V0XSBXcmFwRGF0YVNpemUgTGVuZ3RoIG9mIENvbnRlbnRJbmZvIHN0cnVjdHVy ZSBpbiBieXRlcy4KKworICBAcmV0dmFsICAgICBUUlVFICAgICAgICAgVGhlIG9wZXJhdGlvbiBp cyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuCisgIEByZXR2YWwgICAgIEZBTFNFICAgICAgICBUaGUg b3BlcmF0aW9uIGlzIGZhaWxlZCBkdWUgdG8gbGFjayBvZiByZXNvdXJjZXMuCisKKyoqLworQk9P TEVBTgorV3JhcFBrY3M3RGF0YSAoCisgIElOICBDT05TVCBVSU5UOCAgKlA3RGF0YSwKKyAgSU4g IFVJTlROICAgICAgICBQN0xlbmd0aCwKKyAgT1VUIEJPT0xFQU4gICAgICAqV3JhcEZsYWcsCisg IE9VVCBVSU5UOCAgICAgICAgKipXcmFwRGF0YSwKKyAgT1VUIFVJTlROICAgICAgICAqV3JhcERh dGFTaXplCisgICkKK3sKKyAgQk9PTEVBTiAgICAgICAgICBXcmFwcGVkOworICBVSU5UOCAgICAg ICAgICAgICpTaWduZWREYXRhOworCisgIC8vCisgIC8vIENoZWNrIHdoZXRoZXIgaW5wdXQgUDdE YXRhIGlzIGEgd3JhcHBlZCBDb250ZW50SW5mbyBzdHJ1Y3R1cmUgb3Igbm90LgorICAvLworICBX cmFwcGVkID0gRkFMU0U7CisgIGlmICgoUDdEYXRhWzRdID09IDB4MDYpICYmIChQN0RhdGFbNV0g PT0gMHgwOSkpIHsKKyAgICBpZiAoQ29tcGFyZU1lbSAoUDdEYXRhICsgNiwgbU9pZFZhbHVlLCBz aXplb2YgKG1PaWRWYWx1ZSkpID09IDApIHsKKyAgICAgIGlmICgoUDdEYXRhWzE1XSA9PSAweEEw KSAmJiAoUDdEYXRhWzE2XSA9PSAweDgyKSkgeworICAgICAgICBXcmFwcGVkID0gVFJVRTsKKyAg ICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoV3JhcHBlZCkgeworICAgICpXcmFwRGF0YSAgICAg PSAoVUlOVDggKikgUDdEYXRhOworICAgICpXcmFwRGF0YVNpemUgPSBQN0xlbmd0aDsKKyAgfSBl bHNlIHsKKyAgICAvLworICAgIC8vIFdyYXAgUEtDUyM3IHNpZ25lZGRhdGEgdG8gYSBDb250ZW50 SW5mbyBzdHJ1Y3R1cmUgLSBhZGQgYSBoZWFkZXIgaW4gMTkgYnl0ZXMuCisgICAgLy8KKyAgICAq V3JhcERhdGFTaXplID0gUDdMZW5ndGggKyAxOTsKKyAgICAqV3JhcERhdGEgICAgID0gKFVJTlQ4 ICopbWFsbG9jICgqV3JhcERhdGFTaXplKTsKKyAgICBpZiAoKldyYXBEYXRhID09IE5VTEwpIHsK KyAgICAgICpXcmFwRmxhZyA9IFdyYXBwZWQ7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQor CisgICAgU2lnbmVkRGF0YSA9ICpXcmFwRGF0YTsKKworICAgIC8vCisgICAgLy8gUGFydDE6IDB4 MzAsIDB4ODIuCisgICAgLy8KKyAgICBTaWduZWREYXRhWzBdID0gMHgzMDsKKyAgICBTaWduZWRE YXRhWzFdID0gMHg4MjsKKworICAgIC8vCisgICAgLy8gUGFydDI6IExlbmd0aDEgPSBQN0xlbmd0 aCArIDE5IC0gNCwgaW4gYmlnIGVuZGlhbi4KKyAgICAvLworICAgIFNpZ25lZERhdGFbMl0gPSAo VUlOVDgpICgoKFVJTlQxNikgKCpXcmFwRGF0YVNpemUgLSA0KSkgPj4gOCk7CisgICAgU2lnbmVk RGF0YVszXSA9IChVSU5UOCkgKCgoVUlOVDE2KSAoKldyYXBEYXRhU2l6ZSAtIDQpKSAmIDB4ZmYp OworCisgICAgLy8KKyAgICAvLyBQYXJ0MzogMHgwNiwgMHgwOS4KKyAgICAvLworICAgIFNpZ25l ZERhdGFbNF0gPSAweDA2OworICAgIFNpZ25lZERhdGFbNV0gPSAweDA5OworCisgICAgLy8KKyAg ICAvLyBQYXJ0NDogT0lEIHZhbHVlIC0tIDB4MkEgMHg4NiAweDQ4IDB4ODYgMHhGNyAweDBEIDB4 MDEgMHgwNyAweDAyLgorICAgIC8vCisgICAgQ29weU1lbSAoU2lnbmVkRGF0YSArIDYsIG1PaWRW YWx1ZSwgc2l6ZW9mIChtT2lkVmFsdWUpKTsKKworICAgIC8vCisgICAgLy8gUGFydDU6IDB4QTAs IDB4ODIuCisgICAgLy8KKyAgICBTaWduZWREYXRhWzE1XSA9IDB4QTA7CisgICAgU2lnbmVkRGF0 YVsxNl0gPSAweDgyOworCisgICAgLy8KKyAgICAvLyBQYXJ0NjogTGVuZ3RoMiA9IFA3TGVuZ3Ro LCBpbiBiaWcgZW5kaWFuLgorICAgIC8vCisgICAgU2lnbmVkRGF0YVsxN10gPSAoVUlOVDgpICgo KFVJTlQxNikgUDdMZW5ndGgpID4+IDgpOworICAgIFNpZ25lZERhdGFbMThdID0gKFVJTlQ4KSAo KChVSU5UMTYpIFA3TGVuZ3RoKSAmIDB4ZmYpOworCisgICAgLy8KKyAgICAvLyBQYXJ0NzogUDdE YXRhLgorICAgIC8vCisgICAgQ29weU1lbSAoU2lnbmVkRGF0YSArIDE5LCBQN0RhdGEsIFA3TGVu Z3RoKTsKKyAgfQorCisgICpXcmFwRmxhZyA9IFdyYXBwZWQ7CisgIHJldHVybiBUUlVFOworfQor CisvKioKKyAgUG9wIHNpbmdsZSBjZXJ0aWZpY2F0ZSBmcm9tIFNUQUNLX09GKFg1MDkpLgorCisg IElmIFg1MDlTdGFjaywgQ2VydCwgb3IgQ2VydFNpemUgaXMgTlVMTCwgdGhlbiByZXR1cm4gRkFM U0UuCisKKyAgQHBhcmFtW2luXSAgWDUwOVN0YWNrICAgICAgIFBvaW50ZXIgdG8gYSBYNTA5IHN0 YWNrIG9iamVjdC4KKyAgQHBhcmFtW291dF0gQ2VydCAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBY NTA5IGNlcnRpZmljYXRlLgorICBAcGFyYW1bb3V0XSBDZXJ0U2l6ZSAgICAgICAgTGVuZ3RoIG9m IG91dHB1dCBYNTA5IGNlcnRpZmljYXRlIGluIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCisgIEByZXR2YWwgICAgIFRSVUUgICAgICAgICAgICBUaGUgWDUwOSBzdGFj ayBwb3Agc3VjY2VlZGVkLgorICBAcmV0dmFsICAgICBGQUxTRSAgICAgICAgICAgVGhlIHBvcCBv cGVyYXRpb24gZmFpbGVkLgorCisqKi8KKyNpZiAwCitCT09MRUFOCitYNTA5UG9wQ2VydGlmaWNh dGUgKAorICBJTiAgVk9JRCAgKlg1MDlTdGFjaywKKyAgT1VUIFVJTlQ4ICoqQ2VydCwKKyAgT1VU IFVJTlROICpDZXJ0U2l6ZQorICApCit7CisgIEJJTyAgICAgICAgICAgICAqQ2VydEJpbzsKKyAg WDUwOSAgICAgICAgICAgICpYNTA5Q2VydDsKKyAgU1RBQ0tfT0YoWDUwOSkgICpDZXJ0U3RhY2s7 CisgIEJPT0xFQU4gICAgICAgICBTdGF0dXM7CisgIElOVDMyICAgICAgICAgICBSZXN1bHQ7Cisg IElOVDMyICAgICAgICAgICBMZW5ndGg7CisgIFZPSUQgICAgICAgICAgICAqQnVmZmVyOworCisg IFN0YXR1cyA9IEZBTFNFOworCisgIGlmICgoWDUwOVN0YWNrID09IE5VTEwpIHx8IChDZXJ0ID09 IE5VTEwpIHx8IChDZXJ0U2l6ZSA9PSBOVUxMKSkgeworICAgIHJldHVybiBTdGF0dXM7CisgIH0K KworICBDZXJ0U3RhY2sgPSAoU1RBQ0tfT0YoWDUwOSkgKikgWDUwOVN0YWNrOworCisgIFg1MDlD ZXJ0ID0gc2tfWDUwOV9wb3AgKENlcnRTdGFjayk7CisKKyAgaWYgKFg1MDlDZXJ0ID09IE5VTEwp IHsKKyAgICByZXR1cm4gU3RhdHVzOworICB9CisKKyAgQnVmZmVyID0gTlVMTDsKKworICBDZXJ0 QmlvID0gQklPX25ldyAoQklPX3NfbWVtICgpKTsKKyAgaWYgKENlcnRCaW8gPT0gTlVMTCkgewor ICAgIHJldHVybiBTdGF0dXM7CisgIH0KKworICBSZXN1bHQgPSBpMmRfWDUwOV9iaW8gKENlcnRC aW8sIFg1MDlDZXJ0KTsKKyAgaWYgKFJlc3VsdCA9PSAwKSB7CisgICAgZ290byBfRXhpdDsKKyAg fQorCisgIExlbmd0aCA9ICgoQlVGX01FTSAqKSBDZXJ0QmlvLT5wdHIpLT5sZW5ndGg7CisgIGlm IChMZW5ndGggPD0gMCkgeworICAgIGdvdG8gX0V4aXQ7CisgIH0KKworICBCdWZmZXIgPSBtYWxs b2MgKExlbmd0aCk7CisgIGlmIChCdWZmZXIgPT0gTlVMTCkgeworICAgIGdvdG8gX0V4aXQ7Cisg IH0KKworICBSZXN1bHQgPSBCSU9fcmVhZCAoQ2VydEJpbywgQnVmZmVyLCBMZW5ndGgpOworICBp ZiAoUmVzdWx0ICE9IExlbmd0aCkgeworICAgIGdvdG8gX0V4aXQ7CisgIH0KKworICAqQ2VydCAg ICAgPSBCdWZmZXI7CisgICpDZXJ0U2l6ZSA9IExlbmd0aDsKKworICBTdGF0dXMgPSBUUlVFOwor CitfRXhpdDoKKworICBCSU9fZnJlZSAoQ2VydEJpbyk7CisKKyAgaWYgKCFTdGF0dXMgJiYgKEJ1 ZmZlciAhPSBOVUxMKSkgeworICAgIGZyZWUgKEJ1ZmZlcik7CisgIH0KKworICByZXR1cm4gU3Rh dHVzOworfQorI2VuZGlmCisKKy8qKgorICBHZXQgdGhlIHNpZ25lcidzIGNlcnRpZmljYXRlcyBm cm9tIFBLQ1MjNyBzaWduZWQgZGF0YSBhcyBkZXNjcmliZWQgaW4gIlBLQ1MgIzc6CisgIENyeXB0 b2dyYXBoaWMgTWVzc2FnZSBTeW50YXggU3RhbmRhcmQiLiBUaGUgaW5wdXQgc2lnbmVkIGRhdGEg Y291bGQgYmUgd3JhcHBlZAorICBpbiBhIENvbnRlbnRJbmZvIHN0cnVjdHVyZS4KKworICBJZiBQ N0RhdGEsIENlcnRTdGFjaywgU3RhY2tMZW5ndGgsIFRydXN0ZWRDZXJ0IG9yIENlcnRMZW5ndGgg aXMgTlVMTCwgdGhlbgorICByZXR1cm4gRkFMU0UuIElmIFA3TGVuZ3RoIG92ZXJmbG93LCB0aGVu IHJldHVybiBGQWxTRS4KKworICBDYXV0aW9uOiBUaGlzIGZ1bmN0aW9uIG1heSByZWNlaXZlIHVu dHJ1c3RlZCBpbnB1dC4KKyAgVUVGSSBBdXRoZW50aWNhdGVkIFZhcmlhYmxlIGlzIGV4dGVybmFs IGlucHV0LCBzbyB0aGlzIGZ1bmN0aW9uIHdpbGwgZG8gYmFzaWMKKyAgY2hlY2sgZm9yIFBLQ1Mj NyBkYXRhIHN0cnVjdHVyZS4KKworICBAcGFyYW1baW5dICBQN0RhdGEgICAgICAgUG9pbnRlciB0 byB0aGUgUEtDUyM3IG1lc3NhZ2UgdG8gdmVyaWZ5LgorICBAcGFyYW1baW5dICBQN0xlbmd0aCAg ICAgTGVuZ3RoIG9mIHRoZSBQS0NTIzcgbWVzc2FnZSBpbiBieXRlcy4KKyAgQHBhcmFtW291dF0g Q2VydFN0YWNrICAgIFBvaW50ZXIgdG8gU2lnbmVyJ3MgY2VydGlmaWNhdGVzIHJldHJpZXZlZCBm cm9tIFA3RGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0J3MgY2FsbGVyJ3MgcmVz cG9uc2libGl0eSB0byBmcmVlIHRoZSBidWZmZXIuCisgIEBwYXJhbVtvdXRdIFN0YWNrTGVuZ3Ro ICBMZW5ndGggb2Ygc2lnbmVyJ3MgY2VydGlmaWNhdGVzIGluIGJ5dGVzLgorICBAcGFyYW1bb3V0 XSBUcnVzdGVkQ2VydCAgUG9pbnRlciB0byBhIHRydXN0ZWQgY2VydGlmaWNhdGUgZnJvbSBTaWdu ZXIncyBjZXJ0aWZpY2F0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCdzIGNhbGxl cidzIHJlc3BvbnNpYmxpdHkgdG8gZnJlZSB0aGUgYnVmZmVyLgorICBAcGFyYW1bb3V0XSBDZXJ0 TGVuZ3RoICAgTGVuZ3RoIG9mIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlIGluIGJ5dGVzLgorCisg IEByZXR2YWwgIFRSVUUgICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkIHN1Y2Nl c3NmdWxseS4KKyAgQHJldHZhbCAgRkFMU0UgICAgICAgICAgIEVycm9yIG9jY3VycyBkdXJpbmcg dGhlIG9wZXJhdGlvbi4KKworKiovCisjaWYgMAorQk9PTEVBTgorRUZJQVBJCitQa2NzN0dldFNp Z25lcnMgKAorICBJTiAgQ09OU1QgVUlOVDggICpQN0RhdGEsCisgIElOICBVSU5UTiAgICAgICAg UDdMZW5ndGgsCisgIE9VVCBVSU5UOCAgICAgICAgKipDZXJ0U3RhY2ssCisgIE9VVCBVSU5UTiAg ICAgICAgKlN0YWNrTGVuZ3RoLAorICBPVVQgVUlOVDggICAgICAgICoqVHJ1c3RlZENlcnQsCisg IE9VVCBVSU5UTiAgICAgICAgKkNlcnRMZW5ndGgKKyAgKQoreworICBQS0NTNyAgICAgICAgICAg ICpQa2NzNzsKKyAgQk9PTEVBTiAgICAgICAgICBTdGF0dXM7CisgIFVJTlQ4ICAgICAgICAgICAg KlNpZ25lZERhdGE7CisgIFVJTlQ4ICAgICAgICAgICAgKlRlbXA7CisgIFVJTlROICAgICAgICAg ICAgU2lnbmVkRGF0YVNpemU7CisgIEJPT0xFQU4gICAgICAgICAgV3JhcHBlZDsKKyAgU1RBQ0tf T0YoWDUwOSkgICAqU3RhY2s7CisgIFVJTlQ4ICAgICAgICAgICAgSW5kZXg7CisgIFVJTlQ4ICAg ICAgICAgICAgKkNlcnRCdWY7CisgIFVJTlQ4ICAgICAgICAgICAgKk9sZEJ1ZjsKKyAgVUlOVE4g ICAgICAgICAgICBCdWZmZXJTaXplOworICBVSU5UTiAgICAgICAgICAgIE9sZFNpemU7CisgIFVJ TlQ4ICAgICAgICAgICAgKlNpbmdsZUNlcnQ7CisgIFVJTlROICAgICAgICAgICAgU2luZ2xlQ2Vy dFNpemU7CisKKyAgaWYgKChQN0RhdGEgPT0gTlVMTCkgfHwgKENlcnRTdGFjayA9PSBOVUxMKSB8 fCAoU3RhY2tMZW5ndGggPT0gTlVMTCkgfHwKKyAgICAgIChUcnVzdGVkQ2VydCA9PSBOVUxMKSB8 fCAoQ2VydExlbmd0aCA9PSBOVUxMKSB8fCAoUDdMZW5ndGggPiBJTlRfTUFYKSkgeworICAgIHJl dHVybiBGQUxTRTsKKyAgfQorICAKKyAgU3RhdHVzID0gV3JhcFBrY3M3RGF0YSAoUDdEYXRhLCBQ N0xlbmd0aCwgJldyYXBwZWQsICZTaWduZWREYXRhLCAmU2lnbmVkRGF0YVNpemUpOworICBpZiAo IVN0YXR1cykgeworICAgIHJldHVybiBTdGF0dXM7CisgIH0KKworICBTdGF0dXMgICAgID0gRkFM U0U7CisgIFBrY3M3ICAgICAgPSBOVUxMOworICBTdGFjayAgICAgID0gTlVMTDsKKyAgQ2VydEJ1 ZiAgICA9IE5VTEw7CisgIE9sZEJ1ZiAgICAgPSBOVUxMOworICBTaW5nbGVDZXJ0ID0gTlVMTDsK KworICAvLworICAvLyBSZXRyaWV2ZSBQS0NTIzcgRGF0YSAoREVSIGVuY29kaW5nKQorICAvLwor ICBpZiAoU2lnbmVkRGF0YVNpemUgPiBJTlRfTUFYKSB7CisgICAgZ290byBfRXhpdDsKKyAgfQor CisgIFRlbXAgPSBTaWduZWREYXRhOworICBQa2NzNyA9IGQyaV9QS0NTNyAoTlVMTCwgKGNvbnN0 IHVuc2lnbmVkIGNoYXIgKiopICZUZW1wLCAoaW50KSBTaWduZWREYXRhU2l6ZSk7CisgIGlmIChQ a2NzNyA9PSBOVUxMKSB7CisgICAgZ290byBfRXhpdDsKKyAgfQorCisgIC8vCisgIC8vIENoZWNr IGlmIGl0IGlzIFBLQ1MjNyBTaWduZWQgRGF0YSAoZm9yIEF1dGhlbnRpY29kZSBTY2VuYXJpbykK KyAgLy8KKyAgaWYgKCFQS0NTN190eXBlX2lzX3NpZ25lZCAoUGtjczcpKSB7CisgICAgZ290byBf RXhpdDsKKyAgfQorCisgIFN0YWNrID0gUEtDUzdfZ2V0MF9zaWduZXJzKFBrY3M3LCBOVUxMLCBQ S0NTN19CSU5BUlkpOworICBpZiAoU3RhY2sgPT0gTlVMTCkgeworICAgIGdvdG8gX0V4aXQ7Cisg IH0KKworICAvLworICAvLyBDb252ZXJ0IENlcnRTdGFjayB0byBidWZmZXIgaW4gZm9sbG93aW5n IGZvcm1hdDoKKyAgLy8gVUlOVDggIENlcnROdW1iZXI7CisgIC8vIFVJTlQzMiBDZXJ0MUxlbmd0 aDsKKyAgLy8gVUlOVDggIENlcnQxW107CisgIC8vIFVJTlQzMiBDZXJ0Mkxlbmd0aDsKKyAgLy8g VUlOVDggIENlcnQyW107CisgIC8vIC4uLgorICAvLyBVSU5UMzIgQ2VydG5MZW5ndGg7CisgIC8v IFVJTlQ4ICBDZXJ0bltdOworICAvLworICBCdWZmZXJTaXplID0gc2l6ZW9mIChVSU5UOCk7Cisg IE9sZFNpemUgICAgPSBCdWZmZXJTaXplOworICAKKyAgZm9yIChJbmRleCA9IDA7IDsgSW5kZXgr KykgeworICAgIFN0YXR1cyA9IFg1MDlQb3BDZXJ0aWZpY2F0ZSAoU3RhY2ssICZTaW5nbGVDZXJ0 LCAmU2luZ2xlQ2VydFNpemUpOworICAgIGlmICghU3RhdHVzKSB7CisgICAgICBicmVhazsKKyAg ICB9CisKKyAgICBPbGRTaXplICAgID0gQnVmZmVyU2l6ZTsKKyAgICBPbGRCdWYgICAgID0gQ2Vy dEJ1ZjsKKyAgICBCdWZmZXJTaXplID0gT2xkU2l6ZSArIFNpbmdsZUNlcnRTaXplICsgc2l6ZW9m IChVSU5UMzIpOworICAgIENlcnRCdWYgICAgPSBtYWxsb2MgKEJ1ZmZlclNpemUpOworCisgICAg aWYgKENlcnRCdWYgPT0gTlVMTCkgeworICAgICAgZ290byBfRXhpdDsKKyAgICB9CisKKyAgICBp ZiAoT2xkQnVmICE9IE5VTEwpIHsKKyAgICAgIENvcHlNZW0gKENlcnRCdWYsIE9sZEJ1ZiwgT2xk U2l6ZSk7CisgICAgICBmcmVlIChPbGRCdWYpOworICAgICAgT2xkQnVmID0gTlVMTDsKKyAgICB9 CisKKyAgICBXcml0ZVVuYWxpZ25lZDMyICgoVUlOVDMyICopIChDZXJ0QnVmICsgT2xkU2l6ZSks IChVSU5UMzIpIFNpbmdsZUNlcnRTaXplKTsKKyAgICBDb3B5TWVtIChDZXJ0QnVmICsgT2xkU2l6 ZSArIHNpemVvZiAoVUlOVDMyKSwgU2luZ2xlQ2VydCwgU2luZ2xlQ2VydFNpemUpOworCisgICAg ZnJlZSAoU2luZ2xlQ2VydCk7CisgICAgU2luZ2xlQ2VydCA9IE5VTEw7CisgIH0KKworICBpZiAo Q2VydEJ1ZiAhPSBOVUxMKSB7CisgICAgLy8KKyAgICAvLyBVcGRhdGUgQ2VydE51bWJlci4KKyAg ICAvLworICAgIENlcnRCdWZbMF0gPSBJbmRleDsKKworICAgICpDZXJ0TGVuZ3RoID0gQnVmZmVy U2l6ZSAtIE9sZFNpemUgLSBzaXplb2YgKFVJTlQzMik7CisgICAgKlRydXN0ZWRDZXJ0ID0gbWFs bG9jICgqQ2VydExlbmd0aCk7CisgICAgaWYgKCpUcnVzdGVkQ2VydCA9PSBOVUxMKSB7CisgICAg ICBnb3RvIF9FeGl0OworICAgIH0KKworICAgIENvcHlNZW0gKCpUcnVzdGVkQ2VydCwgQ2VydEJ1 ZiArIE9sZFNpemUgKyBzaXplb2YgKFVJTlQzMiksICpDZXJ0TGVuZ3RoKTsKKyAgICAqQ2VydFN0 YWNrICAgPSBDZXJ0QnVmOworICAgICpTdGFja0xlbmd0aCA9IEJ1ZmZlclNpemU7CisgICAgU3Rh dHVzID0gVFJVRTsKKyAgfSAKKworX0V4aXQ6CisgIC8vCisgIC8vIFJlbGVhc2UgUmVzb3VyY2Vz CisgIC8vCisgIGlmICghV3JhcHBlZCkgeworICAgIGZyZWUgKFNpZ25lZERhdGEpOworICB9CisK KyAgaWYgKFBrY3M3ICE9IE5VTEwpIHsKKyAgICBQS0NTN19mcmVlIChQa2NzNyk7CisgIH0KKwor ICBpZiAoU3RhY2sgIT0gTlVMTCkgeworICAgIHNrX1g1MDlfcG9wX2ZyZWUoU3RhY2ssIFg1MDlf ZnJlZSk7CisgIH0KKworICBpZiAoU2luZ2xlQ2VydCAhPSAgTlVMTCkgeworICAgIGZyZWUgKFNp bmdsZUNlcnQpOworICB9CisKKyAgaWYgKCFTdGF0dXMgJiYgKENlcnRCdWYgIT0gTlVMTCkpIHsK KyAgICBmcmVlIChDZXJ0QnVmKTsKKyAgICAqQ2VydFN0YWNrID0gTlVMTDsKKyAgfQorCisgIGlm IChPbGRCdWYgIT0gTlVMTCkgeworICAgIGZyZWUgKE9sZEJ1Zik7CisgIH0KKyAgCisgIHJldHVy biBTdGF0dXM7Cit9CisjZW5kaWYKKworLyoqCisgIFdyYXAgZnVuY3Rpb24gdG8gdXNlIGZyZWUo KSB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGNlcnRpZmljYXRlcy4KKworICBAcGFyYW1b aW5dICBDZXJ0cyAgICAgICAgUG9pbnRlciB0byB0aGUgY2VydGlmaWNhdGVzIHRvIGJlIGZyZWVk LgorCisqKi8KKyNpZiAwCitWT0lECitFRklBUEkKK1BrY3M3RnJlZVNpZ25lcnMgKAorICBJTiAg VUlOVDggICAgICAgICpDZXJ0cworICApCit7CisgIGlmIChDZXJ0cyA9PSBOVUxMKSB7CisgICAg cmV0dXJuOworICB9CisKKyAgZnJlZSAoQ2VydHMpOworfQorI2VuZGlmCisKKy8qKgorICBWZXJp ZmllcyB0aGUgdmFsaWRpbGl0eSBvZiBhIFBLQ1MjNyBzaWduZWQgZGF0YSBhcyBkZXNjcmliZWQg aW4gIlBLQ1MgIzc6CisgIENyeXB0b2dyYXBoaWMgTWVzc2FnZSBTeW50YXggU3RhbmRhcmQiLiBU aGUgaW5wdXQgc2lnbmVkIGRhdGEgY291bGQgYmUgd3JhcHBlZAorICBpbiBhIENvbnRlbnRJbmZv IHN0cnVjdHVyZS4KKworICBJZiBQN0RhdGEsIFRydXN0ZWRDZXJ0IG9yIEluRGF0YSBpcyBOVUxM LCB0aGVuIHJldHVybiBGQUxTRS4KKyAgSWYgUDdMZW5ndGgsIENlcnRMZW5ndGggb3IgRGF0YUxl bmd0aCBvdmVyZmxvdywgdGhlbiByZXR1cm4gRkFsU0UuCisKKyAgQ2F1dGlvbjogVGhpcyBmdW5j dGlvbiBtYXkgcmVjZWl2ZSB1bnRydXN0ZWQgaW5wdXQuCisgIFVFRkkgQXV0aGVudGljYXRlZCBW YXJpYWJsZSBpcyBleHRlcm5hbCBpbnB1dCwgc28gdGhpcyBmdW5jdGlvbiB3aWxsIGRvIGJhc2lj CisgIGNoZWNrIGZvciBQS0NTIzcgZGF0YSBzdHJ1Y3R1cmUuCisKKyAgQHBhcmFtW2luXSAgUDdE YXRhICAgICAgIFBvaW50ZXIgdG8gdGhlIFBLQ1MjNyBtZXNzYWdlIHRvIHZlcmlmeS4KKyAgQHBh cmFtW2luXSAgUDdMZW5ndGggICAgIExlbmd0aCBvZiB0aGUgUEtDUyM3IG1lc3NhZ2UgaW4gYnl0 ZXMuCisgIEBwYXJhbVtpbl0gIFRydXN0ZWRDZXJ0ICBQb2ludGVyIHRvIGEgdHJ1c3RlZC9yb290 IGNlcnRpZmljYXRlIGVuY29kZWQgaW4gREVSLCB3aGljaAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgaXMgdXNlZCBmb3IgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZpY2F0aW9uLgorICBAcGFy YW1baW5dICBDZXJ0TGVuZ3RoICAgTGVuZ3RoIG9mIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlIGlu IGJ5dGVzLgorICBAcGFyYW1baW5dICBJbkRhdGEgICAgICAgUG9pbnRlciB0byB0aGUgY29udGVu dCB0byBiZSB2ZXJpZmllZC4KKyAgQHBhcmFtW2luXSAgRGF0YUxlbmd0aCAgIExlbmd0aCBvZiBJ bkRhdGEgaW4gYnl0ZXMuCisKKyAgQHJldHZhbCAgVFJVRSAgVGhlIHNwZWNpZmllZCBQS0NTIzcg c2lnbmVkIGRhdGEgaXMgdmFsaWQuCisgIEByZXR2YWwgIEZBTFNFIEludmFsaWQgUEtDUyM3IHNp Z25lZCBkYXRhLgorCisqKi8KK0JPT0xFQU4KK0VGSUFQSQorUGtjczdWZXJpZnkgKAorICBJTiAg Q09OU1QgVUlOVDggICpQN0RhdGEsCisgIElOICBVSU5UTiAgICAgICAgUDdMZW5ndGgsCisgIElO ICBDT05TVCBVSU5UOCAgKlRydXN0ZWRDZXJ0LAorICBJTiAgVUlOVE4gICAgICAgIENlcnRMZW5n dGgsCisgIElOICBDT05TVCBVSU5UOCAgKkluRGF0YSwKKyAgSU4gIFVJTlROICAgICAgICBEYXRh TGVuZ3RoCisgICkKK3sKKyAgUEtDUzcgICAgICAgKlBrY3M3OworICBCSU8gICAgICAgICAqQ2Vy dEJpbzsKKyAgQklPICAgICAgICAgKkRhdGFCaW87CisgIEJPT0xFQU4gICAgIFN0YXR1czsKKyAg WDUwOSAgICAgICAgKkNlcnQ7CisgIFg1MDlfU1RPUkUgICpDZXJ0U3RvcmU7CisgIFVJTlQ4ICAg ICAgICpTaWduZWREYXRhOworICBVSU5UOCAgICAgICAqVGVtcDsKKyAgVUlOVE4gICAgICAgU2ln bmVkRGF0YVNpemU7CisgIEJPT0xFQU4gICAgIFdyYXBwZWQ7CisKKyAgLy8KKyAgLy8gQ2hlY2sg aW5wdXQgcGFyYW1ldGVycy4KKyAgLy8KKyAgaWYgKFA3RGF0YSA9PSBOVUxMIHx8IFRydXN0ZWRD ZXJ0ID09IE5VTEwgfHwgSW5EYXRhID09IE5VTEwgfHwgCisgICAgUDdMZW5ndGggPiBJTlRfTUFY IHx8IENlcnRMZW5ndGggPiBJTlRfTUFYIHx8IERhdGFMZW5ndGggPiBJTlRfTUFYKSB7CisgICAg cmV0dXJuIEZBTFNFOworICB9CisgIAorICBQa2NzNyAgICAgPSBOVUxMOworICBDZXJ0QmlvICAg PSBOVUxMOworICBEYXRhQmlvICAgPSBOVUxMOworICBDZXJ0ICAgICAgPSBOVUxMOworICBDZXJ0 U3RvcmUgPSBOVUxMOworCisgIC8vCisgIC8vIFJlZ2lzdGVyICYgSW5pdGlhbGl6ZSBuZWNlc3Nh cnkgZGlnZXN0IGFsZ29yaXRobXMgZm9yIFBLQ1MjNyBIYW5kbGluZworICAvLworICBFVlBfYWRk X2RpZ2VzdCAoRVZQX21kNSgpKTsKKyAgRVZQX2FkZF9kaWdlc3QgKEVWUF9zaGExKCkpOworICBF VlBfYWRkX2RpZ2VzdF9hbGlhcyAoU05fc2hhMVdpdGhSU0FFbmNyeXB0aW9uLCBTTl9zaGExV2l0 aFJTQSk7CisgIEVWUF9hZGRfZGlnZXN0IChFVlBfc2hhMjU2KCkpOworCisgIFN0YXR1cyA9IFdy YXBQa2NzN0RhdGEgKFA3RGF0YSwgUDdMZW5ndGgsICZXcmFwcGVkLCAmU2lnbmVkRGF0YSwgJlNp Z25lZERhdGFTaXplKTsKKyAgaWYgKCFTdGF0dXMpIHsKKyAgICByZXR1cm4gU3RhdHVzOworICB9 CisKKyAgU3RhdHVzID0gRkFMU0U7CisgIAorICAvLworICAvLyBSZXRyaWV2ZSBQS0NTIzcgRGF0 YSAoREVSIGVuY29kaW5nKQorICAvLworICBpZiAoU2lnbmVkRGF0YVNpemUgPiBJTlRfTUFYKSB7 CisgICAgZ290byBfRXhpdDsKKyAgfQorCisgIFRlbXAgPSBTaWduZWREYXRhOworICBQa2NzNyA9 IGQyaV9QS0NTNyAoTlVMTCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopICZUZW1wLCAoaW50KSBT aWduZWREYXRhU2l6ZSk7CisgIGlmIChQa2NzNyA9PSBOVUxMKSB7CisgICAgZ290byBfRXhpdDsK KyAgfQorCisgIC8vCisgIC8vIENoZWNrIGlmIGl0J3MgUEtDUyM3IFNpZ25lZCBEYXRhIChmb3Ig QXV0aGVudGljb2RlIFNjZW5hcmlvKQorICAvLworICBpZiAoIVBLQ1M3X3R5cGVfaXNfc2lnbmVk IChQa2NzNykpIHsKKyAgICBnb3RvIF9FeGl0OworICB9CisKKyAgLy8KKyAgLy8gUmVhZCBERVIt ZW5jb2RlZCByb290IGNlcnRpZmljYXRlIGFuZCBDb25zdHJ1Y3QgWDUwOSBDZXJ0aWZpY2F0ZQor ICAvLworICBDZXJ0QmlvID0gQklPX25ldyAoQklPX3NfbWVtICgpKTsKKyAgQklPX3dyaXRlIChD ZXJ0QmlvLCBUcnVzdGVkQ2VydCwgKGludClDZXJ0TGVuZ3RoKTsKKyAgaWYgKENlcnRCaW8gPT0g TlVMTCkgeworICAgIGdvdG8gX0V4aXQ7CisgIH0KKyAgQ2VydCA9IGQyaV9YNTA5X2JpbyAoQ2Vy dEJpbywgTlVMTCk7CisgIGlmIChDZXJ0ID09IE5VTEwpIHsKKyAgICBnb3RvIF9FeGl0OworICB9 CisKKyAgLy8KKyAgLy8gU2V0dXAgWDUwOSBTdG9yZSBmb3IgdHJ1c3RlZCBjZXJ0aWZpY2F0ZQor ICAvLworICBDZXJ0U3RvcmUgPSBYNTA5X1NUT1JFX25ldyAoKTsKKyAgaWYgKENlcnRTdG9yZSA9 PSBOVUxMKSB7CisgICAgZ290byBfRXhpdDsKKyAgfQorICBpZiAoIShYNTA5X1NUT1JFX2FkZF9j ZXJ0IChDZXJ0U3RvcmUsIENlcnQpKSkgeworICAgIGdvdG8gX0V4aXQ7CisgIH0KKworICAvLwor ICAvLyBSZWdpc3RlciBjdXN0b21pemVkIFg1MDkgdmVyaWZpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0 aW9uIHRvIHN1cHBvcnQKKyAgLy8gdHJ1c3RlZCBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGUgYW5j aG9yLgorICAvLworI2lmbmRlZiBPUEVOU1NMXzFfMQorICBDZXJ0U3RvcmUtPnZlcmlmeV9jYiA9 IFg1MDlWZXJpZnlDYjsKKyNlbHNlCisgIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihDZXJ0U3Rv cmUsIFg1MDlWZXJpZnlDYik7CisjZW5kaWYKKworCisgIC8vCisgIC8vIEZvciBnZW5lcmljIFBL Q1MjNyBoYW5kbGluZywgSW5EYXRhIG1heSBiZSBOVUxMIGlmIHRoZSBjb250ZW50IGlzIHByZXNl bnQKKyAgLy8gaW4gUEtDUyM3IHN0cnVjdHVyZS4gU28gaWdub3JlIE5VTEwgY2hlY2tpbmcgaGVy ZS4KKyAgLy8KKyAgRGF0YUJpbyA9IEJJT19uZXcgKEJJT19zX21lbSAoKSk7CisgIEJJT193cml0 ZSAoRGF0YUJpbywgSW5EYXRhLCAoaW50KURhdGFMZW5ndGgpOworCisgIC8vCisgIC8vIFZlcmlm aWVzIHRoZSBQS0NTIzcgc2lnbmVkRGF0YSBzdHJ1Y3R1cmUKKyAgLy8KKyAgU3RhdHVzID0gKEJP T0xFQU4pIFBLQ1M3X3ZlcmlmeSAoUGtjczcsIE5VTEwsIENlcnRTdG9yZSwgRGF0YUJpbywgTlVM TCwgUEtDUzdfQklOQVJZKTsKKworX0V4aXQ6CisgIC8vCisgIC8vIFJlbGVhc2UgUmVzb3VyY2Vz CisgIC8vCisgIEJJT19mcmVlIChEYXRhQmlvKTsKKyAgQklPX2ZyZWUgKENlcnRCaW8pOworICBY NTA5X2ZyZWUgKENlcnQpOworICBYNTA5X1NUT1JFX2ZyZWUgKENlcnRTdG9yZSk7CisgIFBLQ1M3 X2ZyZWUgKFBrY3M3KTsKKworICBpZiAoIVdyYXBwZWQpIHsKKyAgICBPUEVOU1NMX2ZyZWUgKFNp Z25lZERhdGEpOworICB9CisKKyAgcmV0dXJuIFN0YXR1czsKK30KKworLyoqIEBmaWxlCisgIEF1 dGhlbnRpY29kZSBQb3J0YWJsZSBFeGVjdXRhYmxlIFNpZ25hdHVyZSBWZXJpZmljYXRpb24gb3Zl ciBPcGVuU1NMLgorCisgIENhdXRpb246IFRoaXMgbW9kdWxlIHJlcXVpcmVzIGFkZGl0aW9uYWwg cmV2aWV3IHdoZW4gbW9kaWZpZWQuCisgIFRoaXMgbGlicmFyeSB3aWxsIGhhdmUgZXh0ZXJuYWwg aW5wdXQgLSBzaWduYXR1cmUgKGUuZy4gUEUvQ09GRiBBdXRoZW50aWNvZGUpLgorICBUaGlzIGV4 dGVybmFsIGlucHV0IG11c3QgYmUgdmFsaWRhdGVkIGNhcmVmdWxseSB0byBhdm9pZCBzZWN1cml0 eSBpc3N1ZSBsaWtlCisgIGJ1ZmZlciBvdmVyZmxvdywgaW50ZWdlciBvdmVyZmxvdy4KKworICBB dXRoZW50aWNvZGVWZXJpZnkoKSB3aWxsIGdldCBQRS9DT0ZGIEF1dGhlbnRpY29kZSBhbmQgd2ls bCBkbyBiYXNpYyBjaGVjayBmb3IKKyAgZGF0YSBzdHJ1Y3R1cmUuCisKK0NvcHlyaWdodCAoYykg MjAxMSAtIDIwMTIsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjxCUj4K K1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBsaWNlbnNl ZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRo ZSBCU0QgTGljZW5zZQord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUg ZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdAoraHR0cDovL29wZW5zb3Vy Y2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocAorCitUSEUgUFJPR1JBTSBJUyBESVNUUklC VVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQg V0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNT IE9SIElNUExJRUQuCisKKyoqLworCisvLyNpbmNsdWRlICJJbnRlcm5hbENyeXB0TGliLmgiCisK KyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4K KyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKy8vCisv LyBPSUQgQVNOLjEgVmFsdWUgZm9yIFNQQ19JTkRJUkVDVF9EQVRBX09CSklECisvLworVUlOVDgg bVNwY0luZGlyZWN0T2lkVmFsdWVbXSA9IHsKKyAgMHgyQiwgMHgwNiwgMHgwMSwgMHgwNCwgMHgw MSwgMHg4MiwgMHgzNywgMHgwMiwgMHgwMSwgMHgwNAorICB9OworCisvKioKKyAgVmVyaWZpZXMg dGhlIHZhbGlkaWxpdHkgb2YgYSBQRS9DT0ZGIEF1dGhlbnRpY29kZSBTaWduYXR1cmUgYXMgZGVz Y3JpYmVkIGluICJXaW5kb3dzCisgIEF1dGhlbnRpY29kZSBQb3J0YWJsZSBFeGVjdXRhYmxlIFNp Z25hdHVyZSBGb3JtYXQiLgorCisgIElmIEF1dGhEYXRhIGlzIE5VTEwsIHRoZW4gcmV0dXJuIEZB TFNFLgorICBJZiBJbWFnZUhhc2ggaXMgTlVMTCwgdGhlbiByZXR1cm4gRkFMU0UuCisKKyAgQ2F1 dGlvbjogVGhpcyBmdW5jdGlvbiBtYXkgcmVjZWl2ZSB1bnRydXN0ZWQgaW5wdXQuCisgIFBFL0NP RkYgQXV0aGVudGljb2RlIGlzIGV4dGVybmFsIGlucHV0LCBzbyB0aGlzIGZ1bmN0aW9uIHdpbGwg ZG8gYmFzaWMgY2hlY2sgZm9yCisgIEF1dGhlbnRpY29kZSBkYXRhIHN0cnVjdHVyZS4KKworICBA cGFyYW1baW5dICBBdXRoRGF0YSAgICAgUG9pbnRlciB0byB0aGUgQXV0aGVudGljb2RlIFNpZ25h dHVyZSByZXRyaWV2ZWQgZnJvbSBzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBF L0NPRkYgaW1hZ2UgdG8gYmUgdmVyaWZpZWQuCisgIEBwYXJhbVtpbl0gIERhdGFTaXplICAgICBT aXplIG9mIHRoZSBBdXRoZW50aWNvZGUgU2lnbmF0dXJlIGluIGJ5dGVzLgorICBAcGFyYW1baW5d ICBUcnVzdGVkQ2VydCAgUG9pbnRlciB0byBhIHRydXN0ZWQvcm9vdCBjZXJ0aWZpY2F0ZSBlbmNv ZGVkIGluIERFUiwgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgZm9y IGNlcnRpZmljYXRlIGNoYWluIHZlcmlmaWNhdGlvbi4KKyAgQHBhcmFtW2luXSAgQ2VydFNpemUg ICAgIFNpemUgb2YgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUgaW4gYnl0ZXMuCisgIEBwYXJhbVtp bl0gIEltYWdlSGFzaCAgICBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBpbWFnZSBmaWxlIGhhc2gg dmFsdWUuIFRoZSBwcm9jdWR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjYWxj dWxhdGluZyB0aGUgaW1hZ2UgaGFzaCB2YWx1ZSBpcyBkZXNjcmliZWQgaW4gQXV0aGVudGljb2Rl CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLgorICBAcGFyYW1baW5d ICBIYXNoU2l6ZSAgICAgU2l6ZSBvZiBJbWFnZSBoYXNoIHZhbHVlIGluIGJ5dGVzLgorCisgIEBy ZXR2YWwgIFRSVUUgICBUaGUgc3BlY2lmaWVkIEF1dGhlbnRpY29kZSBTaWduYXR1cmUgaXMgdmFs aWQuCisgIEByZXR2YWwgIEZBTFNFICBJbnZhbGlkIEF1dGhlbnRpY29kZSBTaWduYXR1cmUuCisK KyoqLworQk9PTEVBTgorRUZJQVBJCitBdXRoZW50aWNvZGVWZXJpZnkgKAorICBJTiAgQ09OU1Qg VUlOVDggICpBdXRoRGF0YSwKKyAgSU4gIFVJTlROICAgICAgICBEYXRhU2l6ZSwKKyAgSU4gIENP TlNUIFVJTlQ4ICAqVHJ1c3RlZENlcnQsCisgIElOICBVSU5UTiAgICAgICAgQ2VydFNpemUsCisg IElOICBDT05TVCBVSU5UOCAgKkltYWdlSGFzaCwKKyAgSU4gIFVJTlROICAgICAgICBIYXNoU2l6 ZQorICApCit7CisgIEJPT0xFQU4gICAgICBTdGF0dXM7CisgIFBLQ1M3ICAgICAgICAqUGtjczc7 CisgIENPTlNUIFVJTlQ4ICAqT3JpZ0F1dGhEYXRhOworICBVSU5UOCAgICAgICAgKlNwY0luZGly ZWN0RGF0YUNvbnRlbnQ7CisgIFVJTlQ4ICAgICAgICBBc24xQnl0ZTsKKyAgVUlOVE4gICAgICAg IENvbnRlbnRTaXplOworLyogIFVJTlQ4ICAgICAgICAqU3BjSW5kaXJlY3REYXRhT2lkOyAqLwor dW5zaWduZWQgaTsKKworICAvLworICAvLyBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzLgorICAvLwor ICBpZiAoKEF1dGhEYXRhID09IE5VTEwpIHx8IChUcnVzdGVkQ2VydCA9PSBOVUxMKSB8fCAoSW1h Z2VIYXNoID09IE5VTEwpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKChEYXRh U2l6ZSA+IElOVF9NQVgpIHx8IChDZXJ0U2l6ZSA+IElOVF9NQVgpIHx8IChIYXNoU2l6ZSA+IElO VF9NQVgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgU3RhdHVzICAgICAgID0gRkFM U0U7CisgIFBrY3M3ICAgICAgICA9IE5VTEw7CisgIE9yaWdBdXRoRGF0YSA9IEF1dGhEYXRhOwor CisgIC8vCisgIC8vIFJldHJpZXZlICYgUGFyc2UgUEtDUyM3IERhdGEgKERFUiBlbmNvZGluZykg ZnJvbSBBdXRoZW50aWNvZGUgU2lnbmF0dXJlCisgIC8vCisgIFBrY3M3ID0gZDJpX1BLQ1M3IChO VUxMLCAmQXV0aERhdGEsIChpbnQpRGF0YVNpemUpOworICBpZiAoUGtjczcgPT0gTlVMTCkgewor ICAgIGdvdG8gX0V4aXQ7CisgIH0KKworICAvLworICAvLyBDaGVjayBpZiBpdCdzIFBLQ1MjNyBT aWduZWQgRGF0YSAoZm9yIEF1dGhlbnRpY29kZSBTY2VuYXJpbykKKyAgLy8KKyAgaWYgKCFQS0NT N190eXBlX2lzX3NpZ25lZCAoUGtjczcpKSB7CisgICAgZ290byBfRXhpdDsKKyAgfQorCisjaWYg MCAvLyBGSVghISEgdGhpcyBuZWVkcyB0byBiZSByZXZpc2l0ZWQKKyAgLy8KKyAgLy8gTk9URTog T3BlblNTTCBQS0NTNyBEZWNvZGVyIGRpZG4ndCB3b3JrIGZvciBBdXRoZW50aWNvZGUtZm9ybWF0 IHNpZ25lZCBkYXRhIGR1ZSB0bworICAvLyAgICAgICBzb21lIGF1dGhlbnRpY29kZS1zcGVjaWZp YyBzdHJ1Y3R1cmUuIFVzZSBvcGFxdWUgQVNOLjEgc3RyaW5nIHRvIHJldHJpZXZlCisgIC8vICAg ICAgIFBLQ1MjNyBDb250ZW50SW5mbyBoZXJlLgorICAvLworI2lmbmRlZiBPUEVOU1NMXzFfMQor ICBTcGNJbmRpcmVjdERhdGFPaWQgPSAoVUlOVDggKikoUGtjczctPmQuc2lnbi0+Y29udGVudHMt PnR5cGUtPmRhdGEpOworI2Vsc2UKKyAgU3BjSW5kaXJlY3REYXRhT2lkID0gKFVJTlQ4ICopQVNO MV9TVFJJTkdfZ2V0MF9kYXRhKFBrY3M3LT5kLnNpZ24tPmNvbnRlbnRzLT50eXBlKTsKKyNlbmRp ZgorUFJJTlRLKCJTcGNJbmRpcmVjdERhdGFPaWQgJXAgJXAgJTA4WFxuIiwgU3BjSW5kaXJlY3RE YXRhT2lkLCBtU3BjSW5kaXJlY3RPaWRWYWx1ZSwgT1BFTlNTTF9BUElfQ09NUEFUKTsKKyAgaWYg KENvbXBhcmVNZW0gKAorICAgICAgICBTcGNJbmRpcmVjdERhdGFPaWQsCisgICAgICAgIG1TcGNJ bmRpcmVjdE9pZFZhbHVlLAorICAgICAgICBzaXplb2YgKG1TcGNJbmRpcmVjdE9pZFZhbHVlKQor ICAgICAgICApICE9IDApIHsKKyAgICAvLworICAgIC8vIFVuLW1hdGNoZWQgU1BDX0lORElSRUNU X0RBVEFfT0JKSUQuCisgICAgLy8KKyAgICBnb3RvIF9FeGl0OworICB9ICAKKyNlbmRpZgorCisg IFNwY0luZGlyZWN0RGF0YUNvbnRlbnQgPSAoVUlOVDggKikoUGtjczctPmQuc2lnbi0+Y29udGVu dHMtPmQub3RoZXItPnZhbHVlLmFzbjFfc3RyaW5nLT5kYXRhKTsKKworICAvLworICAvLyBSZXRy aWV2ZSB0aGUgU0VRVUVOQ0UgZGF0YSBzaXplIGZyb20gQVNOLjEtZW5jb2RlZCBTcGNJbmRpcmVj dERhdGFDb250ZW50LgorICAvLworICBBc24xQnl0ZSA9ICooU3BjSW5kaXJlY3REYXRhQ29udGVu dCArIDEpOworCisgIGlmICgoQXNuMUJ5dGUgJiAweDgwKSA9PSAwKSB7CisgICAgLy8KKyAgICAv LyBTaG9ydCBGb3JtIG9mIExlbmd0aCBFbmNvZGluZworICAgIC8vCisgICAgQ29udGVudFNpemUg PSAoVUlOVE4pIChBc24xQnl0ZSAmIDB4N0YpOworICAgIC8vCisgICAgLy8gU2tpcCB0aGUgU0VR VUVOQ0UgVGFnOworICAgIC8vCisgICAgU3BjSW5kaXJlY3REYXRhQ29udGVudCArPSAyOworICB9 IGVsc2UgaWYgKChBc24xQnl0ZSAmIDB4ODIpID09IDB4ODIpIHsKKyAgICAvLworICAgIC8vIExv bmcgRm9ybSBvZiBMZW5ndGggRW5jb2RpbmcsIG9ubHkgc3VwcG9ydCB0d28gYnl0ZXMuCisgICAg Ly8KKyAgICBDb250ZW50U2l6ZSAgPSAoVUlOVE4pICgqKFNwY0luZGlyZWN0RGF0YUNvbnRlbnQg KyAyKSk7CisgICAgQ29udGVudFNpemUgPSAoQ29udGVudFNpemUgPDwgOCkgKyAoVUlOVE4pKCoo U3BjSW5kaXJlY3REYXRhQ29udGVudCArIDMpKTsKKyAgICAvLworICAgIC8vIFNraXAgdGhlIFNF UVVFTkNFIFRhZzsKKyAgICAvLworICAgIFNwY0luZGlyZWN0RGF0YUNvbnRlbnQgKz0gNDsKKyAg fSBlbHNlIHsKKyAgICBnb3RvIF9FeGl0OworICB9CisKKyAgLy8KKyAgLy8gQ29tcGFyZSB0aGUg b3JpZ2luYWwgZmlsZSBoYXNoIHZhbHVlIHRvIHRoZSBkaWdlc3QgcmV0cmlldmUgZnJvbSBTcGNJ bmRpcmVjdERhdGFDb250ZW50CisgIC8vIGRlZmluZWQgaW4gQXV0aGVudGljb2RlCisgIC8vIE5P VEU6IE5lZWQgdG8gZG91YmxlLWNoZWNrIEhhc2hMZW5ndGggaGVyZSEKKyAgLy8KK1BSSU5USygi UEtDUzcgaGFzaDogIik7IGZvciAoaSA9IDA7IGkgPCBIYXNoU2l6ZTsgKytpKSBQUklOVEsoIiUw MlggIiwgSW1hZ2VIYXNoW2ldKTsgUFJJTlRLKCJcbiIpOworICBpZiAoQ29tcGFyZU1lbSAoU3Bj SW5kaXJlY3REYXRhQ29udGVudCArIENvbnRlbnRTaXplIC0gSGFzaFNpemUsIEltYWdlSGFzaCwg SGFzaFNpemUpICE9IDApIHsKKyAgICAvLworICAgIC8vIFVuLW1hdGNoZWQgUEUvQ09GRiBIYXNo IFZhbHVlCisgICAgLy8KKyAgICBnb3RvIF9FeGl0OworICB9CisKKyAgLy8KKyAgLy8gVmVyaWZp ZXMgdGhlIFBLQ1MjNyBTaWduZWQgRGF0YSBpbiBQRS9DT0ZGIEF1dGhlbnRpY29kZSBTaWduYXR1 cmUKKyAgLy8KKyAgU3RhdHVzID0gKEJPT0xFQU4pIFBrY3M3VmVyaWZ5IChPcmlnQXV0aERhdGEs IERhdGFTaXplLCBUcnVzdGVkQ2VydCwgQ2VydFNpemUsIFNwY0luZGlyZWN0RGF0YUNvbnRlbnQs IENvbnRlbnRTaXplKTsKKworX0V4aXQ6CisgIC8vCisgIC8vIFJlbGVhc2UgUmVzb3VyY2VzCisg IC8vCisgIFBLQ1M3X2ZyZWUgKFBrY3M3KTsKKworICByZXR1cm4gU3RhdHVzOworfQorc3RhdGlj IGNvbnN0IGludCBjZXJ0X25hbWVfbGVuID0gMTYwOworCisjaWYgMAorc3RhdGljIHZvaWQgcHJp bnRfc2lnbmF0dXJlX2luZm8oUEtDUzcgKnA3KQoreworICAgIGNoYXIgc3ViamVjdF9uYW1lW2Nl cnRfbmFtZV9sZW4gKyAxXSwgaXNzdWVyX25hbWVbY2VydF9uYW1lX2xlbiArIDFdOworICAgIFBL Q1M3X1NJR05FUl9JTkZPICpzaTsKKyAgICBYNTA5ICpjZXJ0OworICAgIGludCBpOworCisgICAg UFJJTlRLKCJpbWFnZSBzaWduYXR1cmUgaXNzdWVyczpcbiIpOworCisgICAgZm9yIChpID0gMDsg aSA8IHNrX1BLQ1M3X1NJR05FUl9JTkZPX251bShwNy0+ZC5zaWduLT5zaWduZXJfaW5mbyk7Cisg ICAgICAgICAgICBpKyspIHsKKyAgICAgICAgc2kgPSBza19QS0NTN19TSUdORVJfSU5GT192YWx1 ZShwNy0+ZC5zaWduLT5zaWduZXJfaW5mbywgaSk7CisgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5l KHNpLT5pc3N1ZXJfYW5kX3NlcmlhbC0+aXNzdWVyLAorICAgICAgICAgICAgICAgIGlzc3Vlcl9u YW1lLCBjZXJ0X25hbWVfbGVuKTsKKyAgICAgICAgUFJJTlRLKCIgLSAlc1xuIiwgaXNzdWVyX25h bWUpOworICAgIH0KKworICAgIFBSSU5USygiaW1hZ2Ugc2lnbmF0dXJlIGNlcnRpZmljYXRlczpc biIpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKHA3LT5kLnNpZ24tPmNlcnQp OyBpKyspIHsKKyAgICAgICAgY2VydCA9IHNrX1g1MDlfdmFsdWUocDctPmQuc2lnbi0+Y2VydCwg aSk7CisgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKGNlcnQtPmNlcnRfaW5mby0+c3ViamVjdCwK KyAgICAgICAgICAgICAgICBzdWJqZWN0X25hbWUsIGNlcnRfbmFtZV9sZW4pOworICAgICAgICBY NTA5X05BTUVfb25lbGluZShjZXJ0LT5jZXJ0X2luZm8tPmlzc3VlciwKKyAgICAgICAgICAgICAg ICBpc3N1ZXJfbmFtZSwgY2VydF9uYW1lX2xlbik7CisKKyAgICAgICAgUFJJTlRLKCIgLSBzdWJq ZWN0OiAlc1xuIiwgc3ViamVjdF9uYW1lKTsKKyAgICAgICAgUFJJTlRLKCIgICBpc3N1ZXI6ICAl c1xuIiwgaXNzdWVyX25hbWUpOworICAgIH0KK30KK3N0YXRpYyB2b2lkIHByaW50X2NlcnRpZmlj YXRlX3N0b3JlX2NlcnRzKFg1MDlfU1RPUkUgKmNlcnRzKQoreworICAgIGNoYXIgc3ViamVjdF9u YW1lW2NlcnRfbmFtZV9sZW4gKyAxXSwgaXNzdWVyX25hbWVbY2VydF9uYW1lX2xlbiArIDFdOwor ICAgIFg1MDlfT0JKRUNUICpvYmo7CisgICAgaW50IGk7CisKKyAgICBQUklOVEsoImNlcnRpZmlj YXRlIHN0b3JlOlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9PQkpFQ1RfbnVt KGNlcnRzLT5vYmpzKTsgaSsrKSB7CisgICAgICAgIG9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVl KGNlcnRzLT5vYmpzLCBpKTsKKworICAgICAgICBpZiAob2JqLT50eXBlICE9IFg1MDlfTFVfWDUw OSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKG9i ai0+ZGF0YS54NTA5LT5jZXJ0X2luZm8tPnN1YmplY3QsCisgICAgICAgICAgICAgICAgc3ViamVj dF9uYW1lLCBjZXJ0X25hbWVfbGVuKTsKKyAgICAgICAgWDUwOV9OQU1FX29uZWxpbmUob2JqLT5k YXRhLng1MDktPmNlcnRfaW5mby0+aXNzdWVyLAorICAgICAgICAgICAgICAgIGlzc3Vlcl9uYW1l LCBjZXJ0X25hbWVfbGVuKTsKKworICAgICAgICBQUklOVEsoIiAtIHN1YmplY3Q6ICVzXG4iLCBz dWJqZWN0X25hbWUpOworICAgICAgICBQUklOVEsoIiAgIGlzc3VlcjogICVzXG4iLCBpc3N1ZXJf bmFtZSk7CisgICAgfQorfQorI2VuZGlmCisKK2ludAordmVyaWZ5X29wZW5zc2wgKHBlY29mZl9p bWFnZV90ICpwZSwgY29uc3QgdWludDhfdCAqVHJ1c3RlZENlcnQsIGludCBUcnVzdGVkQ2VydFNp emUpCit7CisgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW5tYXN0ZXIvbWFu My9FVlBfRGlnZXN0SW5pdC5odG1sI0VYQU1QTEUKKyAgICByYW5nZV90ICpyYW5nZTsKKyAgICBy YW5nZV90ICpyYW5nZXMgPSBwZS0+cmFuZ2VzOworICAgIHVpbnQ4X3QgYW5zd2VyWzMyXTsKKyAg ICB1bnNpZ25lZCBhbnN3ZXJfbGVuOworICAgIHVuc2lnbmVkIGs7CisgICAgRVZQX01EX0NUWCAq bWRjdHg7CisgICAgY29uc3QgRVZQX01EICptZDsKKyAgICBCT09MRUFOIFN0YXR1cyA9IDA7CisK KyAgICBtZCA9IEVWUF9zaGEyNTYoKTsKKyAgICBpZiAoTlVMTCA9PSBtZCkgeworICAgICAgICBQ UklOVEsoIlVua25vd24gbWVzc2FnZSBkaWdlc3RcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAg ICB9CisgICAgbWRjdHggPSBFVlBfTURfQ1RYX2NyZWF0ZSgpOworICAgIEVWUF9EaWdlc3RJbml0 X2V4KG1kY3R4LCBtZCwgTlVMTCk7CisgICAgRExDTF9GT1JfRUFDSChyYW5nZV90LCByYW5nZXMs IHJhbmdlLCBuZXh0LCBwcmV2KQorICAgIHsKKyAgICBFVlBfRGlnZXN0VXBkYXRlKG1kY3R4LCBy YW5nZS0+ZGF0YSwgcmFuZ2UtPmxlbmd0aCk7CisgICAgfQorICAgIEVWUF9EaWdlc3RGaW5hbF9l eChtZGN0eCwgYW5zd2VyLCAmYW5zd2VyX2xlbik7CisgICAgZm9yIChrID0gMDsgayA8IDMyOyAr K2spCisgICAgICAgIFBSSU5USygiJTAyWCAiLCBhbnN3ZXJba10pOworICAgIFBSSU5USygiXG4i KTsKKyAgICBFVlBfTURfQ1RYX2Rlc3Ryb3kobWRjdHgpOworCisgICAgaWYgKFRydXN0ZWRDZXJ0 U2l6ZSkKKyAgICB7CisgICAgU3RhdHVzID0KKyAgICBBdXRoZW50aWNvZGVWZXJpZnkgKAorICAg ICAgICBwZS0+Y2VydC5kYXRhLCAvLyBBdXRoRGF0YQorICAgICAgICBwZS0+Y2VydC5hYy0+ZHdM ZW5ndGgsIC8vIERhdGFTaXplCisgICAgICAgIFRydXN0ZWRDZXJ0LAorICAgICAgICBUcnVzdGVk Q2VydFNpemUsCisgICAgICAgIGFuc3dlciwgLy8gSW1hZ2VIYXNoLAorICAgICAgICBhbnN3ZXJf bGVuIC8vIEhhc2hTaXplCisgICAgICAgICk7CisgICAgUFJJTlRLKCJQS0NTNyBTdGF0dXMgJWRc biIsIFN0YXR1cyk7CisgICAgLyogRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOyAqLworLyoK KyAgICB1bnNpZ25lZCBsb25nIGVycjsKKyAgICBjb25zdCBjaGFyICpmOworICAgIGludCBsOwor ICAgIGVyciA9IEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZSgmZiwgJmwpOworICAgIFBSSU5USygi UEtDUzcgU3RhdHVzIGVyciAldWwgMHglbHggOiBsaW5lICVkICVzXG4iLCBlcnIsIGVyciwgbCwg Zik7CisqLworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKy8qCisgUmF0aGVyIHRo YW4gYW5vdGhlciBmaWxlIGZ1bGwgb2YgZ2x1ZSBjb2RlLCBqdXN0IHB1dCBpdCBoZXJlCisqLwor I2lmZGVmIF9fWEVOX18KKyNpbmNsdWRlIDx4ZW5vc3NsLmg+Cit0aW1lX3QgdGltZSAodGltZV90 ICp0cykKK3sKKyAgICAodm9pZCl0czsKKyAgICBQUklOVEsoIk5vdCB5ZXQgaW1wbDogdGltZVxu Iik7CisgICAgcmV0dXJuICh0aW1lX3QpMHgxMjM0NTY3Njg7Cit9CisKK3ZvaWQgYWJvcnQgKHZv aWQpCit7CisgICAgUFJJTlRLKCJOb3QgeWV0IGltcGw6IGFib3J0XG4iKTsKKyAgICB3aGlsZSgx KTsKK30KKwordm9pZCBxc29ydCAodm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6 ZSwKKyAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKyAg ICAodm9pZCliYXNlOworICAgICh2b2lkKW5tZW1iOworICAgICh2b2lkKXNpemU7CisgICAgKHZv aWQpY29tcGFyOworICAgIFBSSU5USygiTm90IHlldCBpbXBsOiBxc29ydFxuIik7Cit9CisKK2lu dCBlcnJubyA9IDA7CisKK2NoYXIgKnN0cmVycm9yIChpbnQgZXJybnVtKQoreworICAgICh2b2lk KWVycm51bTsKKyAgICBQUklOVEsoIk5vdCB5ZXQgaW1wbDogc3RyZXJyb3JcbiIpOworICAgIHJl dHVybiAic3RyZXJyIjsKK30KKworY2hhciAqc3RybmNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hh ciAqc3JjLCBzaXplX3QgbikKK3sKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpbjsKKyAgICBQ UklOVEsoIk5vdCB5ZXQgaW1wbDogc3RyY3B5XG4iKTsKKyAgICByZXR1cm4gZGVzdDsKK30KKwor Y2hhciAqc3RyY2F0IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgICAgKHZvaWQp c3JjOworICAgIFBSSU5USygiTm90IHlldCBpbXBsOiBzdHJjYXRcbiIpOworICAgIHJldHVybiBk ZXN0OworfQorCit1aWRfdCBnZXR1aWQgKHZvaWQpIHsgcmV0dXJuICh1aWRfdCkwOyB9Cit1aWRf dCBnZXRldWlkICh2b2lkKSB7IHJldHVybiAodWlkX3QpMDsgfQorZ2lkX3QgZ2V0Z2lkICh2b2lk KSB7IHJldHVybiAoZ2lkX3QpMDsgfQorZ2lkX3QgZ2V0ZWdpZCAodm9pZCkgeyByZXR1cm4gKGdp ZF90KTA7IH0KKworaW50IHNzY2FuZiAoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3Jt YXQsIC4uLikKK3sKKyAgICAodm9pZClzdHI7CisgICAgKHZvaWQpZm9ybWF0OworICAgIFBSSU5U SygiTm90IHlldCBpbXBsOiBzc2NhbmZcbiIpOworICAgIHJldHVybiAwOworfQorCitpbnQgZ2V0 dGltZW9mZGF5IChzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCit7Cisg ICAgKHZvaWQpdHY7CisgICAgKHZvaWQpdHo7CisgICAgUFJJTlRLKCJOb3QgeWV0IGltcGw6IGdl dHRpbWVvZmRheVxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCi0tIAoyLjcuNAoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZl bCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlz dHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from userp2130.oracle.com ([156.151.31.86]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gj8Db-0000JI-BV for kexec@lists.infradead.org; Mon, 14 Jan 2019 19:48:39 +0000 From: Eric DeVolder Subject: [RFC v1 6/8] kexec: support files for PECOFF Authenticode signature verification Date: Mon, 14 Jan 2019 13:48:03 -0600 Message-Id: <1547495285-28907-7-git-send-email-eric.devolder@oracle.com> In-Reply-To: <1547495285-28907-1-git-send-email-eric.devolder@oracle.com> References: <1547495285-28907-1-git-send-email-eric.devolder@oracle.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: xen-devel@lists.xen.org Cc: daniel.kiper@oracle.com, eric.devolder@oracle.com, kexec@lists.infradead.org, boris.ostrovsky@oracle.com This patch contains the files from the standalone utility that are to be integrated into Xen to provide signature verification of a PECOFF file. - TrustedCert.h is the public root certificate for Oracle signed binaries. This created by taking the DER encoded file at http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt and converting it into this compilable C header file. - dlcl.h is my double linked circular list set of helper macros, and should be replaced with corresponding Xen list handling. - pecoff.h is a transcription of the data structures and constants described in the Microsoft spec https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85).aspx. - ped.[ch] is the PECOFF decoder/parser I wrote, and probably could stand to be replaced with a more mature library. - v_openssl.c is the "glue" code that utilizes OpenSSL routines to perform signature verification. This file essentially contains the two files https://github.com/vathpela/verify/Cryptlib/Pk/[CryptPkcs7.c|CryptAuthenticode.c] which together provide the signature verification capability. Signed-off-by: Eric DeVolder --- xen/common/TrustedCert.h | 113 ++++ xen/common/dlcl.h | 323 +++++++++++ xen/common/pecoff.h | 283 ++++++++++ xen/common/ped.c | 579 ++++++++++++++++++++ xen/common/ped.h | 128 +++++ xen/common/v_openssl.c | 1348 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 2774 insertions(+) create mode 100644 xen/common/TrustedCert.h create mode 100755 xen/common/dlcl.h create mode 100644 xen/common/pecoff.h create mode 100644 xen/common/ped.c create mode 100644 xen/common/ped.h create mode 100644 xen/common/v_openssl.c diff --git a/xen/common/TrustedCert.h b/xen/common/TrustedCert.h new file mode 100644 index 0000000..5b744e4 --- /dev/null +++ b/xen/common/TrustedCert.h @@ -0,0 +1,113 @@ + +uint8_t TrustedCert[] = +{ +0x30, 0x82, 0x03, 0xC5, 0x30, 0x82, 0x02, 0xAD, 0xA0, +0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x02, 0xAC, 0x5C, +0x26, 0x6A, 0x0B, 0x40, 0x9B, 0x8F, 0x0B, 0x79, 0xF2, +0xAE, 0x46, 0x25, 0x77, 0x30, 0x0D, 0x06, 0x09, 0x2A, +0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, +0x00, 0x30, 0x6C, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, +0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, +0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, +0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, +0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, +0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, +0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, +0x63, 0x6F, 0x6D, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, +0x55, 0x04, 0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, +0x43, 0x65, 0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, +0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x61, 0x6E, 0x63, +0x65, 0x20, 0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, +0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x36, +0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +0x30, 0x5A, 0x17, 0x0D, 0x33, 0x31, 0x31, 0x31, 0x31, +0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x30, +0x6C, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, +0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, +0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, +0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, +0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, +0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, +0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, +0x6D, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, +0x03, 0x13, 0x22, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, +0x72, 0x74, 0x20, 0x48, 0x69, 0x67, 0x68, 0x20, 0x41, +0x73, 0x73, 0x75, 0x72, 0x61, 0x6E, 0x63, 0x65, 0x20, +0x45, 0x56, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, +0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, +0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, +0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, +0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xC6, 0xCC, +0xE5, 0x73, 0xE6, 0xFB, 0xD4, 0xBB, 0xE5, 0x2D, 0x2D, +0x32, 0xA6, 0xDF, 0xE5, 0x81, 0x3F, 0xC9, 0xCD, 0x25, +0x49, 0xB6, 0x71, 0x2A, 0xC3, 0xD5, 0x94, 0x34, 0x67, +0xA2, 0x0A, 0x1C, 0xB0, 0x5F, 0x69, 0xA6, 0x40, 0xB1, +0xC4, 0xB7, 0xB2, 0x8F, 0xD0, 0x98, 0xA4, 0xA9, 0x41, +0x59, 0x3A, 0xD3, 0xDC, 0x94, 0xD6, 0x3C, 0xDB, 0x74, +0x38, 0xA4, 0x4A, 0xCC, 0x4D, 0x25, 0x82, 0xF7, 0x4A, +0xA5, 0x53, 0x12, 0x38, 0xEE, 0xF3, 0x49, 0x6D, 0x71, +0x91, 0x7E, 0x63, 0xB6, 0xAB, 0xA6, 0x5F, 0xC3, 0xA4, +0x84, 0xF8, 0x4F, 0x62, 0x51, 0xBE, 0xF8, 0xC5, 0xEC, +0xDB, 0x38, 0x92, 0xE3, 0x06, 0xE5, 0x08, 0x91, 0x0C, +0xC4, 0x28, 0x41, 0x55, 0xFB, 0xCB, 0x5A, 0x89, 0x15, +0x7E, 0x71, 0xE8, 0x35, 0xBF, 0x4D, 0x72, 0x09, 0x3D, +0xBE, 0x3A, 0x38, 0x50, 0x5B, 0x77, 0x31, 0x1B, 0x8D, +0xB3, 0xC7, 0x24, 0x45, 0x9A, 0xA7, 0xAC, 0x6D, 0x00, +0x14, 0x5A, 0x04, 0xB7, 0xBA, 0x13, 0xEB, 0x51, 0x0A, +0x98, 0x41, 0x41, 0x22, 0x4E, 0x65, 0x61, 0x87, 0x81, +0x41, 0x50, 0xA6, 0x79, 0x5C, 0x89, 0xDE, 0x19, 0x4A, +0x57, 0xD5, 0x2E, 0xE6, 0x5D, 0x1C, 0x53, 0x2C, 0x7E, +0x98, 0xCD, 0x1A, 0x06, 0x16, 0xA4, 0x68, 0x73, 0xD0, +0x34, 0x04, 0x13, 0x5C, 0xA1, 0x71, 0xD3, 0x5A, 0x7C, +0x55, 0xDB, 0x5E, 0x64, 0xE1, 0x37, 0x87, 0x30, 0x56, +0x04, 0xE5, 0x11, 0xB4, 0x29, 0x80, 0x12, 0xF1, 0x79, +0x39, 0x88, 0xA2, 0x02, 0x11, 0x7C, 0x27, 0x66, 0xB7, +0x88, 0xB7, 0x78, 0xF2, 0xCA, 0x0A, 0xA8, 0x38, 0xAB, +0x0A, 0x64, 0xC2, 0xBF, 0x66, 0x5D, 0x95, 0x84, 0xC1, +0xA1, 0x25, 0x1E, 0x87, 0x5D, 0x1A, 0x50, 0x0B, 0x20, +0x12, 0xCC, 0x41, 0xBB, 0x6E, 0x0B, 0x51, 0x38, 0xB8, +0x4B, 0xCB, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x63, +0x30, 0x61, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, +0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, +0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, +0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, +0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, +0x14, 0xB1, 0x3E, 0xC3, 0x69, 0x03, 0xF8, 0xBF, 0x47, +0x01, 0xD4, 0x98, 0x26, 0x1A, 0x08, 0x02, 0xEF, 0x63, +0x64, 0x2B, 0xC3, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, +0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xB1, 0x3E, +0xC3, 0x69, 0x03, 0xF8, 0xBF, 0x47, 0x01, 0xD4, 0x98, +0x26, 0x1A, 0x08, 0x02, 0xEF, 0x63, 0x64, 0x2B, 0xC3, +0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, +0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, +0x01, 0x00, 0x1C, 0x1A, 0x06, 0x97, 0xDC, 0xD7, 0x9C, +0x9F, 0x3C, 0x88, 0x66, 0x06, 0x08, 0x57, 0x21, 0xDB, +0x21, 0x47, 0xF8, 0x2A, 0x67, 0xAA, 0xBF, 0x18, 0x32, +0x76, 0x40, 0x10, 0x57, 0xC1, 0x8A, 0xF3, 0x7A, 0xD9, +0x11, 0x65, 0x8E, 0x35, 0xFA, 0x9E, 0xFC, 0x45, 0xB5, +0x9E, 0xD9, 0x4C, 0x31, 0x4B, 0xB8, 0x91, 0xE8, 0x43, +0x2C, 0x8E, 0xB3, 0x78, 0xCE, 0xDB, 0xE3, 0x53, 0x79, +0x71, 0xD6, 0xE5, 0x21, 0x94, 0x01, 0xDA, 0x55, 0x87, +0x9A, 0x24, 0x64, 0xF6, 0x8A, 0x66, 0xCC, 0xDE, 0x9C, +0x37, 0xCD, 0xA8, 0x34, 0xB1, 0x69, 0x9B, 0x23, 0xC8, +0x9E, 0x78, 0x22, 0x2B, 0x70, 0x43, 0xE3, 0x55, 0x47, +0x31, 0x61, 0x19, 0xEF, 0x58, 0xC5, 0x85, 0x2F, 0x4E, +0x30, 0xF6, 0xA0, 0x31, 0x16, 0x23, 0xC8, 0xE7, 0xE2, +0x65, 0x16, 0x33, 0xCB, 0xBF, 0x1A, 0x1B, 0xA0, 0x3D, +0xF8, 0xCA, 0x5E, 0x8B, 0x31, 0x8B, 0x60, 0x08, 0x89, +0x2D, 0x0C, 0x06, 0x5C, 0x52, 0xB7, 0xC4, 0xF9, 0x0A, +0x98, 0xD1, 0x15, 0x5F, 0x9F, 0x12, 0xBE, 0x7C, 0x36, +0x63, 0x38, 0xBD, 0x44, 0xA4, 0x7F, 0xE4, 0x26, 0x2B, +0x0A, 0xC4, 0x97, 0x69, 0x0D, 0xE9, 0x8C, 0xE2, 0xC0, +0x10, 0x57, 0xB8, 0xC8, 0x76, 0x12, 0x91, 0x55, 0xF2, +0x48, 0x69, 0xD8, 0xBC, 0x2A, 0x02, 0x5B, 0x0F, 0x44, +0xD4, 0x20, 0x31, 0xDB, 0xF4, 0xBA, 0x70, 0x26, 0x5D, +0x90, 0x60, 0x9E, 0xBC, 0x4B, 0x17, 0x09, 0x2F, 0xB4, +0xCB, 0x1E, 0x43, 0x68, 0xC9, 0x07, 0x27, 0xC1, 0xD2, +0x5C, 0xF7, 0xEA, 0x21, 0xB9, 0x68, 0x12, 0x9C, 0x3C, +0x9C, 0xBF, 0x9E, 0xFC, 0x80, 0x5C, 0x9B, 0x63, 0xCD, +0xEC, 0x47, 0xAA, 0x25, 0x27, 0x67, 0xA0, 0x37, 0xF3, +0x00, 0x82, 0x7D, 0x54, 0xD7, 0xA9, 0xF8, 0xE9, 0x2E, +0x13, 0xA3, 0x77, 0xE8, 0x1F, 0x4A, +}; + diff --git a/xen/common/dlcl.h b/xen/common/dlcl.h new file mode 100755 index 0000000..709e53e --- /dev/null +++ b/xen/common/dlcl.h @@ -0,0 +1,323 @@ +/* + * Linked list macros + * + * Copyright 2004 Eric DeVolder + * + */ + +#ifndef _DSS_SRC_INCLUDE_DLCL_H +#define _DSS_SRC_INCLUDE_DLCL_H + +/********************************************************************/ +/* + * This macro appends ELEMENT to the end of a list + */ +#define DLCL_APPEND(TYPE, QUEUE, ELEMENT) \ + DLCL_APPEND_NP(TYPE, QUEUE, ELEMENT, next, prev) + +/********************************************************************/ +/* + * This macro removes ELEMENT from the list. + */ +#define DLCL_REMOVE(TYPE, QUEUE, ELEMENT) \ + DLCL_REMOVE_NP(TYPE, QUEUE, ELEMENT, next, prev) + +/********************************************************************/ +/* + * This macro extracts ELEMENT from the list. It doesn't + * update the list head. + */ +#define DLCL_EXTRACT(TYPE, ELEMENT) \ + DLCL_EXTRACT_NP(TYPE, ELEMENT, next, prev) + +/********************************************************************/ +/* + * This macro inserts ELEMENT into the list before NELEMENT + */ +#define DLCL_INSERT_BEFORE(TYPE, ELEMENT, NELEMENT) \ + DLCL_INSERT_BEFORE_NP(TYPE, ELEMENT, NELEMENT, next, prev) + +/********************************************************************/ +/* + * This macro inserts ELEMENT into the list after PELEMENT + */ +#define DLCL_INSERT_AFTER(TYPE, ELEMENT, PELEMENT) \ + DLCL_INSERT_AFTER_NP(TYPE, ELEMENT, PELEMENT, next, prev) + +/********************************************************************/ +/* + * This macro inserts LIST into the list before element NELEMENT. + */ +#define DLCL_INSERT_LIST_BEFORE(TYPE, ELEMENT, NELEMENT) \ + DLCL_INSERT_LIST_BEFORE_NP(TYPE, LIST, NLIST, next, prev) + +/********************************************************************/ +/* + * This macro inserts LIST into the list after element PELEMENT + */ +#define DLCL_INSERT_LIST_AFTER(TYPE, ELEMENT, PELEMENT) \ + DLCL_INSERT_LIST_AFTER_NP(TYPE, LIST, PLIST, next, prev) + +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/* + * This macro appends ELEMENT to [the end of] a list + */ +#define DLCL_APPEND_NP(TYPE, QUEUE, ELEMENT, NEXT, PREV) \ +{ \ + TYPE *fel, *lel; \ + if ((fel = QUEUE) == NULL) \ + { \ + QUEUE = ELEMENT->NEXT = ELEMENT->PREV = ELEMENT; \ + } \ + else \ + { \ + lel = fel->PREV; \ + lel->NEXT = ELEMENT; \ + ELEMENT->PREV = lel; \ + ELEMENT->NEXT = fel; \ + fel->PREV = ELEMENT; \ + } \ +} + +/********************************************************************/ +/* + * This macro prepends ELEMENT to [the beginning of] a list + */ +#define DLCL_PREPEND_NP(TYPE, QUEUE, ELEMENT, NEXT, PREV) \ +{ \ + TYPE *fel, *lel; \ + if ((fel = QUEUE) == NULL) \ + { \ + QUEUE = ELEMENT->NEXT = ELEMENT->PREV = ELEMENT; \ + } \ + else \ + { \ + lel = fel->PREV; \ + lel->NEXT = ELEMENT; \ + ELEMENT->PREV = lel; \ + ELEMENT->NEXT = fel; \ + fel->PREV = ELEMENT; \ + QUEUE = ELEMENT; \ + } \ +} + +/********************************************************************/ +/* + * This macro removes ELEMENT from the list. + * + * NOTE: This requires that ELEMENT actually be on the list! + */ +#define DLCL_REMOVE_NP(TYPE, QUEUE, ELEMENT, NEXT, PREV) \ +{ \ + TYPE *nel, *pel; \ + if (QUEUE != NULL) \ + { \ + nel = ELEMENT->NEXT; \ + pel = ELEMENT->PREV; \ + if (QUEUE == ELEMENT) \ + { \ + /* FIX!!!! should use (nel == pel) */ \ + /*if (nel == pel) */ \ + if (ELEMENT->NEXT == ELEMENT) \ + { \ + ELEMENT->NEXT = ELEMENT->PREV = NULL; \ + QUEUE = NULL; \ + } \ + else \ + { \ + pel->NEXT = nel; \ + nel->PREV = pel; \ + QUEUE = nel; \ + } \ + } \ + else \ + { \ + pel->NEXT = nel; \ + nel->PREV = pel; \ + } \ + } \ +} + + +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ + +/* + * The following insert and extract macros simply manipulate the + * element(s) provided. That is, the list head is not modified. + * Furthermore, it is REQUIRED that the ELEMENT be valid (ie not NULL) + */ + +/* + * This macro extracts ELEMENT from the list. It doesn't + * change the list head. + * + * NOTE: This requires that the element actually be on the list! + */ +#define DLCL_EXTRACT_NP(TYPE, ELEMENT, NEXT, PREV) \ +{ \ + TYPE *nel, *pel; \ + nel = ELEMENT->NEXT; \ + pel = ELEMENT->PREV; \ + pel->NEXT = nel; \ + nel->PREV = pel; \ +} + +/********************************************************************/ +/* + * This macro inserts ELEMENT into the list before NELEMENT. + */ +#define DLCL_INSERT_BEFORE_NP(TYPE, QUEUE, ELEMENT, NELEMENT, NEXT, PREV) \ +{ \ + TYPE *pel; \ + pel = NELEMENT->PREV; \ + pel->NEXT = ELEMENT; \ + ELEMENT->NEXT = NELEMENT; \ + NELEMENT->PREV = ELEMENT; \ + ELEMENT->PREV = pel; \ + if (QUEUE == NELEMENT) \ + QUEUE = ELEMENT; \ +} + +/********************************************************************/ +/* + * This macro inserts ELEMENT into the list after PELEMENT. + */ +#define DLCL_INSERT_AFTER_NP(TYPE, QUEUE, ELEMENT, PELEMENT, NEXT, PREV) \ +{ \ + TYPE *nel; \ + nel = PELEMENT->NEXT; \ + PELEMENT->NEXT = ELEMENT; \ + ELEMENT->NEXT = nel; \ + nel->PREV = ELEMENT; \ + ELEMENT->PREV = PELEMENT; \ +} + +/********************************************************************/ +/* + * This macro inserts ELEMENT into the list in sorted order via EXPR. + */ +#define DLCL_INSERT_SORTED_NP(TYPE, QUEUE, ELEMENT, EXPR, NEXT, PREV) \ +{ \ + TYPE *cel; \ + if ((cel = QUEUE) == NULL) \ + { \ + DLCL_APPEND_NP(TYPE, QUEUE, ELEMENT, NEXT, PREV); /* Start the list */ \ + } \ + else \ + while (cel != NULL) \ + { \ + if (EXPR) \ + { \ + DLCL_INSERT_BEFORE_NP(TYPE, QUEUE, ELEMENT, cel, NEXT, PREV); /* Insert in list */ \ + break; \ + } \ + \ + if ((cel = cel->NEXT) == QUEUE) \ + { \ + DLCL_APPEND_NP(TYPE, QUEUE, ELEMENT, NEXT, PREV); /* Insert at end of list */ \ + cel = NULL; \ + } \ + } \ +} + +/* + * This macro joins two DLCLs together, by concatenating LIST2 at the + * end of LIST1. + */ +#define DLCL_JOIN_NP(TYPE, QUEUE, LIST1, LIST2, NEXT, PREV) \ +{ \ + if (LIST1 && LIST2) \ + { \ + TYPE *fel1, *fel2, *lel1, *lel2; \ + fel1 = LIST1; \ + lel1 = fel1->PREV; \ + fel2 = LIST2; \ + lel2 = fel2->PREV; \ + fel1->PREV = lel2; \ + lel2->NEXT = fel1; \ + lel1->NEXT = fel2; \ + fel2->PREV = lel1; \ + QUEUE = LIST1; \ + } \ + else \ + { \ + if (LIST1) \ + QUEUE = LIST1; \ + else \ + QUEUE = LIST2; \ + } \ +} + +/* + * This macro splits QUEUE into two DLCLs at element ELEMENT. + * This requires that ELEMENT be on the QUEUE. When complete, + * ELEMENT points to a list (as does QUEUE). + */ +#define DLCL_SPLIT_NP(TYPE, QUEUE, ELEMENT, NEXT, PREV) \ +{ \ + if (QUEUE && ELEMENT) \ + { \ + TYPE *fel1, *fel2, *lel1, *lel2; \ + fel1 = QUEUE; \ + fel2 = ELEMENT; \ + lel1 = fel2->PREV; \ + lel2 = fel1->PREV; \ + fel1->PREV = lel1; \ + lel1->NEXT = fel1; \ + fel2->PREV = lel2; \ + lel2->NEXT = fel2; \ + } \ +} + +/********************************************************************/ + +/* + * The following insert macros operate on lists, but do not modify + * the list head. + * Furthermore, it is REQUIRED that the LIST be valid (ie not NULL) + */ + +/* + * This macro inserts LIST into the list BEFORE element NELEMENT. + */ +#define DLCL_INSERT_LIST_BEFORE_NP(TYPE, LIST, NELEMENT, NEXT, PREV) \ +{ \ + TYPE *nel, *pel, *lf, *ll; \ + lf = LIST; ll = lf->PREV; \ + nel = NELEMENT; pel = nel->PREV;\ + ll->NEXT = nel; \ + nel->PREV = ll; \ + pel->NEXT = lf; \ + lf->PREV = pel; \ +} + +/********************************************************************/ +/* + * This macro inserts LIST into the list AFTER element PELEMENT + */ +#define DLCL_INSERT_LIST_AFTER_NP(TYPE, LIST, PELEMENT, NEXT, PREV) \ +{ \ + TYPE *nel, *pel, *lf, *ll; \ + lf = LIST; ll = lf->PREV; \ + pel = PELEMENT; nel = pel->NEXT;\ + ll->NEXT = nel; \ + nel->PREV = ll; \ + pel->NEXT = lf; \ + lf->PREV = pel; \ +} + +/********************************************************************/ + +#define DLCL_FOR_EACH(TYPE, LIST, VAR, NEXT, PREV) \ + for (VAR = LIST; VAR; VAR = (VAR->NEXT == LIST) ? NULL : VAR->NEXT) + +/********************************************************************/ + +#endif /* _DSS_SRC_INCLUDE_DLCL_H */ + diff --git a/xen/common/pecoff.h b/xen/common/pecoff.h new file mode 100644 index 0000000..26d998d --- /dev/null +++ b/xen/common/pecoff.h @@ -0,0 +1,283 @@ + +// google microsoft pecoff format +// wiki microsoft pecoff format +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85).aspx +// https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Portable_Executable_32_bit_Structure_in_SVG_fixed.svg/2000px-Portable_Executable_32_bit_Structure_in_SVG_fixed.svg.png + +// FIX!!! Microsoft type names +#define BYTE uint8_t +#define WORD uint16_t +#define DWORD uint32_t +#define QWORD uint64_t + +/********************************************************************/ + +typedef struct dos_header_s +{ + BYTE Signature[2]; + BYTE header[58]; + DWORD pe_header_offset; +} dos_header_t; + +#define IMAGE_FILE_SIGNATURE_0 0x4D +#define IMAGE_FILE_SIGNATURE_1 0x5A + +typedef struct coff_header_s +{ + DWORD Signature; + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbolTable; + WORD SizeofOptionalHeader; + WORD Characteristics; +} coff_header_t; + +#define IMAGE_FILE_MACHINE_UNKNOWN 0x0 // The contents of this field are assumed to be applicable to any machine type +#define IMAGE_FILE_MACHINE_AM33 0x1d3 // Matsushita AM33 +#define IMAGE_FILE_MACHINE_AMD64 0x8664 // x64 +#define IMAGE_FILE_MACHINE_ARM 0x1c0 // ARM little endian +#define IMAGE_FILE_MACHINE_ARM64 0xaa64 // ARM64 little endian +#define IMAGE_FILE_MACHINE_ARMNT 0x1c4 // ARM Thumb-2 little endian +#define IMAGE_FILE_MACHINE_EBC 0xebc // EFI byte code +#define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386 or later processors and compatible processors +#define IMAGE_FILE_MACHINE_IA64 0x200 // Intel Itanium processor family +#define IMAGE_FILE_MACHINE_M32R 0x9041 // Mitsubishi M32R little endian +#define IMAGE_FILE_MACHINE_MIPS16 0x266 // MIPS16 +#define IMAGE_FILE_MACHINE_MIPSFPU 0x366 // MIPS with FPU +#define IMAGE_FILE_MACHINE_MIPSFPU16 0x466 // MIPS16 with FPU +#define IMAGE_FILE_MACHINE_POWERPC 0x1f0 // Power PC little endian +#define IMAGE_FILE_MACHINE_POWERPCFP 0x1f1 // Power PC with floating point support +#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little endian +#define IMAGE_FILE_MACHINE_RISCV32 0x5032 // RISC-V 32-bit address space +#define IMAGE_FILE_MACHINE_RISCV64 0x5064 // RISC-V 64-bit address space +#define IMAGE_FILE_MACHINE_RISCV128 0x5128 // RISC-V 128-bit address space +#define IMAGE_FILE_MACHINE_SH3 0x1a2 // Hitachi SH3 +#define IMAGE_FILE_MACHINE_SH3DSP 0x1a3 // Hitachi SH3 DSP +#define IMAGE_FILE_MACHINE_SH4 0x1a6 // Hitachi SH4 +#define IMAGE_FILE_MACHINE_SH5 0x1a8 // Hitachi SH5 +#define IMAGE_FILE_MACHINE_THUMB 0x1c2 // Thumb +#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x169 // MIPS little-endian WCE v2 + +#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Image only, Windows CE, and Microsoft Windows NT and later. This indicates that the file does not contain base relocations and must therefore be loaded at its preferred base address. If the base address is not available, the loader reports an error. The default behavior of the linker is to strip base relocations from executable (EXE) files. +#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // Image only. This indicates that the image file is valid and can be run. If this flag is not set, it indicates a linker error. +#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // COFF line numbers have been removed. This flag is deprecated and should be zero. +#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // COFF symbol table entries for local symbols have been removed. This flag is deprecated and should be zero. +#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010 // Obsolete. Aggressively trim working set. This flag is deprecated for Windows 2000 and later and must be zero. +#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // Application can handle > 2-GB addresses. +//#define 0x0040 This flag is reserved for future use. +#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Little endian: the least significant bit (LSB) precedes the most significant bit (MSB) in memory. This flag is deprecated and should be zero. +#define IMAGE_FILE_32BIT_MACHINE 0x0100 // Machine is based on a 32-bit-word architecture. +#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging information is removed from the image file. +#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // If the image is on removable media, fully load it and copy it to the swap file. +#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // If the image is on network media, fully load it and copy it to the swap file. +#define IMAGE_FILE_SYSTEM 0x1000 // The image file is a system file, not a user program. +#define IMAGE_FILE_DLL 0x2000 // The image file is a dynamic-link library (DLL). Such files are considered executable files for almost all purposes, although they cannot be directly run. +#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // The file should be run only on a uniprocessor machine. +#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Big endian: the MSB precedes the LSB in memory. This flag is deprecated and should be zero. + +typedef struct coff_fields_s +{ + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; +} coff_fields_t; + +#define IMAGE_MAGIC_PE32 0x10b +#define IMAGE_MAGIC_PE32PLUS 0x20b + +typedef struct pe32_coff_fields_s +{ + DWORD BaseOfData; + DWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + DWORD SizeOfStackReserve; + DWORD SizeOfStackCommit; + DWORD SizeOfHeapReserve; + DWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; +} pe32_coff_fields_t; + +typedef struct pe32plus_coff_fields_s +{ + QWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + QWORD SizeOfStackReserve; + QWORD SizeOfStackCommit; + QWORD SizeOfHeapReserve; + QWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; +} pe32plus_coff_fields_t; + +typedef union pe_coff_fields_u +{ + pe32_coff_fields_t pe32; + pe32plus_coff_fields_t pe32plus; +} pe_coff_fields_t; + +#define IMAGE_SUBSYSTEM_UNKNOWN 0 // An unknown subsystem +#define IMAGE_SUBSYSTEM_NATIVE 1 // Device drivers and native Windows processes +#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // The Windows graphical user interface (GUI) subsystem +#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // The Windows character subsystem +#define IMAGE_SUBSYSTEM_OS2_CUI 5 // The OS/2 character subsystem +#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // The Posix character subsystem +#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // Native Win9x driver +#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Windows CE +#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 // An Extensible Firmware Interface (EFI) application +#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 // An EFI driver with boot services +#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 // An EFI driver with run-time services +#define IMAGE_SUBSYSTEM_EFI_ROM 13 // An EFI ROM image +#define IMAGE_SUBSYSTEM_XBOX 14 // XBOX +#define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16 // Windows boot application. + +// 0x0001 Reserved, must be zero. +// 0x0002 Reserved, must be zero. +// 0x0004 Reserved, must be zero. +// 0x0008 Reserved, must be zero. +#define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020 // Image can handle a high entropy 64-bit virtual address space. +#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // DLL can be relocated at load time. +#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080 // Code Integrity checks are enforced. +#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // Image is NX compatible. +#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 // Isolation aware, but do not isolate the image. +#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Does not use structured exception (SE) handling. No SE handler may be called in this image. +#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 // Do not bind the image. +#define IMAGE_DLLCHARACTERISTICS_PPCONTAINER 0x1000 // Image must execute in an AppContainer. +#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 // A WDM driver. +#define IMAGE_DLLCHARACTERISTICS_GUARD_CF 0x4000 // Image supports Control Flow Guard. +#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 // Terminal Server aware. + +typedef struct data_directory_entry_s +{ + DWORD VirtualAddress; + DWORD Size; +} data_directory_entry_t; + +typedef struct image_data_directory_s +{ + data_directory_entry_t ExportTable; + data_directory_entry_t ImportTable; + data_directory_entry_t ResourceTable; + data_directory_entry_t ExceptionTable; + data_directory_entry_t CertificateTable; + data_directory_entry_t BaseRelocationTable; + data_directory_entry_t Debug; + data_directory_entry_t Architecture; + data_directory_entry_t GlobalPtr; + data_directory_entry_t TLSTable; + data_directory_entry_t LoadConfigTable; + data_directory_entry_t BoundImport; + data_directory_entry_t ImportAddressTable; + data_directory_entry_t DelayImportDescriptor; + data_directory_entry_t CLRRuntimeHeader; + data_directory_entry_t Reserved; +} image_data_directory_t; + +typedef struct pecoff_section_s +{ + BYTE Name[8]; + DWORD VirtualSize; + DWORD VirtualAddress; + DWORD SizeOfRawData; + DWORD PointerToRawData; + DWORD PointerToRelocations; + DWORD PointerToLinenumbers; + WORD NumberOfRelocations; + WORD NumberOfLinenumbers; + DWORD Characteristics; +} pecoff_section_t; + +// 0x00000000 Reserved for future use. +// 0x00000001 Reserved for future use. +// 0x00000002 Reserved for future use. +// 0x00000004 Reserved for future use. +#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files. +// 0x00000010 Reserved for future use. +#define IMAGE_SCN_CNT_CODE 0x00000020 // The section contains executable code. +#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // The section contains initialized data. +#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // The section contains uninitialized data. +#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved for future use. +#define IMAGE_SCN_LNK_INFO 0x00000200 // The section contains comments or other information. The .drectve section has this type. This is valid for object files only. +// 0x00000400 Reserved for future use. +#define IMAGE_SCN_LNK_REMOVE 0x00000800 // The section will not become part of the image. This is valid only for object files. +#define IMAGE_SCN_LNK_COMDAT 0x00001000 // The section contains COMDAT data. For more information, see COMDAT Sections (Object Only). This is valid only for object files. +#define IMAGE_SCN_GPREL 0x00008000 // The section contains data referenced through the global pointer (GP). +#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 // Reserved for future use. +#define IMAGE_SCN_MEM_16BIT 0x00020000 // Reserved for future use. +#define IMAGE_SCN_MEM_LOCKED 0x00040000 // Reserved for future use. +#define IMAGE_SCN_MEM_PRELOAD 0x00080000 // Reserved for future use. +#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // Align data on a 1-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // Align data on a 2-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // Align data on a 4-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // Align data on an 8-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Align data on a 16-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // Align data on a 32-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // Align data on a 64-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 // Align data on a 128-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 // Align data on a 256-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 // Align data on a 512-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 // Align data on a 1024-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 // Align data on a 2048-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 // Align data on a 4096-byte boundary. Valid only for object files. +#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 // Align data on an 8192-byte boundary. Valid only for object files. +#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // The section contains extended relocations. +#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // The section can be discarded as needed. +#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // The section cannot be cached. +#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // The section is not pageable. +#define IMAGE_SCN_MEM_SHARED 0x10000000 // The section can be shared in memory. +#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // The section can be executed as code. +#define IMAGE_SCN_MEM_READ 0x40000000 // The section can be read. +#define IMAGE_SCN_MEM_WRITE 0x80000000 // The section can be written to. + +typedef struct attribute_certificate_s +{ + DWORD dwLength; + WORD wRevision; + WORD wCertificateType; +} attribute_certificate_t; + +#define WIN_CERT_REVISION_1_0 0x0100 // Version 1, legacy version of the Win_Certificate structure. It is supported only for purposes of verifying legacy Authenticode signatures +#define WIN_CERT_REVISION_2_0 0x0200 // Version 2 is the current version of the Win_Certificate structure. + +#define WIN_CERT_TYPE_X509 0x0001 // bCertificate contains an X.509 Certificate Not Supported +#define WIN_CERT_TYPE_PKCS_SIGNED_DATA 0x0002 // bCertificate contains a PKCS#7 SignedData structure +#define WIN_CERT_TYPE_RESERVED_1 0x0003 // Reserved +#define WIN_CERT_TYPE_TS_STACK_SIGNED 0x0004 // Terminal Server Protocol Stack Certificate signing Not Supported + + + +#define PE_COFF_IMAGE 0x00004550 // ..EP (or PE.. in EB) + diff --git a/xen/common/ped.c b/xen/common/ped.c new file mode 100644 index 0000000..b44b971 --- /dev/null +++ b/xen/common/ped.c @@ -0,0 +1,579 @@ + +#ifndef __XEN__ +#include +#include +#include +#else +#include +#endif + +#include "dlcl.h" + +// google microsoft pecoff format +// wiki microsoft pecoff format +#include "ped.h" + +// FIX!!! see discussion wrt/ typeof() +#define min(A,B) (((A)<(B)) ? (A) : (B)) +#define max(A,B) (((A)>(B)) ? (A) : (B)) + +/********************************************************************/ +#define LABEL "%35s: " +#define CHKDUMP(field, value) PRINTK(LABEL "0x%02X %c %d\n", field, value, (value >= ' ' && value <= '~') ? value : '.', value) +#define FIELD_B(field, value) PRINTK(LABEL "0x%02X %c %d\n", #field, value, (value >= ' ' && value <= '~') ? value : '.', value) +#define FIELD_W(field, value) PRINTK(LABEL "0x%04X\n", #field, value) +#define FIELD_D(field, value) PRINTK(LABEL "0x%08X\n", #field, value) +#define FIELD_Q(field, value) PRINTK(LABEL "0x%016llX\n", #field, (unsigned long long)value) + +#define CHKBIT(var, bit) if ((var) & (bit)) CHKDUMP(#bit, bit) +#define CHKDEF(var, def) if ((var) == (def)) CHKDUMP(#def, def) + +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ + +#define xOFFSET_OF(TYPE, MEMBER) { offset_t o; TYPE *p = (TYPE *)0; o = (&p->MEMBER - p); o; } +#define OFFSET_OF(PTR, MEMBER) (((BYTE *)&PTR->MEMBER) - ((BYTE *)PTR)) + +/********************************************************************/ +range_t * +pecoff_append_range (pecoff_image_t *pe, DWORD offset, DWORD length, BYTE *data, const char *description) +{ + range_t *range = NULL; +//PRINTK("RANGE %6u %6u %s\n", offset, length, description); + if (length) + { + range = zsalloc(range_t); + range->offset = offset; + range->length = length; + range->data = data; + range->description = description; + DLCL_APPEND(range_t, pe->ranges, range); + } + return range; +} + +/********************************************************************/ +pecoff_image_t * +pecoff_image_alloc (uint8_t *imageBase, size_t imageSize) +{ + pecoff_image_t *pe = zsalloc(pecoff_image_t); + if (pe) + { + pe->imageBase = imageBase; + pe->imageSize = imageSize; + } + return pe; +} + +void +pecoff_image_free (pecoff_image_t *pe) +{ + if (pe) + { + range_t *range; + DLCL_FOR_EACH(range_t, pe->ranges, range, next, prev) + { + DLCL_REMOVE(range_t, pe->ranges, range); + zsfree(range); + // FIX!!! accessing range->next after free() + } + zsfree(pe); + } +} + +/********************************************************************/ +static void * +pe_make_pointer (pecoff_image_t *pe, size_t size) +{ + void *p = NULL; + + if ((pe->offset >= pe->imageSize) || (pe->offset+size > pe->imageSize)) + { + PRINTK("Error: offset %lu > imageSize %lu\n", pe->offset, pe->imageSize); + } + else + { + p = (void *)(pe->imageBase + pe->offset); + pe->offset += size; + } + return p; +} +#define mkptr(TYPE) (TYPE *)pe_make_pointer(pe, sizeof(TYPE)) + +/********************************************************************/ +pecoff_image_t * +pecoff_image_decode (uint8_t *imageBase, size_t imageSize) +{ + pecoff_image_t *pe; + dos_header_t *dh; + + pe = pecoff_image_alloc(imageBase, imageSize); + + // MSDOS header/stub + pe->dhc.fileOffset = pe->offset; + if (NULL == (pe->dhc.dh = mkptr(dos_header_t))) goto error; + dh = pe->dhc.dh; + FIELD_B(Signature, dh->Signature[0]); + FIELD_B(Signature, dh->Signature[1]); + FIELD_D(PE_Header_Offset, dh->pe_header_offset); + + if ((IMAGE_FILE_SIGNATURE_0 == dh->Signature[0]) && + (IMAGE_FILE_SIGNATURE_1 == dh->Signature[1])) + { + coff_header_t *ch; + + // Read in DOS stub + if (NULL == (pe->dhc.ds = mkptr(uint8_t))) goto error; + pe->offset = dh->pe_header_offset; + + // COFF header + pe->chc.fileOffset = pe->offset; + if (NULL == (pe->chc.ch = mkptr(coff_header_t))) goto error; + ch = pe->chc.ch; + + FIELD_D(Signature, ch->Signature); + FIELD_W(Machine, ch->Machine); + + if (PE_COFF_IMAGE != ch->Signature) + { + goto error; + } + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_UNKNOWN); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_AM33); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_AMD64); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_ARM); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_ARM64); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_ARMNT); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_EBC); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_I386); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_IA64); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_M32R); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_MIPS16); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_MIPSFPU); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_MIPSFPU16); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_POWERPC); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_POWERPCFP); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_R4000); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_RISCV32); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_RISCV64); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_RISCV128); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_SH3); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_SH3DSP); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_SH4); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_SH5); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_THUMB); + CHKDEF(ch->Machine, IMAGE_FILE_MACHINE_WCEMIPSV2); + FIELD_W(NumberOfSections, ch->NumberOfSections); + FIELD_D(TimeDateStamp, ch->TimeDateStamp); + FIELD_D(PointerToSymbolTable, ch->PointerToSymbolTable); + FIELD_D(NumberOfSymbolTable, ch->NumberOfSymbolTable); + FIELD_W(SizeofOptionalHeader, ch->SizeofOptionalHeader); + FIELD_W(Characteristics, ch->Characteristics); + CHKBIT(ch->Characteristics, IMAGE_FILE_RELOCS_STRIPPED); + CHKBIT(ch->Characteristics, IMAGE_FILE_EXECUTABLE_IMAGE); + CHKBIT(ch->Characteristics, IMAGE_FILE_LINE_NUMS_STRIPPED); + CHKBIT(ch->Characteristics, IMAGE_FILE_LOCAL_SYMS_STRIPPED); + CHKBIT(ch->Characteristics, IMAGE_FILE_AGGRESSIVE_WS_TRIM); + CHKBIT(ch->Characteristics, IMAGE_FILE_LARGE_ADDRESS_AWARE ); + CHKBIT(ch->Characteristics, IMAGE_FILE_BYTES_REVERSED_LO); + CHKBIT(ch->Characteristics, IMAGE_FILE_32BIT_MACHINE); + CHKBIT(ch->Characteristics, IMAGE_FILE_DEBUG_STRIPPED); + CHKBIT(ch->Characteristics, IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP); + CHKBIT(ch->Characteristics, IMAGE_FILE_NET_RUN_FROM_SWAP); + CHKBIT(ch->Characteristics, IMAGE_FILE_SYSTEM); + CHKBIT(ch->Characteristics, IMAGE_FILE_DLL); + CHKBIT(ch->Characteristics, IMAGE_FILE_UP_SYSTEM_ONLY); + CHKBIT(ch->Characteristics, IMAGE_FILE_BYTES_REVERSED_HI); + + if (ch->SizeofOptionalHeader) // required for Image + { + WORD Subsystem = 0; + + // COFF fields + pe->cfc.fileOffset = pe->offset; + if (NULL == (pe->cfc.cf = mkptr(coff_fields_t))) goto error; + + FIELD_W(Magic, pe->cfc.cf->Magic); + FIELD_B(MajorLinkerVersion, pe->cfc.cf->MajorLinkerVersion); + FIELD_B(MinorLinkerVersion, pe->cfc.cf->MinorLinkerVersion); + FIELD_D(SizeOfCode, pe->cfc.cf->SizeOfCode); + FIELD_D(SizeOfInitializedData, pe->cfc.cf->SizeOfInitializedData); + FIELD_D(SizeOfUninitializedData, pe->cfc.cf->SizeOfUninitializedData); + FIELD_D(AddressOfEntryPoint, pe->cfc.cf->AddressOfEntryPoint); + FIELD_D(BaseOfCode, pe->cfc.cf->BaseOfCode); + + // Optional Header Windows-Specific fields (Image Only) + pe->pecfc.fileOffset = pe->offset; + + if (is_pe32()) + { + pe32_coff_fields_t *pecf; + pe->pecfc.fileOffset = pe->offset; + if (NULL == (pe->pecfc.pe32 = mkptr(pe32_coff_fields_t))) goto error; + pecf = pe->pecfc.pe32; + + FIELD_D(BaseOfData, pecf->BaseOfData); + FIELD_D(ImageBase, pecf->ImageBase); + FIELD_D(SectionAlignment, pecf->SectionAlignment); + FIELD_D(FileAlignment, pecf->FileAlignment); + FIELD_W(MajorOperatingSystemVersion, pecf->MajorOperatingSystemVersion); + FIELD_W(MinorOperatingSystemVersion, pecf->MinorOperatingSystemVersion); + FIELD_W(MajorImageVersion, pecf->MajorImageVersion); + FIELD_W(MinorImageVersion, pecf->MinorImageVersion); + FIELD_W(MajorSubsystemVersion, pecf->MajorSubsystemVersion); + FIELD_W(MinorSubsystemVersion, pecf->MinorSubsystemVersion); + FIELD_D(Win32VersionValue, pecf->Win32VersionValue); + FIELD_D(SizeOfImage, pecf->SizeOfImage); + FIELD_D(SizeOfHeaders, pecf->SizeOfHeaders); + FIELD_D(CheckSum, pecf->CheckSum); + FIELD_W(Subsystem, pecf->Subsystem); + FIELD_W(DllCharacteristics, pecf->DllCharacteristics); + FIELD_D(SizeOfStackReserve, pecf->SizeOfStackReserve); + FIELD_D(SizeOfStackCommit, pecf->SizeOfStackCommit); + FIELD_D(SizeOfHeapReserve, pecf->SizeOfHeapReserve); + FIELD_D(SizeOfHeapCommit, pecf->SizeOfHeapCommit); + FIELD_D(LoaderFlags, pecf->LoaderFlags); + FIELD_D(NumberOfRvaAndSizes, pecf->NumberOfRvaAndSizes); + Subsystem = pecf->Subsystem; + pe->NumberOfRvaAndSizes = pecf->NumberOfRvaAndSizes; + } + else + { + pe32plus_coff_fields_t *pecf; + pe->pecfc.fileOffset = pe->offset; + if (NULL == (pe->pecfc.pe32plus = mkptr(pe32plus_coff_fields_t))) goto error; + pecf = pe->pecfc.pe32plus; + + FIELD_Q(ImageBase, pecf->ImageBase); + FIELD_D(SectionAlignment, pecf->SectionAlignment); + FIELD_D(FileAlignment, pecf->FileAlignment); + FIELD_W(MajorOperatingSystemVersion, pecf->MajorOperatingSystemVersion); + FIELD_W(MinorOperatingSystemVersion, pecf->MinorOperatingSystemVersion); + FIELD_W(MajorImageVersion, pecf->MajorImageVersion); + FIELD_W(MinorImageVersion, pecf->MinorImageVersion); + FIELD_W(MajorSubsystemVersion, pecf->MajorSubsystemVersion); + FIELD_W(MinorSubsystemVersion, pecf->MinorSubsystemVersion); + FIELD_D(Win32VersionValue, pecf->Win32VersionValue); + FIELD_D(SizeOfImage, pecf->SizeOfImage); + FIELD_D(SizeOfHeaders, pecf->SizeOfHeaders); + FIELD_D(CheckSum, pecf->CheckSum); + FIELD_W(Subsystem, pecf->Subsystem); + FIELD_W(DllCharacteristics, pecf->DllCharacteristics); + FIELD_Q(SizeOfStackReserve, pecf->SizeOfStackReserve); + FIELD_Q(SizeOfStackCommit, pecf->SizeOfStackCommit); + FIELD_Q(SizeOfHeapReserve, pecf->SizeOfHeapReserve); + FIELD_Q(SizeOfHeapCommit, pecf->SizeOfHeapCommit); + FIELD_D(LoaderFlags, pecf->LoaderFlags); + FIELD_D(NumberOfRvaAndSizes, pecf->NumberOfRvaAndSizes); + Subsystem = pecf->Subsystem; + pe->NumberOfRvaAndSizes = pecf->NumberOfRvaAndSizes; + } + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_UNKNOWN); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_NATIVE); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_WINDOWS_GUI); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_WINDOWS_CUI); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_OS2_CUI); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_POSIX_CUI); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_NATIVE_WINDOWS); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_EFI_APPLICATION); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_EFI_ROM); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_XBOX); + CHKDEF(Subsystem, IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION); + + // Data directory entries + pe->iddc.fileOffset = pe->offset; + if (NULL == (pe->iddc.dd = mkptr(image_data_directory_t))) goto error; + pe->offset -= sizeof(image_data_directory_t); // reset + pe->offset += (pe->NumberOfRvaAndSizes * sizeof(data_directory_entry_t)); + +#define DDE(name) \ + FIELD_D(name##Rva, pe->iddc.dd->name.VirtualAddress); \ + FIELD_D(name##Size, pe->iddc.dd->name.Size); + for (unsigned idx = 0; idx < pe->NumberOfRvaAndSizes; ++idx) + { + switch (idx) + { + case 0: DDE(ExportTable); break; + case 1: DDE(ImportTable); break; + case 2: DDE(ResourceTable); break; + case 3: DDE(ExceptionTable); break; + case 4: DDE(CertificateTable); break; + case 5: DDE(BaseRelocationTable); break; + case 6: DDE(Debug); break; + case 7: DDE(Architecture); break; + case 8: DDE(GlobalPtr); break; + case 9: DDE(TLSTable); break; + case 10: DDE(LoadConfigTable); break; + case 11: DDE(BoundImport); break; + case 12: DDE(ImportAddressTable); break; + case 13: DDE(DelayImportDescriptor); break; + case 14: DDE(CLRRuntimeHeader); break; + default: + case 15: DDE(Reserved); break; + } + } + } + + // Section headers + pe->SectionHeaderBase = pe->offset; + for (unsigned idx = 0; idx < ch->NumberOfSections; ++idx) + { + pecoff_section_ct *sc; + pecoff_section_t *s; + DWORD align; (void)align; + + sc = &pe->sectioncs[idx]; + DLCL_APPEND(pecoff_section_ct, pe->sections, sc); + + pe->offset = pe->SectionHeaderBase + (idx * sizeof(pecoff_section_t)); + sc->fileOffset = pe->offset; + if (NULL == (sc->s = mkptr(pecoff_section_t))) goto error; + s = sc->s; + + if (s->SizeOfRawData) + { + pe->offset = s->PointerToRawData; + if (NULL == (sc->data = mkptr(uint8_t))) goto error; + } + + // Name + for (unsigned k = 0; k < sizeof(s->Name); ++k) + { + FIELD_B(Name, s->Name[k]); + } + FIELD_D(VirtualSize, s->VirtualSize); + FIELD_D(VirtualAddress, s->VirtualAddress); + FIELD_D(SizeOfRawData, s->SizeOfRawData); + FIELD_D(PointerToRawData, s->PointerToRawData); + FIELD_D(PointerToRelocations, s->PointerToRelocations); + FIELD_D(PointerToLinenumbers, s->PointerToLinenumbers); + FIELD_W(NumberOfRelocations, s->NumberOfRelocations); + FIELD_W(NumberOfLinenumbers, s->NumberOfLinenumbers); + FIELD_D(Characteristics, s->Characteristics); + CHKBIT(s->Characteristics, IMAGE_SCN_TYPE_NO_PAD); + CHKBIT(s->Characteristics, IMAGE_SCN_CNT_CODE); + CHKBIT(s->Characteristics, IMAGE_SCN_CNT_INITIALIZED_DATA); + CHKBIT(s->Characteristics, IMAGE_SCN_CNT_UNINITIALIZED_DATA); + CHKBIT(s->Characteristics, IMAGE_SCN_LNK_OTHER); + CHKBIT(s->Characteristics, IMAGE_SCN_LNK_INFO); + CHKBIT(s->Characteristics, IMAGE_SCN_LNK_REMOVE); + CHKBIT(s->Characteristics, IMAGE_SCN_LNK_COMDAT); + CHKBIT(s->Characteristics, IMAGE_SCN_GPREL); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_PURGEABLE); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_16BIT); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_LOCKED); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_PRELOAD); + align = s->Characteristics & (IMAGE_SCN_ALIGN_8192BYTES|IMAGE_SCN_ALIGN_1BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_1BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_2BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_4BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_8BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_16BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_32BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_64BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_128BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_256BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_512BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_1024BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_2048BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_4096BYTES); + CHKDEF(align, IMAGE_SCN_ALIGN_8192BYTES); + CHKBIT(s->Characteristics, IMAGE_SCN_LNK_NRELOC_OVFL); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_DISCARDABLE); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_NOT_CACHED); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_NOT_PAGED); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_SHARED); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_EXECUTE); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_READ); + CHKBIT(s->Characteristics, IMAGE_SCN_MEM_WRITE); + if (sc->data) + { + for (unsigned k = 0; k < 8; ++k) + { + FIELD_B(SECTION_BYTE, sc->data[k]); + } + } + } + + // Certificate Table handling + if (pe->iddc.dd->CertificateTable.VirtualAddress) + { +// FIX!!! not allowing for more than one cert!!! + attribute_certificate_t *ac; + pe->offset = pe->iddc.dd->CertificateTable.VirtualAddress; + if (NULL == (pe->cert.ac = mkptr(attribute_certificate_t))) goto error; + ac = pe->cert.ac; + + FIELD_D(dwLength, ac->dwLength); + FIELD_W(wRevision, ac->wRevision); + FIELD_W(wCertificateType, ac->wCertificateType); + CHKDEF(ac->wRevision, WIN_CERT_REVISION_1_0); + CHKDEF(ac->wRevision, WIN_CERT_REVISION_2_0); + CHKDEF(ac->wCertificateType, WIN_CERT_TYPE_X509); + CHKDEF(ac->wCertificateType, WIN_CERT_TYPE_PKCS_SIGNED_DATA); + CHKDEF(ac->wCertificateType, WIN_CERT_TYPE_RESERVED_1); + CHKDEF(ac->wCertificateType, WIN_CERT_TYPE_TS_STACK_SIGNED); + // FIX!!! verify dwLength < CertificateTable.Size + if (NULL == (pe->cert.data = mkptr(uint8_t))) goto error; + } + + } + else + goto error; + + return pe; + + error: + if (pe) pecoff_image_free(pe); + return NULL; +} + +/********************************************************************/ +void +pecoff_setup_verify (pecoff_image_t *pe) +{ + if (pe && pe->iddc.dd->CertificateTable.VirtualAddress) + { + // Generate signature byte stream + // See Windows Authenticode Portable Executable Signature Format + // 'Calculating the PE Image Hash' + DWORD off1, len1; + DWORD off2, len2; + BYTE *dat1, *dat2; + pecoff_section_ct *sc; + pecoff_section_t *s; + DWORD StartOfRawData = ~0; + DWORD EndOfRawData = 0; + DWORD EndOfImageHeader = 0; + unsigned SUM_OF_BYTES_HASHED; + BYTE *buf; + unsigned FILE_SIZE; + unsigned EXTRA; + range_t *range; + int sorted; + + // DOS header and stub + off1 = pe->dhc.fileOffset; + len1 = sizeof(dos_header_t); + dat1 = (BYTE *)pe->dhc.dh; + off2 = off1 + len1; + len2 = pe->chc.fileOffset - sizeof(dos_header_t); + dat2 = pe->dhc.ds; + pecoff_append_range(pe, off1, len1, dat1, "DOS header"); + pecoff_append_range(pe, off2, len2, dat2, "DOS stub"); + // COFF headers + pecoff_append_range(pe, pe->chc.fileOffset, sizeof(coff_header_t), (BYTE *)pe->chc.ch, "COFF header"); + // COFF fields + pecoff_append_range(pe, pe->cfc.fileOffset, sizeof(coff_fields_t), (BYTE *)pe->cfc.cf, "COFF fields"); + // Windows specific fields, excluding Checksum + if (is_pe32()) + { + off1 = pe->pecfc.fileOffset; + len1 = OFFSET_OF(pe->pecfc.pe32, CheckSum); + dat1 = (BYTE *)pe->pecfc.pe32; + off2 = off1 + len1 + sizeof(DWORD); + len2 = sizeof(pe32_coff_fields_t) - OFFSET_OF(pe->pecfc.pe32, Subsystem); + dat2 = dat1 + len1 + sizeof(DWORD); + } + else + { + off1 = pe->pecfc.fileOffset; + len1 = OFFSET_OF(pe->pecfc.pe32plus, CheckSum); + dat1 = (BYTE *)pe->pecfc.pe32plus; + off2 = off1 + len1 + sizeof(DWORD); + len2 = sizeof(pe32plus_coff_fields_t) - OFFSET_OF(pe->pecfc.pe32plus, Subsystem); + dat2 = dat1 + len1 + sizeof(DWORD); + } + pecoff_append_range(pe, off1, len1, dat1, "Win-specific COFF, minus Checksum"); + pecoff_append_range(pe, off2, len2, dat2, "Win-specific COFF, minus Checksum"); + // Image Data Directories, excluding CertificateTable + off1 = pe->iddc.fileOffset; + len1 = OFFSET_OF(pe->iddc.dd, CertificateTable); + dat1 = (BYTE *)pe->iddc.dd; + off2 = off1 + len1 + sizeof(data_directory_entry_t); + len2 = sizeof(pe32plus_coff_fields_t) - OFFSET_OF(pe->pecfc.pe32plus, Subsystem); + len2 = pe->NumberOfRvaAndSizes * sizeof(data_directory_entry_t); + len2 -= OFFSET_OF(pe->iddc.dd, BaseRelocationTable); + dat2 = dat1 + len1 + sizeof(data_directory_entry_t); + pecoff_append_range(pe, off1, len1, dat1, "Data Directory, minus CertificateTable"); + pecoff_append_range(pe, off2, len2, dat2, "Data Directory, minus CertificateTable"); + // Section Headers - are to be sorted according to PointerToRawData + // FIX!!! this code does not properly sort the list of section headers + SUM_OF_BYTES_HASHED = is_pe32() ? pe->pecfc.pe32->SizeOfHeaders : pe->pecfc.pe32plus->SizeOfHeaders; + DLCL_FOR_EACH(pecoff_section_ct, pe->sections, sc, next, prev) + { + s = sc->s; + pecoff_append_range(pe, sc->fileOffset, sizeof(pecoff_section_t), (BYTE *)s, "SectionHeader"); + if (s->SizeOfRawData) + { +// PRINTK(LABEL "\n", s->Name); + pecoff_append_range(pe, s->PointerToRawData, s->SizeOfRawData, sc->data, "SectionContent"); + SUM_OF_BYTES_HASHED += s->SizeOfRawData; + StartOfRawData = min(s->PointerToRawData, StartOfRawData); + EndOfRawData = max(s->PointerToRawData + s->SizeOfRawData, StartOfRawData); + } + } + EndOfImageHeader = pe->SectionHeaderBase + (pe->chc.ch->NumberOfSections * sizeof(pecoff_section_t)); +// PRINTK("End of Image Hedr: %08X\n", EndOfImageHeader); +// PRINTK("Start of Raw Data: %08X\n", StartOfRawData); + pe->offset = EndOfImageHeader; + buf = mkptr(BYTE); + pecoff_append_range(pe, EndOfImageHeader, StartOfRawData - EndOfImageHeader, buf, "Padding after Header to Raw Data"); + + // The start of raw data officially ends the image header + FILE_SIZE = pe->imageSize; + EXTRA = FILE_SIZE - ((pe->iddc.dd->CertificateTable.Size) + SUM_OF_BYTES_HASHED); + PRINTK("FILE_SIZE %u(%x) SOBH %u EXTRA %u\n", FILE_SIZE, FILE_SIZE, SUM_OF_BYTES_HASHED, EXTRA); + if (EXTRA) + { + // FIX??? Not clear if should be sorted (spec only describes sorting sections) + BYTE *buf; + pe->offset = EndOfRawData; + buf = mkptr(BYTE); + pecoff_append_range(pe, EndOfRawData, EXTRA, buf, "Extra"); + } + + // FIX!!! Must sort sections according to file offset + // Simple brute force linear sort + do + { + sorted = 1; + DLCL_FOR_EACH(range_t, pe->ranges, range, next, prev) + { + if ((range->next != pe->ranges) && (range->offset > range->next->offset)) + { + DLCL_REMOVE(range_t, pe->ranges, range); + DLCL_APPEND(range_t, pe->ranges, range); + sorted = 0; + //break; - safe to continue to traverse list + } + } + } while (!sorted); + +#if 0 + // Now output signature byte stream + { + range_t *range; + range_t *prevRange = NULL; + DLCL_FOR_EACH(range_t, pe->ranges, range, next, prev) + { + if (prevRange) + { + if ((prevRange->offset + prevRange->length) != range->offset) + PRINTK("Warning: not consecutive!\n"); + } + PRINTK("digesting %x + %x (%x) : %s\n", range->offset, range->length, range->offset + range->length, range->description); + prevRange = range; + } + } +#endif + } +} + +/********************************************************************/ + diff --git a/xen/common/ped.h b/xen/common/ped.h new file mode 100644 index 0000000..5b4121f --- /dev/null +++ b/xen/common/ped.h @@ -0,0 +1,128 @@ + +#ifndef PED_H + +/********************************************************************/ + +#ifndef __XEN__ +#define ztalloc(TYPE, SIZE) (TYPE *)calloc( 1, SIZE ) +#define zsalloc(TYPE) ztalloc(TYPE, sizeof(TYPE) ) +#define zsfree(P) free(P) +#include +#define PRINTK(FMT...) printf(FMT) + +#else +#define zsalloc(TYPE) xzalloc_array(TYPE, 1) +#define zsfree(P) xfree(P) +#include +#define PRINTK(FMT...) printk(FMT) + +#endif + +//#define malloc MALLOC_DO_NOT_USE +//#define free FREE_DO_NOT_USE + +#include "pecoff.h" + +/********************************************************************/ +struct pecoff_image_s; + +typedef struct range_s +{ + DWORD offset; // from file + DWORD length; // inclusive + BYTE *data; // to in-memory copy of file + const char *description; // for debug + + struct range_s *next; + struct range_s *prev; +} range_t; + +range_t * +pecoff_append_range (struct pecoff_image_s *pe, DWORD offset, DWORD length, BYTE *data, const char *description); + +/********************************************************************/ +// NOTE: The _cs means container struct, as in it contains the first +// member plus items related to it that I need in the code +typedef struct dos_header_cs +{ + dos_header_t *dh; + BYTE *ds; + DWORD fileOffset; +} dos_header_ct; + +typedef struct coff_header_cs +{ + coff_header_t *ch; + DWORD fileOffset; +} coff_header_ct; + +typedef struct coff_fields_cs +{ + coff_fields_t *cf; +#define is_pe32() (IMAGE_MAGIC_PE32 == pe->cfc.cf->Magic) + DWORD fileOffset; +} coff_fields_ct; + +typedef struct pe_coff_fields_cs +{ + pe32_coff_fields_t *pe32; + pe32plus_coff_fields_t *pe32plus; + DWORD fileOffset; +} pe_coff_fields_ct; + +typedef struct image_data_directory_cs +{ + image_data_directory_t *dd; + DWORD fileOffset; +} image_data_directory_ct; + +typedef struct pecoff_section_cs +{ + pecoff_section_t *s; + BYTE *data; + DWORD fileOffset; + struct pecoff_section_cs *next, *prev; +} pecoff_section_ct; + +typedef struct attribute_certificate_cs +{ + attribute_certificate_t *ac; + BYTE *data; +} attribute_certificate_ct; + +typedef struct pecoff_image_s +{ + // For managing parse/decode + uint8_t *imageBase; + size_t imageSize; + size_t offset; + + dos_header_ct dhc; + coff_header_ct chc; + coff_fields_ct cfc; + pe_coff_fields_ct pecfc; + image_data_directory_ct iddc; +#ifndef PECOFF_MAX_SECTIONS +#define PECOFF_MAX_SECTIONS 32 +#endif + pecoff_section_ct sectioncs[PECOFF_MAX_SECTIONS]; + attribute_certificate_ct cert; + + DWORD SectionHeaderBase; + + // for hash computation/verification + range_t *ranges; + DWORD NumberOfRvaAndSizes; + pecoff_section_ct *sections; + + +} pecoff_image_t; + +pecoff_image_t * pecoff_image_alloc (uint8_t *imageBase, size_t imageSize); +void pecoff_image_free (pecoff_image_t *pe); + +pecoff_image_t * pecoff_image_decode (uint8_t *imageBase, size_t imageSize); +void pecoff_setup_verify (pecoff_image_t *pe); + +#endif // PED_H + diff --git a/xen/common/v_openssl.c b/xen/common/v_openssl.c new file mode 100644 index 0000000..9bcba2e --- /dev/null +++ b/xen/common/v_openssl.c @@ -0,0 +1,1348 @@ + +#ifdef __XEN__ +#define OPENSSL_1_1 +//#define OPENSSL_NO_FP_API +//#define OPENSSL_NO_SCTP +//#define OPENSSL_NO_BIO +#include +#include "ped.h" +#include "dlcl.h" +#define CopyMem(SRC,DEST,SIZE) memcpy((void *)DEST,(const void *)SRC,SIZE) +#define PRINTK(FMT...) printk(FMT) +#else +#define PRINTK(FMT...) printf(FMT) +#endif + +#define INT8 int8_t +#define INT16 int16_t +#define INT32 int32_t +#define INT64 int64_t +#define INTN signed long +#define UINT8 uint8_t +#define UINT16 uint16_t +#define UINT32 uint32_t +#define UINT64 uint64_t +#define UINTN unsigned long +#define BOOLEAN int +#define EFIAPI +#define CONST const +#define IN +#define OUT +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif +#define CompareMem(A,B,SIZE) memcmp(A,B,SIZE) +#ifndef CopyMem +#define CopyMem(SRC,DEST,SIZE) memcpy(DEST,SRC,SIZE) +#endif +#include +#include +#include +#include +#include +#include +#include + +//#ifndef OPENSSL_API_COMPAT +//#define OPENSSL_API_COMPAT 0x10000000L +//#endif +//# if OPENSSL_API_COMPAT < 0x10100000L +//# endif + +static int cert_in_store(X509 *cert, X509_STORE_CTX *ctx) +{ +#ifndef OPENSSL_1_1 + X509_OBJECT obj; + + obj.type = X509_LU_X509; + obj.data.x509 = cert; + + return X509_OBJECT_retrieve_match(ctx->ctx->objs, &obj) != NULL; +#else + X509_OBJECT *obj; + int rc = 0; + if ((obj = X509_OBJECT_new()) != NULL) + { + if (X509_OBJECT_set1_X509(obj, cert)) + { + STACK_OF(X509_OBJECT) *objs; + objs = X509_STORE_get0_objects( X509_STORE_CTX_get0_store(ctx) ); + rc = X509_OBJECT_retrieve_match(objs, obj) != NULL; + } + X509_OBJECT_free(obj); + } + return rc; +#endif +} + +/** @file + PKCS#7 SignedData Verification Wrapper Implementation over OpenSSL. + + Caution: This module requires additional review when modified. + This library will have external input - signature (e.g. UEFI Authenticated + Variable). It may by input in SMM mode. + This external input must be validated carefully to avoid security issue like + buffer overflow, integer overflow. + + WrapPkcs7Data(), Pkcs7GetSigners(), Pkcs7Verify() will get UEFI Authenticated + Variable and will do basic check for data structure. + +Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +/* +#include "InternalCryptLib.h" + +#include +#include +#include +#include +*/ +UINT8 mOidValue[9] = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02 }; + +/** + Verification callback function to override any existing callbacks in OpenSSL + for intermediate certificate supports. + + @param[in] Status Original status before calling this callback. + @param[in] Context X509 store context. + + @retval 1 Current X509 certificate is verified successfully. + @retval 0 Verification failed. + +**/ +int +X509VerifyCb ( + IN int Status, + IN X509_STORE_CTX *Context + ) +{ +#if 0 + X509_OBJECT *Obj; + INTN Error; + INTN Index; + INTN Count; + + Obj = NULL; + Error = (INTN) X509_STORE_CTX_get_error (Context); + + // + // X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT and X509_V_ERR_UNABLE_TO_GET_ISSUER_ + // CERT_LOCALLY mean a X509 certificate is not self signed and its issuer + // can not be found in X509_verify_cert of X509_vfy.c. + // In order to support intermediate certificate node, we override the + // errors if the certification is obtained from X509 store, i.e. it is + // a trusted ceritifcate node that is enrolled by user. + // Besides,X509_V_ERR_CERT_UNTRUSTED and X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE + // are also ignored to enable such feature. + // + if ((Error == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT) || + (Error == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY)) { + Obj = (X509_OBJECT *) malloc (sizeof (X509_OBJECT)); + if (Obj == NULL) { + return 0; + } + + Obj->type = X509_LU_X509; + Obj->data.x509 = Context->current_cert; + + CRYPTO_w_lock (CRYPTO_LOCK_X509_STORE); + + if (X509_OBJECT_retrieve_match (Context->ctx->objs, Obj)) { + Status = 1; + } else { + // + // If any certificate in the chain is enrolled as trusted certificate, + // pass the certificate verification. + // + if (Error == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY) { + Count = (INTN) sk_X509_num (Context->chain); + for (Index = 0; Index < Count; Index++) { + Obj->data.x509 = sk_X509_value (Context->chain, (int) Index); + if (X509_OBJECT_retrieve_match (Context->ctx->objs, Obj)) { + Status = 1; + break; + } + } + } + } + + CRYPTO_w_unlock (CRYPTO_LOCK_X509_STORE); + } + + if ((Error == X509_V_ERR_CERT_UNTRUSTED) || + (Error == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE)) { + Status = 1; + } + + if (Obj != NULL) { + OPENSSL_free (Obj); + } +#else + int err = X509_STORE_CTX_get_error(Context); +#ifdef OPENSSL_1_1 + X509 *cert = X509_STORE_CTX_get0_cert(Context); + uint32_t ex_xkusage = X509_get_extended_key_usage(cert); +#endif + /* also accept code-signing keys */ + if (err == X509_V_ERR_INVALID_PURPOSE +#ifndef OPENSSL_1_1 + && Context->cert->ex_xkusage == XKU_CODE_SIGN +#else + && ex_xkusage == XKU_CODE_SIGN +#endif + ) + Status = 1; + + /* all certs given with the --cert argument are trusted */ + else if (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY || + err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT || + err == X509_V_ERR_CERT_UNTRUSTED) { +#ifndef OPENSSL_1_1 + if (cert_in_store(Context->current_cert, Context)) +#else + if (cert_in_store(X509_STORE_CTX_get_current_cert(Context), Context)) +#endif + Status = 1; + } + /* UEFI doesn't care about expired signatures, so we shouldn't either. */ + else if (err == X509_V_ERR_CERT_HAS_EXPIRED || + err == X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD || + err == X509_V_ERR_CERT_NOT_YET_VALID || + err == X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD) { + Status = 1; + } +#endif + return Status; +} + +/** + Creates a PKCS#7 signedData as described in "PKCS #7: Cryptographic Message + Syntax Standard, version 1.5". This interface is only intended to be used for + application to perform PKCS#7 functionality validation. + + @param[in] PrivateKey Pointer to the PEM-formatted private key data for + data signing. + @param[in] PrivateKeySize Size of the PEM private key data in bytes. + @param[in] KeyPassword NULL-terminated passphrase used for encrypted PEM + key data. + @param[in] InData Pointer to the content to be signed. + @param[in] InDataSize Size of InData in bytes. + @param[in] SignCert Pointer to signer's DER-encoded certificate to sign with. + @param[in] OtherCerts Pointer to an optional additional set of certificates to + include in the PKCS#7 signedData (e.g. any intermediate + CAs in the chain). + @param[out] SignedData Pointer to output PKCS#7 signedData. + @param[out] SignedDataSize Size of SignedData in bytes. + + @retval TRUE PKCS#7 data signing succeeded. + @retval FALSE PKCS#7 data signing failed. + +**/ +#if 0 +BOOLEAN +EFIAPI +Pkcs7Sign ( + IN CONST UINT8 *PrivateKey, + IN UINTN PrivateKeySize, + IN CONST UINT8 *KeyPassword, + IN UINT8 *InData, + IN UINTN InDataSize, + IN UINT8 *SignCert, + IN UINT8 *OtherCerts OPTIONAL, + OUT UINT8 **SignedData, + OUT UINTN *SignedDataSize + ) +{ + BOOLEAN Status; + EVP_PKEY *Key; + BIO *DataBio; + PKCS7 *Pkcs7; + UINT8 *RsaContext; + UINT8 *P7Data; + UINTN P7DataSize; + UINT8 *Tmp; + + // + // Check input parameters. + // + if (PrivateKey == NULL || KeyPassword == NULL || InData == NULL || + SignCert == NULL || SignedData == NULL || SignedDataSize == NULL || InDataSize > INT_MAX) { + return FALSE; + } + + RsaContext = NULL; + Key = NULL; + Pkcs7 = NULL; + DataBio = NULL; + Status = FALSE; + + // + // Retrieve RSA private key from PEM data. + // + Status = RsaGetPrivateKeyFromPem ( + PrivateKey, + PrivateKeySize, + (CONST CHAR8 *) KeyPassword, + (VOID **) &RsaContext + ); + if (!Status) { + return Status; + } + + // + // Register & Initialize necessary digest algorithms and PRNG for PKCS#7 Handling + // + EVP_add_digest (EVP_md5()); + EVP_add_digest (EVP_sha1()); + EVP_add_digest (EVP_sha256()); + RandomSeed (NULL, 0); + + // + // Construct OpenSSL EVP_PKEY for private key. + // + Key = EVP_PKEY_new (); + if (Key == NULL) { + Status = FALSE; + goto _Exit; + } + Key->save_type = EVP_PKEY_RSA; + Key->type = EVP_PKEY_type (EVP_PKEY_RSA); + Key->pkey.rsa = (RSA *) RsaContext; + + // + // Convert the data to be signed to BIO format. + // + DataBio = BIO_new (BIO_s_mem ()); + BIO_write (DataBio, InData, (int) InDataSize); + + // + // Create the PKCS#7 signedData structure. + // + Pkcs7 = PKCS7_sign ( + (X509 *) SignCert, + Key, + (STACK_OF(X509) *) OtherCerts, + DataBio, + PKCS7_BINARY | PKCS7_NOATTR | PKCS7_DETACHED + ); + if (Pkcs7 == NULL) { + Status = FALSE; + goto _Exit; + } + + // + // Convert PKCS#7 signedData structure into DER-encoded buffer. + // + P7DataSize = i2d_PKCS7 (Pkcs7, NULL); + if (P7DataSize <= 19) { + Status = FALSE; + goto _Exit; + } + + P7Data = malloc (P7DataSize); + if (P7Data == NULL) { + Status = FALSE; + goto _Exit; + } + + Tmp = P7Data; + P7DataSize = i2d_PKCS7 (Pkcs7, (unsigned char **) &Tmp); + + // + // Strip ContentInfo to content only for signeddata. The data be trimmed off + // is totally 19 bytes. + // + *SignedDataSize = P7DataSize - 19; + *SignedData = malloc (*SignedDataSize); + if (*SignedData == NULL) { + Status = FALSE; + OPENSSL_free (P7Data); + goto _Exit; + } + + CopyMem (*SignedData, P7Data + 19, *SignedDataSize); + + OPENSSL_free (P7Data); + + Status = TRUE; + +_Exit: + // + // Release Resources + // + if (RsaContext != NULL) { + RsaFree (RsaContext); + if (Key != NULL) { + Key->pkey.rsa = NULL; + } + } + + if (Key != NULL) { + EVP_PKEY_free (Key); + } + + if (DataBio != NULL) { + BIO_free (DataBio); + } + + if (Pkcs7 != NULL) { + PKCS7_free (Pkcs7); + } + + return Status; +} +#endif + +/** + Check input P7Data is a wrapped ContentInfo structure or not. If not construct + a new structure to wrap P7Data. + + Caution: This function may receive untrusted input. + UEFI Authenticated Variable is external input, so this function will do basic + check for PKCS#7 data structure. + + @param[in] P7Data Pointer to the PKCS#7 message to verify. + @param[in] P7Length Length of the PKCS#7 message in bytes. + @param[out] WrapFlag If TRUE P7Data is a ContentInfo structure, otherwise + return FALSE. + @param[out] WrapData If return status of this function is TRUE: + 1) when WrapFlag is TRUE, pointer to P7Data. + 2) when WrapFlag is FALSE, pointer to a new ContentInfo + structure. It's caller's responsibility to free this + buffer. + @param[out] WrapDataSize Length of ContentInfo structure in bytes. + + @retval TRUE The operation is finished successfully. + @retval FALSE The operation is failed due to lack of resources. + +**/ +BOOLEAN +WrapPkcs7Data ( + IN CONST UINT8 *P7Data, + IN UINTN P7Length, + OUT BOOLEAN *WrapFlag, + OUT UINT8 **WrapData, + OUT UINTN *WrapDataSize + ) +{ + BOOLEAN Wrapped; + UINT8 *SignedData; + + // + // Check whether input P7Data is a wrapped ContentInfo structure or not. + // + Wrapped = FALSE; + if ((P7Data[4] == 0x06) && (P7Data[5] == 0x09)) { + if (CompareMem (P7Data + 6, mOidValue, sizeof (mOidValue)) == 0) { + if ((P7Data[15] == 0xA0) && (P7Data[16] == 0x82)) { + Wrapped = TRUE; + } + } + } + + if (Wrapped) { + *WrapData = (UINT8 *) P7Data; + *WrapDataSize = P7Length; + } else { + // + // Wrap PKCS#7 signeddata to a ContentInfo structure - add a header in 19 bytes. + // + *WrapDataSize = P7Length + 19; + *WrapData = (UINT8 *)malloc (*WrapDataSize); + if (*WrapData == NULL) { + *WrapFlag = Wrapped; + return FALSE; + } + + SignedData = *WrapData; + + // + // Part1: 0x30, 0x82. + // + SignedData[0] = 0x30; + SignedData[1] = 0x82; + + // + // Part2: Length1 = P7Length + 19 - 4, in big endian. + // + SignedData[2] = (UINT8) (((UINT16) (*WrapDataSize - 4)) >> 8); + SignedData[3] = (UINT8) (((UINT16) (*WrapDataSize - 4)) & 0xff); + + // + // Part3: 0x06, 0x09. + // + SignedData[4] = 0x06; + SignedData[5] = 0x09; + + // + // Part4: OID value -- 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x07 0x02. + // + CopyMem (SignedData + 6, mOidValue, sizeof (mOidValue)); + + // + // Part5: 0xA0, 0x82. + // + SignedData[15] = 0xA0; + SignedData[16] = 0x82; + + // + // Part6: Length2 = P7Length, in big endian. + // + SignedData[17] = (UINT8) (((UINT16) P7Length) >> 8); + SignedData[18] = (UINT8) (((UINT16) P7Length) & 0xff); + + // + // Part7: P7Data. + // + CopyMem (SignedData + 19, P7Data, P7Length); + } + + *WrapFlag = Wrapped; + return TRUE; +} + +/** + Pop single certificate from STACK_OF(X509). + + If X509Stack, Cert, or CertSize is NULL, then return FALSE. + + @param[in] X509Stack Pointer to a X509 stack object. + @param[out] Cert Pointer to a X509 certificate. + @param[out] CertSize Length of output X509 certificate in bytes. + + @retval TRUE The X509 stack pop succeeded. + @retval FALSE The pop operation failed. + +**/ +#if 0 +BOOLEAN +X509PopCertificate ( + IN VOID *X509Stack, + OUT UINT8 **Cert, + OUT UINTN *CertSize + ) +{ + BIO *CertBio; + X509 *X509Cert; + STACK_OF(X509) *CertStack; + BOOLEAN Status; + INT32 Result; + INT32 Length; + VOID *Buffer; + + Status = FALSE; + + if ((X509Stack == NULL) || (Cert == NULL) || (CertSize == NULL)) { + return Status; + } + + CertStack = (STACK_OF(X509) *) X509Stack; + + X509Cert = sk_X509_pop (CertStack); + + if (X509Cert == NULL) { + return Status; + } + + Buffer = NULL; + + CertBio = BIO_new (BIO_s_mem ()); + if (CertBio == NULL) { + return Status; + } + + Result = i2d_X509_bio (CertBio, X509Cert); + if (Result == 0) { + goto _Exit; + } + + Length = ((BUF_MEM *) CertBio->ptr)->length; + if (Length <= 0) { + goto _Exit; + } + + Buffer = malloc (Length); + if (Buffer == NULL) { + goto _Exit; + } + + Result = BIO_read (CertBio, Buffer, Length); + if (Result != Length) { + goto _Exit; + } + + *Cert = Buffer; + *CertSize = Length; + + Status = TRUE; + +_Exit: + + BIO_free (CertBio); + + if (!Status && (Buffer != NULL)) { + free (Buffer); + } + + return Status; +} +#endif + +/** + Get the signer's certificates from PKCS#7 signed data as described in "PKCS #7: + Cryptographic Message Syntax Standard". The input signed data could be wrapped + in a ContentInfo structure. + + If P7Data, CertStack, StackLength, TrustedCert or CertLength is NULL, then + return FALSE. If P7Length overflow, then return FAlSE. + + Caution: This function may receive untrusted input. + UEFI Authenticated Variable is external input, so this function will do basic + check for PKCS#7 data structure. + + @param[in] P7Data Pointer to the PKCS#7 message to verify. + @param[in] P7Length Length of the PKCS#7 message in bytes. + @param[out] CertStack Pointer to Signer's certificates retrieved from P7Data. + It's caller's responsiblity to free the buffer. + @param[out] StackLength Length of signer's certificates in bytes. + @param[out] TrustedCert Pointer to a trusted certificate from Signer's certificates. + It's caller's responsiblity to free the buffer. + @param[out] CertLength Length of the trusted certificate in bytes. + + @retval TRUE The operation is finished successfully. + @retval FALSE Error occurs during the operation. + +**/ +#if 0 +BOOLEAN +EFIAPI +Pkcs7GetSigners ( + IN CONST UINT8 *P7Data, + IN UINTN P7Length, + OUT UINT8 **CertStack, + OUT UINTN *StackLength, + OUT UINT8 **TrustedCert, + OUT UINTN *CertLength + ) +{ + PKCS7 *Pkcs7; + BOOLEAN Status; + UINT8 *SignedData; + UINT8 *Temp; + UINTN SignedDataSize; + BOOLEAN Wrapped; + STACK_OF(X509) *Stack; + UINT8 Index; + UINT8 *CertBuf; + UINT8 *OldBuf; + UINTN BufferSize; + UINTN OldSize; + UINT8 *SingleCert; + UINTN SingleCertSize; + + if ((P7Data == NULL) || (CertStack == NULL) || (StackLength == NULL) || + (TrustedCert == NULL) || (CertLength == NULL) || (P7Length > INT_MAX)) { + return FALSE; + } + + Status = WrapPkcs7Data (P7Data, P7Length, &Wrapped, &SignedData, &SignedDataSize); + if (!Status) { + return Status; + } + + Status = FALSE; + Pkcs7 = NULL; + Stack = NULL; + CertBuf = NULL; + OldBuf = NULL; + SingleCert = NULL; + + // + // Retrieve PKCS#7 Data (DER encoding) + // + if (SignedDataSize > INT_MAX) { + goto _Exit; + } + + Temp = SignedData; + Pkcs7 = d2i_PKCS7 (NULL, (const unsigned char **) &Temp, (int) SignedDataSize); + if (Pkcs7 == NULL) { + goto _Exit; + } + + // + // Check if it is PKCS#7 Signed Data (for Authenticode Scenario) + // + if (!PKCS7_type_is_signed (Pkcs7)) { + goto _Exit; + } + + Stack = PKCS7_get0_signers(Pkcs7, NULL, PKCS7_BINARY); + if (Stack == NULL) { + goto _Exit; + } + + // + // Convert CertStack to buffer in following format: + // UINT8 CertNumber; + // UINT32 Cert1Length; + // UINT8 Cert1[]; + // UINT32 Cert2Length; + // UINT8 Cert2[]; + // ... + // UINT32 CertnLength; + // UINT8 Certn[]; + // + BufferSize = sizeof (UINT8); + OldSize = BufferSize; + + for (Index = 0; ; Index++) { + Status = X509PopCertificate (Stack, &SingleCert, &SingleCertSize); + if (!Status) { + break; + } + + OldSize = BufferSize; + OldBuf = CertBuf; + BufferSize = OldSize + SingleCertSize + sizeof (UINT32); + CertBuf = malloc (BufferSize); + + if (CertBuf == NULL) { + goto _Exit; + } + + if (OldBuf != NULL) { + CopyMem (CertBuf, OldBuf, OldSize); + free (OldBuf); + OldBuf = NULL; + } + + WriteUnaligned32 ((UINT32 *) (CertBuf + OldSize), (UINT32) SingleCertSize); + CopyMem (CertBuf + OldSize + sizeof (UINT32), SingleCert, SingleCertSize); + + free (SingleCert); + SingleCert = NULL; + } + + if (CertBuf != NULL) { + // + // Update CertNumber. + // + CertBuf[0] = Index; + + *CertLength = BufferSize - OldSize - sizeof (UINT32); + *TrustedCert = malloc (*CertLength); + if (*TrustedCert == NULL) { + goto _Exit; + } + + CopyMem (*TrustedCert, CertBuf + OldSize + sizeof (UINT32), *CertLength); + *CertStack = CertBuf; + *StackLength = BufferSize; + Status = TRUE; + } + +_Exit: + // + // Release Resources + // + if (!Wrapped) { + free (SignedData); + } + + if (Pkcs7 != NULL) { + PKCS7_free (Pkcs7); + } + + if (Stack != NULL) { + sk_X509_pop_free(Stack, X509_free); + } + + if (SingleCert != NULL) { + free (SingleCert); + } + + if (!Status && (CertBuf != NULL)) { + free (CertBuf); + *CertStack = NULL; + } + + if (OldBuf != NULL) { + free (OldBuf); + } + + return Status; +} +#endif + +/** + Wrap function to use free() to free allocated memory for certificates. + + @param[in] Certs Pointer to the certificates to be freed. + +**/ +#if 0 +VOID +EFIAPI +Pkcs7FreeSigners ( + IN UINT8 *Certs + ) +{ + if (Certs == NULL) { + return; + } + + free (Certs); +} +#endif + +/** + Verifies the validility of a PKCS#7 signed data as described in "PKCS #7: + Cryptographic Message Syntax Standard". The input signed data could be wrapped + in a ContentInfo structure. + + If P7Data, TrustedCert or InData is NULL, then return FALSE. + If P7Length, CertLength or DataLength overflow, then return FAlSE. + + Caution: This function may receive untrusted input. + UEFI Authenticated Variable is external input, so this function will do basic + check for PKCS#7 data structure. + + @param[in] P7Data Pointer to the PKCS#7 message to verify. + @param[in] P7Length Length of the PKCS#7 message in bytes. + @param[in] TrustedCert Pointer to a trusted/root certificate encoded in DER, which + is used for certificate chain verification. + @param[in] CertLength Length of the trusted certificate in bytes. + @param[in] InData Pointer to the content to be verified. + @param[in] DataLength Length of InData in bytes. + + @retval TRUE The specified PKCS#7 signed data is valid. + @retval FALSE Invalid PKCS#7 signed data. + +**/ +BOOLEAN +EFIAPI +Pkcs7Verify ( + IN CONST UINT8 *P7Data, + IN UINTN P7Length, + IN CONST UINT8 *TrustedCert, + IN UINTN CertLength, + IN CONST UINT8 *InData, + IN UINTN DataLength + ) +{ + PKCS7 *Pkcs7; + BIO *CertBio; + BIO *DataBio; + BOOLEAN Status; + X509 *Cert; + X509_STORE *CertStore; + UINT8 *SignedData; + UINT8 *Temp; + UINTN SignedDataSize; + BOOLEAN Wrapped; + + // + // Check input parameters. + // + if (P7Data == NULL || TrustedCert == NULL || InData == NULL || + P7Length > INT_MAX || CertLength > INT_MAX || DataLength > INT_MAX) { + return FALSE; + } + + Pkcs7 = NULL; + CertBio = NULL; + DataBio = NULL; + Cert = NULL; + CertStore = NULL; + + // + // Register & Initialize necessary digest algorithms for PKCS#7 Handling + // + EVP_add_digest (EVP_md5()); + EVP_add_digest (EVP_sha1()); + EVP_add_digest_alias (SN_sha1WithRSAEncryption, SN_sha1WithRSA); + EVP_add_digest (EVP_sha256()); + + Status = WrapPkcs7Data (P7Data, P7Length, &Wrapped, &SignedData, &SignedDataSize); + if (!Status) { + return Status; + } + + Status = FALSE; + + // + // Retrieve PKCS#7 Data (DER encoding) + // + if (SignedDataSize > INT_MAX) { + goto _Exit; + } + + Temp = SignedData; + Pkcs7 = d2i_PKCS7 (NULL, (const unsigned char **) &Temp, (int) SignedDataSize); + if (Pkcs7 == NULL) { + goto _Exit; + } + + // + // Check if it's PKCS#7 Signed Data (for Authenticode Scenario) + // + if (!PKCS7_type_is_signed (Pkcs7)) { + goto _Exit; + } + + // + // Read DER-encoded root certificate and Construct X509 Certificate + // + CertBio = BIO_new (BIO_s_mem ()); + BIO_write (CertBio, TrustedCert, (int)CertLength); + if (CertBio == NULL) { + goto _Exit; + } + Cert = d2i_X509_bio (CertBio, NULL); + if (Cert == NULL) { + goto _Exit; + } + + // + // Setup X509 Store for trusted certificate + // + CertStore = X509_STORE_new (); + if (CertStore == NULL) { + goto _Exit; + } + if (!(X509_STORE_add_cert (CertStore, Cert))) { + goto _Exit; + } + + // + // Register customized X509 verification callback function to support + // trusted intermediate certificate anchor. + // +#ifndef OPENSSL_1_1 + CertStore->verify_cb = X509VerifyCb; +#else + X509_STORE_set_verify_cb(CertStore, X509VerifyCb); +#endif + + + // + // For generic PKCS#7 handling, InData may be NULL if the content is present + // in PKCS#7 structure. So ignore NULL checking here. + // + DataBio = BIO_new (BIO_s_mem ()); + BIO_write (DataBio, InData, (int)DataLength); + + // + // Verifies the PKCS#7 signedData structure + // + Status = (BOOLEAN) PKCS7_verify (Pkcs7, NULL, CertStore, DataBio, NULL, PKCS7_BINARY); + +_Exit: + // + // Release Resources + // + BIO_free (DataBio); + BIO_free (CertBio); + X509_free (Cert); + X509_STORE_free (CertStore); + PKCS7_free (Pkcs7); + + if (!Wrapped) { + OPENSSL_free (SignedData); + } + + return Status; +} + +/** @file + Authenticode Portable Executable Signature Verification over OpenSSL. + + Caution: This module requires additional review when modified. + This library will have external input - signature (e.g. PE/COFF Authenticode). + This external input must be validated carefully to avoid security issue like + buffer overflow, integer overflow. + + AuthenticodeVerify() will get PE/COFF Authenticode and will do basic check for + data structure. + +Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +//#include "InternalCryptLib.h" + +#include +#include +#include + +#include +// +// OID ASN.1 Value for SPC_INDIRECT_DATA_OBJID +// +UINT8 mSpcIndirectOidValue[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04 + }; + +/** + Verifies the validility of a PE/COFF Authenticode Signature as described in "Windows + Authenticode Portable Executable Signature Format". + + If AuthData is NULL, then return FALSE. + If ImageHash is NULL, then return FALSE. + + Caution: This function may receive untrusted input. + PE/COFF Authenticode is external input, so this function will do basic check for + Authenticode data structure. + + @param[in] AuthData Pointer to the Authenticode Signature retrieved from signed + PE/COFF image to be verified. + @param[in] DataSize Size of the Authenticode Signature in bytes. + @param[in] TrustedCert Pointer to a trusted/root certificate encoded in DER, which + is used for certificate chain verification. + @param[in] CertSize Size of the trusted certificate in bytes. + @param[in] ImageHash Pointer to the original image file hash value. The procudure + for calculating the image hash value is described in Authenticode + specification. + @param[in] HashSize Size of Image hash value in bytes. + + @retval TRUE The specified Authenticode Signature is valid. + @retval FALSE Invalid Authenticode Signature. + +**/ +BOOLEAN +EFIAPI +AuthenticodeVerify ( + IN CONST UINT8 *AuthData, + IN UINTN DataSize, + IN CONST UINT8 *TrustedCert, + IN UINTN CertSize, + IN CONST UINT8 *ImageHash, + IN UINTN HashSize + ) +{ + BOOLEAN Status; + PKCS7 *Pkcs7; + CONST UINT8 *OrigAuthData; + UINT8 *SpcIndirectDataContent; + UINT8 Asn1Byte; + UINTN ContentSize; +/* UINT8 *SpcIndirectDataOid; */ +unsigned i; + + // + // Check input parameters. + // + if ((AuthData == NULL) || (TrustedCert == NULL) || (ImageHash == NULL)) { + return FALSE; + } + + if ((DataSize > INT_MAX) || (CertSize > INT_MAX) || (HashSize > INT_MAX)) { + return FALSE; + } + + Status = FALSE; + Pkcs7 = NULL; + OrigAuthData = AuthData; + + // + // Retrieve & Parse PKCS#7 Data (DER encoding) from Authenticode Signature + // + Pkcs7 = d2i_PKCS7 (NULL, &AuthData, (int)DataSize); + if (Pkcs7 == NULL) { + goto _Exit; + } + + // + // Check if it's PKCS#7 Signed Data (for Authenticode Scenario) + // + if (!PKCS7_type_is_signed (Pkcs7)) { + goto _Exit; + } + +#if 0 // FIX!!! this needs to be revisited + // + // NOTE: OpenSSL PKCS7 Decoder didn't work for Authenticode-format signed data due to + // some authenticode-specific structure. Use opaque ASN.1 string to retrieve + // PKCS#7 ContentInfo here. + // +#ifndef OPENSSL_1_1 + SpcIndirectDataOid = (UINT8 *)(Pkcs7->d.sign->contents->type->data); +#else + SpcIndirectDataOid = (UINT8 *)ASN1_STRING_get0_data(Pkcs7->d.sign->contents->type); +#endif +PRINTK("SpcIndirectDataOid %p %p %08X\n", SpcIndirectDataOid, mSpcIndirectOidValue, OPENSSL_API_COMPAT); + if (CompareMem ( + SpcIndirectDataOid, + mSpcIndirectOidValue, + sizeof (mSpcIndirectOidValue) + ) != 0) { + // + // Un-matched SPC_INDIRECT_DATA_OBJID. + // + goto _Exit; + } +#endif + + SpcIndirectDataContent = (UINT8 *)(Pkcs7->d.sign->contents->d.other->value.asn1_string->data); + + // + // Retrieve the SEQUENCE data size from ASN.1-encoded SpcIndirectDataContent. + // + Asn1Byte = *(SpcIndirectDataContent + 1); + + if ((Asn1Byte & 0x80) == 0) { + // + // Short Form of Length Encoding + // + ContentSize = (UINTN) (Asn1Byte & 0x7F); + // + // Skip the SEQUENCE Tag; + // + SpcIndirectDataContent += 2; + } else if ((Asn1Byte & 0x82) == 0x82) { + // + // Long Form of Length Encoding, only support two bytes. + // + ContentSize = (UINTN) (*(SpcIndirectDataContent + 2)); + ContentSize = (ContentSize << 8) + (UINTN)(*(SpcIndirectDataContent + 3)); + // + // Skip the SEQUENCE Tag; + // + SpcIndirectDataContent += 4; + } else { + goto _Exit; + } + + // + // Compare the original file hash value to the digest retrieve from SpcIndirectDataContent + // defined in Authenticode + // NOTE: Need to double-check HashLength here! + // +PRINTK("PKCS7 hash: "); for (i = 0; i < HashSize; ++i) PRINTK("%02X ", ImageHash[i]); PRINTK("\n"); + if (CompareMem (SpcIndirectDataContent + ContentSize - HashSize, ImageHash, HashSize) != 0) { + // + // Un-matched PE/COFF Hash Value + // + goto _Exit; + } + + // + // Verifies the PKCS#7 Signed Data in PE/COFF Authenticode Signature + // + Status = (BOOLEAN) Pkcs7Verify (OrigAuthData, DataSize, TrustedCert, CertSize, SpcIndirectDataContent, ContentSize); + +_Exit: + // + // Release Resources + // + PKCS7_free (Pkcs7); + + return Status; +} +static const int cert_name_len = 160; + +#if 0 +static void print_signature_info(PKCS7 *p7) +{ + char subject_name[cert_name_len + 1], issuer_name[cert_name_len + 1]; + PKCS7_SIGNER_INFO *si; + X509 *cert; + int i; + + PRINTK("image signature issuers:\n"); + + for (i = 0; i < sk_PKCS7_SIGNER_INFO_num(p7->d.sign->signer_info); + i++) { + si = sk_PKCS7_SIGNER_INFO_value(p7->d.sign->signer_info, i); + X509_NAME_oneline(si->issuer_and_serial->issuer, + issuer_name, cert_name_len); + PRINTK(" - %s\n", issuer_name); + } + + PRINTK("image signature certificates:\n"); + + for (i = 0; i < sk_X509_num(p7->d.sign->cert); i++) { + cert = sk_X509_value(p7->d.sign->cert, i); + X509_NAME_oneline(cert->cert_info->subject, + subject_name, cert_name_len); + X509_NAME_oneline(cert->cert_info->issuer, + issuer_name, cert_name_len); + + PRINTK(" - subject: %s\n", subject_name); + PRINTK(" issuer: %s\n", issuer_name); + } +} +static void print_certificate_store_certs(X509_STORE *certs) +{ + char subject_name[cert_name_len + 1], issuer_name[cert_name_len + 1]; + X509_OBJECT *obj; + int i; + + PRINTK("certificate store:\n"); + + for (i = 0; i < sk_X509_OBJECT_num(certs->objs); i++) { + obj = sk_X509_OBJECT_value(certs->objs, i); + + if (obj->type != X509_LU_X509) + continue; + + X509_NAME_oneline(obj->data.x509->cert_info->subject, + subject_name, cert_name_len); + X509_NAME_oneline(obj->data.x509->cert_info->issuer, + issuer_name, cert_name_len); + + PRINTK(" - subject: %s\n", subject_name); + PRINTK(" issuer: %s\n", issuer_name); + } +} +#endif + +int +verify_openssl (pecoff_image_t *pe, const uint8_t *TrustedCert, int TrustedCertSize) +{ + // https://www.openssl.org/docs/manmaster/man3/EVP_DigestInit.html#EXAMPLE + range_t *range; + range_t *ranges = pe->ranges; + uint8_t answer[32]; + unsigned answer_len; + unsigned k; + EVP_MD_CTX *mdctx; + const EVP_MD *md; + BOOLEAN Status = 0; + + md = EVP_sha256(); + if (NULL == md) { + PRINTK("Unknown message digest\n"); + return 0; + } + mdctx = EVP_MD_CTX_create(); + EVP_DigestInit_ex(mdctx, md, NULL); + DLCL_FOR_EACH(range_t, ranges, range, next, prev) + { + EVP_DigestUpdate(mdctx, range->data, range->length); + } + EVP_DigestFinal_ex(mdctx, answer, &answer_len); + for (k = 0; k < 32; ++k) + PRINTK("%02X ", answer[k]); + PRINTK("\n"); + EVP_MD_CTX_destroy(mdctx); + + if (TrustedCertSize) + { + Status = + AuthenticodeVerify ( + pe->cert.data, // AuthData + pe->cert.ac->dwLength, // DataSize + TrustedCert, + TrustedCertSize, + answer, // ImageHash, + answer_len // HashSize + ); + PRINTK("PKCS7 Status %d\n", Status); + /* ERR_print_errors_fp(stderr); */ +/* + unsigned long err; + const char *f; + int l; + err = ERR_peek_last_error_line(&f, &l); + PRINTK("PKCS7 Status err %ul 0x%lx : line %d %s\n", err, err, l, f); +*/ + } + + return Status; +} + +/* + Rather than another file full of glue code, just put it here +*/ +#ifdef __XEN__ +#include +time_t time (time_t *ts) +{ + (void)ts; + PRINTK("Not yet impl: time\n"); + return (time_t)0x123456768; +} + +void abort (void) +{ + PRINTK("Not yet impl: abort\n"); + while(1); +} + +void qsort (void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *)) +{ + (void)base; + (void)nmemb; + (void)size; + (void)compar; + PRINTK("Not yet impl: qsort\n"); +} + +int errno = 0; + +char *strerror (int errnum) +{ + (void)errnum; + PRINTK("Not yet impl: strerror\n"); + return "strerr"; +} + +char *strncpy (char *dest, const char *src, size_t n) +{ + (void)src; + (void)n; + PRINTK("Not yet impl: strcpy\n"); + return dest; +} + +char *strcat (char *dest, const char *src) +{ + (void)src; + PRINTK("Not yet impl: strcat\n"); + return dest; +} + +uid_t getuid (void) { return (uid_t)0; } +uid_t geteuid (void) { return (uid_t)0; } +gid_t getgid (void) { return (gid_t)0; } +gid_t getegid (void) { return (gid_t)0; } + +int sscanf (const char *str, const char *format, ...) +{ + (void)str; + (void)format; + PRINTK("Not yet impl: sscanf\n"); + return 0; +} + +int gettimeofday (struct timeval *tv, struct timezone *tz) +{ + (void)tv; + (void)tz; + PRINTK("Not yet impl: gettimeofday\n"); + return 0; +} + +#endif + -- 2.7.4 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec