NTQxZTdmYTgzYWJmZGQ0Yzg0MTVmYjVjZDRlZDUnOw0KDQoJLy8gb3B0aW9uYWwNCiAgdmFyICRf dmVyYm9zZSAgICAgICAgICAgPSBmYWxzZTsNCiAgdmFyICRfY2hhcnNldCAgICAgICAgICAgPSAn VVRGLTgnOw0KCXZhciAkX2ZldGNoX3JlbW90ZV90eXBlID0gJ2ZpbGVfZ2V0X2NvbnRlbnRzJzsN Cgl2YXIgJF9zb2NrZXRfdGltZW91dCAgICA9IDY7DQoJdmFyICRfbGlua3NfZGVsaW1pdGVyCQk9 ICcgJzsNCgl2YXIgJF9zaG93X2NvZGUJCQkJCT0gZmFsc2U7DQoNCgkvLyBvdGhlcg0KICB2YXIg JF9zZXJ2ZXJzCQkJCQkJPSAnbGlua3NtYW5hZ2VyMS5pbnxsaW5rc21hbmFnZXIxLmNvLnR2JzsN CiAgdmFyICRfY2FjaGVfbGlmZXRpbWUgICAgPSAxMDgwMDsNCiAgdmFyICRfY2FjaGVfcmVsb2Fk dGltZSAgPSA2MDA7DQogIHZhciAkX2Vycm9yICAgICAgICAgICAgID0gJyc7DQogIHZhciAkX2Ri X2ZpbGUgICAgICAgICAgID0gJyc7DQoNCiAgZnVuY3Rpb24gQ01fYmFzZSgkb3B0aW9ucyA9IG51 bGwpIHsNCg0KCQlpZiAoaXNzZXQoJG9wdGlvbnNbJ3ZlcmJvc2UnXSkgJiYgJG9wdGlvbnNbJ3Zl cmJvc2UnXSA9PSB0cnVlKQ0KCQkJJHRoaXMtPl92ZXJib3NlID0gdHJ1ZTsNCg0KICAgIGlmIChp c3NldCgkb3B0aW9uc1snY2hhcnNldCddKSAmJiBzdHJsZW4oJG9wdGlvbnNbJ2NoYXJzZXQnXSkp DQogICAgICAkdGhpcy0+X2NoYXJzZXQgPSAkb3B0aW9uc1snY2hhcnNldCddOw0KDQogICAgaWYg KGlzc2V0KCRvcHRpb25zWydmZXRjaF9yZW1vdGVfdHlwZSddKSAmJiBzdHJsZW4oJG9wdGlvbnNb J2ZldGNoX3JlbW90ZV90eXBlJ10pKQ0KICAgICAgJHRoaXMtPl9mZXRjaF9yZW1vdGVfdHlwZSA9 ICRvcHRpb25zWydmZXRjaF9yZW1vdGVfdHlwZSddOw0KDQoJCWlmIChpc3NldCgkb3B0aW9uc1sn c29ja2V0X3RpbWVvdXQnXSkgJiYgaXNfbnVtZXJpYygkb3B0aW9uc1snc29ja2V0X3RpbWVvdXQn XSkgJiYgJG9wdGlvbnNbJ3NvY2tldF90aW1lb3V0J10gPiAwKQ0KICAgICAgJHRoaXMtPl9zb2Nr ZXRfdGltZW91dCA9ICRvcHRpb25zWydzb2NrZXRfdGltZW91dCddOw0KDQogICAgaWYgKGlzc2V0 KCRvcHRpb25zWydsaW5rc19kZWxpbWl0ZXInXSkgJiYgc3RybGVuKCRvcHRpb25zWydsaW5rc19k ZWxpbWl0ZXInXSkpDQogICAgICAkdGhpcy0+X2xpbmtzX2RlbGltaXRlciA9ICRvcHRpb25zWyds aW5rc19kZWxpbWl0ZXInXTsNCg0KICAgIGlmIChpc3NldCgkb3B0aW9uc1snc2hvd19jb2RlJ10p ICYmICRvcHRpb25zWydzaG93X2NvZGUnXSA9PSB0cnVlKQ0KICAgICAgICR0aGlzLT5fc2hvd19j b2RlID0gdHJ1ZTsNCgkNCgl9DQoNCg0KICBmdW5jdGlvbiBmZXRjaF9yZW1vdGVfZmlsZSgkaG9z dCwgJHBhdGgpIHsNCg0KCQlAaW5pX3NldCgnYWxsb3dfdXJsX2ZvcGVuJywgICAgICAgICAgMSk7 DQogICAgQGluaV9zZXQoJ2RlZmF1bHRfc29ja2V0X3RpbWVvdXQnLCAgICR0aGlzLT5fc29ja2V0 X3RpbWVvdXQpOw0KDQogICAgaWYgKCR0aGlzLT5fZmV0Y2hfcmVtb3RlX3R5cGUgPT0gJ2ZpbGVf Z2V0X2NvbnRlbnRzJyB8fCANCgkJCSgkdGhpcy0+X2ZldGNoX3JlbW90ZV90eXBlID09ICcnICYm IGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9nZXRfY29udGVudHMnKSAmJiBpbmlfZ2V0KCdhbGxvd191 cmxfZm9wZW4nKSA9PSAxKSkgew0KICAgICAgICAgICAgDQoJCQkkdGhpcy0+X2ZldGNoX3JlbW90 ZV90eXBlID0gJ2ZpbGVfZ2V0X2NvbnRlbnRzJzsNCgkJCSRkYXRhID0gQGZpbGVfZ2V0X2NvbnRl bnRzKCdodHRwOi8vJyAuICRob3N0IC4gJHBhdGgpOw0KDQoJCQlpZiAoJGRhdGEpDQoJCQkJcmV0 dXJuICRkYXRhOw0KDQogICAgfSBlbHNlaWYgKCR0aGlzLT5fZmV0Y2hfcmVtb3RlX3R5cGUgPT0g J2N1cmwnIHx8IA0KCQkJKCR0aGlzLT5fZmV0Y2hfcmVtb3RlX3R5cGUgPT0gJycgJiYgZnVuY3Rp b25fZXhpc3RzKCdjdXJsX2luaXQnKSkpIHsNCiAgICAgICAgICAgIA0KCQkJJHRoaXMtPl9mZXRj aF9yZW1vdGVfdHlwZSA9ICdjdXJsJzsNCg0KICAgICAgaWYgKCRjaCA9IEBjdXJsX2luaXQoKSkg ew0KDQoJCQkJQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICAgICAgICAgICAgICAnaHR0 cDovLycgLiAkaG9zdCAuICRwYXRoKTsNCgkJCQlAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hF QURFUiwgICAgICAgICAgIGZhbHNlKTsNCgkJCQlAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JF VFVSTlRSQU5TRkVSLCAgIHRydWUpOw0KCQkJCUBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09O TkVDVFRJTUVPVVQsICAgJHRoaXMtPl9zb2NrZXRfdGltZW91dCk7DQoNCiAgICAgICAgJGRhdGEg PSBAY3VybF9leGVjKCRjaCk7DQogICAgICAgIEBjdXJsX2Nsb3NlKCRjaCk7DQoNCgkJCQlpZiAo JGRhdGEpDQoJCQkJCXJldHVybiAkZGF0YTsNCgkJCX0NCg0KICAgIH0gZWxzZSB7DQoNCgkJCSR0 aGlzLT5fZmV0Y2hfcmVtb3RlX3R5cGUgPSAnc29ja2V0JzsNCg0KICAgICAgJGJ1ZmYgPSAnJzsN CiAgICAgICRmcCA9IEBmc29ja29wZW4oJGhvc3QsIDgwLCAkZXJybm8sICRlcnJzdHIsICR0aGlz LT5fc29ja2V0X3RpbWVvdXQpOw0KDQogICAgICBpZiAoJGZwKSB7DQoNCgkJCQlAZnB1dHMoJGZw LCAiR0VUIHskcGF0aH0gSFRUUC8xLjBcclxuSG9zdDogeyRob3N0fVxyXG4iKTsNCg0KCQkJCXdo aWxlICghQGZlb2YoJGZwKSkNCgkJCQkJJGJ1ZmYgLj0gQGZnZXRzKCRmcCwgMTI4KTsNCg0KCQkJ CUBmY2xvc2UoJGZwKTsNCg0KCQkJCSRwYWdlID0gZXhwbG9kZSgiXHJcblxyXG4iLCAkYnVmZik7 DQoJCQkJcmV0dXJuICRwYWdlWzFdOw0KDQogICAgICB9DQoNCiAgICB9DQoNCiAgICByZXR1cm4g JHRoaXMtPnJhaXNlX2Vycm9yKCcmIzEwNTM7JiMxMDc3OyAmIzEwODQ7JiMxMDg2OyYjMTA3NTsm IzEwOTE7ICYjMTA4NzsmIzEwODY7JiMxMDc2OyYjMTA4MjsmIzEwODM7JiMxMTAyOyYjMTA5NTsm IzEwODA7JiMxMDkwOyYjMTEwMDsmIzEwODk7JiMxMTAzOyAmIzEwODI7ICYjMTA4OTsmIzEwNzc7 JiMxMDg4OyYjMTA3NDsmIzEwNzc7JiMxMDg4OyYjMTA5MTs6ICcgLiAkaG9zdCAuICRwYXRoLics IHR5cGU6ICcuJHRoaXMtPl9mZXRjaF9yZW1vdGVfdHlwZSk7DQogIH0NCg0KICBmdW5jdGlvbiBf cmVhZCgkZmlsZW5hbWUpIHsNCiAgICAgICAgDQoJCSRmcCA9IEBmb3BlbigkZmlsZW5hbWUsICdy YicpOw0KCQlAZmxvY2soJGZwLCBMT0NLX1NIKTsNCg0KCQlpZiAoJGZwKSB7DQoNCgkJCWNsZWFy c3RhdGNhY2hlKCk7DQoJCQkkbGVuZ3RoID0gQGZpbGVzaXplKCRmaWxlbmFtZSk7DQoJCQkkbXFy ID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7DQoJCQlzZXRfbWFnaWNfcXVvdGVzX3J1bnRp bWUoMCk7DQoNCgkJCWlmICgkbGVuZ3RoKQ0KCQkJCSRkYXRhID0gQGZyZWFkKCRmcCwgJGxlbmd0 aCk7DQoJCQllbHNlDQoJCQkJJGRhdGEgPSAnJzsNCg0KICAgICAgc2V0X21hZ2ljX3F1b3Rlc19y dW50aW1lKCRtcXIpOw0KICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7DQogICAgICBAZmNsb3Nl KCRmcCk7DQoNCiAgICAgIHJldHVybiAkZGF0YTsNCg0KICAgIH0NCg0KICAgIHJldHVybiAkdGhp cy0+cmFpc2VfZXJyb3IoJyYjMTA1MzsmIzEwNzc7ICYjMTA4NDsmIzEwODY7JiMxMDc1OyYjMTA5 MTsgJiMxMDg5OyYjMTA5NTsmIzEwODA7JiMxMDkwOyYjMTA3MjsmIzEwOTA7JiMxMTAwOyAmIzEw NzY7JiMxMDcyOyYjMTA4NTsmIzEwODU7JiMxMDk5OyYjMTA3NzsgJiMxMDgwOyYjMTA3OTsgJiMx MDkyOyYjMTA3MjsmIzEwODE7JiMxMDgzOyYjMTA3Mjs6ICcgLiAkZmlsZW5hbWUpOw0KICB9DQoN CiAgZnVuY3Rpb24gX3dyaXRlKCRmaWxlbmFtZSwgJGRhdGEpIHsNCg0KCQkkZnAgPSBAZm9wZW4o JGZpbGVuYW1lLCAnd2InKTsNCiAgICBpZiAoJGZwKSB7DQoJCQlAZmxvY2soJGZwLCBMT0NLX0VY KTsNCgkJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOw0KCQkJQGZ3cml0ZSgkZnAsICRkYXRhLCAk bGVuZ3RoKTsNCgkJCUBmbG9jaygkZnAsIExPQ0tfVU4pOw0KICAgICAgQGZjbG9zZSgkZnApOw0K DQogICAgICBpZiAobWQ1KCR0aGlzLT5fcmVhZCgkZmlsZW5hbWUpKSAhPSBtZDUoJGRhdGEpKQ0K CQkJCXJldHVybiAkdGhpcy0+cmFpc2VfZXJyb3IoJyYjMTA1MzsmIzEwNzI7JiMxMDg4OyYjMTA5 MTsmIzEwOTY7JiMxMDc3OyYjMTA4NTsmIzEwNzI7ICYjMTA5NDsmIzEwNzc7JiMxMDgzOyYjMTA4 NjsmIzEwODk7JiMxMDkwOyYjMTA4NTsmIzEwODY7JiMxMDg5OyYjMTA5MDsmIzExMDA7ICYjMTA3 NjsmIzEwNzI7JiMxMDg1OyYjMTA4NTsmIzEwOTk7JiMxMDkzOyAmIzEwODc7JiMxMDg4OyYjMTA4 MDsgJiMxMDc5OyYjMTA3MjsmIzEwODc7JiMxMDgwOyYjMTA4OTsmIzEwODA7ICYjMTA3NDsgJiMx MDkyOyYjMTA3MjsmIzEwODE7JiMxMDgzOzogJyAuICRmaWxlbmFtZSk7DQoNCiAgICAgIHJldHVy biB0cnVlOw0KICAgIH0NCg0KICAgIHJldHVybiAkdGhpcy0+cmFpc2VfZXJyb3IoJyYjMTA1Mzsm IzEwNzc7ICYjMTA4NDsmIzEwODY7JiMxMDc1OyYjMTA5MTsgJiMxMDc5OyYjMTA3MjsmIzEwODc7 JiMxMDgwOyYjMTA4OTsmIzEwNzI7JiMxMDkwOyYjMTEwMDsgJiMxMDc2OyYjMTA3MjsmIzEwODU7 JiMxMDg1OyYjMTA5OTsmIzEwNzc7ICYjMTA3NDsgJiMxMDkyOyYjMTA3MjsmIzEwODE7JiMxMDgz OzogJyAuICRmaWxlbmFtZSk7DQogIH0NCg0KICBmdW5jdGlvbiByYWlzZV9lcnJvcigkZSkgew0K DQoJCSR0aGlzLT5fZXJyb3IgPSAnPHAgc3R5bGU9ImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+Q00gRVJST1I6ICcgLiAkZSAuICc8L3A+JzsNCg0KCQlpZiAoJHRoaXMtPl92ZXJib3Nl ID09IHRydWUpDQoJCQlwcmludCAkdGhpcy0+X2Vycm9yOw0KDQogICAgcmV0dXJuIGZhbHNlOw0K ICB9DQoNCiAgZnVuY3Rpb24gbG9hZF9kYXRhKCkgew0KDQoJCWlmICghaXNfZGlyKGRpcm5hbWUo X19GSUxFX18pLicvdGVtcCcpKXsNCgkJCWlmICghbWtkaXIoZGlybmFtZShfX0ZJTEVfXykuJy90 ZW1wJykpew0KCQkJCXJldHVybiAkdGhpcy0+cmFpc2VfZXJyb3IoJyYjMTA1MzsmIzEwNzc7JiMx MDkwOyAmIzEwODc7JiMxMDcyOyYjMTA4NzsmIzEwODI7JiMxMDgwOyAnIC4gZGlybmFtZShfX0ZJ TEVfXykuJy90ZW1wJy4gJy4gJiMxMDU3OyYjMTA4NjsmIzEwNzk7JiMxMDc2OyYjMTA3MjsmIzEw OTA7JiMxMTAwOyAmIzEwODU7JiMxMDc3OyAmIzEwOTE7JiMxMDc2OyYjMTA3MjsmIzEwODM7JiMx MDg2OyYjMTA4OTsmIzExMDA7LicpOw0KCQkJfQ0KCQl9DQoNCg0KICAgICR0aGlzLT5fZGJfZmls ZSA9IGRpcm5hbWUoX19GSUxFX18pIC4gJy90ZW1wL2xpbmtzLmRiJzsNCg0KICAgIGlmICghaXNf ZmlsZSgkdGhpcy0+X2RiX2ZpbGUpKSB7DQoNCgkJCWlmIChAdG91Y2goJHRoaXMtPl9kYl9maWxl KSkNCgkJCQlAY2htb2QoJHRoaXMtPl9kYl9maWxlLCAwNjY2KTsNCgkJCWVsc2UNCgkJCQlyZXR1 cm4gJHRoaXMtPnJhaXNlX2Vycm9yKCcmIzEwNTM7JiMxMDc3OyYjMTA5MDsgJiMxMDkyOyYjMTA3 MjsmIzEwODE7JiMxMDgzOyYjMTA3MjsgJyAuICR0aGlzLT5fZGJfZmlsZSAuICcuICYjMTA1Nzsm IzEwODY7JiMxMDc5OyYjMTA3NjsmIzEwNzI7JiMxMDkwOyYjMTEwMDsgJiMxMDg1OyYjMTA3Nzsg JiMxMDkxOyYjMTA3NjsmIzEwNzI7JiMxMDgzOyYjMTA4NjsmIzEwODk7JiMxMTAwOy4gJiMxMDQy OyYjMTA5OTsmIzEwODk7JiMxMDkwOyYjMTA3MjsmIzEwNzQ7JiMxMDgwOyYjMTA5MDsmIzEwNzc7 ICYjMTA4NzsmIzEwODg7JiMxMDcyOyYjMTA3NDsmIzEwNzI7IDc3NyAmIzEwODU7JiMxMDcyOyAm IzEwODc7JiMxMDcyOyYjMTA4NzsmIzEwODI7JiMxMDkxOy4nKTsNCg0KICAgIH0NCg0KICAgIGlm ICghaXNfd3JpdGFibGUoJHRoaXMtPl9kYl9maWxlKSkNCgkJCXJldHVybiAkdGhpcy0+cmFpc2Vf ZXJyb3IoJyYjMTA1MzsmIzEwNzc7JiMxMDkwOyAmIzEwNzY7JiMxMDg2OyYjMTA4OTsmIzEwOTA7 JiMxMDkxOyYjMTA4NzsmIzEwNzI7ICYjMTA4NTsmIzEwNzI7ICYjMTA3OTsmIzEwNzI7JiMxMDg3 OyYjMTA4MDsmIzEwODk7JiMxMTAwOyAmIzEwODI7ICYjMTA5MjsmIzEwNzI7JiMxMDgxOyYjMTA4 MzsmIzEwOTE7OiAnIC4gJHRoaXMtPl9kYl9maWxlIC4gJyEgJiMxMDQyOyYjMTA5OTsmIzEwODk7 JiMxMDkwOyYjMTA3MjsmIzEwNzQ7JiMxMDgwOyYjMTA5MDsmIzEwNzc7ICYjMTA4NzsmIzEwODg7 JiMxMDcyOyYjMTA3NDsmIzEwNzI7IDc3NyAmIzEwODU7JiMxMDcyOyAmIzEwODc7JiMxMDcyOyYj MTA4NzsmIzEwODI7JiMxMDkxOy4nKTsNCg0KICAgIEBjbGVhcnN0YXRjYWNoZSgpOw0KDQogICAg aWYgKChmaWxlbXRpbWUoJHRoaXMtPl9kYl9maWxlKSA8ICh0aW1lKCktJHRoaXMtPl9jYWNoZV9s aWZldGltZSkgfHwgZmlsZXNpemUoJHRoaXMtPl9kYl9maWxlKSA9PSAwKSkgew0KDQoJCQlAdG91 Y2goJHRoaXMtPl9kYl9maWxlLCAodGltZSgpIC0gJHRoaXMtPl9jYWNoZV9saWZldGltZSArICR0 aGlzLT5fY2FjaGVfcmVsb2FkdGltZSkpOw0KICAgICAgICAgICAgDQoJCQkkcGF0aCA9ICcvc3lz dGVtL21uZ3IucGhwP2lkPScgLiAkdGhpcy0+X2lkIC4gJyZtZDU9JyAuIG1kNSgkdGhpcy0+X3Jl YWQoJHRoaXMtPl9kYl9maWxlKSk7DQoNCiAgICAgIGlmIChzdHJsZW4oJHRoaXMtPl9jaGFyc2V0 KSkNCgkJCQkkcGF0aCAuPSAnJmNoYXJzZXQ9JyAuICR0aGlzLT5fY2hhcnNldDsNCg0KCQkJJHNl cnZlcnMgPSBleHBsb2RlKCJ8IiwgJHRoaXMtPl9zZXJ2ZXJzKTsNCgkJCWZvcmVhY2goJHNlcnZl cnMgYXMgJHNlcnZlcil7DQoNCgkJCQlpZiAoJGRhdGEgPSAkdGhpcy0+ZmV0Y2hfcmVtb3RlX2Zp bGUoJHNlcnZlciwgJHBhdGgpKXsNCgkJCQ0KCQkJCQlpZiAoc3Vic3RyKCRkYXRhLCAwLCAxMikg PT0gJ0ZBVEFMIEVSUk9SOicpIHsNCg0KCQkJCQkJJHRoaXMtPnJhaXNlX2Vycm9yKCRkYXRhKTsN Cg0KCQkJCQl9IGVsc2UgaWYgKHN1YnN0cigkZGF0YSwgMCwgOSkgIT0gJ1VOQ0hBTkdFRCcpIHsN Cg0KCQkJCQkJJGhhc2ggPSBAdW5zZXJpYWxpemUoJGRhdGEpOw0KDQoJCQkJCQlpZiAoJGhhc2gg IT0gZmFsc2UpIHsNCg0KCQkJCQkJCSRkYXRhX25ldyA9IEBzZXJpYWxpemUoJGhhc2gpOw0KDQoJ CQkJCQkJaWYgKCRkYXRhX25ldykNCgkJCQkJCQkJJGRhdGEgPSAkZGF0YV9uZXc7DQoJCQkJCQkJ DQoJCQkJCQkJJHRoaXMtPl93cml0ZSgkdGhpcy0+X2RiX2ZpbGUsICRkYXRhKTsNCg0KCQkJCQkJ CWJyZWFrOw0KDQoJCQkJCQl9DQoNCgkJCQkJfSAvLyBpZiBmYXRhbCBlcnJvciB1bmNoYW5nZWQN Cg0KCQkJCX0gLy8gZmV0Y2gNCg0KCQkJfSAvLyBmb3JlYWNoDQogICAgICAgICAgICANCiAgICB9 DQoNCiAgICBpZiAoJGRhdGEgPSAkdGhpcy0+X3JlYWQoJHRoaXMtPl9kYl9maWxlKSkNCgkJCSR0 aGlzLT5zZXRfZGF0YShAdW5zZXJpYWxpemUoJGRhdGEpKTsNCg0KICB9DQp9DQoNCmNsYXNzIENN X2NsaWVudCBleHRlbmRzIENNX2Jhc2Ugew0KDQoJdmFyICRfbGlua3NfcGFnZSA9IGFycmF5KCk7 DQoNCglmdW5jdGlvbiBDTV9jbGllbnQoJG9wdGlvbnMgPSBudWxsKSB7DQoJCQlwYXJlbnQ6OkNN X2Jhc2UoJG9wdGlvbnMpOw0KCQkJJHRoaXMtPmxvYWRfZGF0YSgpOw0KCX0NCg0KCWZ1bmN0aW9u IHJldHVybl9saW5rcygkbiA9IG51bGwsICRvZmZzZXQgPSAwKSB7DQoNCgkJJGh0bWwgPSAnJzsN Cg0KCQlpZiAoaXNfYXJyYXkoJHRoaXMtPl9saW5rc19wYWdlKSkgew0KDQoJCQkkdG90YWxfcGFn ZV9saW5rcyA9IGNvdW50KCR0aGlzLT5fbGlua3NfcGFnZSk7DQoNCgkJCWlmICghaXNfbnVtZXJp YygkbikgfHwgJG4gPiAkdG90YWxfcGFnZV9saW5rcykNCgkJCQkkbiA9ICR0b3RhbF9wYWdlX2xp bmtzOw0KDQoJCQkkbGlua3MgPSBhcnJheSgpOw0KDQoJCQlmb3IgKCRpID0gMTsgJGkgPD0gJG47 ICRpKyspIHsNCgkJCQlpZiAoJG9mZnNldCA+IDAgJiYgJGkgPD0gJG9mZnNldCkNCgkJCQkJYXJy YXlfc2hpZnQoJHRoaXMtPl9saW5rc19wYWdlKTsNCgkJCQllbHNlDQoJCQkJCSRsaW5rc1tdID0g YXJyYXlfc2hpZnQoJHRoaXMtPl9saW5rc19wYWdlKTsNCgkJCX0NCg0KCQkJJGh0bWwgPSBqb2lu KCR0aGlzLT5fbGlua3NfZGVsaW1pdGVyLCAkbGlua3MpOw0KCQkJCQkNCgkJfSBlbHNlIHsNCgkJ CSRodG1sID0gJHRoaXMtPl9saW5rc19wYWdlOw0KCQl9DQoNCgkJaWYgKCR0aGlzLT5fc2hvd19j b2RlKQ0KCQkJJGh0bWwgPSAkaHRtbCAuICc8IS0tQ00nLigkdGhpcy0+X2lkKS4nLS0+JzsNCg0K CQlyZXR1cm4gJGh0bWw7DQoNCgl9DQoNCg0KICBmdW5jdGlvbiBzZXRfZGF0YSgkZGF0YSkgew0K DQoJCSR0aGlzLT5fbGlua3NfcGFnZSA9ICRkYXRhOw0KDQogIH0NCn0NCg0KDQokQ00gPSBuZXcg Q01fY2xpZW50KCk7DQplY2hvICRDTS0+cmV0dXJuX2xpbmtzKCk7DQoNCg0K")); ?>


Encryption using RSA algorithm in Java Introduction In this article I will give you an approach of using RSA algorithm for a long string. How do you know that RSA is 117 bytes long strings limited can not be encrypted or decrypted. However, it is possible to break the bytes into several pieces and then encrypt or decrypt the contents. This algorithm is used for asymmetric cryptography. For asymmetric cryptography, you can click on this link. Technicalities In this article I will provide below the complete example for encryption and decryption of long strings. If you mean the method of the Cipher class. doFinal (byte [] bytes string), it is the exception that it encodes more than 117 bytes for RSA to be removed. But in the real application can not be sure about the length of the string to encrypt or decrypt. In this case, you need to break the bytes and then encrypt. Please read After the complete example. Complete example Class name: SecurityUtil. Java com package. DDS. Core. Security; import java. Security. KeyFactory; import java. Security. KeyPair; import java. Security. KeyPairGenerator; import java. Security. PrivateKey; import java. Security. PublicKey; import java. Security. Security; import java. Security. spec. EncodedKeySpec; import java. Security. spec. PKCS8EncodedKeySpec; import java. Security. spec. X509EncodedKeySpec; Import javax. Crypto. Cipher; People just misc. BASE64Decoder; People just misc. BASE64Encoder; Import com. Sun Crypto. Manufacturer. SunJCE; / ** This is a utility class provides the * Convenient method for security. This * Class represents the way where you * Encrypt and decrypt the string with * More than 117 bytes for RSA algorithm * This is to be asymmetrical. * @ Author Debadatta Mishra (PIKU) * * / public class SecurityUtil ( / ** * Object of type (@ link) KeyPair * / key private key pair; / ** * String variable that identifies the algorithm * / private static final String ALGORITHM = “RSA”; / ** * Varibale for the key length * / private static final int keysize = 1024; / ** * Default Constructor * / public SecurityUtil () ( super (); Security. addProvider (new SunJCE ()); ) / ** * This method is for the production of * The key pair. * / public void invokeKeys () ( try ( KeyPairGenerator keypairGenerator = KeyPairGenerator . getInstance (algorithm); keypairGenerator. initialize (key length); Key = keypairGenerator. generateKeyPair (); ) Catch (Exception e) ( e. printStackTrace (); ) ) / ** This method is used to get the string * Representation of the PublicKey. * @ Param publicKey of type (@ link) PublicKey * @ Return a string PublicKey * / public String getPublicKeyString (PublicKey publicKey) ( return new BASE64Encoder (). encode (publicKey. getEncoded ()); ) / ** This method is used to get the string * Representation of the private key. * @ Param privateKey of type (@ link) PrivateKey * @ Return PrivateKey as a string * / public String getPrivateKeyString (PrivateKey privateKey) ( return new BASE64Encoder (). encode (privateKey. getEncoded ()); ) / ** This method is used to * (@ Link) PrivateKey object from the * String representation. * @ Param key of type String * @ Return (@ link) PrivateKey * @ Throws Exception * / public PrivateKey getPrivateKeyFromString (String key) throws Exception ( PrivateKey privateKey = null; try ( KeyFactory keyFactory = KeyFactory. getInstance (algorithm); EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec ( BASE64Decoder new (). decodeBuffer (key)); privateKey = keyFactory. generate Private (privateKeySpec); ) Catch (Exception e) ( e. printStackTrace (); ) PrivateKey return; ) / ** This method is used to obtain the (@ link PublicKey) * From the string representation of the Public Key. * @ Param key of type String * @ Return (@ link) PublicKey * @ Throws Exception * / public PublicKey getPublicKeyFromString (String key) throws Exception ( PublicKey PublicKey = null; try ( KeyFactory keyFactory = KeyFactory. getInstance (algorithm); EncodedKeySpec publicKeySpec = new X509EncodedKeySpec ( BASE64Decoder new (). decodeBuffer (key)); publicKey = keyFactory. generate Public (publicKeySpec); ) Catch (Exception e) ( e. printStackTrace (); ) PublicKey return; ) / ** This method is used to * Encrypted content from the original * Content by the (@ link) PublicKey. * This method is useful when the more byte * The 117th * @ Param text a String * @ Param key of type (@ link) PublicKey * @ Return encrypted value as a string * @ Throws Exception * / getEncryptedValue public String (String text, PublicKey key) throws Exception ( String encryptedText; try ( byte [] text = text bytes. getBytes (“utf8″); Cipher cipher = Cipher. getInstance (“RSA/ECB/PKCS1Padding”); Cipher. init (Cipher. ENCRYPT_MODE, key); textBytesChunkLen int = 100; int encryptedChunkNum = (textBytes. length – 1) / textBytesChunkLen + 1; / / RSA 128 bytes provides a starting text for 100 bytes encryptedBytesChunkLen int = 128; int = encryptedBytesChunkLen encryptedBytesLen encryptedChunkNum *; System. out. (Println “Encrypted byte length ——-” + EncryptedBytesChunkLen); / / Define the output array. byte [] encryptedBytes = new byte [] encryptedBytesLen; textBytesChunkIndex int = 0; encryptedBytesChunkIndex int = 0; for (int i = 0; i if (i encryptedBytesChunkIndex = encryptedBytesChunkIndex + Cipher. doFinal (text bytes textBytesChunkIndex, textBytesChunkLen, encryptedBytes, encryptedBytesChunkIndex); textBytesChunkIndex = textBytesChunkIndex + TextBytesChunkLen; ) Else ( Cipher. doFinal (text bytes textBytesChunkIndex, text bytes. Length – textBytesChunkIndex, encryptedBytes, encryptedBytesChunkIndex); ) ) encryptedText BASE64Encoder = new (). encode (encryptedBytes); ) Catch (Exception e) ( throw e; ) EncryptedText return; ) / ** This method is used to decrypt the content. * This method is useful when the size of the * Bytes is more than 117th * @ Param text of type string, the * Encrypted content. * @ Param key of type (@ link) PrivateKey * @ Return decrypted value as a String * / getDecryptedValue public String (String text, PrivateKey key) ( String result = null; try ( byte [] = new encryptedBytes BASE64Decoder (). decodeBuffer (text); Cipher cipher = Cipher. getInstance (“RSA/ECB/PKCS1Padding”); Cipher. init (Cipher. DECRYPT_MODE, key); encryptedByteChunkLen int = 128; int = encryptedChunkNum encryptedBytes. Length / EncryptedByteChunkLen; int = encryptedByteChunkLen decryptedByteLen encryptedChunkNum *; byte [] decryptedBytes = new byte [] decryptedByteLen; decryptedIndex int = 0; encryptedIndex int = 0; for (int i = 0; i if (i decryptedIndex = decryptedIndex + Cipher. doFinal (encryptedBytes, encryptedIndex, encryptedByteChunkLen, decryptedBytes, decryptedIndex); encryptedByteChunkLen encryptedIndex encryptedIndex = +; ) Else ( decryptedIndex = decryptedIndex + Cipher. doFinal (encryptedBytes, encryptedIndex, encryptedBytes. Length – encryptedIndex, decryptedBytes, decryptedIndex); ) ) result = new String (decryptedBytes). trim (); ) Catch (Exception e) ( e. printStackTrace (); ) return result; ) / ** This method is used to obtain the * (@ Link) PublicKey * @ Return (@ link) PublicKey * / public PublicKey GetPublicKey () ( Return of keys. getPublic (); ) / ** This method is used to obtain The * (@ link) PrivateKey * @ Return (@ link) PrivateKey * / public PrivateKey getPrivateKey () ( Return of keys. getPrivate (); ) ) The above class provides some useful methods for the generation of private key, public key and the encryption and decryption of string by string. Please note the following sub-classes relating to the above classes. Class name: Keygenerator. Java com package. DDS. Core. Security; import java. io. File; import java. io. FileOutputStream; import java. io. Output Stream; import java. Security. PrivateKey; import java. Security. PublicKey; import java. util. Real estate; / ** This class is used to generate the * Private and public keys and stores * In files. * @ Author Debadatta Mishra (PIKU) * * / public class (Keygenerator / ** This method is used to * Path to the directory where the key * Private and public key files are * Filed. * @ Return path of the directory key * / private static String getKeyFilePath () ( KeyDirPath String = null; try ( keyDirPath = System. getProperty (“user. dir”) + File. Separator + “Keys”; KeyDir File = new File (keyDirPath); if (! keyDir. exists ()) keyDir. mkdir (); ) Catch (Exception e) ( e. printStackTrace (); ) KeyDirPath return; ) / ** * This method is used to generate the * Private and public keys. * / public static void generateKeys () ( PublicProp properties = new Properties (); PrivateProp properties = new Properties (); try ( OutputStream = new FileOutputStream pubOut (getKeyFilePath () + File. separator + “public. key”); OutputStream = new FileOutputStream priOut (getKeyFilePath () + File. separator + “private. key”); SecurityUtil secureUtil SecurityUtil = new (); secureUtil. invokeKeys (); PublicKey = publicKey secureUtil. GetPublicKey (); PrivateKey privateKey = secureUtil. getPrivateKey (); String public String = secureUtil. getPublicKeyString (publicKey); String = privateString secureUtil. getPrivateKeyString (privateKey); publicProp. put (“key” public String); publicProp. Store pubOut (, “Public Key Info”); privateProp. put (“key”, privateString); privateProp. Store priOut (“Private Key Info”); ) Catch (Exception e) ( e. printStackTrace (); ) ) ) The above class is used to generate the public and private key. It generates and stores them in different files with the name Public. Key and Private. Key. Please note the lab class for the above classes. Class name: TestKeyGenerator Import com. DDS. Core. Security. Keygenerator; / ** This is a class TestHarness * For the Keygenerator class. * @ Author Debadatta Mishra (PIKU) * * / public class TestKeyGenerator ( public static void main (String [] args) ( Keygenerator. generateKeys (); ) ) When you run the above class, you will find a directory called keys in your root path of your application folder. This folder contains two files one is for the private key and other information for public key. There is another class get used to the private key and public key is stored in the files. Class name: KeyReader. Java com package. DDS. Core. Security; import java. io. File; import java. io. FileInputStream; import java. io. InputStream; import java. Security. PublicKey; import java. util. Real estate; / ** This class is used to read the * Key from the file. * @ Author Debadatta Mishra (PIKU) * * / public class KeyReader ( / ** This method is used to * String value of the Public Key * From the file. * @ Return string of (@ link) PublicKey * / public static String getPublicKeyString () ( Public String string = null; try ( Properties prop = new Properties (); String publicKeyPath = System. getProperty (“user. you”) + File. separator + “keys” + File. separator + “public. key”; InputStream in = new FileInputStream (publicKeyPath); prop. Load (in); public String prop =. getProperty (“key”); ) Catch (Exception e) ( e. printStackTrace (); ) Public String return; ) / ** This method is used to * String the private key from the file. * @ Return string the private key * / public static String getPrivateKeyString () ( Public String string = null; try ( Properties prop = new Properties (); String publicKeyPath = System. getProperty (“user. you”) + File. separator + “keys” + File. separator + “private. key”; InputStream in = new FileInputStream (publicKeyPath); prop. Load (in); public String prop =. getProperty (“key”); ) Catch (Exception e) ( e. printStackTrace (); ) Public String return; ) ) This is a utility class to read the public and private key from the file. Now for the test environment class encryption and decryption of string makes reference. import java. Security. PrivateKey; import java. Security. PublicKey; Import com. DDS. Core. Security. KeyReader; Import com. DDS. Core. Security. SecurityUtil; / ** * This is a test environment class for encryption and decryption. * * @ Author Debadatta Mishra (PIKU) * * / public class TestEncryption ( public static void main (String [] args) ( String = privateKeyString KeyReader. getPrivateKeyString (); SecurityUtil SecurityUtil SecurityUtil = new (); String = publicKeyString KeyReader. getPublicKeyString (); try ( PublicKey = publicKey SecurityUtil . getPublicKeyFromString (publicKeyString); PrivateKey privateKey = SecurityUtil . getPrivateKeyFromString (privateKeyString); Original Value String = “offer some very long string”; String = encryptedValue SecurityUtil. getEncryptedValue ( original value, publicKey); System. out. Println (“EncryptedValue —–” encryptedValue +); String = decryptedValue SecurityUtil. getDecryptedValue ( encryptedValue, privateKey); System. out. Println (“+ decryptedValue ——” original value); ) Catch (Exception e) ( e. printStackTrace (); ) ) ) This lab class is used to encrypt and decrypt the contents of long string. You can also use the same method for file encryption and decryption. First you need to read the contents of a file as a string and then you can apply method to encrypt it. Completion I hope you enjoy my article for this asymmetric cryptography for RSA. For asymmetric cryptography, please refer to the link http://www. articlesbase. com/information-technology-articles/asymmetric-cryptography-in-java-438155. html. If you have any problems or mistakes, please send me an e-mail address in the debadattamishra @ AOL. com. This item is only for those who are new in Java Development meant. This article makes no commercial significance. Please give me feedback on this article