ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10d2luaGFuLmMgYi9kcml2ZXJzL2hpZC9oaWQtdHdpbmhhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWY2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtdHdpbmhhbi5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogSElEIGRyaXZlciBmb3IgVHdpbkhhbiBJUiByZW1vdGUgY29udHJvbAorICoKKyAqIEJhc2VkIG9uIGhpZC1neXJhdGlvbi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEJydW5vIFBy6W1vbnQgPGJvbmJvbnNAbGludXgtdnNlcnZlci5vcmc+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworLyoJUmVtb3RlIGNvbnRyb2wga2V5IGxheW91dCArIGxpc3Rpbmc6CisgKgorICogCUZ1bGwgU2NyZWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXIKKyAqCUtFWV9TQ1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9QT1dFUjIKKyAqCisgKgkxICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAzCisgKglLRVlfTlVNRVJJQ18xICAgS0VZX05VTUVSSUNfMiAgICBLRVlfTlVNRVJJQ18zCisgKgorICoJNCAgICAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgNgorICoJS0VZX05VTUVSSUNfNCAgIEtFWV9OVU1FUklDXzUgICAgS0VZX05VTUVSSUNfNgorICoKKyAqCTcgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgIDkKKyAqCUtFWV9OVU1FUklDXzcgICBLRVlfTlVNRVJJQ184ICAgIEtFWV9OVU1FUklDXzkKKyAqCisgKglSRUMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIEZhdm9yaXRlCisgKglLRVlfUkVDT1JEICAgICAgS0VZX05VTUVSSUNfMCAgICBLRVlfRkFWT1JJVEVTCisgKgorICoJUmV3aW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yd2FyZAorICoJS0VZX1JFV0lORCAgICAgICAgICAgQ0grICAgICAgICAgICBLRVlfRk9SV0FSRAorICoJICAgICAgICAgICAgICAgS0VZX0NIQU5ORUxVUAorICoKKyAqCVZPTC0gICAgICAgICAgICAgICAgICA+ICAgICAgICAgICAgICAgICAgIFZPTCsKKyAqCUtFWV9WT0xVTUVET1dOICAgIEtFWV9QTEFZICAgICAgICBLRVlfVk9MVU1FVVAKKyAqCisgKgkgICAgICAgICAgICAgICAgICAgICBDSC0KKyAqCSAgICAgICAgICAgICAgS0VZX0NIQU5ORUxET1dOCisgKglSZWNhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wCisgKglLRVlfUkVTVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9TVE9QCisgKgorICoJVGltZXNoaWZ0L1BhdXNlICAgICBNdXRlICAgICAgICAgICAgICAgIENhbmNlbAorICoJS0VZX1BBVVNFICAgICAgICAgS0VZX01VVEUgICAgICAgICAgS0VZX0NBTkNFTAorICoKKyAqCUNhcHR1cmUgICAgICAgICAgICBQcmV2aWV3ICAgICAgICAgICAgICAgICBFUEcKKyAqCUtFWV9QUklOVCAgICAgICAgS0VZX1BST0dSQU0gICAgICAgICAgIEtFWV9FUEcKKyAqCisgKglSZWNvcmQgTGlzdCAgICAgICAgICBUYWIgICAgICAgICAgICAgIFRlbGV0ZXh0CisgKglLRVlfTElTVCAgICAgICAgICAgIEtFWV9UQUIgICAgICAgICAgIEtFWV9URVhUCisgKi8KKworI2RlZmluZSB0aF9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgdHdpbmhhbl9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0tFWUJPQVJEKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCS8qIE1hcCBhbGwga2V5cyBmcm9tIFR3aW5oYW4gUmVtb3RlICovCisJY2FzZSAweDAwNDogdGhfbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7ICAgICAgICAgYnJlYWs7CisJY2FzZSAweDAwNjogdGhfbWFwX2tleV9jbGVhcihLRVlfUkVTVEFSVCk7ICAgICAgYnJlYWs7CisJY2FzZSAweDAwODogdGhfbWFwX2tleV9jbGVhcihLRVlfRVBHKTsgICAgICAgICAgYnJlYWs7CisJY2FzZSAweDAwYzogdGhfbWFwX2tleV9jbGVhcihLRVlfUkVXSU5EKTsgICAgICAgYnJlYWs7CisJY2FzZSAweDAwZTogdGhfbWFwX2tleV9jbGVhcihLRVlfUFJPR1JBTSk7ICAgICAgYnJlYWs7CisJY2FzZSAweDAwZjogdGhfbWFwX2tleV9jbGVhcihLRVlfTElTVCk7ICAgICAgICAgYnJlYWs7CisJY2FzZSAweDAxMDogdGhfbWFwX2tleV9jbGVhcihLRVlfTVVURSk7ICAgICAgICAgYnJlYWs7CisJY2FzZSAweDAxMTogdGhfbWFwX2tleV9jbGVhcihLRVlfRk9SV0FSRCk7ICAgICAgYnJlYWs7CisJY2FzZSAweDAxMzogdGhfbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOyAgICAgICAgYnJlYWs7CisJY2FzZSAweDAxNzogdGhfbWFwX2tleV9jbGVhcihLRVlfUEFVU0UpOyAgICAgICAgYnJlYWs7CisJY2FzZSAweDAxOTogdGhfbWFwX2tleV9jbGVhcihLRVlfRkFWT1JJVEVTKTsgICAgYnJlYWs7CisJY2FzZSAweDAxZDogdGhfbWFwX2tleV9jbGVhcihLRVlfU0NSRUVOKTsgICAgICAgYnJlYWs7CisJY2FzZSAweDAxZTogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ18xKTsgICAgYnJlYWs7CisJY2FzZSAweDAxZjogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ18yKTsgICAgYnJlYWs7CisJY2FzZSAweDAyMDogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ18zKTsgICAgYnJlYWs7CisJY2FzZSAweDAyMTogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ180KTsgICAgYnJlYWs7CisJY2FzZSAweDAyMjogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ181KTsgICAgYnJlYWs7CisJY2FzZSAweDAyMzogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ182KTsgICAgYnJlYWs7CisJY2FzZSAweDAyNDogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ183KTsgICAgYnJlYWs7CisJY2FzZSAweDAyNTogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ184KTsgICAgYnJlYWs7CisJY2FzZSAweDAyNjogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ185KTsgICAgYnJlYWs7CisJY2FzZSAweDAyNzogdGhfbWFwX2tleV9jbGVhcihLRVlfTlVNRVJJQ18wKTsgICAgYnJlYWs7CisJY2FzZSAweDAyODogdGhfbWFwX2tleV9jbGVhcihLRVlfUExBWSk7ICAgICAgICAgYnJlYWs7CisJY2FzZSAweDAyOTogdGhfbWFwX2tleV9jbGVhcihLRVlfQ0FOQ0VMKTsgICAgICAgYnJlYWs7CisJY2FzZSAweDAyYjogdGhfbWFwX2tleV9jbGVhcihLRVlfVEFCKTsgICAgICAgICAgYnJlYWs7CisJLyogUG93ZXIgICAgICAgPSAweDBlMCArIDB4MGUxICsgMHgwZTIgKyAweDAzZiAqLworCWNhc2UgMHgwM2Y6IHRoX21hcF9rZXlfY2xlYXIoS0VZX1BPV0VSMik7ICAgICAgIGJyZWFrOworCWNhc2UgMHgwNGE6IHRoX21hcF9rZXlfY2xlYXIoS0VZX1JFQ09SRCk7ICAgICAgIGJyZWFrOworCWNhc2UgMHgwNGI6IHRoX21hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUxVUCk7ICAgIGJyZWFrOworCWNhc2UgMHgwNGQ6IHRoX21hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOyAgICAgICAgIGJyZWFrOworCWNhc2UgMHgwNGU6IHRoX21hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUxET1dOKTsgIGJyZWFrOworCS8qIFZvbHVtZSBkb3duID0gMHgwZTEgKyAweDA1MSAgICAgICAgICAgICAgICAgKi8KKwljYXNlIDB4MDUxOiB0aF9tYXBfa2V5X2NsZWFyKEtFWV9WT0xVTUVET1dOKTsgICBicmVhazsKKwkvKiBWb2x1bWUgdXAgICA9IDB4MGUxICsgMHgwNTIgICAgICAgICAgICAgICAgICovCisJY2FzZSAweDA1MjogdGhfbWFwX2tleV9jbGVhcihLRVlfVk9MVU1FVVApOyAgICAgYnJlYWs7CisJLyogS2lsbCB0aGUgZXh0cmEga2V5cyB1c2VkIGZvciBtdWx0aS1rZXkgInBvd2VyIiBhbmQgInZvbHVtZSIga2V5cworCSAqIGFzIHdlbGwgYXMgY29udGludW91c2x5IHRvIHJlbGVhc2UgQ1RSTCxBTFQsTUVUQSwuLi4ga2V5cyAqLworCWNhc2UgMHgwZTA6CisJY2FzZSAweDBlMToKKwljYXNlIDB4MGUyOgorCWNhc2UgMHgwZTM6CisJY2FzZSAweDBlNDoKKwljYXNlIDB4MGU1OgorCWNhc2UgMHgwZTY6CisJY2FzZSAweDBlNzoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgdHdpbmhhbl9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RXSU5IQU4sIFVTQl9ERVZJQ0VfSURfVFdJTkhBTl9JUl9SRU1PVEUpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHR3aW5oYW5fZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciB0d2luaGFuX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ0d2luaGFuIiwKKwkuaWRfdGFibGUgPSB0d2luaGFuX2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSB0d2luaGFuX2lucHV0X21hcHBpbmcsCit9OworCitzdGF0aWMgaW50IHR3aW5oYW5faW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZ0d2luaGFuX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHR3aW5oYW5fZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmdHdpbmhhbl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0d2luaGFuX2luaXQpOworbW9kdWxlX2V4aXQodHdpbmhhbl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsK