From bfb721a1b391ecc30ee75640f37f98f73324979a Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Tue, 26 Mar 2024 10:22:48 -0300 Subject: [PATCH] feat: Sign setup Make possible sign downloaded files to be possible delete compated files after install. Signed-off-by: Vitor Mattos --- appinfo/info.xml | 1 + appinfo/install-signature.json | 282 ++++++++++++++++++++++++++++ lib/Command/Developer/SignSetup.php | 96 ++++++++++ lib/Service/Install/SignFiles.php | 203 ++++++++++++++++++++ 4 files changed, 582 insertions(+) create mode 100644 appinfo/install-signature.json create mode 100644 lib/Command/Developer/SignSetup.php create mode 100644 lib/Service/Install/SignFiles.php diff --git a/appinfo/info.xml b/appinfo/info.xml index 30c55d769b..ed058447a7 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -34,6 +34,7 @@ OCA\Libresign\Command\Configure\Cfssl OCA\Libresign\Command\Configure\OpenSsl OCA\Libresign\Command\Developer\Reset + OCA\Libresign\Command\Developer\SignSetup OCA\Libresign\Command\Install OCA\Libresign\Command\Uninstall diff --git a/appinfo/install-signature.json b/appinfo/install-signature.json new file mode 100644 index 0000000000..10d4b56a59 --- /dev/null +++ b/appinfo/install-signature.json @@ -0,0 +1,282 @@ +{ + "hashes": { + "checksums_java_21.0.2_13.txt": "7110bab6ee73702be77ee966b3a1ec13812d012fa981e68e189d0f126a10acee7a86ecadd584dcf091c6f0f76ca4a97d5a331e7307b1e49da7f70165cb8923b5", + "java\/OpenJDK21U-jre_x64_linux_hotspot_21.0.2_13.tar.gz": "3dc4f78e235aed4be20b5f20bdcdef48bbc1ca18fff08d109e055945503ae32c86cdfb3bdb95196bc3ab55b336011e6f55503c55b940b1e4362cadb978d6c02a", + "java\/jdk-21.0.2+13-jre\/NOTICE": "e0c38f15ba79febedf49941bb772b99e12d8da3748e60891f3bd02ff157691b545f9a5c910197ab08b61a93c62616d98206391b2200fa4294047f35c883ac08f", + "java\/jdk-21.0.2+13-jre\/bin\/java": "02c868f7a62fba5e56ad29e5f99e4d4e8cabdeea9be72fcf7025b838d108311ccd2df08404d43b1983042e7a80d31f69d7550d507e1539ff873072be4e56bca5", + "java\/jdk-21.0.2+13-jre\/bin\/jfr": "546a00d8bbea4640f615f87ef702ac752e84e0c26d507f2b47ef68e39c46fffd82876c40e9ee9cba98495d947c189fb1e85ea21f9aac4463a02330d7f777d69c", + "java\/jdk-21.0.2+13-jre\/bin\/jrunscript": "830e426ad5b6cc3ed046d160f653e31a93497ca500c64922596e3ad1678a96912b788b9f074f9b5d4e501d32710e9b05bc5e8450148433a375016f2526595bf1", + "java\/jdk-21.0.2+13-jre\/bin\/jwebserver": "a02726a89255c301c4035cc91f2511089b56a9034244d69e5610068e5c2cb243b1bd1ec933f4f7ddda49903eabbf9f5d776e2f12c3b66a494c4399f30a4d0c3d", + "java\/jdk-21.0.2+13-jre\/bin\/keytool": "76a6ce792c3ac07163ab80e3bcc73eb01e457a47cc4fe25321c2115ce72dd634ae108a0b44133fd6de1b2934ac9d4537cd3496b91d1937cf6c8748b59ba4e1c2", + "java\/jdk-21.0.2+13-jre\/bin\/rmiregistry": "64263c3eb1e0f75adb5d3f12b56bff4e5aebcb44d674f23564bd0c796dd591c4bf5fc2b58f6c829f197fcd346abd684f8caed6b30962aa3095651c52935bfedc", + "java\/jdk-21.0.2+13-jre\/conf\/jaxp.properties": "37163a66138973c586c4d59394a1b7f2ed82c9c76a82ed0354fc3a0c96f52abb5d7f8bb3141a747953a4984b62b7efe8f2a3c40b7339ebd81d4a59413403a3a0", + "java\/jdk-21.0.2+13-jre\/conf\/logging.properties": "e869f4a3b821a9933796dc9a56ee00483493369dfbfe07b3b1d895cb8318c6821cd44134eb37513f15b830c25861b596646824ed56672d08b678fefe6a4c7504", + "java\/jdk-21.0.2+13-jre\/conf\/management\/jmxremote.access": "64d33add796d2d3df7ad37aa452ee1d106174be1ade3063d73ba416211629a9a9b05177969404fdc92fcee8458450c9de4a6195744b93131303208cb6f1416ad", + "java\/jdk-21.0.2+13-jre\/conf\/management\/jmxremote.password.template": "e6794168ba80a8ff733d8c1771930ae8c8fc33030e5e9ca02700f326c88a2f68ff09bc734bfd1e492ef15705b288c7918ce1f3f7174742dee6a62dfe086abd65", + "java\/jdk-21.0.2+13-jre\/conf\/management\/management.properties": "4fae4e2b5f7122cd80c03b3d04fca5c4b9586be6c712dfdb729f5e85d6e71a86addfdb975be4ee7e250e28643222687f834a6456054e38331bd978aba79dae71", + "java\/jdk-21.0.2+13-jre\/conf\/net.properties": "397d39f852fe94e6b384f3924e7676c252ab7ceaab2b0ebb8bc4e6244f487830c786ba327ac4ec6dadbcb31be78ebeff0d3c0fde2b02b0f1963e924fe399afba", + "java\/jdk-21.0.2+13-jre\/conf\/sdp\/sdp.conf.template": "645e30897684300d163086eea1477e5262b1fe05adc0053b26cd07898f3de6c147285acfd0fac9007022692d93b347ac321fa054ab7464b07c32f86b8c2419b1", + "java\/jdk-21.0.2+13-jre\/conf\/security\/java.policy": "d2b6ea94bc3becc531926239a77c9995c543bf48232484fa0036c4e09e42ab7ee5facc10e0eed64556950980ffc9c8e56c556f34e74985c09f2384216ca461ab", + "java\/jdk-21.0.2+13-jre\/conf\/security\/java.security": "695cd8a173dac2d92bbe723082f4940b9ba920f8be7220f4abb06ee84c3fd664ed6ba5e9ad93cdffd804c78dac68dfb3a999da17f4dae9499b74304de565476b", + "java\/jdk-21.0.2+13-jre\/conf\/security\/policy\/README.txt": "68a031264cf9442526307364ca74b336af55564c233c2f514cac48e910022767562f8ff6a64bb9cfcbf0fb5e755289273382c9246418a4b9207fc7761d03c64e", + "java\/jdk-21.0.2+13-jre\/conf\/security\/policy\/limited\/default_US_export.policy": "4cfca5b10cd7addcff887c8f3621d2fbec1b5632436326377b0ce5af1ae3e8b68ac5a743ca6082fc79991b8eec703a6e1dfd5b896153407ad72327753222fdb3", + "java\/jdk-21.0.2+13-jre\/conf\/security\/policy\/limited\/default_local.policy": "a0b98cbbb49184df973bb2c4a506e9bc6e025a696bc0c8054a6352cc3f9b4a38e3baf117c6834ddaddc38498556607ed4eda8f1bc683f662d61da50e0db0c8c2", + "java\/jdk-21.0.2+13-jre\/conf\/security\/policy\/limited\/exempt_local.policy": "2bd70518aed6b0e01c520c446830c5f567fa72974548818cac3e1e5c2be6f03db78ce6012f5463b1e19c36243d04cbaad38ec79524635eaae2e427eb1875ccdb", + "java\/jdk-21.0.2+13-jre\/conf\/security\/policy\/unlimited\/default_US_export.policy": "4cfca5b10cd7addcff887c8f3621d2fbec1b5632436326377b0ce5af1ae3e8b68ac5a743ca6082fc79991b8eec703a6e1dfd5b896153407ad72327753222fdb3", + "java\/jdk-21.0.2+13-jre\/conf\/security\/policy\/unlimited\/default_local.policy": "2b0385417a3fc2af58b1cbb186dd3e0b0875e42923884153deee0efcb390ca00b326ed5b266b3892d31bf7d40e10969a0b51daa6d0b4ca3183770786925d3cde", + "java\/jdk-21.0.2+13-jre\/conf\/sound.properties": "99fdd75b8ce71622f85f957ae52b85e6646763f7864b670e993df0c2c77363ef9cfce2727badee03503cda41abe6eb8a278142766bf66f00b4eb39d0d4fc4a87", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/aes.md": "4d14b5ddbb4d09797264ed29ba71fab6986b4a9e75efb9402c1476e0a9e2884813d6a922dea125643b4f74e1f3e458f4e48d6c840e0f4d16ed72ffbc4611dbb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/asm.md": "2fcf1da50a53858e5e68db51996b59ebeb8f07b698f72b67a827d4fd302f757c5c0d0479b37128d239268b635b20177a27557c1dba920fa9f12f1bec2b7f6d40", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/c-libutl.md": "ae459d8ce5581ea57e203088373c1ce86d122d0e27eb871ee1383e0e64cd8a184fa207eee0e835347316e70afa24a1c95aec30def3e09d15ee19a0b2c3ad2095", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/cldr.md": "8ab32a80deb12dd1f3a54a38b3335a76feb44e20fcf5ee897d47511e0acedbbedf51a241768441c56259a54c7303ddf7b57be7693c5cddb30f90741ca3257190", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/icu.md": "0b31bcbdb578ac448dd145c0160c83e24ff4f1b48cada692d213e026155f5a44fc0e7b01444c5af0649e49ffd100421a890a6ed0c60722b15c4a4938a0c99b67", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/public_suffix.md": "cbd16c4c29a51669f51ff9817ed33e29b871df215fb252a946c3b4e80fc83d4f0e4e1b32d46c2998924092e4b14585666f748b598708773dc6d2432701d6f627", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/unicode.md": "06f8cd7233ab0e6d2db403765aa543f153b611fa6d1cdc571fa98dc8ff9a908c14034e31305b14c6f80ee8de5bb5e6e49dcd18c030d5b5772dc93153ea16fc19", + "java\/jdk-21.0.2+13-jre\/legal\/java.base\/zlib.md": "c516403a109630b79998f3bea6b698247a0b5367cc9873defa75014e8c98c690d34d0810d32792d80fde1333980ac6c5f19324743795cb6455ef0ee4979496bb", + "java\/jdk-21.0.2+13-jre\/legal\/java.compiler\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.compiler\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.compiler\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.datatransfer\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.datatransfer\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.datatransfer\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/colorimaging.md": "f5872960470810cdbdc2db1dfb216cab88203b23400b16e157c8654c2eecff8d9b26ce066ec18718c8e6d54ee1c54533fdade395c454210fed5159fd4a7a0adb", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/freetype.md": "67a686550414a6b878869b7280708d8a428cfbf803e1462929e65e6c6e1a265562149a2e23ac82488ae96f1e856d2f23470b5335021865fc499fbee520f0c079", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/giflib.md": "dafac31d75a7ab4ddd7666799a24abf22c1583ca22554a738cc26a77bf927b20dde52f12194670a5196bce3a43bd58de46944291727c8877fee1fe4a38a1f1ca", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/harfbuzz.md": "8fc9822bb15a0008055882976510258287cedc81de390cc01fe0869fc8a2c2d876241470c5bffb96cb5d4460544e893ac8077d6dcc8ec523e02050807b946adf", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/jpeg.md": "7e82da825499b1b4c5ddb09d17bdda584f52739b504786f8126df2fe914d97111189fb7829ebb5285d11cf2a18977f377e0d89a16c82d5e574a5b5b83aca1b3a", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/lcms.md": "a91faa243a09bdfe62714859b9b4420e8434dd09693a6a280e1c8ef6694fb7858d0171fae4ca36721b685e3ab8bc8000c5635bf3789250a5b9081130eb4ff57c", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/libpng.md": "6a35e221deb422ef690354d04183bd51ebda349c0ceb768d16f935cdfaac78cbc7fa5afc022b1b933abf52ea46d95b2cccf4976aaa0bf010647d96ec1d31b397", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/mesa3d.md": "9c4111728ab9472f0b160cb11ce1e4ebd75a83cfddca0b3cb87243d15afc5a7fa34dc6006e6b92084648cbad1426f70b405259f589cdef758442643e1618dff4", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/pipewire.md": "7eb9d8dfa8a2c8f234f5a545e890906b6f0ddb5088f0a5631a2f7515d5dbaa7a6e2563fd789db3de43be2503d97245cae5192f0f9a9992d71c8ce7f8fa32e34f", + "java\/jdk-21.0.2+13-jre\/legal\/java.desktop\/xwd.md": "42fc3783e35ca37525611767b7cfd5ae541ddace22af7102f36c1550d39f994c94e6c0b241153a2b9bae228f3944f7ad3400d6f9db384d104c452f6a07054aed", + "java\/jdk-21.0.2+13-jre\/legal\/java.instrument\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.instrument\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.instrument\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.logging\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.logging\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.logging\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.management.rmi\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.management.rmi\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.management.rmi\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.management\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.management\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.management\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.naming\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.naming\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.naming\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.net.http\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.net.http\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.net.http\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.prefs\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.prefs\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.prefs\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.rmi\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.rmi\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.rmi\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.scripting\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.scripting\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.scripting\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.se\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.se\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.se\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.security.jgss\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.security.jgss\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.security.jgss\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.security.sasl\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.security.sasl\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.security.sasl\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.smartcardio\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.smartcardio\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.smartcardio\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.smartcardio\/pcsclite.md": "19eb5494e32e1276d87153f06dbcfe513a3df5355ca7a7c576fdaf200aeb5698a92b4e113ca3191b22c742e66226cbdba9d1ae8c2a0d1bfa0f7206baf9bb5fc9", + "java\/jdk-21.0.2+13-jre\/legal\/java.sql.rowset\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.sql.rowset\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.sql.rowset\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.sql\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.sql\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.sql\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.transaction.xa\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.transaction.xa\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.transaction.xa\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml.crypto\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml.crypto\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml.crypto\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml.crypto\/santuario.md": "108bafd2f15cf3b46df2495c164fda196b2e72194e03368d18442abd8924bf920f2e1343329d54f83e77dedfd9143769543e2459a36b5610f85103cfe7fd5296", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/bcel.md": "25f2189643a113616f53cd87fc96df01b55602bfc3f6653e48c310de03f6d79ccbbec58936d54b88052e32d68c646017bf75b8a179f59fb9d2c5f6938e351a4d", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/dom.md": "8c71f226f0f07b471aea6b8e715434b5eaa6b4a59a653ec22c2489e743e9288a0c4537f479719f9d58737d0257470c9cceff9ce647a96e79fd757a4cdcfed499", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/jcup.md": "7ed3e58f189f2922f7543d4617308d0c35f8adc2e7cbbb6fbba49d33cdd5da64c6edc022ae9842c28e58d97b056a245245c816003978f1e0152236636ca72ba5", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/xalan.md": "db99644e83bf0d0f7573e520f5381b038810afd7de1a881d7d752273ec2584d9aca3eb1f3ae47f0402ec6a49116cb581019cbb9c82278f99c37bb7b01b09457e", + "java\/jdk-21.0.2+13-jre\/legal\/java.xml\/xerces.md": "26972bb1fe75ff78ed4afef538e389556ccca2d04af0c50bc6fd0d3dbfa2be6610d259b307cefe29dafb613fa3d324e7734e83873b16a61c90bf6e2514d92566", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.accessibility\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.accessibility\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.accessibility\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.charsets\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.charsets\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.charsets\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.cryptoki\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.cryptoki\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.cryptoki\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.cryptoki\/pkcs11cryptotoken.md": "2676cfdfd61762c7b6171985e8cfe1068c36683ca43753a1ffb10241ac61a74c9be1c00be22903df85ba6954fd908d77de60903c316506fd88b9679672ada968", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.cryptoki\/pkcs11wrapper.md": "759c75f87309b67c56a5b7088045e04be7c023ecdbaea80842e22b81b0bfb36026191070471f8b08fef47ec73664611ce0453b4a9818f7708c95663733ee5ce9", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.ec\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.ec\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.crypto.ec\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.dynalink\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.dynalink\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.dynalink\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.dynalink\/dynalink.md": "86ee77d8e129b78173964461cd27200aeab7fb6417fe0f4982d9b126ed2292216d08212be91b53eccb26dd6a8b3e1aab1d1dbab85c2133872ac0027dc87a8223", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.httpserver\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.httpserver\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.httpserver\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.incubator.vector\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.incubator.vector\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.incubator.vector\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.ci\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.ci\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.ci\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.compiler.management\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.compiler.management\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.compiler.management\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.compiler\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.compiler\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.internal.vm.compiler\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jdwp.agent\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jdwp.agent\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jdwp.agent\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jfr\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jfr\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jfr\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jsobject\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jsobject\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.jsobject\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.localedata\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.localedata\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.localedata\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.localedata\/cldr.md": "8ab32a80deb12dd1f3a54a38b3335a76feb44e20fcf5ee897d47511e0acedbbedf51a241768441c56259a54c7303ddf7b57be7693c5cddb30f90741ca3257190", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.localedata\/thaidict.md": "5221112cd8ef83b636dc4364f53b72c5484a5885acb55c2c071c88d23058093caee38578f7e424ecafdb483ccc0bc8e78d7ac13add536ec824a8eac171a576cb", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management.agent\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management.agent\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management.agent\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management.jfr\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management.jfr\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management.jfr\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.management\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.naming.dns\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.naming.dns\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.naming.dns\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.naming.rmi\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.naming.rmi\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.naming.rmi\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.net\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.net\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.net\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.nio.mapmode\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.nio.mapmode\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.nio.mapmode\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.sctp\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.sctp\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.sctp\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.security.auth\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.security.auth\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.security.auth\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.security.jgss\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.security.jgss\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.security.jgss\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.unsupported\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.unsupported\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.unsupported\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.xml.dom\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.xml.dom\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.xml.dom\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.zipfs\/ADDITIONAL_LICENSE_INFO": "9f658dfea71bdc3cc1549edfb5ad3171dbfa0082b2d91e820c09abe0b376b6bcd8b5170442a5e25e72274e98f130176bbdecfa7997c59705782b214f02136a20", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.zipfs\/ASSEMBLY_EXCEPTION": "5516e2e9eb3a555562f600cc3cd85ae01004962a8af8c49d2598281ce622bcbee7a4bc513b94b05e3b611bb50611360171e21bae9c1b3ed7d05a0867de7d3bb2", + "java\/jdk-21.0.2+13-jre\/legal\/jdk.zipfs\/LICENSE": "6732288c682a39ed9edf11a151f6f48e742696f4a762c0c7d8872b99b9f6d5ab6c305064d4910b1a254862a873129f11fd0fa56ff11bc577d29303f4fb492673", + "java\/jdk-21.0.2+13-jre\/lib\/classlist": "fa075d07032562204684a85ef801757efb30f2e51dece3f985dbec029181ed4cd508522fb3d57c13455d8d49dfcc32e576ee657048e7e2d134d8acbacf82edc3", + "java\/jdk-21.0.2+13-jre\/lib\/jexec": "9d598da3edba0218c1a9920bc218f869028afc509b128daaeb1711bbc6ab10062b0dde05d9d8bcc1581a9f9b3f50ecf304ef8945562c6a06dde58e6e7807ff21", + "java\/jdk-21.0.2+13-jre\/lib\/jfr\/default.jfc": "f34c0543e2654cd7cf5180d3c0c8a9b77616049493c1e344ab974e76baeff37244f075fafef854ade49ab4d9ba0bbc07a83e4733fc6ef31afadf3d359fd820e6", + "java\/jdk-21.0.2+13-jre\/lib\/jfr\/profile.jfc": "b8abe37dab4ec4b9adacf3b5aab4dbc4ff706e70d1cc45471d6829b8b08651c3f1c6c267462f208e1b8bb0a7054cfe018927d3309b44870551d8282d4ea1895f", + "java\/jdk-21.0.2+13-jre\/lib\/jrt-fs.jar": "25641ecb09cfb703f72dd99dab58fde80b8c0636386eae57a08c7bf2db5e3d35f84fe583acb145c1aad99770354098d729adbf11cfbd7a753df0f30c16dbb77a", + "java\/jdk-21.0.2+13-jre\/lib\/jspawnhelper": "0719bbe098509538c6a0f4b26b40e484e7c810b5fe38dc83666dbee139a3bbcb4ff23a03b7b33b8a0347fede5d72080d56c65909b06777b5631ed5bcb9aa3b7f", + "java\/jdk-21.0.2+13-jre\/lib\/jvm.cfg": "8b37a1a5600e0a4e5832021c4db50569e33f1ddc8ac4fc2f38d5439272b955b0e3028ea10dec0743b197aa0def32d9e185066d2bac451f81b99539d34006074b", + "java\/jdk-21.0.2+13-jre\/lib\/libawt.so": "ae37c93ac242bd2dbfc7fb3d3e9f4991b9668819b42de8a4a0fec03bc9189d2138bf573d5100385dfa306907c25991090f1ce6c0b326e40600a2aade1912c208", + "java\/jdk-21.0.2+13-jre\/lib\/libawt_headless.so": "a02c26ddad2c6d23fa73d9b508e4332d07e8853d471179ea658ef9d6fb8fc5f503d5feeb8839a14b4bfaa73c211b8ed2b9c4642a33b34784f213dc0531d7d113", + "java\/jdk-21.0.2+13-jre\/lib\/libawt_xawt.so": "c0f68c55a0fb44fdd31545a0ead22fa069ce4cc0963dbfea5db786e57f1ab331a12cc3a093e81944b95d825d36c47bc6e8370e3fb138813dd530304387d0763a", + "java\/jdk-21.0.2+13-jre\/lib\/libdt_socket.so": "2c88b58210dd5a2a95233ebd284421ef1c739a9e567194f2db2b218eee16be7933829a5646bdbacfb0ec79c82bfbef35d72f0275dce51b07b1dd9fafcb96622c", + "java\/jdk-21.0.2+13-jre\/lib\/libextnet.so": "c191aa130e3cc4a13c425524d3216bf7b844ffa5c1c3ec6259f57bd23a13f9166be8a780af6ada14e054d495caae5c8eb0259c16c3d593f723853f1d8495973c", + "java\/jdk-21.0.2+13-jre\/lib\/libfontmanager.so": "eec80dfc544e7bfa02a51672d7d3b4ddd8e7cef2349d195d6fc8e13ea11ccc4f74fd0cc69a7ddb4f7eccaf3517b0e3b4e53425da772b81dc7d1e91d60ad80063", + "java\/jdk-21.0.2+13-jre\/lib\/libfreetype.so": "5c81ce6ca56d3fe46088720747fdaeb0adcb3643a9f7d31d5aaa54c8e1d80de3285e839381f1ddaefb36fe7c4e29a78bf0091480d566b8fbd873bfccbc7ae306", + "java\/jdk-21.0.2+13-jre\/lib\/libinstrument.so": "fec9990e02d5b541f602ac0584e02af7dea1e76fe0fc6ce5fa54567826f4c078189a63a1fd2094e5b28a2c6ccf9a2e3a4f5b5e0d9b436e30be286a85c60cecb0", + "java\/jdk-21.0.2+13-jre\/lib\/libj2gss.so": "e174e096da4ed44f5d75eaf4dbf408699362518dbf60d18473736b5750245c03206ae21697541bc96601c708cb72799e5bd4c4d2568d5b8f13838cb6d287c281", + "java\/jdk-21.0.2+13-jre\/lib\/libj2pcsc.so": "a5ff7d35a4cb2865a227ae1ad95eef110adf8bd9c6ba705800a5f26dbb50f1091c53b2349d4502a52a1b83c3ccee1c841f5d91d27886a67cdd8950b13ecb4f4d", + "java\/jdk-21.0.2+13-jre\/lib\/libj2pkcs11.so": "82b3cb4450899cf556bdcc9c9e0b7f929b6cd928c51d86b5fd1a78c53934b1a874702ff179f37e91ceef662fd98102c120ba79b86565cfe6a4ee379f05760938", + "java\/jdk-21.0.2+13-jre\/lib\/libjaas.so": "2996d617a4394a3c94fe189fb320e110dac119ce28b1f7ab94d1c6a7e33e6ad14fcaddd3d27d7da8b9cc43a4bd2407e2cd3d7e4a13cace1e403b95b81bbe0b0b", + "java\/jdk-21.0.2+13-jre\/lib\/libjava.so": "1bb9dafb9501570b562e7e7f3372c38240a68a0ecc1c290982f5a575c36408be563ad9b648f7860a0693e7b5b1dddc537890d3862de4e1abff550e72ad83c6fb", + "java\/jdk-21.0.2+13-jre\/lib\/libjavajpeg.so": "d7914c3e57ebf44b69f426eaad86bdea925b913045e778d22653837c70e816a7e8eed339d4ea5426c9fbd47279e5594965b7abef88f08f5499ca930cba9448ca", + "java\/jdk-21.0.2+13-jre\/lib\/libjawt.so": "7929c31ce9e1a215017fe36145bb9ee80c995d2e53e5f1d7dd36b251efee327e91df97368f136bdc0bc8833014e7b8bdb5d064371c5a93dc2516e9d102af782f", + "java\/jdk-21.0.2+13-jre\/lib\/libjdwp.so": "46e79d5181f96ed0b5a45395ca804832f492e351a2cd4e79dad6285a1b79e631c934690d0c68c47a339f57900daead29c39445eacfd231f0c74d1f6415a5f483", + "java\/jdk-21.0.2+13-jre\/lib\/libjimage.so": "66e33a7398a057937a904e372576f6486ce4274639e79363d9bfd54474a39645af879ad8b8b5b848f917efb16196e876caf28f540db1dfa18f5b513a1ba029cb", + "java\/jdk-21.0.2+13-jre\/lib\/libjli.so": "1687e9ba3ca18664f92bdc84e342414d96abf3a1029e47d73b11d7af237499545961ff00d0cef824feaea91bcf2c4dfa67bb982bd1c3b82aefc5a4d87f8ed2f9", + "java\/jdk-21.0.2+13-jre\/lib\/libjsig.so": "659cd0b0ed9426d26224373f85d0addd80349e2a76ad69df725dbaf3b613c11dd24260744051fcbf89116a1cae193d80708d70a4a468071ecf5b5ca80a76274f", + "java\/jdk-21.0.2+13-jre\/lib\/libjsound.so": "65f4708e89382f949292ea658da67f8cc794e35b4637a5781eefcd09ff30de6b7495d9d90cb26ac1f4589fbf0f1897f9fe9e611448cf3dd912f604e225e0538c", + "java\/jdk-21.0.2+13-jre\/lib\/libjsvml.so": "ad0c7a0f7191e6dea75c87f309da66905207b35de71914444f0ab8b34136a699f43798c8c9c5c430ff6a9194027557d0bd5e68d2cb90ef5df4df9bb27255cffb", + "java\/jdk-21.0.2+13-jre\/lib\/liblcms.so": "092fbc7cf3bc5c8b762b0960966e1e46160240e5757af9e1980822f6d717ab20ded782bbb8e9c3424d2164471cc8b6fb32612b798aae2c7b9842aa0d6c933903", + "java\/jdk-21.0.2+13-jre\/lib\/libmanagement.so": "2b02ac889aabd460f638f735349b9ecdf95a3df4471a35ded7313405e59c91973f67567a165fe915059b575a72880d6be28eed20ad08e20814a385a87c3d4d43", + "java\/jdk-21.0.2+13-jre\/lib\/libmanagement_agent.so": "6b98e9e505ee98bcf6901c39c27b53fbc1f60121d2d194edc7893c5b17186761fc3d66de5543f047746d88fed55f4ce8e3fa7f7ae1881f1f9f895825e9374a95", + "java\/jdk-21.0.2+13-jre\/lib\/libmanagement_ext.so": "55fc6bddefc826a8cd3f66624625900cfa5de7c7ea0e14f7106ba509d935a26904193ba7d0be4149b17dcb87c8729a235175137cb7f0847c07a4c3e5c9cea824", + "java\/jdk-21.0.2+13-jre\/lib\/libmlib_image.so": "f4617bec60984379f6cbe81eb1d4be9fdc4277fddd8c1d381c9cf3121ddec27a9d50bca1e70c9146cc6f314f3e38d42fd7835b79a919abb4484a49f6d27938f9", + "java\/jdk-21.0.2+13-jre\/lib\/libnet.so": "fe0023af3c3b183c13b091fb8608ce09e47d6fb209d5cd0334d6811ede4f41806e2077a43578d26a82acbdf2459dd7ef8596ebb0950b7e94542a6146d2163149", + "java\/jdk-21.0.2+13-jre\/lib\/libnio.so": "26539ed73e685977c4cc4b97da4edd346501019f8180daeafd894f835778777f67eeb52fde45f9d303436359678b0a04b07dfd7402c0f664a0f6fa6c5095823a", + "java\/jdk-21.0.2+13-jre\/lib\/libprefs.so": "4d31f33b5e905a0d2655dd1bb572ec0788181c9a4cf6f28482acaaa89f0959786b8c603a1a4b2e343b4d97d108f2a2041294798b07e209a242e11392f14387e9", + "java\/jdk-21.0.2+13-jre\/lib\/librmi.so": "11f106bbf97d7b8dafc10da95acfa8878131fd557c8c438efa6ca77defca7ba7e821c28d3b77089593a130ca5eeb99babb0cba5b2fa7d34825ba015dcae18930", + "java\/jdk-21.0.2+13-jre\/lib\/libsctp.so": "27ed970b13bcb535fb423e37d7826af640c7be833b730de00c9d759972b41650616c7f9c9251295c2a072a78c3456a3aa92e818f0d0b1402053313262aece324", + "java\/jdk-21.0.2+13-jre\/lib\/libsplashscreen.so": "a999eb715e9beeefa6e6844a93c595a9374e2194ebcbf384626c5cb002c36bc4f4eced091bf5db520f7f9ff225471ff08b8e2aed1cc2a2b8357a2f7fecf4d0e5", + "java\/jdk-21.0.2+13-jre\/lib\/libsyslookup.so": "7cee79233d7f997bb804c72766ed54def3e0e74769f8938858e65bfba584984d8b24ef15b5e6f6eb4ff87ed0d63682a0b4e444d03491c45e1351538597ed795d", + "java\/jdk-21.0.2+13-jre\/lib\/libverify.so": "22372ab221cb4b26b439abdd704d9828501ef2876e08152c46279bc9203e23ca93ec05dfe07c3eec24ae2ca4a4b22e1258b55af823aa3d7fe90159d6ecfeae1f", + "java\/jdk-21.0.2+13-jre\/lib\/libzip.so": "4f9502ec0d51b43dd2d37aea06df0fe86bf2fcc76f41b5dabb1ed78da286aebe5ec198c7bcf03e220cd1923d2d010408c01a8a95bcc64633bb9af69146a987cc", + "java\/jdk-21.0.2+13-jre\/lib\/modules": "f3bd47f9feaecdcb4797d332b7b3886722dced66790ca7bedd54f073113844499457e9ff66ba6f3c5c88e2bc604ad67a1a2aab5e937c183be7fd26c278d06ff7", + "java\/jdk-21.0.2+13-jre\/lib\/psfont.properties.ja": "8124b25decfa64a65433ff2ce1f0f7bdf304abe2997568abc35264a705f07152aa993b543da37c4132b4b1b606743c825c90a0eb17b268518d478f5cf0889062", + "java\/jdk-21.0.2+13-jre\/lib\/psfontj2d.properties": "e4ee92d4598385cb2f6f3a4db91ddabd7e615dc105ed26cdc5b5598d01c526cea7726ff93f92a308350229f2e5a5dd64cc0c38865dd97666368a330b410d4892", + "java\/jdk-21.0.2+13-jre\/lib\/security\/blocked.certs": "c6d8d4ee0eb7eeb14532512ff4310dff9dd4f31d112716fc67a1052d37eef18d4bd6eb58301c76167ad35d31e73f5b28993f4da8c5de2dbe3836a5ef7e9c8b7e", + "java\/jdk-21.0.2+13-jre\/lib\/security\/cacerts": "a01185b26d6921ba639790904a7a7f37bcc39f931d4c959d489580fc4e0d38ae33033c1afe5fb926e27c526225b634cf2817e73e539875f91491fb04e01c0465", + "java\/jdk-21.0.2+13-jre\/lib\/security\/default.policy": "ba7ca64aee530cc36aa7bb556c44f976cc636750d31d8d8fa3d8c3d0070dfa83cb85f56be9ddc0e8418852b3a70c2716343f832973a753d4debe30042f4bc1ed", + "java\/jdk-21.0.2+13-jre\/lib\/security\/public_suffix_list.dat": "6caaa3c2a53782fd286ab8db4a6a2470cd0150608c33b27aa506735d37185d26eedd27ef95fe0ade83d8301fdb8ac1c4b972a87b3714c303181f5cd67bc64815", + "java\/jdk-21.0.2+13-jre\/lib\/server\/classes.jsa": "23df528e05459e6cd96cd3e2977e750e64693b5e75cc766eee6f262e7e8abb8635b166ef3b7f57f0a8b2a352a12ce8c9d59092d1abecd4457e4f16c1e2f60e36", + "java\/jdk-21.0.2+13-jre\/lib\/server\/classes_nocoops.jsa": "9c6a4f9dea7d78cf399b64012196bced503001047f232d151e68eebf9765718f497d3a11f39cf6f58f2b8e4dd33d8ee621b7e1e9de13b269251a06807b973a9f", + "java\/jdk-21.0.2+13-jre\/lib\/server\/libjsig.so": "659cd0b0ed9426d26224373f85d0addd80349e2a76ad69df725dbaf3b613c11dd24260744051fcbf89116a1cae193d80708d70a4a468071ecf5b5ca80a76274f", + "java\/jdk-21.0.2+13-jre\/lib\/server\/libjvm.so": "8df080e567f3a2017395f6e542fdccd57515dbfcd5047bf8696855408670b2f0faa2ffc3b0651ca5306d507a77d737092fd450a87f0e9afbdb8c8e06b585fc59", + "java\/jdk-21.0.2+13-jre\/lib\/tzdb.dat": "958f835407e4a10a268bf76bc2ef0196ecd5fa92e139de4c3760544dbdf76f95e67865bac22406aef8ac5ae7508fe63cd1a688c8328e46b73a5867efa4f18d47", + "java\/jdk-21.0.2+13-jre\/release": "9424659912a18e1e6368d62240542b4e821672ec4c3fa557665b1fbf3060d763c9de4edf525e80cea1ae2fb259821b98b3854f65f1beab080beeb0802ad43f98", + "jsignpdf-2.2.2.zip": "dac3fc83ea6ffede68f53e9db33161075db7b9b4028b5216522501b5cdf5f9815adb966c1af7a80d42ba09edad6efbf71d4b7ec4236cd5d7236d3868178022a5", + "jsignpdf-2.2.2\/InstallCert.jar": "748afcd66d2cb10d996ee83df4b7354f3cde9d73e8f5388b89107bd82a046cebd7982f38745c61b8dd1a5ca2099eb0e290281ea699dd6f2ebd32bc13a2794569", + "jsignpdf-2.2.2\/JSignPdf.jar": "dbc0bb7af34cc1c034cae7f5c0e05702260a26684a56ab6254025fe7a0afbf01e68f8664d73bab4b71b97142373143d1159068181ae6e137740485c38c475572", + "jsignpdf-2.2.2\/conf\/conf.properties": "9867ca50e21f620a85aeb77b1eeada52998ff5bed05c98e34365d78d38b5df9716e1e1cb0c316f26fbbac799faad7e73c6ccb8e8ecb3422f085da5b33b89862d", + "jsignpdf-2.2.2\/conf\/pkcs11.cfg": "7755a14ea0a9486948d25799134bdaa34a2bc9807b7470dbfd88fadd7eb1a3cb2d40dba830320ed864598b70f5fa4c7f426a3d992f9ce80298471b5346a890ca", + "jsignpdf-2.2.2\/docs\/JSignPdf.pdf": "fcf4cc584f7aaf039cf458bad5cf8165de586bb124088945ad0f293efca7c2803457e40ced4e20ed050d3fb98625f038e65533a8d3adb84d73a8a42f07b1a592", + "jsignpdf-2.2.2\/jsignpdf.sh": "6f7e547d846b8f74abff2f6a85fe30ce6be98779565f2eed1714ad2363ccf4bd6bb999a4de08d201e55d2c6ab21475b9afba259716e99c3cb673fe175c59c4e5", + "jsignpdf-2.2.2\/licenses\/MPL-2.0.txt": "7479c0cc9df5359cfffcb421e108dfbb4a5493589bbb3ff998f4c0c0499be3d974e608939f07c9644ae3936f008d299f0da80d4b181367284299f4ac3841eb73", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/DejaVu-font.license": "eb1b3f39d42d7a9a00c31ed6e97608b693fd9e519d5775ad83dd10f5af1172aa450eda6a1ec301e7dc348cfeb4c279067388ad88e76fbf2073fb100b648209e0", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/InstallCert.license": "ded0e324601bf2826998bfaf5c0aeb854cdb2fcad3b5046e901612372dafcf45e41b59a0c43d341d98edeec4ef7a078797f91abba104d3193d996677f2307a00", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/PdfRenderer.license": "c929152d51e8db633124dc8ec3272b8f76172c4820a587ebba0fcdb0c2ffa5eb90bc795696a2a8a863521b347822856b0e44d576649a3e85af21c17f28a7e437", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/apache-commons.license": "d43a0e998d3e817e71501086f4d6a46f1f18b46791c491932887ee15efd51426c606f92620766ba2688276406be970b32dbd18b4a54483a8466e05a6cd81d1c1", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/bouncycastle.license": "806473fdb2d8ea53e4f812a50ecd450bdb187e2fbd469e75ccd71142830d544417300bfed99967db39eea0e950978b012b9a48b5f73f4fe732759234ae05016d", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/icu4j.license": "085545902048420cddc84a6474238075ecb0839c158683256b939292f9067a49593714ac58eec4c445e36ea5a511e254f63fb97b4f9fa100d3f61437b5d2ef7b", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/pdfbox.license": "d43a0e998d3e817e71501086f4d6a46f1f18b46791c491932887ee15efd51426c606f92620766ba2688276406be970b32dbd18b4a54483a8466e05a6cd81d1c1", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/pokrytie_font.license": "ead14823e799bb46e4aa5ab0a2fb3efdc5d6bf73ccb4fdce892445d1852c0e6599c9e2fd2f83a953878eb34af3750920642275d83798364f134b78340582948c", + "jsignpdf-2.2.2\/licenses\/ThirdPartyLicenses\/splashscreen.info": "2be843531ec9d89bb953e03f26d550d9e3e6b567f63d0abbe9ed81f61e8967e53e096b63cacc681561a2006dbf498ef8eaa0ffbd1f60bcc14907c8222bf6db1c", + "jsignpdf-2.2.2\/licenses\/lgpl-2.1.txt": "c929152d51e8db633124dc8ec3272b8f76172c4820a587ebba0fcdb0c2ffa5eb90bc795696a2a8a863521b347822856b0e44d576649a3e85af21c17f28a7e437", + "pdftk.jar": "9ac70daf30c98209892895c05782bf08f69251e321887d3e30b3a8b0868d0e749da5a8f35584d46441c8b83090d0c4228bfe2185862c58231dc929b25b9d6b57" + }, + "signature": "ZcGk0YXYabX\/mjUJqBbAKYmzjXkTxvOEBpbx4\/QWih1XfXLBhbplttW7n+Pszjz2rWU9tNCt7guwHP2xdcev3ZWFx\/iCHp7rUc67zF+9Nw8LGYiVbeG+7M0zqwiqUtlyNpuNG8dyL5ePzqkcxK91W8AzWoth4ceShKwZNORAAJh5T4SAgzc+ThCbB0jDk+F957s0ZGfdPxxXc9Pd\/xqk1kvfQ3YMSkpC6bceulosZQUJFIREkQKTdLN\/FKAkLFcuURCKWuDMqBZ7qKF7uxFba3KIwDf+Bjd4zQL9DEoixQNuo2XXpg3dBAU6aqkN0BYvdgDkT7G7i0C2UdgSsQbTgNisq5oaUpf3ZAhu2iXo+5orUCv4fa1kWnJojmi4Gqlih4IY65oBYPQVBzgxJms\/VFpgFqnwms2moAGmXjxe+DyJ6O0reJHC8PlZBuIudvdIk5vMVB1fBuHFY4m5WP572oUOsrCtvRMMnc2xR1VPmeieVmatAQNr3Uj9vLnYfVmQyNDv1D9vXCq0oda2W4PYOd8vLI04O1YRoiM5lEyZJanVPQZKCOFb8nV6mApD1Zn0Hida3n3cVi\/O6E456DjAk3rj1wxQJEB8d6HoZ6myKpiBVoncdkQbnQX6KhItLIe5rr5VdBZ6mOENeLw7rLY+ORwznbVuXm\/gWCcT\/tjiupo=", + "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEBDCCAuwCAhF4MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD\r\nVQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI\r\nMTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB\r\ndXRob3JpdHkwHhcNMjEwMzA0MTk1NzQ1WhcNMzEwNjEwMTk1NzQ1WjAUMRIwEAYD\r\nVQQDDAlsaWJyZXNpZ24wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDq\r\nNU7W4kX445A4yMlADzxuNCouzzIYJBDRZXrKuz5OtbApKY5mPqfXGEpc8N04+eAJ\r\n5EJz5f9r0WxVcWGtyFN1sPObAsoMGyhOzNvAGaveL40xBsc7LdQgCR2JraInHH\/e\r\nMNtkgHQcWL5nihqYIEWvMeVt3uMTiI05F3SjW4+u\/NaRRw\/5y5l5W4Fy6VPzPW0P\r\n22Wmllkb3BFG16C6hHG\/+qE8pf12AcxQZ3B21MbPkHjOjxSz6NS74jGIVRtcn6dO\r\ny26XZ1XoeNUPZDyLFluYCBw5fgTIIU+721mkkA7EjP9RighygVGk4WII7l9Pc+Sf\r\nNwcxQykNdEnZ67ETSr4v1CpArAeXZ2dEZ\/b9QqI\/MCGw0Aa\/Pv2vDc8McFFBBTrt\r\nPDvn0TG0RdfuFAkYdOpFjH3urGUEvcJ\/+lFvRVUu203PHLfx72zNI3XVXui\/slf3\r\noK4LsQrbvj+heYnNXyr5UQAzgXW9JDiXE0sBxfzUz2XKlbuuNpLLE9EkFFQ5LyZJ\r\nG3l1f\/yO3CvGLancbhCvRjo6Lts38GjmkWQT+0BNBpwYhoAd4wopnMYphI9qldbp\r\n1XPWBqb+0w1p6bkIHmci8D\/whC0\/BEHoCs+DpRciRZM0FqW7frZcEGeO6YOoDWJ2\r\nCAhwXGodT4iV8RtVUC6\/arGGUal\/YqBk2M\/9zK6eMwIDAQABMA0GCSqGSIb3DQEB\r\nCwUAA4IBAQBWMFEq++xjRqFsWNPpoTtkfuj0PUajfRHBGzSUXccz0hw8kdR4C2xx\r\nhkYlJ9kqyWNxO1h4urQL5cM1sbl4xf5CI9xf7iuOcB06\/kn3umLmruRec32WG2bS\r\nqAWnnljGCX4sVY8oSbdaUopXE9o9pl966XQ5858c+w9ydkjMDnfOmzrCpgHrJefN\r\n94hIttjJsV8te15VcKoNUxsrZBlPIrpueUQRc13Z9CWp8eRXl4J4CZfVFSY7T4ho\r\nBlNtdPas2R9HJJDYEGS+fg5dfLLvTL4qPSxLjm753pJprfrDxfE9qQl0xtIe8aaw\r\nKFJ\/AK3JTRBkBwsgAE5OYEXTUV9oNS2j\r\n-----END CERTIFICATE-----" +} \ No newline at end of file diff --git a/lib/Command/Developer/SignSetup.php b/lib/Command/Developer/SignSetup.php new file mode 100644 index 0000000000..2b8e7746d9 --- /dev/null +++ b/lib/Command/Developer/SignSetup.php @@ -0,0 +1,96 @@ + + * + * @author Vitor Mattos + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\Libresign\Command\Developer; + +use OC\Core\Command\Base; +use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCA\Libresign\Service\Install\SignFiles; +use OCP\IConfig; +use phpseclib\Crypt\RSA; +use phpseclib\File\X509; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +class SignSetup extends Base { + public function __construct( + private IConfig $config, + private FileAccessHelper $fileAccessHelper, + private SignFiles $signFiles, + ) { + parent::__construct(); + } + + public function isEnabled(): bool { + return $this->config->getSystemValue('debug', false) === true; + } + + protected function configure(): void { + $this + ->setName('libresign:developer:sign-setup') + ->setDescription('Clean all LibreSign data') + ->addOption('privateKey', null, InputOption::VALUE_REQUIRED, 'Path to private key to use for signing') + ->addOption('certificate', null, InputOption::VALUE_REQUIRED, 'Path to certificate to use for signing') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + $privateKeyPath = $input->getOption('privateKey'); + $keyBundlePath = $input->getOption('certificate'); + if (is_null($privateKeyPath) || is_null($keyBundlePath)) { + $output->writeln('This command requires the --path, --privateKey and --certificate.'); + $output->writeln('Example: ./occ libresign:developer:sign-setup --privateKey="/libresign/private/myapp.key" --certificate="/libresign/public/mycert.crt"'); + return 1; + } + + $privateKey = $this->fileAccessHelper->file_get_contents((string) $privateKeyPath); + $keyBundle = $this->fileAccessHelper->file_get_contents((string) $keyBundlePath); + if ($privateKey === false) { + $output->writeln(sprintf('Private key "%s" does not exists.', $privateKeyPath)); + return 1; + } + + if ($keyBundle === false) { + $output->writeln(sprintf('Certificate "%s" does not exists.', $keyBundlePath)); + return 1; + } + + $rsa = new RSA(); + $rsa->loadKey($privateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $x509->setPrivateKey($rsa); + try { + foreach ($this->signFiles->getArchitectures() as $architecture) { + $this->signFiles->writeAppSignature($x509, $rsa, $architecture); + } + $output->writeln('Successfully signed'); + } catch (\Exception $e) { + $output->writeln('Error: ' . $e->getMessage()); + return 1; + } + return 0; + } +} diff --git a/lib/Service/Install/SignFiles.php b/lib/Service/Install/SignFiles.php new file mode 100644 index 0000000000..2813ccf0a4 --- /dev/null +++ b/lib/Service/Install/SignFiles.php @@ -0,0 +1,203 @@ + + * + * @author Vitor Mattos + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\Libresign\Service\Install; + +use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCA\Libresign\AppInfo\Application; +use OCP\App\IAppManager; +use OCP\Files\AppData\IAppDataFactory; +use OCP\Files\IAppData; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IConfig; +use phpseclib\Crypt\RSA; +use phpseclib\File\X509; + +class SignFiles { + private IAppData $appData; + private array $exclude = [ + 'openssl_config', + 'cfssl_config', + 'unauthetnicated', + ]; + public function __construct( + private FileAccessHelper $fileAccessHelper, + private IConfig $config, + private IAppDataFactory $appDataFactory, + private IAppManager $appManager, + ) { + $this->appData = $appDataFactory->get('libresign'); + } + + public function getArchitectures(): array { + $appInfo = $this->appManager->getAppInfo(Application::APP_ID); + if (!isset($appInfo['dependencies']['architecture'])) { + throw new \Exception('dependencies>architecture not found at info.xml'); + } + return $appInfo['dependencies']['architecture']; + } + + /** + * Write the signature of the app in the specified folder + * + * @param string $path + * @param X509 $certificate + * @param RSA $privateKey + * @throws \Exception + */ + public function writeAppSignature( + X509 $certificate, + RSA $privateKey, + string $architecture, + ) { + $appInfoDir = __DIR__ . '/../../../appinfo'; + try { + $this->fileAccessHelper->assertDirectoryExists($appInfoDir); + + $iterator = $this->getFolderIterator(); + $hashes = $this->generateHashes($iterator); + $signature = $this->createSignatureData($hashes, $certificate, $privateKey); + $this->fileAccessHelper->file_put_contents( + $appInfoDir . '/install-' . $architecture . '.json', + json_encode($signature, JSON_PRETTY_PRINT) + ); + } catch (\Exception $e) { + if (!$this->fileAccessHelper->is_writable($appInfoDir)) { + throw new \Exception($appInfoDir . ' is not writable'); + } + throw $e; + } + } + + private function getDataDir(): string { + $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/'); + return $dataDir; + } + + /** + * @todo check a best solution to don't use reflection + */ + private function getInternalPathOfFolder(ISimpleFolder $node): string { + $reflection = new \ReflectionClass($node); + $reflectionProperty = $reflection->getProperty('folder'); + $reflectionProperty->setAccessible(true); + $folder = $reflectionProperty->getValue($node); + $path = $folder->getInternalPath(); + return $path; + } + + private function getInstallPath(): string { + $folder = $this->getDataDir() . '/' . + $this->getInternalPathOfFolder($this->appData->getFolder('/')); + return $folder; + } + + + /** + * Enumerates all files belonging to the folder. Sensible defaults are excluded. + * + * @param string $folderToIterate + * @param string $root + * @return \RecursiveIteratorIterator + * @throws \Exception + */ + private function getFolderIterator(): \RecursiveIteratorIterator { + $dirItr = new \RecursiveDirectoryIterator( + $this->getInstallPath(), + \RecursiveDirectoryIterator::SKIP_DOTS + ); + + return new \RecursiveIteratorIterator( + $dirItr, + \RecursiveIteratorIterator::SELF_FIRST + ); + } + + /** + * Returns an array of ['filename' => 'SHA512-hash-of-file'] for all files found + * in the iterator. + * + * @param \RecursiveIteratorIterator $iterator + * @param string $path + * @return array Array of hashes. + */ + private function generateHashes(\RecursiveIteratorIterator $iterator): array { + $hashes = []; + + $baseDirectoryLength = \strlen($this->getInstallPath()); + foreach ($iterator as $filename => $data) { + /** @var \DirectoryIterator $data */ + if ($data->isDir()) { + continue; + } + + $relativeFileName = substr($filename, $baseDirectoryLength); + $relativeFileName = ltrim($relativeFileName, '/'); + + if ($this->isExcluded($relativeFileName)) { + continue; + } + + $hashes[$relativeFileName] = hash_file('sha512', $filename); + } + + return $hashes; + } + + private function isExcluded(string $filename): bool { + foreach ($this->exclude as $prefix) { + if (str_starts_with($filename, $prefix)) { + return true; + } + } + return false; + } + + /** + * Creates the signature data + * + * @param array $hashes + * @param X509 $certificate + * @param RSA $privateKey + * @return array + */ + private function createSignatureData(array $hashes, + X509 $certificate, + RSA $privateKey): array { + ksort($hashes); + + $privateKey->setSignatureMode(RSA::SIGNATURE_PSS); + $privateKey->setMGFHash('sha512'); + // See https://tools.ietf.org/html/rfc3447#page-38 + $privateKey->setSaltLength(0); + $signature = $privateKey->sign(json_encode($hashes)); + + return [ + 'hashes' => $hashes, + 'signature' => base64_encode($signature), + 'certificate' => $certificate->saveX509($certificate->currentCert), + ]; + } +}