From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750717AbWGRCCp (ORCPT ); Mon, 17 Jul 2006 22:02:45 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750781AbWGRCCp (ORCPT ); Mon, 17 Jul 2006 22:02:45 -0400 Received: from py-out-1112.google.com ([64.233.166.182]:444 "EHLO py-out-1112.google.com") by vger.kernel.org with ESMTP id S1750717AbWGRCCo (ORCPT ); Mon, 17 Jul 2006 22:02:44 -0400 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:mime-version:content-type; b=X3aUQcNCeIYYMo9XDHgI+LhKRAkuO6LUWg7jG9rMop/ZRKXvv70/+WPbFSSXrgyRqMsTaKfMnGV9kDBpd5ggorJbyvp+2HuKi+i3VICduXHBdm/UGLSoQAIFRML/qVrIrRFjzs7ho456OYJx4K5MpUkrCJBqPlSwKcSGr0n3CrM= Message-ID: <4745278c0607171902pc218a9dn9c63dd6670ac7249@mail.gmail.com> Date: Mon, 17 Jul 2006 22:02:43 -0400 From: "Vishal Patil" To: "Linux Kernel Mailing List" Subject: Generic B-tree implementation MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_17706_27924240.1153188163438" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org ------=_Part_17706_27924240.1153188163438 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello folks I am attaching source files containing a very generic implementation of B-trees in C. The implementation corresponds to in memory B-Tree data structure. The B-tree library consists of two files, btree.h and btree.c. I am also attaching a sample program main.c which should hopefully make the use of the library clear. I would be happy to receive inputs from the community for changes (enchancements) to the library. All the more I would like to help someone with a project which would take advantage of the B-Tree implementation. - Vishal PS: This code is being released under GPL version 2. -- Motivation will almost always beat mere talent. ------=_Part_17706_27924240.1153188163438 Content-Type: application/octet-stream; name=btree.h Content-Transfer-Encoding: base64 X-Attachment-Id: f_eprllhsp Content-Disposition: attachment; filename="btree.h" I2lmbmRlZiBfQlRSRUVfSF8KI2RlZmluZSBfQlRSRUVfSF8KCi8vIFBsYXRmb3JtIGRlcGVuZGVu dCBoZWFkZXJzCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRl IDxzdHJpbmdzLmg+CgojZGVmaW5lIG1lbV9hbGxvYyBtYWxsb2MKI2RlZmluZSBtZW1fZnJlZSBm cmVlCiNkZWZpbmUgYmNvcHkgYmNvcHkKI2RlZmluZSBwcmludCBwcmludGYKCnR5cGVkZWYgZW51 bSAge2ZhbHNlLHRydWV9IGJvb2w7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgdm9pZCAqIGtl eTsKICAgICAgICB2b2lkICogdmFsOwp9IGJ0X2tleV92YWw7Cgp0eXBlZGVmIHN0cnVjdCBidF9u b2RlIHsKCXN0cnVjdCBidF9ub2RlICogbmV4dDsJCS8vIFBvaW50ZXIgdXNlZCBmb3IgbGlua2Vk IGxpc3QgCglib29sIGxlYWY7CQkJLy8gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGxlYWYgb3Ig bm90CiAgICAgICAgdW5zaWduZWQgaW50IG5yX2FjdGl2ZTsJCS8vIE51bWJlciBvZiBhY3RpdmUg a2V5cwoJdW5zaWduZWQgaW50IGxldmVsOwkJLy8gTGV2ZWwgaW4gdGhlIEItVHJlZQogICAgICAg IGJ0X2tleV92YWwgKioga2V5X3ZhbHM7IAkvLyBBcnJheSBvZiBrZXlzIGFuZCB2YWx1ZXMKICAg ICAgICBzdHJ1Y3QgYnRfbm9kZSAqKiBjaGlsZHJlbjsJLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8g Y2hpbGQgbm9kZXMKfWJ0X25vZGU7Cgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBpbnQgb3Jk ZXI7CQkJLy8gQi1UcmVlIG9yZGVyCglidF9ub2RlICogcm9vdDsJCQkJLy8gUm9vdCBvZiB0aGUg Qi1UcmVlCgl1bnNpZ25lZCBpbnQgKCp2YWx1ZSkodm9pZCAqIGtleSk7CS8vIEdlbmVyYXRlIHVp bnQgdmFsdWUgZm9yIHRoZSBrZXkKICAgICAgICB1bnNpZ25lZCBpbnQgKCprZXlfc2l6ZSkodm9p ZCAqIGtleSk7ICAgIC8vIFJldHVybiB0aGUga2V5IHNpemUKICAgICAgICB1bnNpZ25lZCBpbnQg KCpkYXRhX3NpemUpKHZvaWQgKiBkYXRhKTsgIC8vIFJldHVybiB0aGUgZGF0YSBzaXplCgl2b2lk ICgqcHJpbnRfa2V5KSh2b2lkICoga2V5KTsJCS8vIFByaW50IHRoZSBrZXkKfWJ0cmVlOyAKCmV4 dGVybiBidHJlZSAqIGJ0cmVlX2NyZWF0ZSh1bnNpZ25lZCBpbnQgb3JkZXIpOwpleHRlcm4gaW50 IGJ0cmVlX2luc2VydF9rZXkoYnRyZWUgKiBidHJlZSwgYnRfa2V5X3ZhbCAqIGtleV92YWwpOwpl eHRlcm4gaW50IGJ0cmVlX2RlbGV0ZV9rZXkoYnRyZWUgKiBidHJlZSxidF9ub2RlICogc3VidHJl ZSAsdm9pZCAqIGtleSk7CmV4dGVybiBidF9rZXlfdmFsICogYnRyZWVfc2VhcmNoKGJ0cmVlICog YnRyZWUsICB2b2lkICoga2V5KTsKZXh0ZXJuIHZvaWQgYnRyZWVfZGVzdHJveShidHJlZSAqIGJ0 cmVlKTsKZXh0ZXJuIHZvaWQgKiBidHJlZV9nZXRfbWF4X2tleShidHJlZSAqIGJ0cmVlKTsKZXh0 ZXJuIHZvaWQgKiBidHJlZV9nZXRfbWluX2tleShidHJlZSAqIGJ0cmVlKTsKCiNpZmRlZiBERUJV RwpleHRlcm4gdm9pZCBwcmludF9zdWJ0cmVlKGJ0cmVlICogYnRyZWUsYnRfbm9kZSAqIG5vZGUp OwojZW5kaWYKCgojZW5kaWYK ------=_Part_17706_27924240.1153188163438 Content-Type: application/octet-stream; name=btree.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_eprllkuc Content-Disposition: attachment; filename="btree.c" I2luY2x1ZGUgImJ0cmVlLmgiCgp0eXBlZGVmIGVudW0ge2xlZnQgPSAtMSxyaWdodCA9IDF9IHBv c2l0aW9uX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CglidF9ub2RlICogbm9kZTsKCXVuc2lnbmVkIGlu dCBpbmRleDsKfW5vZGVfcG9zOwoKc3RhdGljIHZvaWQgcHJpbnRfc2luZ2xlX25vZGUoYnRyZWUg KmJ0cmVlLCBidF9ub2RlICogbm9kZSk7CnN0YXRpYyBidF9ub2RlICogYWxsb2NhdGVfYnRyZWVf bm9kZSAodW5zaWduZWQgaW50IG9yZGVyKTsKc3RhdGljIGludCBmcmVlX2J0cmVlX25vZGUgKGJ0 X25vZGUgKiBub2RlKTsKCnN0YXRpYyBub2RlX3BvcyBnZXRfYnRyZWVfbm9kZShidHJlZSAqIGJ0 cmVlLHZvaWQgKiBrZXkpOwoKc3RhdGljIGludCBkZWxldGVfa2V5X2Zyb21fbm9kZShidHJlZSAq IGJ0cmVlLCBub2RlX3BvcyAqIG5vZGVfcG9zKTsKc3RhdGljIGJ0X25vZGUgKiBtZXJnZV9ub2Rl cyhidHJlZSAqIGJ0cmVlLCBidF9ub2RlICogbjEsIGJ0X2tleV92YWwgKiBrdiAsYnRfbm9kZSAq IG4yKTsKc3RhdGljIHZvaWQgbW92ZV9rZXkoYnRyZWUgKiBidHJlZSwgYnRfbm9kZSAqIG5vZGUs IHVuc2lnbmVkIGludCBpbmRleCwgcG9zaXRpb25fdCBwb3MpOwpzdGF0aWMgbm9kZV9wb3MgZ2V0 X21heF9rZXlfcG9zKGJ0cmVlICogYnRyZWUsIGJ0X25vZGUgKiBzdWJ0cmVlKTsKc3RhdGljIG5v ZGVfcG9zIGdldF9taW5fa2V5X3BvcyhidHJlZSAqIGJ0cmVlLCBidF9ub2RlICogc3VidHJlZSk7 CnN0YXRpYyBidF9ub2RlICogbWVyZ2Vfc2libGluZ3MoYnRyZWUgKiBidHJlZSwgYnRfbm9kZSAq IHBhcmVudCx1bnNpZ25lZCBpbnQgaW5kZXgsCgkJCQkJcG9zaXRpb25fdCBwb3MpOwpzdGF0aWMg dm9pZCBjb3B5X2tleV92YWwoYnRyZWUgKiBidHJlZSxidF9rZXlfdmFsICogc3JjLCBidF9rZXlf dmFsICogZHN0KTsKCi8qKgoqCVVzZWQgdG8gY3JlYXRlIGEgYnRyZWUgd2l0aCBqdXN0IHRoZSBy b290IG5vZGUKKglAcGFyYW0gb3JkZXIgVGhlIG9yZGVyIG9mIHRoZSBCLXRyZWUKKglAcmV0dXJu IFRoZSBhbiBlbXB0eSBCLXRyZWUKKi8KYnRyZWUgKiBidHJlZV9jcmVhdGUodW5zaWduZWQgaW50 IG9yZGVyKSB7CglidHJlZSAqIGJ0cmVlOwoJYnRyZWUgPSBtZW1fYWxsb2Moc2l6ZW9mKCpidHJl ZSkpOwoJYnRyZWUtPm9yZGVyID0gb3JkZXI7CglidHJlZS0+cm9vdCA9IGFsbG9jYXRlX2J0cmVl X25vZGUob3JkZXIpOwoJYnRyZWUtPnJvb3QtPmxlYWYgPSB0cnVlOwoJYnRyZWUtPnJvb3QtPm5y X2FjdGl2ZSA9IDA7CglidHJlZS0+cm9vdC0+bmV4dCA9IE5VTEw7CglidHJlZS0+cm9vdC0+bGV2 ZWwgPSAwOwoJcmV0dXJuIGJ0cmVlOwp9CgovKioKKiAgICAgICBGdW5jdGlvbiB1c2VkIHRvIGFs bG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJ0cmVlIG5vZGUKKiAgICAgICBAcGFyYW0gb3JkZXIgT3Jk ZXIgb2YgdGhlIEItVHJlZQoqCUBwYXJhbSBsZWFmIGJvb2xlYW4gc2V0IHRydWUgZm9yIGEgbGVh ZiBub2RlCiogICAgICAgQHJldHVybiBUaGUgYWxsb2NhdGVkIEItdHJlZSBub2RlCiovCnN0YXRp YyBidF9ub2RlICogYWxsb2NhdGVfYnRyZWVfbm9kZSAodW5zaWduZWQgaW50IG9yZGVyKSB7CiAg ICAgICAgYnRfbm9kZSAqIG5vZGU7CgogICAgICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhl IG5vZGUKICAgICAgICBub2RlID0gKGJ0X25vZGUgKiltZW1fYWxsb2Moc2l6ZW9mKGJ0X25vZGUp KTsKICAgICAgIAogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG51bWJlciBvZiBhY3RpdmUgbm9k ZXMKICAgICAgICBub2RlLT5ucl9hY3RpdmUgPSAwOwoKICAgICAgICAvLyBJbml0aWFsaXplIHRo ZSBrZXlzCiAgICAgICAgbm9kZS0+a2V5X3ZhbHMgPSAoYnRfa2V5X3ZhbCAqKiltZW1fYWxsb2Mo MipvcmRlcipzaXplb2YoYnRfa2V5X3ZhbCopIC0gMSk7CiAgICAgICAgCiAgICAgICAgLy8gSW5p dGlhbGl6ZSB0aGUgY2hpbGQgcG9pbnRlcnMKICAgICAgICBub2RlLT5jaGlsZHJlbiA9IChidF9u b2RlICoqKW1lbV9hbGxvYygyKm9yZGVyKnNpemVvZihidF9ub2RlKikpOwoKCS8vIFVzZSB0byBk ZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIGxlYWYKCW5vZGUtPmxlYWYgPSB0cnVlOwoKCS8vIFVz ZSB0byBkZXRlcm1pbmUgdGhlIGxldmVsIGluIHRoZSB0cmVlCglub2RlLT5sZXZlbCA9IDA7CgoJ Ly9Jbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBwb2ludGVyIHRvIE5VTEwKCW5vZGUtPm5leHQg PSBOVUxMOwoKICAgICAgICByZXR1cm4gbm9kZTsKfQoKLyoqCiogICAgICAgRnVuY3Rpb24gdXNl ZCB0byBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHRoZSBiLXRyZWUgCiogICAgICAgQHBh cmFtIG5vZGUgVGhlIG5vZGUgdG8gYmUgZnJlZWQKKiAgICAgICBAcGFyYW0gb3JkZXIgT3JkZXIg b2YgdGhlIEItVHJlZQoqICAgICAgIEByZXR1cm4gVGhlIGFsbG9jYXRlZCBCLXRyZWUgbm9kZQoq LwpzdGF0aWMgaW50IGZyZWVfYnRyZWVfbm9kZSAoYnRfbm9kZSAqIG5vZGUpIHsKCiAgICAgICAg bWVtX2ZyZWUobm9kZS0+Y2hpbGRyZW4pOwogICAgICAgIG1lbV9mcmVlKG5vZGUtPmtleV92YWxz KTsKICAgICAgICBtZW1fZnJlZShub2RlKTsKCiAgICAgICAgcmV0dXJuIDA7Cn0KCi8qKgoqCVVz ZWQgdG8gc3BsaXQgdGhlIGNoaWxkIG5vZGUgYW5kIGFkanVzdCB0aGUgcGFyZW50IHNvIHRoYXQK KglpdCBoYXMgdHdvIGNoaWxkcmVuCioJQHBhcmFtIHBhcmVudCBQYXJlbnQgTm9kZQoqCUBwYXJh bSBpbmRleCBJbmRleCBvZiB0aGUgY2hpbGQgbm9kZQoqCUBwYXJhbSBjaGlsZCAgRnVsbCBjaGls ZCBub2RlCioJCiovCnN0YXRpYyB2b2lkIGJ0cmVlX3NwbGl0X2NoaWxkKGJ0cmVlICogYnRyZWUs IGJ0X25vZGUgKiBwYXJlbnQsIAoJCQkJdW5zaWduZWQgaW50IGluZGV4LAoJCQkJYnRfbm9kZSAq IGNoaWxkKSB7CglpbnQgaSA9IDA7CQoJdW5zaWduZWQgaW50IG9yZGVyID0gYnRyZWUtPm9yZGVy OwoKCWJ0X25vZGUgKiBuZXdfY2hpbGQgPSBhbGxvY2F0ZV9idHJlZV9ub2RlKGJ0cmVlLT5vcmRl cik7IAoJbmV3X2NoaWxkLT5sZWFmID0gY2hpbGQtPmxlYWY7CgluZXdfY2hpbGQtPmxldmVsID0g Y2hpbGQtPmxldmVsOwoJbmV3X2NoaWxkLT5ucl9hY3RpdmUgPSBidHJlZS0+b3JkZXIgLSAxOwoK CS8vIENvcHkgdGhlIGhpZ2hlciBvcmRlciBrZXlzIHRvIHRoZSBuZXcgY2hpbGQJCglmb3IoaT0w O2k8b3JkZXIgLSAxO2krKykgewoJCW5ld19jaGlsZC0+a2V5X3ZhbHNbaV0gPSBjaGlsZC0+a2V5 X3ZhbHNbaSArIG9yZGVyXTsKCQlpZighY2hpbGQtPmxlYWYpIHsKCQkJbmV3X2NoaWxkLT5jaGls ZHJlbltpXSA9IAoJCQkJY2hpbGQtPmNoaWxkcmVuW2kgKyBvcmRlcl07CgkJfSAKCX0KCQoJLy8g Q29weSB0aGUgbGFzdCBjaGlsZCBwb2ludGVyCglpZighY2hpbGQtPmxlYWYpIHsKCQluZXdfY2hp bGQtPmNoaWxkcmVuW2ldID0gCgkJY2hpbGQtPmNoaWxkcmVuW2kgKyBvcmRlcl07Cgl9CgoJY2hp bGQtPm5yX2FjdGl2ZSA9IG9yZGVyIC0gMTsKCQoJZm9yKGkgPSBwYXJlbnQtPm5yX2FjdGl2ZSAr IDE7aSA+IGluZGV4ICsgMTtpLS0pIHsKCQlwYXJlbnQtPmNoaWxkcmVuW2ldID0gcGFyZW50LT5j aGlsZHJlbltpIC0gMV07Cgl9CglwYXJlbnQtPmNoaWxkcmVuW2luZGV4ICsgMV0gPSBuZXdfY2hp bGQ7CgoJZm9yKGkgPSBwYXJlbnQtPm5yX2FjdGl2ZTtpID4gaW5kZXg7aS0tKSB7CgkJcGFyZW50 LT5rZXlfdmFsc1tpXSA9IHBhcmVudC0+a2V5X3ZhbHNbaSAtIDFdOwoJfQoKCXBhcmVudC0+a2V5 X3ZhbHNbaW5kZXhdID0gY2hpbGQtPmtleV92YWxzW29yZGVyIC0gMV07CQoJcGFyZW50LT5ucl9h Y3RpdmUrKzsKfQoKLyoqCioJVXNlZCB0byBpbnNlcnQgYSBrZXkgaW4gdGhlIG5vbi1mdWxsIG5v ZGUKKglAcGFyYW0gYnRyZWUgVGhlIGJ0cmVlCioJQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gd2hp Y2ggdGhlIGtleSB3aWxsIGJlIGFkZGVkCioJQHBhcmFtIHRoZSBrZXkgdmFsdWUgcGFpcgoqCUBy ZXR1cm4gdm9pZAoqLwoKc3RhdGljIHZvaWQgYnRyZWVfaW5zZXJ0X25vbmZ1bGwgKGJ0cmVlICog YnRyZWUsIGJ0X25vZGUgKiBwYXJlbnRfbm9kZSwKCQkJCWJ0X2tleV92YWwgKiBrZXlfdmFsKSB7 CgkKCXVuc2lnbmVkIGludCBrZXkgPSBidHJlZS0+dmFsdWUoa2V5X3ZhbC0+a2V5KTsKCWludCBp IDsKCWJ0X25vZGUgKiBjaGlsZDsJCglidF9ub2RlICogbm9kZSA9IHBhcmVudF9ub2RlOwoKaW5z ZXJ0OglpID0gbm9kZS0+bnJfYWN0aXZlIC0gMTsKCWlmKG5vZGUtPmxlYWYpIHsKCQl3aGlsZShp ID49IDAgJiYga2V5IDwgYnRyZWUtPnZhbHVlKG5vZGUtPmtleV92YWxzW2ldLT5rZXkpKSB7CgkJ CW5vZGUtPmtleV92YWxzW2kgKyAxXSA9IG5vZGUtPmtleV92YWxzW2ldOwoJCQlpLS07CgkJfQoJ CW5vZGUtPmtleV92YWxzW2kgKyAxXSA9IGtleV92YWw7CgkJbm9kZS0+bnJfYWN0aXZlKys7IAoJ fSBlbHNlIHsKCQl3aGlsZSAoaSA+PSAwICYmIGtleSA8IGJ0cmVlLT52YWx1ZShub2RlLT5rZXlf dmFsc1tpXS0+a2V5KSkgewoJCQlpLS07CgkJfQoJCWkrKzsKCQljaGlsZCA9IG5vZGUtPmNoaWxk cmVuW2ldOyAKCQkKCQlpZihjaGlsZC0+bnJfYWN0aXZlID09IDIqYnRyZWUtPm9yZGVyIC0gMSkg ewoJCQlidHJlZV9zcGxpdF9jaGlsZChidHJlZSxub2RlLGksY2hpbGQpOwkKCQkJaWYoYnRyZWUt PnZhbHVlKGtleV92YWwtPmtleSkgPiAKCQkJCWJ0cmVlLT52YWx1ZShub2RlLT5rZXlfdmFsc1tp XS0+a2V5KSkgewoJCQkJaSsrOwkKCQkJfQkKCQl9CgkJbm9kZSA9IG5vZGUtPmNoaWxkcmVuW2ld OwoJCWdvdG8gaW5zZXJ0OwkKCX0gCn0KCgovKioKKiAgICAgICBGdW5jdGlvbiB1c2VkIHRvIGlu c2VydCBub2RlIGludG8gYSBCLVRyZWUKKiAgICAgICBAcGFyYW0gcm9vdCBSb290IG9mIHRoZSBC LVRyZWUKKiAgICAgICBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBiZSBpbnNlcnRlZAoqICAgICAg IEBwYXJhbSBjb21wYXJlIEZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB0aGUgdHdvIG5vZGVzIG9m IHRoZSB0cmVlCiogICAgICAgQHJldHVybiBzdWNjZXNzIG9yIGZhaWx1cmUKKi8KaW50IGJ0cmVl X2luc2VydF9rZXkoYnRyZWUgKiBidHJlZSwgYnRfa2V5X3ZhbCAqIGtleV92YWwpIHsKCWJ0X25v ZGUgKiBybm9kZTsKCglybm9kZSA9IGJ0cmVlLT5yb290OwoJaWYocm5vZGUtPm5yX2FjdGl2ZSA9 PSAoMipidHJlZS0+b3JkZXIgLSAxKSkgewoJCWJ0X25vZGUgKiBuZXdfcm9vdDsKCQluZXdfcm9v dCA9IGFsbG9jYXRlX2J0cmVlX25vZGUoYnRyZWUtPm9yZGVyKTsKCQluZXdfcm9vdC0+bGV2ZWwg PSBidHJlZS0+cm9vdC0+bGV2ZWwgKyAxOwoJCWJ0cmVlLT5yb290ID0gbmV3X3Jvb3Q7CQoJCW5l d19yb290LT5sZWFmID0gZmFsc2U7CgkJbmV3X3Jvb3QtPm5yX2FjdGl2ZSA9IDA7CgkJbmV3X3Jv b3QtPmNoaWxkcmVuWzBdICA9IHJub2RlOwoJCWJ0cmVlX3NwbGl0X2NoaWxkKGJ0cmVlLG5ld19y b290LDAscm5vZGUpOwoJCWJ0cmVlX2luc2VydF9ub25mdWxsKGJ0cmVlLG5ld19yb290LGtleV92 YWwpOwkKCX0gZWxzZQoJCWJ0cmVlX2luc2VydF9ub25mdWxsKGJ0cmVlLHJub2RlLGtleV92YWwp OwkJCgogICAgICAgIHJldHVybiAwOwp9CgovKioKKglVc2VkIHRvIGdldCB0aGUgcG9zaXRpb24g b2YgdGhlIE1BWCBrZXkgd2l0aGluIHRoZSBzdWJ0cmVlCioJQHBhcmFtIGJ0cmVlIFRoZSBidHJl ZQoqCUBwYXJhbSBzdWJ0cmVlIFRoZSBzdWJ0cmVlIHRvIGJlIHNlYXJjaGVkCioJQHJldHVybiBU aGUgbm9kZSBjb250YWluaW5nIHRoZSBrZXkgYW5kIHBvc2l0aW9uIG9mIHRoZSBrZXkKKi8Kc3Rh dGljIG5vZGVfcG9zIGdldF9tYXhfa2V5X3BvcyhidHJlZSAqIGJ0cmVlLCBidF9ub2RlICogc3Vi dHJlZSkgewoJbm9kZV9wb3Mgbm9kZV9wb3M7CglidF9ub2RlICogbm9kZSA9IHN1YnRyZWU7IAoK CXdoaWxlKHRydWUpIHsKCQlpZihub2RlID09IE5VTEwpIHsKCQkJYnJlYWs7CgkJfQoKCQlpZihu b2RlLT5sZWFmKSB7CgkJCW5vZGVfcG9zLm5vZGUgCT0gbm9kZTsKCQkJbm9kZV9wb3MuaW5kZXgg CT0gbm9kZS0+bnJfYWN0aXZlIC0gMTsKCQkJcmV0dXJuIG5vZGVfcG9zOwkKCQl9IGVsc2UgewoJ CQlub2RlX3Bvcy5ub2RlIAk9IG5vZGU7CgkJCW5vZGVfcG9zLmluZGV4IAk9IG5vZGUtPm5yX2Fj dGl2ZSAtIDE7CgkJCW5vZGUgPSBub2RlLT5jaGlsZHJlbltub2RlLT5ucl9hY3RpdmVdOwkKCQl9 Cgl9CglyZXR1cm4gbm9kZV9wb3M7Cn0KCi8qKgoqCVVzZWQgdG8gZ2V0IHRoZSBwb3NpdGlvbiBv ZiB0aGUgTUFYIGtleSB3aXRoaW4gdGhlIHN1YnRyZWUKKglAcGFyYW0gYnRyZWUgVGhlIGJ0cmVl CioJQHBhcmFtIHN1YnRyZWUgVGhlIHN1YnRyZWUgdG8gYmUgc2VhcmNoZWQKKglAcmV0dXJuIFRo ZSBub2RlIGNvbnRhaW5pbmcgdGhlIGtleSBhbmQgcG9zaXRpb24gb2YgdGhlIGtleQoqLwpzdGF0 aWMgbm9kZV9wb3MgZ2V0X21pbl9rZXlfcG9zKGJ0cmVlICogYnRyZWUsIGJ0X25vZGUgKiBzdWJ0 cmVlKSB7Cglub2RlX3BvcyBub2RlX3BvczsKCWJ0X25vZGUgKiBub2RlID0gc3VidHJlZTsgCgoJ d2hpbGUodHJ1ZSkgewoJCWlmKG5vZGUgPT0gTlVMTCkgewoJCQlicmVhazsKCQl9CgoJCWlmKG5v ZGUtPmxlYWYpIHsKCQkJbm9kZV9wb3Mubm9kZSAJPSBub2RlOwoJCQlub2RlX3Bvcy5pbmRleCAJ PSAwOwoJCQlyZXR1cm4gbm9kZV9wb3M7CQoJCX0gZWxzZSB7CgkJCW5vZGVfcG9zLm5vZGUgCT0g bm9kZTsKCQkJbm9kZV9wb3MuaW5kZXggCT0gMDsKCQkJbm9kZSA9IG5vZGUtPmNoaWxkcmVuWzBd OwkKCQl9Cgl9CglyZXR1cm4gbm9kZV9wb3M7Cn0KCi8qKgoqCU1lcmdlIG5vZGVzIG4xIGFuZCBu MiAoY2FzZSAzYiBmcm9tIENvcm1lbikKKglAcGFyYW0gYnRyZWUgVGhlIGJ0cmVlIAoqCUBwYXJh bSBub2RlIFRoZSBwYXJlbnQgbm9kZSAKKglAcGFyYW0gaW5kZXggb2YgdGhlIGNoaWxkCioJQHBh cmFtIHBvcyBsZWZ0IG9yIHJpZ2h0CioJQHJldHVybiBub25lIAoqLwpzdGF0aWMgYnRfbm9kZSAq IG1lcmdlX3NpYmxpbmdzKGJ0cmVlICogYnRyZWUsIGJ0X25vZGUgKiBwYXJlbnQsIHVuc2lnbmVk IGludCBpbmRleCAsIAoJCQkJCXBvc2l0aW9uX3QgcG9zKSB7Cgl1bnNpZ25lZCBpbnQgaSxqOwoJ YnRfbm9kZSAqIG5ld19ub2RlOwoJYnRfbm9kZSAqIG4xLCAqIG4yOwogICAgICAgIAogICAgICAg IGlmIChpbmRleCA9PSAocGFyZW50LT5ucl9hY3RpdmUpKSB7ICAgCiAgICAgICAgICAgICAgIGlu ZGV4LS07CgkgICAgICAgbjEgPSBwYXJlbnQtPmNoaWxkcmVuW3BhcmVudC0+bnJfYWN0aXZlIC0g MV07CgkgICAgICAgbjIgPSBwYXJlbnQtPmNoaWxkcmVuW3BhcmVudC0+bnJfYWN0aXZlXTsKICAg ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBuMSA9IHBhcmVudC0+Y2hpbGRyZW5baW5kZXhd OwoJICAgICAgIG4yID0gcGFyZW50LT5jaGlsZHJlbltpbmRleCArIDFdOwogICAgICAgIH0KCgkv L01lcmdlIHRoZSBjdXJyZW50IG5vZGUgd2l0aCB0aGUgbGVmdCBub2RlCgluZXdfbm9kZSA9IGFs bG9jYXRlX2J0cmVlX25vZGUoYnRyZWUtPm9yZGVyKTsKCW5ld19ub2RlLT5sZXZlbCA9IG4xLT5s ZXZlbDsKCW5ld19ub2RlLT5sZWFmID0gbjEtPmxlYWY7CgoJZm9yKGo9MDtqPGJ0cmVlLT5vcmRl ciAtIDE7IGorKykgewoJCW5ld19ub2RlLT5rZXlfdmFsc1tqXSA9CW4xLT5rZXlfdmFsc1tqXTsK CQluZXdfbm9kZS0+Y2hpbGRyZW5bal0gPQluMS0+Y2hpbGRyZW5bal07Cgl9CgkKCW5ld19ub2Rl LT5rZXlfdmFsc1tidHJlZS0+b3JkZXIgLSAxXSA9CXBhcmVudC0+a2V5X3ZhbHNbaW5kZXhdOwoJ bmV3X25vZGUtPmNoaWxkcmVuW2J0cmVlLT5vcmRlciAtIDFdID0JbjEtPmNoaWxkcmVuW2J0cmVl LT5vcmRlciAtIDFdOwoKCWZvcihqPTA7ajxidHJlZS0+b3JkZXIgLSAxOyBqKyspIHsKCQluZXdf bm9kZS0+a2V5X3ZhbHNbaiArIGJ0cmVlLT5vcmRlcl0gPSAJbjItPmtleV92YWxzW2pdOwoJCW5l d19ub2RlLT5jaGlsZHJlbltqICsgYnRyZWUtPm9yZGVyXSA9IAluMi0+Y2hpbGRyZW5bal07Cgl9 CgluZXdfbm9kZS0+Y2hpbGRyZW5bMipidHJlZS0+b3JkZXIgLSAxXSA9IG4yLT5jaGlsZHJlblti dHJlZS0+b3JkZXIgLSAxXTsKCglwYXJlbnQtPmNoaWxkcmVuW2luZGV4XSA9IG5ld19ub2RlOwoK CWZvcihqID0gaW5kZXg7ajxwYXJlbnQtPm5yX2FjdGl2ZTtqKyspIHsKCQlwYXJlbnQtPmtleV92 YWxzW2pdID0gcGFyZW50LT5rZXlfdmFsc1tqICsgMV07CgkJcGFyZW50LT5jaGlsZHJlbltqICsg MV0gPSBwYXJlbnQtPmNoaWxkcmVuW2ogKyAyXTsKCX0KCgluZXdfbm9kZS0+bnJfYWN0aXZlID0g bjEtPm5yX2FjdGl2ZSArIG4yLT5ucl9hY3RpdmUgKyAxOwoJcGFyZW50LT5ucl9hY3RpdmUtLTsK Cglmb3IoaT1wYXJlbnQtPm5yX2FjdGl2ZTtpIDwgMipidHJlZS0+b3JkZXIgLSAxOyBpKyspIHsK CQlwYXJlbnQtPmtleV92YWxzW2ldID0gTlVMTDsgCgl9CgoJZnJlZV9idHJlZV9ub2RlKG4xKTsK CWZyZWVfYnRyZWVfbm9kZShuMik7CgoJaWYgKHBhcmVudC0+bnJfYWN0aXZlID09IDAgJiYgYnRy ZWUtPnJvb3QgPT0gcGFyZW50KSB7CgkJZnJlZV9idHJlZV9ub2RlKHBhcmVudCk7CgkJYnRyZWUt PnJvb3QgPSBuZXdfbm9kZTsKCQlpZihuZXdfbm9kZS0+bGV2ZWwpCgkJCW5ld19ub2RlLT5sZWFm ID0gZmFsc2U7CgkJZWxzZQoJCQluZXdfbm9kZS0+bGVhZiA9IHRydWU7IAoJfQoKCXJldHVybiBu ZXdfbm9kZTsKfQoKLyoqCioJTW92ZSB0aGUga2V5IGZyb20gbm9kZSB0byBhbm90aGVyCQoqCUBw YXJhbSBidHJlZSBUaGUgQi1UcmVlCioJQHBhcmFtIG5vZGUgVGhlIHBhcmVudCBub2RlCioJQHBh cmFtIGluZGV4IG9mIHRoZSBrZXkgdG8gYmUgbW92ZWQgZG9uZSAKKglAcGFyYW0gcG9zIHRoZSBw b3NpdGlvbiBvZiB0aGUgY2hpbGQgdG8gcmVjZWl2ZSB0aGUga2V5IAoqCUByZXR1cm4gbm9uZQoq LwpzdGF0aWMgdm9pZCBtb3ZlX2tleShidHJlZSAqIGJ0cmVlLCBidF9ub2RlICogbm9kZSwgdW5z aWduZWQgaW50IGluZGV4LCBwb3NpdGlvbl90IHBvcykgewoJYnRfbm9kZSAqIGxjaGlsZDsKCWJ0 X25vZGUgKiByY2hpbGQ7Cgl1bnNpZ25lZCBpbnQgaTsKCglpZihwb3MgPT0gcmlnaHQpIHsKCQlp bmRleC0tOwoJfQoJbGNoaWxkID0gbm9kZS0+Y2hpbGRyZW5baW5kZXhdOwoJcmNoaWxkID0gbm9k ZS0+Y2hpbGRyZW5baW5kZXggKyAxXTsKCQoJLy8gTW92ZSB0aGUga2V5IGZyb20gdGhlIHBhcmVu dCB0byB0aGUgbGVmdCBjaGlsZAoJaWYocG9zID09IGxlZnQpIHsKCQlsY2hpbGQtPmtleV92YWxz W2xjaGlsZC0+bnJfYWN0aXZlXSA9IG5vZGUtPmtleV92YWxzW2luZGV4XTsKCQlsY2hpbGQtPmNo aWxkcmVuW2xjaGlsZC0+bnJfYWN0aXZlICsgMV0gPSByY2hpbGQtPmNoaWxkcmVuWzBdOwoJCXJj aGlsZC0+Y2hpbGRyZW5bMF0gPSBOVUxMOwoJCWxjaGlsZC0+bnJfYWN0aXZlKys7CgoJCW5vZGUt PmtleV92YWxzW2luZGV4XSA9IHJjaGlsZC0+a2V5X3ZhbHNbMF07CgkJcmNoaWxkLT5rZXlfdmFs c1swXSA9IE5VTEw7CgoJCWZvcihpPTA7aTxyY2hpbGQtPm5yX2FjdGl2ZSAtIDE7aSsrKSB7CgkJ CXJjaGlsZC0+a2V5X3ZhbHNbaV0gPSByY2hpbGQtPmtleV92YWxzW2kgKyAxXTsKCQkJcmNoaWxk LT5jaGlsZHJlbltpXSA9IHJjaGlsZC0+Y2hpbGRyZW5baSArIDFdOwoJCX0KCQlyY2hpbGQtPmNo aWxkcmVuW3JjaGlsZC0+bnJfYWN0aXZlIC0gMV0gPSAKCQkJCXJjaGlsZC0+Y2hpbGRyZW5bcmNo aWxkLT5ucl9hY3RpdmVdOwoJCXJjaGlsZC0+bnJfYWN0aXZlLS07Cgl9IGVsc2UgewoJCS8vIE1v dmUgdGhlIGtleSBmcm9tIHRoZSBwYXJlbnQgdG8gdGhlIHJpZ2h0IGNoaWxkCgkJZm9yKGk9cmNo aWxkLT5ucl9hY3RpdmU7aSA+IDAgOyBpLS0pIHsKCQkJcmNoaWxkLT5rZXlfdmFsc1tpXSA9IHJj aGlsZC0+a2V5X3ZhbHNbaSAtIDFdOwoJCQlyY2hpbGQtPmNoaWxkcmVuW2kgKyAxXSA9IHJjaGls ZC0+Y2hpbGRyZW5baV07CQkKCQl9CgkJcmNoaWxkLT5jaGlsZHJlblsxXSA9IHJjaGlsZC0+Y2hp bGRyZW5bMF07CQkKCQlyY2hpbGQtPmNoaWxkcmVuWzBdID0gTlVMTDsKCgkJcmNoaWxkLT5rZXlf dmFsc1swXSA9IG5vZGUtPmtleV92YWxzW2luZGV4XTsKCgkJcmNoaWxkLT5jaGlsZHJlblswXSA9 IGxjaGlsZC0+Y2hpbGRyZW5bbGNoaWxkLT5ucl9hY3RpdmVdOwkKCQlsY2hpbGQtPmNoaWxkcmVu W2xjaGlsZC0+bnJfYWN0aXZlXSA9IE5VTEw7CgoJCW5vZGUtPmtleV92YWxzW2luZGV4XSA9IGxj aGlsZC0+a2V5X3ZhbHNbbGNoaWxkLT5ucl9hY3RpdmUgLSAxXTsKCQlsY2hpbGQtPmtleV92YWxz W2xjaGlsZC0+bnJfYWN0aXZlIC0gMV0gPSBOVUxMOwoJCQkKCQlsY2hpbGQtPm5yX2FjdGl2ZS0t OwoJCXJjaGlsZC0+bnJfYWN0aXZlKys7CQkKCX0JCQkJCn0KCi8qKgoqCU1lcmdlIG5vZGVzIG4x IGFuZCBuMgoqCUBwYXJhbSBuMSBGaXJzdCBub2RlCioJQHBhcmFtIG4yIFNlY29uZCBub2RlCioJ QHJldHVybiBjb21iaW5lZCBub2RlCiovCnN0YXRpYyBidF9ub2RlICogbWVyZ2Vfbm9kZXMoYnRy ZWUgKiBidHJlZSwgYnRfbm9kZSAqIG4xLCBidF9rZXlfdmFsICoga3YsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X25vZGUgKiBuMikgewoJYnRfbm9k ZSAqIG5ld19ub2RlOwoJdW5zaWduZWQgaW50IGk7CQoKCW5ld19ub2RlID0gYWxsb2NhdGVfYnRy ZWVfbm9kZShidHJlZS0+b3JkZXIpOwoJbmV3X25vZGUtPmxlYWYgPSB0cnVlOwoJCglmb3IoaT0w O2k8bjEtPm5yX2FjdGl2ZTtpKyspIHsKCQluZXdfbm9kZS0+a2V5X3ZhbHNbaV0gICA9IG4xLT5r ZXlfdmFsc1tpXTsJCiAgICAgICAgICAgICAgICBuZXdfbm9kZS0+Y2hpbGRyZW5baV0gICA9IG4x LT5jaGlsZHJlbltpXTsKCX0KICAgICAgICBuZXdfbm9kZS0+Y2hpbGRyZW5bbjEtPm5yX2FjdGl2 ZV0gPSBuMS0+Y2hpbGRyZW5bbjEtPm5yX2FjdGl2ZV07CiAgICAgICAgbmV3X25vZGUtPmtleV92 YWxzW24xLT5ucl9hY3RpdmVdID0ga3Y7CgoJZm9yKGk9MDtpPG4yLT5ucl9hY3RpdmU7aSsrKSB7 CgkJbmV3X25vZGUtPmtleV92YWxzW2kgKyBuMS0+bnJfYWN0aXZlICsgMV0gPSBuMi0+a2V5X3Zh bHNbaV07CiAgICAgICAgICAgICAgICBuZXdfbm9kZS0+Y2hpbGRyZW5baSArIG4xLT5ucl9hY3Rp dmUgKyAxXSA9IG4yLT5jaGlsZHJlbltpXTsKCX0KICAgICAgICBuZXdfbm9kZS0+Y2hpbGRyZW5b MipidHJlZS0+b3JkZXIgLSAxXSA9IG4yLT5jaGlsZHJlbltuMi0+bnJfYWN0aXZlXTsKCQogICAg ICAgIG5ld19ub2RlLT5ucl9hY3RpdmUgPSBuMS0+bnJfYWN0aXZlICsgbjItPm5yX2FjdGl2ZSAr IDE7CiAgICAgICAgbmV3X25vZGUtPmxlYWYgPSBuMS0+bGVhZjsKICAgICAgICBuZXdfbm9kZS0+ bGV2ZWwgPSBuMS0+bGV2ZWw7CgoJZnJlZV9idHJlZV9ub2RlKG4xKTsKCWZyZWVfYnRyZWVfbm9k ZShuMik7CgoJcmV0dXJuIG5ld19ub2RlOwp9CgovKioKKglVc2VkIHRvIGRlbGV0ZSBhIGtleSBm cm9tIHRoZSBCLXRyZWUgbm9kZQoqCUBwYXJhbSBidHJlZSBUaGUgYnRyZWUKKglAcGFyYW0gbm9k ZSBUaGUgbm9kZSBmcm9tIHdoaWNoIHRoZSBrZXkgaXMgdG8gYmUgZGVsZXRlZCAJCioJQHBhcmFt IGtleSBUaGUga2V5IHRvIGJlIGRlbGV0ZWQKKglAcmV0dXJuIDAgb24gc3VjY2VzcyAtMSBvbiBl cnJvciAKKi8KCmludCBkZWxldGVfa2V5X2Zyb21fbm9kZShidHJlZSAqIGJ0cmVlLCBub2RlX3Bv cyAqIG5vZGVfcG9zKSB7Cgl1bnNpZ25lZCBpbnQga2V5c19tYXggPSAyKmJ0cmVlLT5vcmRlciAt IDE7Cgl1bnNpZ25lZCBpbnQgaTsKCWJ0X2tleV92YWwgKiBrZXlfdmFsOwoJYnRfbm9kZSAqIG5v ZGUgPSBub2RlX3Bvcy0+bm9kZTsKCglpZihub2RlLT5sZWFmID09IGZhbHNlKSB7CgkJcmV0dXJu IC0xOwoJfQkKCQoJa2V5X3ZhbCA9IG5vZGUtPmtleV92YWxzW25vZGVfcG9zLT5pbmRleF07CgoJ Zm9yKGk9bm9kZV9wb3MtPmluZGV4O2k8IGtleXNfbWF4IC0gMTtpKyspIHsKCQlub2RlLT5rZXlf dmFsc1tpXSA9IG5vZGUtPmtleV92YWxzW2kgKyAxXTsJCgl9CgkKCWlmKGtleV92YWwtPmtleSkg ewoJCW1lbV9mcmVlKGtleV92YWwtPmtleSk7CiAgICAgICAgICAgICAgICBrZXlfdmFsLT5rZXkg PSBOVUxMOwoJfQoKCWlmKGtleV92YWwtPnZhbCkgewoJCW1lbV9mcmVlKGtleV92YWwtPnZhbCk7 CiAgICAgICAgICAgICAgICBrZXlfdmFsLT52YWwgPSBOVUxMOwoJfQoJCglub2RlLT5ucl9hY3Rp dmUtLTsKCglpZihub2RlLT5ucl9hY3RpdmUgPT0gMCApIHsKCQlmcmVlX2J0cmVlX25vZGUobm9k ZSk7Cgl9CglyZXR1cm4gMDsKfQoKLyoqCiogICAgICAgRnVuY3Rpb24gdXNlZCB0byBkZWxldGUg YSBub2RlIGZyb20gYSAgQi1UcmVlCiogICAgICAgQHBhcmFtIGJ0cmVlIFRoZSBCLVRyZWUKKiAg ICAgICBAcGFyYW0ga2V5IEtleSBvZiB0aGUgbm9kZSB0byBiZSBkZWxldGVkCiogICAgICAgQHBh cmFtIHZhbHVlIGZ1bmN0aW9uIHRvIG1hcCB0aGUga2V5IHRvIGFuIHVuaXF1ZSBpbnRlZ2VyIHZh bHVlICAgICAgICAKKiAgICAgICBAcGFyYW0gY29tcGFyZSBGdW5jdGlvbiB1c2VkIHRvIGNvbXBh cmUgdGhlIHR3byBub2RlcyBvZiB0aGUgdHJlZQoqICAgICAgIEByZXR1cm4gc3VjY2VzcyBvciBm YWlsdXJlCiovCgppbnQgYnRyZWVfZGVsZXRlX2tleShidHJlZSAqIGJ0cmVlLGJ0X25vZGUgKiBz dWJ0cmVlLHZvaWQgKiBrZXkpIHsKCXVuc2lnbmVkIGludCBpLGluZGV4OwoJYnRfbm9kZSAqIG5v ZGUgPSBOVUxMLCAqIHJzaWJsaW5nLCAqbHNpYmxpbmc7CglidF9ub2RlICogY29tYl9ub2RlLCAq IHBhcmVudDsKCW5vZGVfcG9zIHN1Yl9ub2RlX3BvczsKCW5vZGVfcG9zIG5vZGVfcG9zOwoJYnRf a2V5X3ZhbCAqIGtleV92YWwsICogbmV3X2tleV92YWw7Cgl1bnNpZ25lZCBpbnQga3YgPSBidHJl ZS0+dmFsdWUoa2V5KTsJCgoJbm9kZSA9IHN1YnRyZWU7CglwYXJlbnQgPSBOVUxMOwkKCmRlbF9s b29wOmZvciAoaSA9IDA7O2kgPSAwKSB7CiAgICAgICAgICAgICAKICAgICAgICAgICAgLy9JZiB0 aGVyZSBhcmUgbm8ga2V5cyBzaW1wbHkgcmV0dXJuCiAgICAgICAgICAgIGlmKCFub2RlLT5ucl9h Y3RpdmUpCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CgoJICAgIC8vIEZpeCB0aGUgaW5kZXgg b2YgdGhlIGtleSBncmVhdGVyIHRoYW4gb3IgZXF1YWwKCSAgICAvLyB0byB0aGUga2V5IHRoYXQg d2Ugd291bGQgbGlrZSB0byBzZWFyY2gKCQkKCSAgICB3aGlsZSAoaSA8IG5vZGUtPm5yX2FjdGl2 ZSAmJiBrdiA+IAoJCQkgICAgYnRyZWUtPnZhbHVlKG5vZGUtPmtleV92YWxzW2ldLT5rZXkpICkg ewoJCSAgICBpKys7CgkgICAgfQoJICAgIGluZGV4ID0gaTsKCgkgICAgLy8gSWYgd2UgZmluZCBz dWNoIGtleSBicmVhawkJICAgIAoJICAgIGlmKGkgPCBub2RlLT5ucl9hY3RpdmUgJiYgCgkJCWt2 ID09IGJ0cmVlLT52YWx1ZShub2RlLT5rZXlfdmFsc1tpXS0+a2V5KSkgewoJCQlicmVhazsKCSAg ICB9CiAgICAgICAgICAgIGlmKG5vZGUtPmxlYWYpCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7 CiAgICAgICAgICAgICAgICAKICAgIAkgICAgLy9TdG9yZSB0aGUgcGFyZW50IG5vZGUKCSAgICBw YXJlbnQgPSBub2RlOwoKCSAgICAvLyBUbyBnZXQgYSBjaGlsZCBub2RlIAoJICAgIG5vZGUgPSBu b2RlLT5jaGlsZHJlbltpXTsKCiAgICAgICAgICAgIC8vSWYgTlVMTCBub3QgZm91bmQKICAgICAg ICAgICAgaWYgKG5vZGUgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAg ICAgICAgIGlmIChpbmRleCA9PSAocGFyZW50LT5ucl9hY3RpdmUpKSB7ICAgCiAgICAgICAgICAg ICAgICBsc2libGluZyA9ICBwYXJlbnQtPmNoaWxkcmVuW3BhcmVudC0+bnJfYWN0aXZlIC0gMV07 CgkgICAgCXJzaWJsaW5nID0gTlVMTDsgCiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0g MCkgewogICAgICAgICAgICAgICAgbHNpYmxpbmcgPSBOVUxMOwogICAgICAgICAgICAgICAgcnNp YmxpbmcgPSBwYXJlbnQtPmNoaWxkcmVuWzFdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAg IAlsc2libGluZyA9IHBhcmVudC0+Y2hpbGRyZW5baSAtIDFdOwoJICAgIAlyc2libGluZyA9IHBh cmVudC0+Y2hpbGRyZW5baSArIDFdOwogICAgICAgICAgICB9CgoJICAgIGlmIChub2RlLT5ucl9h Y3RpdmUgPT0gYnRyZWUtPm9yZGVyIC0gMSAmJiBwYXJlbnQpIHsKCQkvLyBUaGUgY3VycmVudCBu b2RlIGhhcyAodCAtIDEpIGtleXMgYnV0IHRoZSByaWdodCBzaWJsaW5nIGhhcyA+ICh0IC0gMSkK CQkvLyBrZXlzCgkJaWYgKHJzaWJsaW5nICYmIChyc2libGluZy0+bnJfYWN0aXZlID4gYnRyZWUt Pm9yZGVyIC0gMSkpIHsKCQkJbW92ZV9rZXkoYnRyZWUscGFyZW50LGksbGVmdCk7CgkJfSBlbHNl CgkJLy8gVGhlIGN1cnJlbnQgbm9kZSBoYXMgKHQgLSAxKSBrZXlzIGJ1dCB0aGUgbGVmdCBzaWJs aW5nIGhhcyAodCAtIDEpCgkJLy8ga2V5cwoJCWlmIChsc2libGluZyAmJiAobHNpYmxpbmctPm5y X2FjdGl2ZSA+IGJ0cmVlLT5vcmRlciAtIDEpKSB7CgkJCW1vdmVfa2V5KGJ0cmVlLHBhcmVudCxp LHJpZ2h0KTsKCQl9IGVsc2UKCQkvLyBMZWZ0IHNpYmxpbmcgaGFzICh0IC0gMSkga2V5cwoJICAg ICAgICBpZihsc2libGluZyAmJiAobHNpYmxpbmctPm5yX2FjdGl2ZSA9PSBidHJlZS0+b3JkZXIg LSAxKSkgewoJCSAgICAgICAgbm9kZSA9IG1lcmdlX3NpYmxpbmdzKGJ0cmVlLHBhcmVudCxpLGxl ZnQpOwoJCX0gZWxzZQogICAgICAgICAgICAgICAgLy8gUmlnaHQgc2libGluZyBoYXMgKHQgLSAx KSBrZXlzCgkgICAgICAgIGlmKHJzaWJsaW5nICYmIChyc2libGluZy0+bnJfYWN0aXZlID09IGJ0 cmVlLT5vcmRlciAtIDEpKSB7CgkJICAgICAgICBub2RlID0gbWVyZ2Vfc2libGluZ3MoYnRyZWUs cGFyZW50LGkscmlnaHQpOwoJCX0KCSAgICB9CiAgICAgICAgfSAgICAgICAgICAgIAoJCgkvL0Nh c2UgMSA6IFRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIGtleSBpcyBmb3VuZCBhbmQgaXMgdGhlIGxl YWYgbm9kZS4KCS8vQWxzbyB0aGUgbGVhZiBub2RlIGhhcyBrZXlzIGdyZWF0ZXIgdGhhbiB0aGUg bWluaW11bSByZXF1aXJlZC4KCS8vU2ltcGx5IHJlbW92ZSB0aGUga2V5CglpZihub2RlLT5sZWFm ICYmIChub2RlLT5ucl9hY3RpdmUgPiBidHJlZS0+b3JkZXIgLSAxKSkgewoJCW5vZGVfcG9zLm5v ZGUgPSBub2RlOwoJCW5vZGVfcG9zLmluZGV4ID0gaW5kZXg7CgkJZGVsZXRlX2tleV9mcm9tX25v ZGUoYnRyZWUsJm5vZGVfcG9zKTsKCQlyZXR1cm4gMDsKCX0KCgkvL0lmIHRoZSBsZWFmIG5vZGUg aXMgdGhlIHJvb3QgcGVybWl0IGRlbGV0aW9uIGV2ZW4gaWYgdGhlIG51bWJlciBvZiBrZXlzIGlz CgkvL2xlc3MgdGhhbiAodCAtIDEpCglpZihub2RlLT5sZWFmICYmIChub2RlID09IGJ0cmVlLT5y b290KSkgewoJCW5vZGVfcG9zLm5vZGUgPSBub2RlOwoJCW5vZGVfcG9zLmluZGV4ID0gaW5kZXg7 CgkJZGVsZXRlX2tleV9mcm9tX25vZGUoYnRyZWUsJm5vZGVfcG9zKTsKCQlyZXR1cm4gMDsKCX0K CgoJLy9DYXNlIDI6IFRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIGtleSBpcyBmb3VuZCBhbmQgaXMg YW4gaW50ZXJuYWwgbm9kZQoJaWYobm9kZS0+bGVhZiA9PSBmYWxzZSkgewoJCWlmKG5vZGUtPmNo aWxkcmVuW2luZGV4XS0+bnJfYWN0aXZlID4gYnRyZWUtPm9yZGVyIC0gMSApIHsKCQkJc3ViX25v ZGVfcG9zID0gZ2V0X21heF9rZXlfcG9zKGJ0cmVlLG5vZGUtPmNoaWxkcmVuW2luZGV4XSk7CiAg ICAgICAgICAgICAgICAgICAgICAgIGtleV92YWwgPSBzdWJfbm9kZV9wb3Mubm9kZS0+a2V5X3Zh bHNbc3ViX25vZGVfcG9zLmluZGV4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19rZXlf dmFsID0gKGJ0X2tleV92YWwgKiltZW1fYWxsb2Moc2l6ZW9mKGJ0X2tleV92YWwpKTsKICAgICAg ICAgICAgICAgICAgICAgICAgY29weV9rZXlfdmFsKGJ0cmVlLGtleV92YWwsbmV3X2tleV92YWwp OwogICAgICAgIAkJbm9kZS0+a2V5X3ZhbHNbaW5kZXhdID0gbmV3X2tleV92YWw7CQogICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgYnRyZWVfZGVsZXRlX2tleShidHJlZSxu b2RlLT5jaGlsZHJlbltpbmRleF0sa2V5X3ZhbC0+a2V5KTsKCQkJaWYoc3ViX25vZGVfcG9zLm5v ZGUtPmxlYWYgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlu dCgiTm90IGxlYWZcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIGlmICgo bm9kZS0+Y2hpbGRyZW5baW5kZXggKyAxXS0+bnJfYWN0aXZlID4gYnRyZWUtPm9yZGVyIC0gMSkg KSB7CgkJCXN1Yl9ub2RlX3BvcyA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdl dF9taW5fa2V5X3BvcyhidHJlZSxub2RlLT5jaGlsZHJlbltpbmRleCArIDFdKTsKICAgICAgICAg ICAgICAgICAgICAgICAga2V5X3ZhbCA9IHN1Yl9ub2RlX3Bvcy5ub2RlLT5rZXlfdmFsc1tzdWJf bm9kZV9wb3MuaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2tleV92YWwgPSAo YnRfa2V5X3ZhbCAqKW1lbV9hbGxvYyhzaXplb2YoYnRfa2V5X3ZhbCkpOwogICAgICAgICAgICAg ICAgICAgICAgICBjb3B5X2tleV92YWwoYnRyZWUsa2V5X3ZhbCxuZXdfa2V5X3ZhbCk7CiAgICAg ICAgCQlub2RlLT5rZXlfdmFsc1tpbmRleF0gPSBuZXdfa2V5X3ZhbDsJCiAgICAgICAgICAgICAg IAogICAgICAgICAgICAgICAgICAgICAgICBidHJlZV9kZWxldGVfa2V5KGJ0cmVlLG5vZGUtPmNo aWxkcmVuW2luZGV4ICsgMV0sa2V5X3ZhbC0+a2V5KTsKCQkJaWYoc3ViX25vZGVfcG9zLm5vZGUt PmxlYWYgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgi Tm90IGxlYWZcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoJCX0gZWxzZSBpZiAoIAoJ CQlub2RlLT5jaGlsZHJlbltpbmRleF0tPm5yX2FjdGl2ZSA9PSBidHJlZS0+b3JkZXIgLSAxICYm CgkJCW5vZGUtPmNoaWxkcmVuW2luZGV4ICsgMV0tPm5yX2FjdGl2ZSA9PSBidHJlZS0+b3JkZXIg LSAxKSB7CgoJCQljb21iX25vZGUgPSBtZXJnZV9ub2RlcyhidHJlZSxub2RlLT5jaGlsZHJlbltp bmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2V5X3ZhbHNbaW5k ZXhdLAoJCQkJbm9kZS0+Y2hpbGRyZW5baW5kZXggKyAxXSk7CgkJCW5vZGUtPmNoaWxkcmVuW2lu ZGV4XSA9IGNvbWJfbm9kZTsKCQkJCgkJCWZvcihpPWluZGV4ICsgMTtpPG5vZGUtPm5yX2FjdGl2 ZTtpKyspIHsKCQkJCW5vZGUtPmNoaWxkcmVuW2ldID0gbm9kZS0+Y2hpbGRyZW5baSArIDFdOwoJ CQkJbm9kZS0+a2V5X3ZhbHNbaSAtIDFdID0gbm9kZS0+a2V5X3ZhbHNbaV07CgkJCX0KCQkJbm9k ZS0+bnJfYWN0aXZlLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5ucl9hY3Rp dmUgPT0gMCAmJiBidHJlZS0+cm9vdCA9PSBub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZnJlZV9idHJlZV9ub2RlKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGJ0cmVlLT5yb290ID0gY29tYl9ub2RlOyAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjb21iX25vZGU7CiAgICAg ICAgICAgICAgICAgICAgICAgIGdvdG8gZGVsX2xvb3A7CgkJfQkJCiAgICAgICAgICB9CgkKCS8v IENhc2UgMzoKCS8vIEluIHRoaXMgY2FzZSBzdGFydCBmcm9tIHRoZSB0b3Agb2YgdGhlIHRyZWUg YW5kIGNvbnRpbnVlCgkvLyBtb3ZpbmcgdG8gdGhlIGxlYWYgbm9kZSBtYWtpbmcgc3VyZSB0aGF0 IGVhY2ggbm9kZSB0aGF0CgkvLyB3ZSBlbmNvdW50ZXIgb24gdGhlIHdheSBoYXMgYXRsZWFzdCAn dCcgKG9yZGVyIG9mIHRoZSB0cmVlKQoJLy8ga2V5cyAKCWlmKG5vZGUtPmxlYWYgJiYgKG5vZGUt Pm5yX2FjdGl2ZSA+IGJ0cmVlLT5vcmRlciAtIDEpKSB7CgkgICAgICBub2RlX3Bvcy5ub2RlID0g bm9kZTsKCSAgICAgIG5vZGVfcG9zLmluZGV4ID0gaW5kZXg7CgkgICAgICBkZWxldGVfa2V5X2Zy b21fbm9kZShidHJlZSwmbm9kZV9wb3MpOwoJfQoKICAgICAgICByZXR1cm4gMDsKfQoKLyoqCioJ RnVuY3Rpb24gdXNlZCB0byBnZXQgdGhlIG5vZGUgY29udGFpbmluZyB0aGUgZ2l2ZW4ga2V5CioJ QHBhcmFtIGJ0cmVlIFRoZSBidHJlZSB0byBiZSBzZWFyY2hlZAoqCUBwYXJhbSBrZXkgVGhlIHRo ZSBrZXkgdG8gYmUgc2VhcmNoZWQKKglAcmV0dXJuIFRoZSBub2RlIGFuZCBwb3NpdGlvbiBvZiB0 aGUga2V5IHdpdGhpbiB0aGUgbm9kZSAKKi8Kbm9kZV9wb3MgIGdldF9idHJlZV9ub2RlKGJ0cmVl ICogYnRyZWUsdm9pZCAqIGtleSkgewoJbm9kZV9wb3Mga3A7Cgl1bnNpZ25lZCBpbnQga2V5X3Zh bCA9IGJ0cmVlLT52YWx1ZShrZXkpOwkKCWJ0X25vZGUgKiBub2RlOwoJdW5zaWduZWQgaW50IGkg PSAwOwoKCW5vZGUgPSBidHJlZS0+cm9vdDsKCgkJCglmb3IgKDs7aSA9IDApIHsJCgoJICAgIC8v IEZpeCB0aGUgaW5kZXggb2YgdGhlIGtleSBncmVhdGVyIHRoYW4gb3IgZXF1YWwKCSAgICAvLyB0 byB0aGUga2V5IHRoYXQgd2Ugd291bGQgbGlrZSB0byBzZWFyY2gKCQkKCSAgICB3aGlsZSAoaSA8 IG5vZGUtPm5yX2FjdGl2ZSAmJiBrZXlfdmFsID4gCgkJCSAgICBidHJlZS0+dmFsdWUobm9kZS0+ a2V5X3ZhbHNbaV0tPmtleSkgKSB7CgkJICAgIGkrKzsKCSAgICB9CgoJICAgIC8vIElmIHdlIGZp bmQgc3VjaCBrZXkgcmV0dXJuIHRoZSBrZXktdmFsdWUgcGFpcgkJICAgIAoJICAgIGlmKGkgPCBu b2RlLT5ucl9hY3RpdmUgJiYgCgkJCWtleV92YWwgPT0gYnRyZWUtPnZhbHVlKG5vZGUtPmtleV92 YWxzW2ldLT5rZXkpKSB7CgkJICAgIGtwLm5vZGUgPSBub2RlOwoJCSAgICBrcC5pbmRleCA9IGk7 CQoJCSAgICByZXR1cm4ga3A7CgkgICAgfQoJCgkgICAgLy8gSWYgdGhlIG5vZGUgaXMgbGVhZiBh bmQgaWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBrZXkgCgkgICAgLy8gcmV0dXJuIE5VTEwKCSAgICBp Zihub2RlLT5sZWFmKSB7CgkJICAgIHJldHVybiBrcDsKCSAgICB9CgoJICAgIC8vIFRvIGdvdCBh IGNoaWxkIG5vZGUgCgkgICAgbm9kZSA9IG5vZGUtPmNoaWxkcmVuW2ldOwoJfQogICAgICAJcmV0 dXJuIGtwOwoKfQoKLyoqCiogICAgICAgVXNlZCB0byBkZXN0b3J5IGJ0cmVlCiogICAgICAgQHBh cmFtIGJ0cmVlIFRoZSBCLXRyZWUKKiAgICAgICBAcmV0dXJuIG5vbmUKKi8Kdm9pZCBidHJlZV9k ZXN0cm95KGJ0cmVlICogYnRyZWUpIHsKICAgICAgIGludCBpID0gMDsKICAgICAgIHVuc2lnbmVk IGludCBjdXJyZW50X2xldmVsOwoKICAgICAgIGJ0X25vZGUgKiBoZWFkLCAqIHRhaWwsICogbm9k ZTsKICAgICAgIGJ0X25vZGUgKiBjaGlsZCwgKiBkZWxfbm9kZTsKCiAgICAgICBub2RlID0gYnRy ZWUtPnJvb3Q7CiAgICAgICBjdXJyZW50X2xldmVsID0gbm9kZS0+bGV2ZWw7CiAgICAgICBoZWFk ID0gbm9kZTsKICAgICAgIHRhaWwgPSBub2RlOwoKICAgICAgIHdoaWxlKHRydWUpIHsKICAgICAg ICAgICAgICAgaWYoaGVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7 CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgKGhlYWQtPmxldmVsIDwgY3VycmVu dF9sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbGV2ZWwgPSBoZWFkLT5s ZXZlbDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgaWYoaGVhZC0+bGVhZiA9PSBm YWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMCA7IGkgPCBoZWFkLT5ucl9h Y3RpdmUgKyAxOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0g aGVhZC0+Y2hpbGRyZW5baV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsLT5u ZXh0ID0gY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsID0gY2hpbGQ7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC0+bmV4dCA9IE5VTEw7CiAgICAg ICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGRlbF9u b2RlID0gaGVhZDsKICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICAgICAgICAg ICAgIGZyZWVfYnRyZWVfbm9kZShkZWxfbm9kZSk7CiAgICAgICB9Cgp9CgovKioKKiAgICAgICBG dW5jdGlvbiB1c2VkIHRvIHNlYXJjaCBhIG5vZGUgaW4gYSBCLVRyZWUKKiAgICAgICBAcGFyYW0g YnRyZWUgVGhlIEItdHJlZSB0byBiZSBzZWFyY2hlZAoqICAgICAgIEBwYXJhbSBrZXkgS2V5IG9m IHRoZSBub2RlIHRvIGJlIHNlYXJjaAoqICAgICAgIEByZXR1cm4gVGhlIGtleS12YWx1ZSBwYWly CiovCmJ0X2tleV92YWwgKiBidHJlZV9zZWFyY2goYnRyZWUgKiBidHJlZSx2b2lkICoga2V5KSB7 CgoJYnRfa2V5X3ZhbCAqIGtleV92YWwgPSBOVUxMOwoJbm9kZV9wb3Mga3AgPSBnZXRfYnRyZWVf bm9kZShidHJlZSxrZXkpOwoKCWlmKGtwLm5vZGUpIHsKCQlrZXlfdmFsID0ga3Aubm9kZS0+a2V5 X3ZhbHNba3AuaW5kZXhdOwoJfQoJcmV0dXJuIGtleV92YWw7IAp9CgovKioKKiAgICAgICBVc2Vk IHRvIGNvcHkga2V5IHZhbHVlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCiogICAgICAgQHBh cmFtIHNyYyBUaGUgc291cmNlIGtleSB2YWx1ZQoqICAgICAgIEBwYXJhbSBkc3QgVGhlIGRlc3Qg a2V5IHZhbHVlCiogICAgICAgQHJldHVybiBub25lCiovCnN0YXRpYyB2b2lkIGNvcHlfa2V5X3Zh bChidHJlZSAqIGJ0cmVlLCBidF9rZXlfdmFsICogc3JjLCBidF9rZXlfdmFsICogZHN0KSB7CiAg ICAgICAgdW5zaWduZWQgaW50IGtleXNpemU7CiAgICAgICAgdW5zaWduZWQgaW50IGRhdGFzaXpl OwoKICAgICAgICBrZXlzaXplICAgID0gYnRyZWUtPmtleV9zaXplKHNyYy0+a2V5KTsKICAgICAg ICBkc3QtPmtleSAgICAgICAgPSAodm9pZCAqKW1lbV9hbGxvYyhrZXlzaXplKTsKICAgICAgICBi Y29weShzcmMtPmtleSxkc3QtPmtleSxrZXlzaXplKTsKICAgICAgICAKICAgICAgICBpZihzcmMt PnZhbCkgewogICAgICAgICAgICAgICAgZGF0YXNpemUgICA9IGJ0cmVlLT5kYXRhX3NpemUoc3Jj LT52YWwpOwogICAgICAgICAgICAgICAgZHN0LT52YWwgICAgICAgPSAodm9pZCAqKW1lbV9hbGxv YyhkYXRhc2l6ZSk7CiAgICAgICAgICAgICAgICBiY29weShzcmMtPnZhbCxkc3QtPnZhbCxkYXRh c2l6ZSk7CiAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAKfQoKLyoqCioJR2V0IHRo ZSBtYXgga2V5IGluIHRoZSBidHJlZQoqCUBwYXJhbSBidHJlZSBUaGUgYnRyZWUKKglAcmV0dXJu IFRoZSBtYXgga2V5IAoqLwp2b2lkICogYnRyZWVfZ2V0X21heF9rZXkoYnRyZWUgKiBidHJlZSkg ewoJbm9kZV9wb3Mgbm9kZV9wb3M7Cglub2RlX3BvcyA9IGdldF9tYXhfa2V5X3BvcyhidHJlZSxi dHJlZS0+cm9vdCk7CglyZXR1cm4gbm9kZV9wb3Mubm9kZS0+a2V5X3ZhbHNbbm9kZV9wb3MuaW5k ZXhdLT5rZXk7Cn0KCi8qKgoqCUdldCB0aGUgbWluIGtleSBpbiB0aGUgYnRyZWUKKglAcGFyYW0g YnRyZWUgVGhlIGJ0cmVlCioJQHJldHVybiBUaGUgbWF4IGtleSAKKi8Kdm9pZCAqIGJ0cmVlX2dl dF9taW5fa2V5KGJ0cmVlICogYnRyZWUpIHsKCW5vZGVfcG9zIG5vZGVfcG9zOwoJbm9kZV9wb3Mg PSBnZXRfbWluX2tleV9wb3MoYnRyZWUsYnRyZWUtPnJvb3QpOwoJcmV0dXJuIG5vZGVfcG9zLm5v ZGUtPmtleV92YWxzW25vZGVfcG9zLmluZGV4XS0+a2V5Owp9CgojaWZkZWYgREVCVUcKCi8qKgoq CVVzZWQgdG8gcHJpbnQgdGhlIGtleXMgb2YgdGhlIGJ0X25vZGUKKglAcGFyYW0gbm9kZSBUaGUg bm9kZSB3aG9zZSBrZXlzIGFyZSB0byBiZSBwcmludGVkCioJQHJldHVybiBub25lCiovCgpzdGF0 aWMgdm9pZCBwcmludF9zaW5nbGVfbm9kZShidHJlZSAqYnRyZWUsIGJ0X25vZGUgKiBub2RlKSB7 CgkKCWludCBpID0gMDsKCQoJcHJpbnQoIiB7ICIpOwkKCXdoaWxlKGkgPCBub2RlLT5ucl9hY3Rp dmUpIHsKCQlwcmludCgiMHgleCglZCkgIiwgYnRyZWUtPnZhbHVlKG5vZGUtPmtleV92YWxzW2ld LT5rZXkpLAoJCQlub2RlLT5sZXZlbCk7CgkJaSsrOwoJfQoJcHJpbnQoIn0gKDB4JXgsJWQpICIs IG5vZGUsbm9kZS0+bGVhZik7CQp9CgovKioKKiAgICAgICBGdW5jdGlvbiB1c2VkIHRvIHByaW50 IHRoZSBCLXRyZWUKKiAgICAgICBAcGFyYW0gcm9vdCBSb290IG9mIHRoZSBCLVRyZWUKKiAgICAg ICBAcGFyYW0gcHJpbnRfa2V5IEZ1bmN0aW9uIHVzZWQgdG8gcHJpbnQgdGhlIGtleSB2YWx1ZQoq ICAgICAgIEByZXR1cm4gbm9uZQoqLwoKdm9pZCBwcmludF9zdWJ0cmVlKGJ0cmVlICpidHJlZSxi dF9ub2RlICogbm9kZSkgewoJCglpbnQgaSA9IDA7Cgl1bnNpZ25lZCBpbnQgY3VycmVudF9sZXZl bDsKCglidF9ub2RlICogaGVhZCwgKiB0YWlsOwoJYnRfbm9kZSAqIGNoaWxkOwoKCWN1cnJlbnRf bGV2ZWwgPSBub2RlLT5sZXZlbDsKCWhlYWQgPSBub2RlOwoJdGFpbCA9IG5vZGU7CgoJd2hpbGUo dHJ1ZSkgewoJCWlmKGhlYWQgPT0gTlVMTCkgewoJCQlicmVhazsKCQl9CgkJaWYgKGhlYWQtPmxl dmVsIDwgY3VycmVudF9sZXZlbCkgewoJCQljdXJyZW50X2xldmVsID0gaGVhZC0+bGV2ZWw7CgkJ CXByaW50KCJcbiIpOwoJCX0KCQlwcmludF9zaW5nbGVfbm9kZShidHJlZSxoZWFkKTsKCgkJaWYo aGVhZC0+bGVhZiA9PSBmYWxzZSkgewkKCQkJZm9yKGkgPSAwIDsgaSA8IGhlYWQtPm5yX2FjdGl2 ZSArIDE7IGkrKykgewoJCQkJY2hpbGQgPSBoZWFkLT5jaGlsZHJlbltpXTsKCQkJCXRhaWwtPm5l eHQgPSBjaGlsZDsKCQkJCXRhaWwgPSBjaGlsZDsKCQkJCWNoaWxkLT5uZXh0ID0gTlVMTDsKCQkJ fQoJCX0KCQloZWFkID0gaGVhZC0+bmV4dDsJCgl9CglwcmludCgiXG4iKTsKfQoKCiNlbmRpZgo= ------=_Part_17706_27924240.1153188163438 Content-Type: application/octet-stream; name=main.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_eprllo4h Content-Disposition: attachment; filename="main.c" I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4K I2luY2x1ZGUgImJ0cmVlLmgiCgp1bnNpZ25lZCBpbnQgdmFsdWUodm9pZCAqIGtleSkgewoJcmV0 dXJuICooKGludCAqKWtleSk7Cn0KCnVuc2lnbmVkIGludCBrZXlzaXplKHZvaWQgKiBrZXkpIHsK ICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7Cn0KCnVuc2lnbmVkIGludCBkYXRhc2l6ZSh2b2lk ICogZGF0YSkgewogICAgICAgIHJldHVybiBzaXplb2YoaW50KTsKfQoKaW50IG1haW4oaW50IGFy Z2MsY2hhciAqIGFyZ3ZbXSkKewoJaW50IGkgPSAwOwoJYnRyZWUgKiB0cmVlOwoJYnRfa2V5X3Zh bCAqIGt2OwoJaW50IGl0ZW0gPSAweDQzOwoJaW50IGNvdW50OwoJaW50IG9yZGVyOwogICAgICAg IGludCAqIHZhbHVlczsKCQoJc3JhbmRvbSh0aW1lKE5VTEwpKTsKCQoJZm9yKG9yZGVyPTI7b3Jk ZXI8NjA7b3JkZXIrKykgewoJICAgIGNvdW50ID0gcmFuZG9tKCklNTEyOwkJCiAgICAgICAgICAg IHZhbHVlcyA9IChpbnQgKiltYWxsb2MoY291bnQqc2l6ZW9mKGludCkpOwoKICAgICAgICAgICAg Zm9yKGkgPSAwO2k8Y291bnQ7aSsrKSB7CiAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSByYW5k b20oKSUxMDI0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIAoJICAgIHRyZWUgPSBidHJlZV9j cmVhdGUob3JkZXIpOwkKICAgICAgICAgICAgdHJlZS0+dmFsdWUgPSB2YWx1ZTsKICAgICAgICAg ICAgdHJlZS0+a2V5X3NpemUgPSBrZXlzaXplOwogICAgICAgICAgICB0cmVlLT5kYXRhX3NpemUg PSBkYXRhc2l6ZTsKCSAgICAKCSAgICBmb3IgKGk9MDtpPGNvdW50O2krKykgewkKCQkgICAga3Yg PSAoYnRfa2V5X3ZhbCopbWFsbG9jKHNpemVvZigqa3YpKTsKCQkgICAga3YtPmtleSA9IG1hbGxv YyhzaXplb2YoaW50KSk7CQkKCQkgICAgKihpbnQgKilrdi0+a2V5ID0gdmFsdWVzW2ldOwoJCSAg ICBrdi0+dmFsID0gbWFsbG9jKHNpemVvZihpbnQpKTsKCQkgICAgKihpbnQgKilrdi0+dmFsID0g dmFsdWVzW2ldOwoJCSAgICBidHJlZV9pbnNlcnRfa2V5KHRyZWUsa3YpOwoJICAgIH0JCQogICAg CSAgICBwcmludF9zdWJ0cmVlKHRyZWUsdHJlZS0+cm9vdCk7CgkgICAgCgkgICAgZm9yIChpPSBj b3VudCAtIDE7IGkgPiAtMTsgaS09IChyYW5kb20oKSU1KSkgewkKCQkgICAgaXRlbSA9IHZhbHVl c1tpXTsKCQkgICAgYnRyZWVfZGVsZXRlX2tleSh0cmVlLHRyZWUtPnJvb3QsJml0ZW0pOwoJICAg IH0KCSAgICBmcmVlKHZhbHVlcyk7CiAgICAgICAgICAgIGJ0cmVlX2Rlc3Ryb3kodHJlZSk7Cgl9 CglyZXR1cm4gMDsKfQo= ------=_Part_17706_27924240.1153188163438--