From 82ff5215b7eb4bb6198ca024267c454f1e7958da Mon Sep 17 00:00:00 2001 From: cfig Date: Fri, 14 Jul 2023 22:52:53 +0800 Subject: [PATCH] Test case for #125, along with periodic updates - kotlin: 1.9.0 - gradle: 8.2.1 - helper: update crypto helper - capex: partial update --- .gitmodules | 3 + .../vts-testcase/security/avb/data/Android.bp | 45 + .../avb/data/kernel_version_matrix.textproto | 91 + .../security/avb/data/q-gsi.avbpubkey | Bin 0 -> 1032 bytes .../security/avb/data/qcar-gsi.avbpubkey | Bin 0 -> 1032 bytes .../security/avb/data/r-gsi.avbpubkey | Bin 0 -> 1032 bytes .../security/avb/data/s-gsi.avbpubkey | Bin 0 -> 1032 bytes .../security/avb/data/t-gsi.avbpubkey | Bin 0 -> 1032 bytes bbootimg/build.gradle.kts | 2 +- .../android/apex/ApexBuildInfoOuterClass.java | 1961 +++++++++ .../android/apex/ApexManifestOuterClass.java | 3736 +++++++++++++++++ bbootimg/src/main/resources/known_keys.json | 107 +- bbootimg/src/test/kotlin/AvbTest.kt | 34 +- gradle/wrapper/gradle-wrapper.properties | 2 +- helper/build.gradle.kts | 6 +- .../main/kotlin/cfig/helper/CryptoHelper.kt | 256 +- .../src/main/kotlin/cfig/helper/Launcher.kt | 76 +- integrationTest.py | 3 + src/integrationTest/resources_3 | 1 + 19 files changed, 6197 insertions(+), 126 deletions(-) create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/Android.bp create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/kernel_version_matrix.textproto create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/q-gsi.avbpubkey create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/qcar-gsi.avbpubkey create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/r-gsi.avbpubkey create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/s-gsi.avbpubkey create mode 100644 aosp/avb/test/vts-testcase/security/avb/data/t-gsi.avbpubkey create mode 100644 bbootimg/src/main/java/com/android/apex/ApexBuildInfoOuterClass.java create mode 100644 bbootimg/src/main/java/com/android/apex/ApexManifestOuterClass.java create mode 160000 src/integrationTest/resources_3 diff --git a/.gitmodules b/.gitmodules index f1271fe..b0ed05a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "src/integrationTest/resources_2"] path = src/integrationTest/resources_2 url = https://gitee.com/cfig/android_image_res2.git +[submodule "src/integrationTest/resources_3"] + path = src/integrationTest/resources_3 + url = https://github.com/cfig/android_image_res3.git diff --git a/aosp/avb/test/vts-testcase/security/avb/data/Android.bp b/aosp/avb/test/vts-testcase/security/avb/data/Android.bp new file mode 100644 index 0000000..9c75677 --- /dev/null +++ b/aosp/avb/test/vts-testcase/security/avb/data/Android.bp @@ -0,0 +1,45 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +filegroup { + name: "q-gsi_avbpubkey", + srcs: [ + "q-gsi.avbpubkey", + ], +} + +filegroup { + name: "r-gsi_avbpubkey", + srcs: [ + "r-gsi.avbpubkey", + ], +} + +filegroup { + name: "s-gsi_avbpubkey", + srcs: [ + "s-gsi.avbpubkey", + ], +} + +filegroup { + name: "t-gsi_avbpubkey", + srcs: [ + "t-gsi.avbpubkey", + ], +} + +filegroup { + name: "qcar-gsi_avbpubkey", + srcs: [ + "qcar-gsi.avbpubkey", + ], +} + +filegroup { + name: "kernel_version_matrix.textproto", + srcs: [ + "kernel_version_matrix.textproto" + ], +} diff --git a/aosp/avb/test/vts-testcase/security/avb/data/kernel_version_matrix.textproto b/aosp/avb/test/vts-testcase/security/avb/data/kernel_version_matrix.textproto new file mode 100644 index 0000000..05b27f8 --- /dev/null +++ b/aosp/avb/test/vts-testcase/security/avb/data/kernel_version_matrix.textproto @@ -0,0 +1,91 @@ +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# https://source.android.com/docs/core/architecture/kernel/android-common#compatibility-matrix +release_requirements: [ + { + # Android 13 + # This is the minimum SDK level where we start enforcing the matrix. + key: 33 + value { + upgrade: [ + # -q, -stable are dropped from non-GKI kernel release formats because the kernel branch + # cannot be looked up anywhere. + "android-4.9", + "android-4.14", + "android-4.19", + "android11-5.4", + "android12-5.4", + "android12-5.10", + "android13-5.10", + "android13-5.15" + ] + launch: [ + "android11-5.4", + "android12-5.4", + "android12-5.10", + "android13-5.10", + "android13-5.15" + ] + launch_grf: [ + # -q, -stable are dropped from non-GKI kernel release formats because the kernel branch + # cannot be looked up anywhere. + "android-4.19", + "android11-5.4", + "android12-5.4", + "android12-5.10", + "android13-5.10", + "android13-5.15" + ] + } + }, + { + # Android 14 + key: 34 + value { + upgrade: [ + # -q, -stable are dropped from non-GKI kernel release formats because the kernel branch + # cannot be looked up anywhere. + "android-4.14", + "android-4.19", + "android11-5.4", + "android12-5.4", + "android12-5.10", + "android13-5.10", + "android13-5.15", + "android14-5.15", + "android14-6.1" + ] + launch: [ + "android12-5.10", + "android13-5.10", + "android13-5.15", + "android14-5.15", + "android14-6.1" + ] + launch_grf: [ + # -q, -stable are dropped from non-GKI kernel release formats because the kernel branch + # cannot be looked up anywhere. + "android-4.19", + "android11-5.4", + "android12-5.4", + "android12-5.10", + "android13-5.10", + "android13-5.15", + "android14-5.15", + "android14-6.1" + ] + } + } +] diff --git a/aosp/avb/test/vts-testcase/security/avb/data/q-gsi.avbpubkey b/aosp/avb/test/vts-testcase/security/avb/data/q-gsi.avbpubkey new file mode 100644 index 0000000000000000000000000000000000000000..5ed7543ba22c4164b0ab153828a6b3bfe0d1289f GIT binary patch literal 1032 zcmV+j1o!&@01yD(;c0=8JaJn0B0#<(DW{QMqbdDcP`qtY2!e*!F^e6}Uj*Jb>60*lA@oN0+(ajXIPdhR}&EUp?c(M^6 zi*QoVQBhKj!KWq*d*l{4CsrCjPc_Fuu8v^`Rp^fgyHTTPs{5~o zI${|X;W}6)4A9YrMpXsir%JTapb#0aK>*t91*69lx63l$=)`5FAb}nv@{A{K6;6oB zs4W*Jo&8ca=g~#N|CN1}Pk03eFrp7Q6y;&rG4OE4EDTovT2f>ep%ExHBSQfkAp8;6 z!8M@G=LF61h~eo|BPyl!U1s&kdA5VjP&o2k!sMk^|`lL}R?dgf7vCA5}v#q98-@_%D- z!gj@qDsj@0jjiEA;A!UWoJKZc&;X*D)bIev@a%L}YM$312A*h|vXmcgz-LI9qJM-ATQ-^oFFzI~*DX*Gte zAaJRnzsg165Io~`G$9w7;%mn#`#=eWX&;w75Wc&d}2*#pDOG CUkH={ literal 0 HcmV?d00001 diff --git a/aosp/avb/test/vts-testcase/security/avb/data/qcar-gsi.avbpubkey b/aosp/avb/test/vts-testcase/security/avb/data/qcar-gsi.avbpubkey new file mode 100644 index 0000000000000000000000000000000000000000..ce56646d08bc2038bd712d611abb6f6ffacf7b79 GIT binary patch literal 1032 zcmV+j1o!&@01yCT`U;!6j>|$x__CBmd@XRPC?hjs7!oZ#&P8q?M6i*1-?p&zx+g+~ zQbpJx9pb`PjQ}x@F;C_B9p+^a3f}S%`4LOWwLO%i6$=8j4u5%*=*zw&VE3yQFHg?y z0SjXvdlphZGDq* zL6X03UxrHOA1$F8#Ij)fD_&}yacYQl>RCnoUzFpR=yh&<@ZZ{|-H=Iuy5qD6M3W3e zg$>TTf*Cz(4m!ujf-tHzt?w?%+fvdIhm}>7QrV20PlJ(=tPEqB?=Ls?6iYeuN+v z2I?!ClCC;@`bb@Om^G9nPW*=7T&JiNd|xB8)qvb{h()eBycLw$nJZ2R>Ys3)FnB}iIA1JWhS7PaZb>!*YAU4bt-NOMa9VS=3of0i7@F?UmEDsyT5q}I||;$b*8X1Drivp*xBYm zKrQccz%oc6N-7%KOZtk6O|3DAW*_F0DN6fNumKis=$p3MWICeMWDcd;Ml2!Y8hEz+ zNT~LV>|#ki8`b3PDMl&PSO35J-vc;jlg8cZV0;x<-7OG<`qG1KR!1|(SduT}g?^sD zEW$qaADt^DKWK^rY8gC$cqx?r&>K6^GQWWh6=S9ymksH|9LkVKHIn#boSiFaWeF*#{t zABNhc|Ai+Eh!+PH_0EJ4+W_mCqf0SQJ@lKiI_H_P&^>IOF%qZ$Lp!lfwu?Llhzvj3 z6JqK^4P*Y*2%=L)B@QZEti=5Ytx5oO1no^}0a1N4wWV=D}*lXj|>G`Rs8NSo~n=0BYbT8TV^oVTo`sHrqh>6&@aJ z`;OsX5G33grNyPXTdT=V;ijBxL3G1MD~wQeltjvuuC-7vDhe3s8Ip#gGaFwV?(x5y Ccl0a( literal 0 HcmV?d00001 diff --git a/aosp/avb/test/vts-testcase/security/avb/data/r-gsi.avbpubkey b/aosp/avb/test/vts-testcase/security/avb/data/r-gsi.avbpubkey new file mode 100644 index 0000000000000000000000000000000000000000..2609b3037eac08b7ea9653dabc9e8f6c090b08e0 GIT binary patch literal 1032 zcmV+j1o!&@01yCX{@#0v1$Dzh2>)~!ai+Y*rAQU%fefCJm`H}0aEcJk0twPGe4Wq8 zc#Z1LW{!i38&+P9?;4B^;p8Jb{u~EZ-uq$Ttz-zH1LF2h#|nIhdYi|E;Mf;5%6v=U zRTi_cHTs`!s7W#*i#f6w7B^FoBTV*&9`#>5@kQvKl(h{qofL19rq-`v?scQssc|sX zZ>E-)UA_iQS^<1l@c$BL39iNw*LJ>o=PZ>yjHt(2jnU)1vdA!$>L6=$e4Ht4g*P}m z98?QLKgepC%HL3>d%Oet4AI2j%;UV+Sg=wpOAFp6FGTyPVVKWbI}A~qtBTJ$3`w*} z*Tm3_;bJR6=a7@(S~m%G>r~h`t%Z#`nBD$DzWKZJQxmkeCozyqz$N!RzEWFYoSI&~ z-W_|DtKem70$xmF%i$oN$kSqqjZSd(p(JjLm0?BS zxPu*-SYEMld(ViszGK<2UH+Ee8q8oD)nx@)`((`^91Td>XS) zud*KqL$EU7+tG3ip5TGHgWSU%P zgt(I?{j)qxW&m<=qOW>pB699(Y@V|IT3^3y&i`y0?&PW?zB7=lu!??8-Hl?(xujJO zc8?bh8Fc~Db^}?whdyhDy&>TLS5rFLni@d4^H?pQXz55-2xB_b$fayN_pD5-_Oe$$ z-EtNzg4=$`bRWm#7#6~Gn}!wX6G(=z>EsK9=d_7L*J>`Fj)IirCYI`4-)${XSJFOz z=IE$op6OS4l`bE!d43>8JZR$pLel6DYw2ydaG=yO!GSIRkg+&>`O>SFZg^H`1fJp) z`@sVE#%Um9>0jEAY}(SCVaeQR|T16QD69CoWYP1&%M_v|MIsT-qV5y z)kf}5u1TqRsU1eZT#u`Qwv-gXd+9@kvxIC&3R!`p%qeTdI?^VVZEFx#?}F$?vOSy3 ztvSKEE{x>dV}{WGE$p%|*n-kC5S9Y+j*o7VrL0=ut{- C{{=1p literal 0 HcmV?d00001 diff --git a/aosp/avb/test/vts-testcase/security/avb/data/s-gsi.avbpubkey b/aosp/avb/test/vts-testcase/security/avb/data/s-gsi.avbpubkey new file mode 100644 index 0000000000000000000000000000000000000000..9065fb83ff23ca5a0ab7c238aca0e88257cb8b23 GIT binary patch literal 1032 zcmV+j1o!&@01yB@P5GIx)IH-|v#Q9k-S zfvOD;X$WYMAQJ(p{s%jweHi*$B0Uu~|FG{6L^twr=9a`Q%`+-WMpcENA+~D_MOX@C zhk_8_3lV!4*Zi2kJp}0=yjT=K;9=mCuH+af)xC#R!Q zXWensVlX?h0%#2J6H6&;X=Y)cA^u0CfiJ5Wt=rL*3_A}<4F#9MWQr-M5BA^rb(zm5$&p;a?FjL%tr!wZl_W zjx=~K*xVx}E}TN3hrHfWmjkgFqC*AcYiPLsD>!{qke;@CsZ>)XMbiImg!XbNxBn+)ra?@>0wuu^m36 zV}vQ&Gc~?6x(RiC^Co(Refb@Y{SwAyL&;}=s#aKhDC802R!J#?Err{s{BYq!k~QLe<})**@=&b@gPK2dv5*eaCQW_2R83MP1_Zl+4ZJ${ z_EV}jOlViwG#sjc3!d$poryOYVT@Q;Zqo{b{b1a_yZ>Op*Ik}Eum%zwu9bA$NJgG& z;7x?I_>@#aaPV;3qSwvFgJGUMAHa==|IR`?SVRA<9)edfcDl6wd$qCW*XhyyK5L00 z7C9oC&mzH+8R<)-c5dyEIf7P0GnQQ&d7DbdICY<(oCA_>`E0A0-=&Y5DK)V8LV7I_ CTlMq+ literal 0 HcmV?d00001 diff --git a/aosp/avb/test/vts-testcase/security/avb/data/t-gsi.avbpubkey b/aosp/avb/test/vts-testcase/security/avb/data/t-gsi.avbpubkey new file mode 100644 index 0000000000000000000000000000000000000000..de5991e6df6b86e721a3e0212aefe288200da971 GIT binary patch literal 1032 zcmV+j1o!&@01yBkz3KC+naj^!ow!>1)@mbw8q%MI(HsL>oANL7)uTY}lP6K4Yd`0f zpKXCXQ3{(-ePR(~TPwTMOwSc||Ha`!9^I;KAS3`;8hNTeWuRK5Vo z6W{x7giHwXBBw*jL4rgsi&%k|p=ADi8<}Wfkn4Ux=31%Mm`uH(nhD>ZCYE+K{H8l} zQ6VOBgvOOf!dn_G>FJ`=@Y{gSPSwQ1D4-R2Q;|^IOkr6jq^>l7&Wwdstn-8$a=;7! zb#$?c_Kp8wX`n^aT2@kqO@P)DWWN;lyo)8pcuG?$H}E~*-)|cXIem|)U9FSR!QbL! zQTDNGC(Q#{)k?n!Vk##Z``*Sv$4`U{=ysiftA$KYd5ui!#{YoNCJ?3l*FCrYDo zuINC^PH6SjxfnkLs=Q+^D5j<&_gH>Y~( zr|9qV!;@ERRI+A|Q)Ply;R2D63(Twrky>2#>ytzqZ;5lMsh1{3GJtVdHEm&P6375J z-0;Y>lrY&DLAagI;{Z9igyfD5rl8jqPN&bc)?MU}KSAJ|jrvdM^!FQf&sgF)2= z^?cbGCb8?O9!%g?x!!jv52^*npp)J;0>xR$o=a=i+_Yw|C$}?l8LM8uj2}mfy|$s;IH4JR94pgkN?6-s~iv(-yas zH;*|vW%9u6D5>l6GnVu#>}@S<>+F0sC$>;i@Ug$kz4@Vr#8aA9S`j2=v?HT+pOfysVH)8z@g|KTLm0+Uqjm@yf`S0yTUL+Z@cG2h1{ + * Apexer command line. + * + * + * string apexer_command_line = 1; + * @return The apexerCommandLine. + */ + java.lang.String getApexerCommandLine(); + /** + *
+     * Apexer command line.
+     * 
+ * + * string apexer_command_line = 1; + * @return The bytes for apexerCommandLine. + */ + com.google.protobuf.ByteString + getApexerCommandLineBytes(); + + /** + *
+     * Content of the selinux file contexts file.
+     * 
+ * + * bytes file_contexts = 2; + * @return The fileContexts. + */ + com.google.protobuf.ByteString getFileContexts(); + + /** + *
+     * Content of the canned_fs_config specifying uid/gid/mode of files.
+     * 
+ * + * bytes canned_fs_config = 3; + * @return The cannedFsConfig. + */ + com.google.protobuf.ByteString getCannedFsConfig(); + + /** + *
+     * Content of the original AndroidManifest.xml, before being compiled by aapt.
+     * 
+ * + * bytes android_manifest = 4; + * @return The androidManifest. + */ + com.google.protobuf.ByteString getAndroidManifest(); + + /** + *
+     * Value of --min_sdk_version parameter passed at build time.
+     * 
+ * + * string min_sdk_version = 5; + * @return The minSdkVersion. + */ + java.lang.String getMinSdkVersion(); + /** + *
+     * Value of --min_sdk_version parameter passed at build time.
+     * 
+ * + * string min_sdk_version = 5; + * @return The bytes for minSdkVersion. + */ + com.google.protobuf.ByteString + getMinSdkVersionBytes(); + + /** + *
+     * Value of --target_sdk_version parameter passed at build time.
+     * 
+ * + * string target_sdk_version = 6; + * @return The targetSdkVersion. + */ + java.lang.String getTargetSdkVersion(); + /** + *
+     * Value of --target_sdk_version parameter passed at build time.
+     * 
+ * + * string target_sdk_version = 6; + * @return The bytes for targetSdkVersion. + */ + com.google.protobuf.ByteString + getTargetSdkVersionBytes(); + + /** + *
+     * Whether the --no_hashtree option was set at build time.
+     * 
+ * + * bool no_hashtree = 7; + * @return The noHashtree. + */ + boolean getNoHashtree(); + + /** + *
+     * Value of --override_apk_package_name passed at build itme.
+     * 
+ * + * string override_apk_package_name = 8; + * @return The overrideApkPackageName. + */ + java.lang.String getOverrideApkPackageName(); + /** + *
+     * Value of --override_apk_package_name passed at build itme.
+     * 
+ * + * string override_apk_package_name = 8; + * @return The bytes for overrideApkPackageName. + */ + com.google.protobuf.ByteString + getOverrideApkPackageNameBytes(); + + /** + *
+     * Value of --logging_parent passed at build time.
+     * 
+ * + * string logging_parent = 9; + * @return The loggingParent. + */ + java.lang.String getLoggingParent(); + /** + *
+     * Value of --logging_parent passed at build time.
+     * 
+ * + * string logging_parent = 9; + * @return The bytes for loggingParent. + */ + com.google.protobuf.ByteString + getLoggingParentBytes(); + + /** + *
+     * Value of --payload_fs_type passed at build time.
+     * 
+ * + * string payload_fs_type = 10; + * @return The payloadFsType. + */ + java.lang.String getPayloadFsType(); + /** + *
+     * Value of --payload_fs_type passed at build time.
+     * 
+ * + * string payload_fs_type = 10; + * @return The bytes for payloadFsType. + */ + com.google.protobuf.ByteString + getPayloadFsTypeBytes(); + } + /** + * Protobuf type {@code apex.proto.ApexBuildInfo} + */ + public static final class ApexBuildInfo extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:apex.proto.ApexBuildInfo) + ApexBuildInfoOrBuilder { + private static final long serialVersionUID = 0L; + // Use ApexBuildInfo.newBuilder() to construct. + private ApexBuildInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ApexBuildInfo() { + apexerCommandLine_ = ""; + fileContexts_ = com.google.protobuf.ByteString.EMPTY; + cannedFsConfig_ = com.google.protobuf.ByteString.EMPTY; + androidManifest_ = com.google.protobuf.ByteString.EMPTY; + minSdkVersion_ = ""; + targetSdkVersion_ = ""; + overrideApkPackageName_ = ""; + loggingParent_ = ""; + payloadFsType_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ApexBuildInfo(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ApexBuildInfo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + apexerCommandLine_ = s; + break; + } + case 18: { + + fileContexts_ = input.readBytes(); + break; + } + case 26: { + + cannedFsConfig_ = input.readBytes(); + break; + } + case 34: { + + androidManifest_ = input.readBytes(); + break; + } + case 42: { + java.lang.String s = input.readStringRequireUtf8(); + + minSdkVersion_ = s; + break; + } + case 50: { + java.lang.String s = input.readStringRequireUtf8(); + + targetSdkVersion_ = s; + break; + } + case 56: { + + noHashtree_ = input.readBool(); + break; + } + case 66: { + java.lang.String s = input.readStringRequireUtf8(); + + overrideApkPackageName_ = s; + break; + } + case 74: { + java.lang.String s = input.readStringRequireUtf8(); + + loggingParent_ = s; + break; + } + case 82: { + java.lang.String s = input.readStringRequireUtf8(); + + payloadFsType_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.android.apex.ApexBuildInfoOuterClass.internal_static_apex_proto_ApexBuildInfo_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.android.apex.ApexBuildInfoOuterClass.internal_static_apex_proto_ApexBuildInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.class, com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.Builder.class); + } + + public static final int APEXER_COMMAND_LINE_FIELD_NUMBER = 1; + private volatile java.lang.Object apexerCommandLine_; + /** + *
+     * Apexer command line.
+     * 
+ * + * string apexer_command_line = 1; + * @return The apexerCommandLine. + */ + @java.lang.Override + public java.lang.String getApexerCommandLine() { + java.lang.Object ref = apexerCommandLine_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + apexerCommandLine_ = s; + return s; + } + } + /** + *
+     * Apexer command line.
+     * 
+ * + * string apexer_command_line = 1; + * @return The bytes for apexerCommandLine. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getApexerCommandLineBytes() { + java.lang.Object ref = apexerCommandLine_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + apexerCommandLine_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FILE_CONTEXTS_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString fileContexts_; + /** + *
+     * Content of the selinux file contexts file.
+     * 
+ * + * bytes file_contexts = 2; + * @return The fileContexts. + */ + @java.lang.Override + public com.google.protobuf.ByteString getFileContexts() { + return fileContexts_; + } + + public static final int CANNED_FS_CONFIG_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString cannedFsConfig_; + /** + *
+     * Content of the canned_fs_config specifying uid/gid/mode of files.
+     * 
+ * + * bytes canned_fs_config = 3; + * @return The cannedFsConfig. + */ + @java.lang.Override + public com.google.protobuf.ByteString getCannedFsConfig() { + return cannedFsConfig_; + } + + public static final int ANDROID_MANIFEST_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString androidManifest_; + /** + *
+     * Content of the original AndroidManifest.xml, before being compiled by aapt.
+     * 
+ * + * bytes android_manifest = 4; + * @return The androidManifest. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAndroidManifest() { + return androidManifest_; + } + + public static final int MIN_SDK_VERSION_FIELD_NUMBER = 5; + private volatile java.lang.Object minSdkVersion_; + /** + *
+     * Value of --min_sdk_version parameter passed at build time.
+     * 
+ * + * string min_sdk_version = 5; + * @return The minSdkVersion. + */ + @java.lang.Override + public java.lang.String getMinSdkVersion() { + java.lang.Object ref = minSdkVersion_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + minSdkVersion_ = s; + return s; + } + } + /** + *
+     * Value of --min_sdk_version parameter passed at build time.
+     * 
+ * + * string min_sdk_version = 5; + * @return The bytes for minSdkVersion. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMinSdkVersionBytes() { + java.lang.Object ref = minSdkVersion_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + minSdkVersion_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TARGET_SDK_VERSION_FIELD_NUMBER = 6; + private volatile java.lang.Object targetSdkVersion_; + /** + *
+     * Value of --target_sdk_version parameter passed at build time.
+     * 
+ * + * string target_sdk_version = 6; + * @return The targetSdkVersion. + */ + @java.lang.Override + public java.lang.String getTargetSdkVersion() { + java.lang.Object ref = targetSdkVersion_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + targetSdkVersion_ = s; + return s; + } + } + /** + *
+     * Value of --target_sdk_version parameter passed at build time.
+     * 
+ * + * string target_sdk_version = 6; + * @return The bytes for targetSdkVersion. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTargetSdkVersionBytes() { + java.lang.Object ref = targetSdkVersion_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + targetSdkVersion_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int NO_HASHTREE_FIELD_NUMBER = 7; + private boolean noHashtree_; + /** + *
+     * Whether the --no_hashtree option was set at build time.
+     * 
+ * + * bool no_hashtree = 7; + * @return The noHashtree. + */ + @java.lang.Override + public boolean getNoHashtree() { + return noHashtree_; + } + + public static final int OVERRIDE_APK_PACKAGE_NAME_FIELD_NUMBER = 8; + private volatile java.lang.Object overrideApkPackageName_; + /** + *
+     * Value of --override_apk_package_name passed at build itme.
+     * 
+ * + * string override_apk_package_name = 8; + * @return The overrideApkPackageName. + */ + @java.lang.Override + public java.lang.String getOverrideApkPackageName() { + java.lang.Object ref = overrideApkPackageName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + overrideApkPackageName_ = s; + return s; + } + } + /** + *
+     * Value of --override_apk_package_name passed at build itme.
+     * 
+ * + * string override_apk_package_name = 8; + * @return The bytes for overrideApkPackageName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getOverrideApkPackageNameBytes() { + java.lang.Object ref = overrideApkPackageName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + overrideApkPackageName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int LOGGING_PARENT_FIELD_NUMBER = 9; + private volatile java.lang.Object loggingParent_; + /** + *
+     * Value of --logging_parent passed at build time.
+     * 
+ * + * string logging_parent = 9; + * @return The loggingParent. + */ + @java.lang.Override + public java.lang.String getLoggingParent() { + java.lang.Object ref = loggingParent_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + loggingParent_ = s; + return s; + } + } + /** + *
+     * Value of --logging_parent passed at build time.
+     * 
+ * + * string logging_parent = 9; + * @return The bytes for loggingParent. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getLoggingParentBytes() { + java.lang.Object ref = loggingParent_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + loggingParent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PAYLOAD_FS_TYPE_FIELD_NUMBER = 10; + private volatile java.lang.Object payloadFsType_; + /** + *
+     * Value of --payload_fs_type passed at build time.
+     * 
+ * + * string payload_fs_type = 10; + * @return The payloadFsType. + */ + @java.lang.Override + public java.lang.String getPayloadFsType() { + java.lang.Object ref = payloadFsType_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + payloadFsType_ = s; + return s; + } + } + /** + *
+     * Value of --payload_fs_type passed at build time.
+     * 
+ * + * string payload_fs_type = 10; + * @return The bytes for payloadFsType. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getPayloadFsTypeBytes() { + java.lang.Object ref = payloadFsType_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + payloadFsType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getApexerCommandLineBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, apexerCommandLine_); + } + if (!fileContexts_.isEmpty()) { + output.writeBytes(2, fileContexts_); + } + if (!cannedFsConfig_.isEmpty()) { + output.writeBytes(3, cannedFsConfig_); + } + if (!androidManifest_.isEmpty()) { + output.writeBytes(4, androidManifest_); + } + if (!getMinSdkVersionBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, minSdkVersion_); + } + if (!getTargetSdkVersionBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, targetSdkVersion_); + } + if (noHashtree_ != false) { + output.writeBool(7, noHashtree_); + } + if (!getOverrideApkPackageNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 8, overrideApkPackageName_); + } + if (!getLoggingParentBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 9, loggingParent_); + } + if (!getPayloadFsTypeBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 10, payloadFsType_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getApexerCommandLineBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, apexerCommandLine_); + } + if (!fileContexts_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, fileContexts_); + } + if (!cannedFsConfig_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, cannedFsConfig_); + } + if (!androidManifest_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, androidManifest_); + } + if (!getMinSdkVersionBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, minSdkVersion_); + } + if (!getTargetSdkVersionBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, targetSdkVersion_); + } + if (noHashtree_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(7, noHashtree_); + } + if (!getOverrideApkPackageNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, overrideApkPackageName_); + } + if (!getLoggingParentBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, loggingParent_); + } + if (!getPayloadFsTypeBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, payloadFsType_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo)) { + return super.equals(obj); + } + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo other = (com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo) obj; + + if (!getApexerCommandLine() + .equals(other.getApexerCommandLine())) return false; + if (!getFileContexts() + .equals(other.getFileContexts())) return false; + if (!getCannedFsConfig() + .equals(other.getCannedFsConfig())) return false; + if (!getAndroidManifest() + .equals(other.getAndroidManifest())) return false; + if (!getMinSdkVersion() + .equals(other.getMinSdkVersion())) return false; + if (!getTargetSdkVersion() + .equals(other.getTargetSdkVersion())) return false; + if (getNoHashtree() + != other.getNoHashtree()) return false; + if (!getOverrideApkPackageName() + .equals(other.getOverrideApkPackageName())) return false; + if (!getLoggingParent() + .equals(other.getLoggingParent())) return false; + if (!getPayloadFsType() + .equals(other.getPayloadFsType())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + APEXER_COMMAND_LINE_FIELD_NUMBER; + hash = (53 * hash) + getApexerCommandLine().hashCode(); + hash = (37 * hash) + FILE_CONTEXTS_FIELD_NUMBER; + hash = (53 * hash) + getFileContexts().hashCode(); + hash = (37 * hash) + CANNED_FS_CONFIG_FIELD_NUMBER; + hash = (53 * hash) + getCannedFsConfig().hashCode(); + hash = (37 * hash) + ANDROID_MANIFEST_FIELD_NUMBER; + hash = (53 * hash) + getAndroidManifest().hashCode(); + hash = (37 * hash) + MIN_SDK_VERSION_FIELD_NUMBER; + hash = (53 * hash) + getMinSdkVersion().hashCode(); + hash = (37 * hash) + TARGET_SDK_VERSION_FIELD_NUMBER; + hash = (53 * hash) + getTargetSdkVersion().hashCode(); + hash = (37 * hash) + NO_HASHTREE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getNoHashtree()); + hash = (37 * hash) + OVERRIDE_APK_PACKAGE_NAME_FIELD_NUMBER; + hash = (53 * hash) + getOverrideApkPackageName().hashCode(); + hash = (37 * hash) + LOGGING_PARENT_FIELD_NUMBER; + hash = (53 * hash) + getLoggingParent().hashCode(); + hash = (37 * hash) + PAYLOAD_FS_TYPE_FIELD_NUMBER; + hash = (53 * hash) + getPayloadFsType().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code apex.proto.ApexBuildInfo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:apex.proto.ApexBuildInfo) + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfoOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.android.apex.ApexBuildInfoOuterClass.internal_static_apex_proto_ApexBuildInfo_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.android.apex.ApexBuildInfoOuterClass.internal_static_apex_proto_ApexBuildInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.class, com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.Builder.class); + } + + // Construct using com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + apexerCommandLine_ = ""; + + fileContexts_ = com.google.protobuf.ByteString.EMPTY; + + cannedFsConfig_ = com.google.protobuf.ByteString.EMPTY; + + androidManifest_ = com.google.protobuf.ByteString.EMPTY; + + minSdkVersion_ = ""; + + targetSdkVersion_ = ""; + + noHashtree_ = false; + + overrideApkPackageName_ = ""; + + loggingParent_ = ""; + + payloadFsType_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.android.apex.ApexBuildInfoOuterClass.internal_static_apex_proto_ApexBuildInfo_descriptor; + } + + @java.lang.Override + public com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo getDefaultInstanceForType() { + return com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.getDefaultInstance(); + } + + @java.lang.Override + public com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo build() { + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo buildPartial() { + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo result = new com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo(this); + result.apexerCommandLine_ = apexerCommandLine_; + result.fileContexts_ = fileContexts_; + result.cannedFsConfig_ = cannedFsConfig_; + result.androidManifest_ = androidManifest_; + result.minSdkVersion_ = minSdkVersion_; + result.targetSdkVersion_ = targetSdkVersion_; + result.noHashtree_ = noHashtree_; + result.overrideApkPackageName_ = overrideApkPackageName_; + result.loggingParent_ = loggingParent_; + result.payloadFsType_ = payloadFsType_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo) { + return mergeFrom((com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo other) { + if (other == com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo.getDefaultInstance()) return this; + if (!other.getApexerCommandLine().isEmpty()) { + apexerCommandLine_ = other.apexerCommandLine_; + onChanged(); + } + if (other.getFileContexts() != com.google.protobuf.ByteString.EMPTY) { + setFileContexts(other.getFileContexts()); + } + if (other.getCannedFsConfig() != com.google.protobuf.ByteString.EMPTY) { + setCannedFsConfig(other.getCannedFsConfig()); + } + if (other.getAndroidManifest() != com.google.protobuf.ByteString.EMPTY) { + setAndroidManifest(other.getAndroidManifest()); + } + if (!other.getMinSdkVersion().isEmpty()) { + minSdkVersion_ = other.minSdkVersion_; + onChanged(); + } + if (!other.getTargetSdkVersion().isEmpty()) { + targetSdkVersion_ = other.targetSdkVersion_; + onChanged(); + } + if (other.getNoHashtree() != false) { + setNoHashtree(other.getNoHashtree()); + } + if (!other.getOverrideApkPackageName().isEmpty()) { + overrideApkPackageName_ = other.overrideApkPackageName_; + onChanged(); + } + if (!other.getLoggingParent().isEmpty()) { + loggingParent_ = other.loggingParent_; + onChanged(); + } + if (!other.getPayloadFsType().isEmpty()) { + payloadFsType_ = other.payloadFsType_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object apexerCommandLine_ = ""; + /** + *
+       * Apexer command line.
+       * 
+ * + * string apexer_command_line = 1; + * @return The apexerCommandLine. + */ + public java.lang.String getApexerCommandLine() { + java.lang.Object ref = apexerCommandLine_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + apexerCommandLine_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Apexer command line.
+       * 
+ * + * string apexer_command_line = 1; + * @return The bytes for apexerCommandLine. + */ + public com.google.protobuf.ByteString + getApexerCommandLineBytes() { + java.lang.Object ref = apexerCommandLine_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + apexerCommandLine_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Apexer command line.
+       * 
+ * + * string apexer_command_line = 1; + * @param value The apexerCommandLine to set. + * @return This builder for chaining. + */ + public Builder setApexerCommandLine( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + apexerCommandLine_ = value; + onChanged(); + return this; + } + /** + *
+       * Apexer command line.
+       * 
+ * + * string apexer_command_line = 1; + * @return This builder for chaining. + */ + public Builder clearApexerCommandLine() { + + apexerCommandLine_ = getDefaultInstance().getApexerCommandLine(); + onChanged(); + return this; + } + /** + *
+       * Apexer command line.
+       * 
+ * + * string apexer_command_line = 1; + * @param value The bytes for apexerCommandLine to set. + * @return This builder for chaining. + */ + public Builder setApexerCommandLineBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + apexerCommandLine_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString fileContexts_ = com.google.protobuf.ByteString.EMPTY; + /** + *
+       * Content of the selinux file contexts file.
+       * 
+ * + * bytes file_contexts = 2; + * @return The fileContexts. + */ + @java.lang.Override + public com.google.protobuf.ByteString getFileContexts() { + return fileContexts_; + } + /** + *
+       * Content of the selinux file contexts file.
+       * 
+ * + * bytes file_contexts = 2; + * @param value The fileContexts to set. + * @return This builder for chaining. + */ + public Builder setFileContexts(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + fileContexts_ = value; + onChanged(); + return this; + } + /** + *
+       * Content of the selinux file contexts file.
+       * 
+ * + * bytes file_contexts = 2; + * @return This builder for chaining. + */ + public Builder clearFileContexts() { + + fileContexts_ = getDefaultInstance().getFileContexts(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString cannedFsConfig_ = com.google.protobuf.ByteString.EMPTY; + /** + *
+       * Content of the canned_fs_config specifying uid/gid/mode of files.
+       * 
+ * + * bytes canned_fs_config = 3; + * @return The cannedFsConfig. + */ + @java.lang.Override + public com.google.protobuf.ByteString getCannedFsConfig() { + return cannedFsConfig_; + } + /** + *
+       * Content of the canned_fs_config specifying uid/gid/mode of files.
+       * 
+ * + * bytes canned_fs_config = 3; + * @param value The cannedFsConfig to set. + * @return This builder for chaining. + */ + public Builder setCannedFsConfig(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + cannedFsConfig_ = value; + onChanged(); + return this; + } + /** + *
+       * Content of the canned_fs_config specifying uid/gid/mode of files.
+       * 
+ * + * bytes canned_fs_config = 3; + * @return This builder for chaining. + */ + public Builder clearCannedFsConfig() { + + cannedFsConfig_ = getDefaultInstance().getCannedFsConfig(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString androidManifest_ = com.google.protobuf.ByteString.EMPTY; + /** + *
+       * Content of the original AndroidManifest.xml, before being compiled by aapt.
+       * 
+ * + * bytes android_manifest = 4; + * @return The androidManifest. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAndroidManifest() { + return androidManifest_; + } + /** + *
+       * Content of the original AndroidManifest.xml, before being compiled by aapt.
+       * 
+ * + * bytes android_manifest = 4; + * @param value The androidManifest to set. + * @return This builder for chaining. + */ + public Builder setAndroidManifest(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + androidManifest_ = value; + onChanged(); + return this; + } + /** + *
+       * Content of the original AndroidManifest.xml, before being compiled by aapt.
+       * 
+ * + * bytes android_manifest = 4; + * @return This builder for chaining. + */ + public Builder clearAndroidManifest() { + + androidManifest_ = getDefaultInstance().getAndroidManifest(); + onChanged(); + return this; + } + + private java.lang.Object minSdkVersion_ = ""; + /** + *
+       * Value of --min_sdk_version parameter passed at build time.
+       * 
+ * + * string min_sdk_version = 5; + * @return The minSdkVersion. + */ + public java.lang.String getMinSdkVersion() { + java.lang.Object ref = minSdkVersion_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + minSdkVersion_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Value of --min_sdk_version parameter passed at build time.
+       * 
+ * + * string min_sdk_version = 5; + * @return The bytes for minSdkVersion. + */ + public com.google.protobuf.ByteString + getMinSdkVersionBytes() { + java.lang.Object ref = minSdkVersion_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + minSdkVersion_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Value of --min_sdk_version parameter passed at build time.
+       * 
+ * + * string min_sdk_version = 5; + * @param value The minSdkVersion to set. + * @return This builder for chaining. + */ + public Builder setMinSdkVersion( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + minSdkVersion_ = value; + onChanged(); + return this; + } + /** + *
+       * Value of --min_sdk_version parameter passed at build time.
+       * 
+ * + * string min_sdk_version = 5; + * @return This builder for chaining. + */ + public Builder clearMinSdkVersion() { + + minSdkVersion_ = getDefaultInstance().getMinSdkVersion(); + onChanged(); + return this; + } + /** + *
+       * Value of --min_sdk_version parameter passed at build time.
+       * 
+ * + * string min_sdk_version = 5; + * @param value The bytes for minSdkVersion to set. + * @return This builder for chaining. + */ + public Builder setMinSdkVersionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + minSdkVersion_ = value; + onChanged(); + return this; + } + + private java.lang.Object targetSdkVersion_ = ""; + /** + *
+       * Value of --target_sdk_version parameter passed at build time.
+       * 
+ * + * string target_sdk_version = 6; + * @return The targetSdkVersion. + */ + public java.lang.String getTargetSdkVersion() { + java.lang.Object ref = targetSdkVersion_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + targetSdkVersion_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Value of --target_sdk_version parameter passed at build time.
+       * 
+ * + * string target_sdk_version = 6; + * @return The bytes for targetSdkVersion. + */ + public com.google.protobuf.ByteString + getTargetSdkVersionBytes() { + java.lang.Object ref = targetSdkVersion_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + targetSdkVersion_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Value of --target_sdk_version parameter passed at build time.
+       * 
+ * + * string target_sdk_version = 6; + * @param value The targetSdkVersion to set. + * @return This builder for chaining. + */ + public Builder setTargetSdkVersion( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + targetSdkVersion_ = value; + onChanged(); + return this; + } + /** + *
+       * Value of --target_sdk_version parameter passed at build time.
+       * 
+ * + * string target_sdk_version = 6; + * @return This builder for chaining. + */ + public Builder clearTargetSdkVersion() { + + targetSdkVersion_ = getDefaultInstance().getTargetSdkVersion(); + onChanged(); + return this; + } + /** + *
+       * Value of --target_sdk_version parameter passed at build time.
+       * 
+ * + * string target_sdk_version = 6; + * @param value The bytes for targetSdkVersion to set. + * @return This builder for chaining. + */ + public Builder setTargetSdkVersionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + targetSdkVersion_ = value; + onChanged(); + return this; + } + + private boolean noHashtree_ ; + /** + *
+       * Whether the --no_hashtree option was set at build time.
+       * 
+ * + * bool no_hashtree = 7; + * @return The noHashtree. + */ + @java.lang.Override + public boolean getNoHashtree() { + return noHashtree_; + } + /** + *
+       * Whether the --no_hashtree option was set at build time.
+       * 
+ * + * bool no_hashtree = 7; + * @param value The noHashtree to set. + * @return This builder for chaining. + */ + public Builder setNoHashtree(boolean value) { + + noHashtree_ = value; + onChanged(); + return this; + } + /** + *
+       * Whether the --no_hashtree option was set at build time.
+       * 
+ * + * bool no_hashtree = 7; + * @return This builder for chaining. + */ + public Builder clearNoHashtree() { + + noHashtree_ = false; + onChanged(); + return this; + } + + private java.lang.Object overrideApkPackageName_ = ""; + /** + *
+       * Value of --override_apk_package_name passed at build itme.
+       * 
+ * + * string override_apk_package_name = 8; + * @return The overrideApkPackageName. + */ + public java.lang.String getOverrideApkPackageName() { + java.lang.Object ref = overrideApkPackageName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + overrideApkPackageName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Value of --override_apk_package_name passed at build itme.
+       * 
+ * + * string override_apk_package_name = 8; + * @return The bytes for overrideApkPackageName. + */ + public com.google.protobuf.ByteString + getOverrideApkPackageNameBytes() { + java.lang.Object ref = overrideApkPackageName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + overrideApkPackageName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Value of --override_apk_package_name passed at build itme.
+       * 
+ * + * string override_apk_package_name = 8; + * @param value The overrideApkPackageName to set. + * @return This builder for chaining. + */ + public Builder setOverrideApkPackageName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + overrideApkPackageName_ = value; + onChanged(); + return this; + } + /** + *
+       * Value of --override_apk_package_name passed at build itme.
+       * 
+ * + * string override_apk_package_name = 8; + * @return This builder for chaining. + */ + public Builder clearOverrideApkPackageName() { + + overrideApkPackageName_ = getDefaultInstance().getOverrideApkPackageName(); + onChanged(); + return this; + } + /** + *
+       * Value of --override_apk_package_name passed at build itme.
+       * 
+ * + * string override_apk_package_name = 8; + * @param value The bytes for overrideApkPackageName to set. + * @return This builder for chaining. + */ + public Builder setOverrideApkPackageNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + overrideApkPackageName_ = value; + onChanged(); + return this; + } + + private java.lang.Object loggingParent_ = ""; + /** + *
+       * Value of --logging_parent passed at build time.
+       * 
+ * + * string logging_parent = 9; + * @return The loggingParent. + */ + public java.lang.String getLoggingParent() { + java.lang.Object ref = loggingParent_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + loggingParent_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Value of --logging_parent passed at build time.
+       * 
+ * + * string logging_parent = 9; + * @return The bytes for loggingParent. + */ + public com.google.protobuf.ByteString + getLoggingParentBytes() { + java.lang.Object ref = loggingParent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + loggingParent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Value of --logging_parent passed at build time.
+       * 
+ * + * string logging_parent = 9; + * @param value The loggingParent to set. + * @return This builder for chaining. + */ + public Builder setLoggingParent( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + loggingParent_ = value; + onChanged(); + return this; + } + /** + *
+       * Value of --logging_parent passed at build time.
+       * 
+ * + * string logging_parent = 9; + * @return This builder for chaining. + */ + public Builder clearLoggingParent() { + + loggingParent_ = getDefaultInstance().getLoggingParent(); + onChanged(); + return this; + } + /** + *
+       * Value of --logging_parent passed at build time.
+       * 
+ * + * string logging_parent = 9; + * @param value The bytes for loggingParent to set. + * @return This builder for chaining. + */ + public Builder setLoggingParentBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + loggingParent_ = value; + onChanged(); + return this; + } + + private java.lang.Object payloadFsType_ = ""; + /** + *
+       * Value of --payload_fs_type passed at build time.
+       * 
+ * + * string payload_fs_type = 10; + * @return The payloadFsType. + */ + public java.lang.String getPayloadFsType() { + java.lang.Object ref = payloadFsType_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + payloadFsType_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Value of --payload_fs_type passed at build time.
+       * 
+ * + * string payload_fs_type = 10; + * @return The bytes for payloadFsType. + */ + public com.google.protobuf.ByteString + getPayloadFsTypeBytes() { + java.lang.Object ref = payloadFsType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + payloadFsType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Value of --payload_fs_type passed at build time.
+       * 
+ * + * string payload_fs_type = 10; + * @param value The payloadFsType to set. + * @return This builder for chaining. + */ + public Builder setPayloadFsType( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + payloadFsType_ = value; + onChanged(); + return this; + } + /** + *
+       * Value of --payload_fs_type passed at build time.
+       * 
+ * + * string payload_fs_type = 10; + * @return This builder for chaining. + */ + public Builder clearPayloadFsType() { + + payloadFsType_ = getDefaultInstance().getPayloadFsType(); + onChanged(); + return this; + } + /** + *
+       * Value of --payload_fs_type passed at build time.
+       * 
+ * + * string payload_fs_type = 10; + * @param value The bytes for payloadFsType to set. + * @return This builder for chaining. + */ + public Builder setPayloadFsTypeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + payloadFsType_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:apex.proto.ApexBuildInfo) + } + + // @@protoc_insertion_point(class_scope:apex.proto.ApexBuildInfo) + private static final com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo(); + } + + public static com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ApexBuildInfo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ApexBuildInfo(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.android.apex.ApexBuildInfoOuterClass.ApexBuildInfo getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_apex_proto_ApexBuildInfo_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_apex_proto_ApexBuildInfo_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\025apex_build_info.proto\022\napex.proto\"\225\002\n\r" + + "ApexBuildInfo\022\033\n\023apexer_command_line\030\001 \001" + + "(\t\022\025\n\rfile_contexts\030\002 \001(\014\022\030\n\020canned_fs_c" + + "onfig\030\003 \001(\014\022\030\n\020android_manifest\030\004 \001(\014\022\027\n" + + "\017min_sdk_version\030\005 \001(\t\022\032\n\022target_sdk_ver" + + "sion\030\006 \001(\t\022\023\n\013no_hashtree\030\007 \001(\010\022!\n\031overr" + + "ide_apk_package_name\030\010 \001(\t\022\026\n\016logging_pa" + + "rent\030\t \001(\t\022\027\n\017payload_fs_type\030\n \001(\tB\022\n\020c" + + "om.android.apexb\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_apex_proto_ApexBuildInfo_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_apex_proto_ApexBuildInfo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_apex_proto_ApexBuildInfo_descriptor, + new java.lang.String[] { "ApexerCommandLine", "FileContexts", "CannedFsConfig", "AndroidManifest", "MinSdkVersion", "TargetSdkVersion", "NoHashtree", "OverrideApkPackageName", "LoggingParent", "PayloadFsType", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/bbootimg/src/main/java/com/android/apex/ApexManifestOuterClass.java b/bbootimg/src/main/java/com/android/apex/ApexManifestOuterClass.java new file mode 100644 index 0000000..d21390d --- /dev/null +++ b/bbootimg/src/main/java/com/android/apex/ApexManifestOuterClass.java @@ -0,0 +1,3736 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: apex_manifest.proto + +package com.android.apex; + +public final class ApexManifestOuterClass { + private ApexManifestOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ApexManifestOrBuilder extends + // @@protoc_insertion_point(interface_extends:apex.proto.ApexManifest) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * Package Name
+     * 
+ * + * string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + *
+     * Package Name
+     * 
+ * + * string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + *
+     * Version Number
+     * 
+ * + * int64 version = 2; + * @return The version. + */ + long getVersion(); + + /** + *
+     * Pre Install Hook
+     * 
+ * + * string preInstallHook = 3; + * @return The preInstallHook. + */ + java.lang.String getPreInstallHook(); + /** + *
+     * Pre Install Hook
+     * 
+ * + * string preInstallHook = 3; + * @return The bytes for preInstallHook. + */ + com.google.protobuf.ByteString + getPreInstallHookBytes(); + + /** + *
+     * Post Install Hook
+     * 
+ * + * string postInstallHook = 4; + * @return The postInstallHook. + */ + java.lang.String getPostInstallHook(); + /** + *
+     * Post Install Hook
+     * 
+ * + * string postInstallHook = 4; + * @return The bytes for postInstallHook. + */ + com.google.protobuf.ByteString + getPostInstallHookBytes(); + + /** + *
+     * Version Name
+     * 
+ * + * string versionName = 5; + * @return The versionName. + */ + java.lang.String getVersionName(); + /** + *
+     * Version Name
+     * 
+ * + * string versionName = 5; + * @return The bytes for versionName. + */ + com.google.protobuf.ByteString + getVersionNameBytes(); + + /** + *
+     * Signals whenever this APEX doesn't contain any executable code.
+     * If this field is set to true, then apexd will mount this apex
+     * with MS_NOEXEC flag.
+     * 
+ * + * bool noCode = 6; + * @return The noCode. + */ + boolean getNoCode(); + + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @return A list containing the provideNativeLibs. + */ + java.util.List + getProvideNativeLibsList(); + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @return The count of provideNativeLibs. + */ + int getProvideNativeLibsCount(); + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index of the element to return. + * @return The provideNativeLibs at the given index. + */ + java.lang.String getProvideNativeLibs(int index); + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index of the value to return. + * @return The bytes of the provideNativeLibs at the given index. + */ + com.google.protobuf.ByteString + getProvideNativeLibsBytes(int index); + + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @return A list containing the requireNativeLibs. + */ + java.util.List + getRequireNativeLibsList(); + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @return The count of requireNativeLibs. + */ + int getRequireNativeLibsCount(); + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index of the element to return. + * @return The requireNativeLibs at the given index. + */ + java.lang.String getRequireNativeLibs(int index); + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index of the value to return. + * @return The bytes of the requireNativeLibs at the given index. + */ + com.google.protobuf.ByteString + getRequireNativeLibsBytes(int index); + + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @return A list containing the jniLibs. + */ + java.util.List + getJniLibsList(); + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @return The count of jniLibs. + */ + int getJniLibsCount(); + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @param index The index of the element to return. + * @return The jniLibs at the given index. + */ + java.lang.String getJniLibs(int index); + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @param index The index of the value to return. + * @return The bytes of the jniLibs at the given index. + */ + com.google.protobuf.ByteString + getJniLibsBytes(int index); + + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return A list containing the requireSharedApexLibs. + */ + java.util.List + getRequireSharedApexLibsList(); + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return The count of requireSharedApexLibs. + */ + int getRequireSharedApexLibsCount(); + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index of the element to return. + * @return The requireSharedApexLibs at the given index. + */ + java.lang.String getRequireSharedApexLibs(int index); + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index of the value to return. + * @return The bytes of the requireSharedApexLibs at the given index. + */ + com.google.protobuf.ByteString + getRequireSharedApexLibsBytes(int index); + + /** + *
+     * Whether this APEX provides libraries to be shared with other APEXs. This
+     * causes libraries contained in the APEX to be made available under
+     * /apex/sharedlibs .
+     * 
+ * + * bool provideSharedApexLibs = 11; + * @return The provideSharedApexLibs. + */ + boolean getProvideSharedApexLibs(); + + /** + *
+     * Exists only for compressed APEX
+     * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + * @return Whether the capexMetadata field is set. + */ + boolean hasCapexMetadata(); + /** + *
+     * Exists only for compressed APEX
+     * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + * @return The capexMetadata. + */ + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata getCapexMetadata(); + /** + *
+     * Exists only for compressed APEX
+     * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder getCapexMetadataOrBuilder(); + + /** + *
+     * Indicates that this APEX can be updated without rebooting device.
+     * 
+ * + * bool supportsRebootlessUpdate = 13; + * @return The supportsRebootlessUpdate. + */ + boolean getSupportsRebootlessUpdate(); + } + /** + * Protobuf type {@code apex.proto.ApexManifest} + */ + public static final class ApexManifest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:apex.proto.ApexManifest) + ApexManifestOrBuilder { + private static final long serialVersionUID = 0L; + // Use ApexManifest.newBuilder() to construct. + private ApexManifest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ApexManifest() { + name_ = ""; + preInstallHook_ = ""; + postInstallHook_ = ""; + versionName_ = ""; + provideNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + requireNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + jniLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + requireSharedApexLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ApexManifest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ApexManifest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + name_ = s; + break; + } + case 16: { + + version_ = input.readInt64(); + break; + } + case 26: { + java.lang.String s = input.readStringRequireUtf8(); + + preInstallHook_ = s; + break; + } + case 34: { + java.lang.String s = input.readStringRequireUtf8(); + + postInstallHook_ = s; + break; + } + case 42: { + java.lang.String s = input.readStringRequireUtf8(); + + versionName_ = s; + break; + } + case 48: { + + noCode_ = input.readBool(); + break; + } + case 58: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + provideNativeLibs_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000001; + } + provideNativeLibs_.add(s); + break; + } + case 66: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + requireNativeLibs_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000002; + } + requireNativeLibs_.add(s); + break; + } + case 74: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + jniLibs_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000004; + } + jniLibs_.add(s); + break; + } + case 82: { + java.lang.String s = input.readStringRequireUtf8(); + if (!((mutable_bitField0_ & 0x00000008) != 0)) { + requireSharedApexLibs_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + requireSharedApexLibs_.add(s); + break; + } + case 88: { + + provideSharedApexLibs_ = input.readBool(); + break; + } + case 98: { + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder subBuilder = null; + if (capexMetadata_ != null) { + subBuilder = capexMetadata_.toBuilder(); + } + capexMetadata_ = input.readMessage(com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(capexMetadata_); + capexMetadata_ = subBuilder.buildPartial(); + } + + break; + } + case 104: { + + supportsRebootlessUpdate_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + provideNativeLibs_ = provideNativeLibs_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000002) != 0)) { + requireNativeLibs_ = requireNativeLibs_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000004) != 0)) { + jniLibs_ = jniLibs_.getUnmodifiableView(); + } + if (((mutable_bitField0_ & 0x00000008) != 0)) { + requireSharedApexLibs_ = requireSharedApexLibs_.getUnmodifiableView(); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.android.apex.ApexManifestOuterClass.ApexManifest.class, com.android.apex.ApexManifestOuterClass.ApexManifest.Builder.class); + } + + public interface CompressedApexMetadataOrBuilder extends + // @@protoc_insertion_point(interface_extends:apex.proto.ApexManifest.CompressedApexMetadata) + com.google.protobuf.MessageOrBuilder { + + /** + *
+       * Valid only for compressed APEX. This field contains the root digest of
+       * the original_apex contained inside CAPEX.
+       * 
+ * + * string originalApexDigest = 1; + * @return The originalApexDigest. + */ + java.lang.String getOriginalApexDigest(); + /** + *
+       * Valid only for compressed APEX. This field contains the root digest of
+       * the original_apex contained inside CAPEX.
+       * 
+ * + * string originalApexDigest = 1; + * @return The bytes for originalApexDigest. + */ + com.google.protobuf.ByteString + getOriginalApexDigestBytes(); + } + /** + * Protobuf type {@code apex.proto.ApexManifest.CompressedApexMetadata} + */ + public static final class CompressedApexMetadata extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:apex.proto.ApexManifest.CompressedApexMetadata) + CompressedApexMetadataOrBuilder { + private static final long serialVersionUID = 0L; + // Use CompressedApexMetadata.newBuilder() to construct. + private CompressedApexMetadata(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CompressedApexMetadata() { + originalApexDigest_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CompressedApexMetadata(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CompressedApexMetadata( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + java.lang.String s = input.readStringRequireUtf8(); + + originalApexDigest_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_CompressedApexMetadata_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_CompressedApexMetadata_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.class, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder.class); + } + + public static final int ORIGINALAPEXDIGEST_FIELD_NUMBER = 1; + private volatile java.lang.Object originalApexDigest_; + /** + *
+       * Valid only for compressed APEX. This field contains the root digest of
+       * the original_apex contained inside CAPEX.
+       * 
+ * + * string originalApexDigest = 1; + * @return The originalApexDigest. + */ + @java.lang.Override + public java.lang.String getOriginalApexDigest() { + java.lang.Object ref = originalApexDigest_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + originalApexDigest_ = s; + return s; + } + } + /** + *
+       * Valid only for compressed APEX. This field contains the root digest of
+       * the original_apex contained inside CAPEX.
+       * 
+ * + * string originalApexDigest = 1; + * @return The bytes for originalApexDigest. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getOriginalApexDigestBytes() { + java.lang.Object ref = originalApexDigest_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + originalApexDigest_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getOriginalApexDigestBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, originalApexDigest_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getOriginalApexDigestBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, originalApexDigest_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata)) { + return super.equals(obj); + } + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata other = (com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata) obj; + + if (!getOriginalApexDigest() + .equals(other.getOriginalApexDigest())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ORIGINALAPEXDIGEST_FIELD_NUMBER; + hash = (53 * hash) + getOriginalApexDigest().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code apex.proto.ApexManifest.CompressedApexMetadata} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:apex.proto.ApexManifest.CompressedApexMetadata) + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_CompressedApexMetadata_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_CompressedApexMetadata_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.class, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder.class); + } + + // Construct using com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + originalApexDigest_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_CompressedApexMetadata_descriptor; + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata getDefaultInstanceForType() { + return com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.getDefaultInstance(); + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata build() { + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata buildPartial() { + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata result = new com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata(this); + result.originalApexDigest_ = originalApexDigest_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata) { + return mergeFrom((com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata other) { + if (other == com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.getDefaultInstance()) return this; + if (!other.getOriginalApexDigest().isEmpty()) { + originalApexDigest_ = other.originalApexDigest_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private java.lang.Object originalApexDigest_ = ""; + /** + *
+         * Valid only for compressed APEX. This field contains the root digest of
+         * the original_apex contained inside CAPEX.
+         * 
+ * + * string originalApexDigest = 1; + * @return The originalApexDigest. + */ + public java.lang.String getOriginalApexDigest() { + java.lang.Object ref = originalApexDigest_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + originalApexDigest_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+         * Valid only for compressed APEX. This field contains the root digest of
+         * the original_apex contained inside CAPEX.
+         * 
+ * + * string originalApexDigest = 1; + * @return The bytes for originalApexDigest. + */ + public com.google.protobuf.ByteString + getOriginalApexDigestBytes() { + java.lang.Object ref = originalApexDigest_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + originalApexDigest_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+         * Valid only for compressed APEX. This field contains the root digest of
+         * the original_apex contained inside CAPEX.
+         * 
+ * + * string originalApexDigest = 1; + * @param value The originalApexDigest to set. + * @return This builder for chaining. + */ + public Builder setOriginalApexDigest( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + originalApexDigest_ = value; + onChanged(); + return this; + } + /** + *
+         * Valid only for compressed APEX. This field contains the root digest of
+         * the original_apex contained inside CAPEX.
+         * 
+ * + * string originalApexDigest = 1; + * @return This builder for chaining. + */ + public Builder clearOriginalApexDigest() { + + originalApexDigest_ = getDefaultInstance().getOriginalApexDigest(); + onChanged(); + return this; + } + /** + *
+         * Valid only for compressed APEX. This field contains the root digest of
+         * the original_apex contained inside CAPEX.
+         * 
+ * + * string originalApexDigest = 1; + * @param value The bytes for originalApexDigest to set. + * @return This builder for chaining. + */ + public Builder setOriginalApexDigestBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + originalApexDigest_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:apex.proto.ApexManifest.CompressedApexMetadata) + } + + // @@protoc_insertion_point(class_scope:apex.proto.ApexManifest.CompressedApexMetadata) + private static final com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata(); + } + + public static com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CompressedApexMetadata parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CompressedApexMetadata(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + *
+     * Package Name
+     * 
+ * + * string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + *
+     * Package Name
+     * 
+ * + * string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VERSION_FIELD_NUMBER = 2; + private long version_; + /** + *
+     * Version Number
+     * 
+ * + * int64 version = 2; + * @return The version. + */ + @java.lang.Override + public long getVersion() { + return version_; + } + + public static final int PREINSTALLHOOK_FIELD_NUMBER = 3; + private volatile java.lang.Object preInstallHook_; + /** + *
+     * Pre Install Hook
+     * 
+ * + * string preInstallHook = 3; + * @return The preInstallHook. + */ + @java.lang.Override + public java.lang.String getPreInstallHook() { + java.lang.Object ref = preInstallHook_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + preInstallHook_ = s; + return s; + } + } + /** + *
+     * Pre Install Hook
+     * 
+ * + * string preInstallHook = 3; + * @return The bytes for preInstallHook. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getPreInstallHookBytes() { + java.lang.Object ref = preInstallHook_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + preInstallHook_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int POSTINSTALLHOOK_FIELD_NUMBER = 4; + private volatile java.lang.Object postInstallHook_; + /** + *
+     * Post Install Hook
+     * 
+ * + * string postInstallHook = 4; + * @return The postInstallHook. + */ + @java.lang.Override + public java.lang.String getPostInstallHook() { + java.lang.Object ref = postInstallHook_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + postInstallHook_ = s; + return s; + } + } + /** + *
+     * Post Install Hook
+     * 
+ * + * string postInstallHook = 4; + * @return The bytes for postInstallHook. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getPostInstallHookBytes() { + java.lang.Object ref = postInstallHook_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + postInstallHook_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VERSIONNAME_FIELD_NUMBER = 5; + private volatile java.lang.Object versionName_; + /** + *
+     * Version Name
+     * 
+ * + * string versionName = 5; + * @return The versionName. + */ + @java.lang.Override + public java.lang.String getVersionName() { + java.lang.Object ref = versionName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + versionName_ = s; + return s; + } + } + /** + *
+     * Version Name
+     * 
+ * + * string versionName = 5; + * @return The bytes for versionName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getVersionNameBytes() { + java.lang.Object ref = versionName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + versionName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int NOCODE_FIELD_NUMBER = 6; + private boolean noCode_; + /** + *
+     * Signals whenever this APEX doesn't contain any executable code.
+     * If this field is set to true, then apexd will mount this apex
+     * with MS_NOEXEC flag.
+     * 
+ * + * bool noCode = 6; + * @return The noCode. + */ + @java.lang.Override + public boolean getNoCode() { + return noCode_; + } + + public static final int PROVIDENATIVELIBS_FIELD_NUMBER = 7; + private com.google.protobuf.LazyStringList provideNativeLibs_; + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @return A list containing the provideNativeLibs. + */ + public com.google.protobuf.ProtocolStringList + getProvideNativeLibsList() { + return provideNativeLibs_; + } + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @return The count of provideNativeLibs. + */ + public int getProvideNativeLibsCount() { + return provideNativeLibs_.size(); + } + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index of the element to return. + * @return The provideNativeLibs at the given index. + */ + public java.lang.String getProvideNativeLibs(int index) { + return provideNativeLibs_.get(index); + } + /** + *
+     * List of native libs which can be used by other apexes or system.
+     * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index of the value to return. + * @return The bytes of the provideNativeLibs at the given index. + */ + public com.google.protobuf.ByteString + getProvideNativeLibsBytes(int index) { + return provideNativeLibs_.getByteString(index); + } + + public static final int REQUIRENATIVELIBS_FIELD_NUMBER = 8; + private com.google.protobuf.LazyStringList requireNativeLibs_; + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @return A list containing the requireNativeLibs. + */ + public com.google.protobuf.ProtocolStringList + getRequireNativeLibsList() { + return requireNativeLibs_; + } + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @return The count of requireNativeLibs. + */ + public int getRequireNativeLibsCount() { + return requireNativeLibs_.size(); + } + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index of the element to return. + * @return The requireNativeLibs at the given index. + */ + public java.lang.String getRequireNativeLibs(int index) { + return requireNativeLibs_.get(index); + } + /** + *
+     * List of native libs which this apex uses from other apexes or system.
+     * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index of the value to return. + * @return The bytes of the requireNativeLibs at the given index. + */ + public com.google.protobuf.ByteString + getRequireNativeLibsBytes(int index) { + return requireNativeLibs_.getByteString(index); + } + + public static final int JNILIBS_FIELD_NUMBER = 9; + private com.google.protobuf.LazyStringList jniLibs_; + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @return A list containing the jniLibs. + */ + public com.google.protobuf.ProtocolStringList + getJniLibsList() { + return jniLibs_; + } + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @return The count of jniLibs. + */ + public int getJniLibsCount() { + return jniLibs_.size(); + } + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @param index The index of the element to return. + * @return The jniLibs at the given index. + */ + public java.lang.String getJniLibs(int index) { + return jniLibs_.get(index); + } + /** + *
+     * List of JNI libs.
+     * linkerconfig/libnativeloader use this field so that java libraries can
+     * load JNI libraries in the same apex.
+     * This is supposed to be filled by the build system with libraries which are
+     * marked as "is_jni: true" from the list of "native_shared_libs".
+     * 
+ * + * repeated string jniLibs = 9; + * @param index The index of the value to return. + * @return The bytes of the jniLibs at the given index. + */ + public com.google.protobuf.ByteString + getJniLibsBytes(int index) { + return jniLibs_.getByteString(index); + } + + public static final int REQUIRESHAREDAPEXLIBS_FIELD_NUMBER = 10; + private com.google.protobuf.LazyStringList requireSharedApexLibs_; + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return A list containing the requireSharedApexLibs. + */ + public com.google.protobuf.ProtocolStringList + getRequireSharedApexLibsList() { + return requireSharedApexLibs_; + } + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return The count of requireSharedApexLibs. + */ + public int getRequireSharedApexLibsCount() { + return requireSharedApexLibs_.size(); + } + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index of the element to return. + * @return The requireSharedApexLibs at the given index. + */ + public java.lang.String getRequireSharedApexLibs(int index) { + return requireSharedApexLibs_.get(index); + } + /** + *
+     * List of libs required that are located in a shared libraries APEX.
+     * Format of the content is 'library:hash'.
+     * Example) libc++.so:83d8f50...
+     * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index of the value to return. + * @return The bytes of the requireSharedApexLibs at the given index. + */ + public com.google.protobuf.ByteString + getRequireSharedApexLibsBytes(int index) { + return requireSharedApexLibs_.getByteString(index); + } + + public static final int PROVIDESHAREDAPEXLIBS_FIELD_NUMBER = 11; + private boolean provideSharedApexLibs_; + /** + *
+     * Whether this APEX provides libraries to be shared with other APEXs. This
+     * causes libraries contained in the APEX to be made available under
+     * /apex/sharedlibs .
+     * 
+ * + * bool provideSharedApexLibs = 11; + * @return The provideSharedApexLibs. + */ + @java.lang.Override + public boolean getProvideSharedApexLibs() { + return provideSharedApexLibs_; + } + + public static final int CAPEXMETADATA_FIELD_NUMBER = 12; + private com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata capexMetadata_; + /** + *
+     * Exists only for compressed APEX
+     * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + * @return Whether the capexMetadata field is set. + */ + @java.lang.Override + public boolean hasCapexMetadata() { + return capexMetadata_ != null; + } + /** + *
+     * Exists only for compressed APEX
+     * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + * @return The capexMetadata. + */ + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata getCapexMetadata() { + return capexMetadata_ == null ? com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.getDefaultInstance() : capexMetadata_; + } + /** + *
+     * Exists only for compressed APEX
+     * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder getCapexMetadataOrBuilder() { + return getCapexMetadata(); + } + + public static final int SUPPORTSREBOOTLESSUPDATE_FIELD_NUMBER = 13; + private boolean supportsRebootlessUpdate_; + /** + *
+     * Indicates that this APEX can be updated without rebooting device.
+     * 
+ * + * bool supportsRebootlessUpdate = 13; + * @return The supportsRebootlessUpdate. + */ + @java.lang.Override + public boolean getSupportsRebootlessUpdate() { + return supportsRebootlessUpdate_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (version_ != 0L) { + output.writeInt64(2, version_); + } + if (!getPreInstallHookBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, preInstallHook_); + } + if (!getPostInstallHookBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, postInstallHook_); + } + if (!getVersionNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, versionName_); + } + if (noCode_ != false) { + output.writeBool(6, noCode_); + } + for (int i = 0; i < provideNativeLibs_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, provideNativeLibs_.getRaw(i)); + } + for (int i = 0; i < requireNativeLibs_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 8, requireNativeLibs_.getRaw(i)); + } + for (int i = 0; i < jniLibs_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 9, jniLibs_.getRaw(i)); + } + for (int i = 0; i < requireSharedApexLibs_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 10, requireSharedApexLibs_.getRaw(i)); + } + if (provideSharedApexLibs_ != false) { + output.writeBool(11, provideSharedApexLibs_); + } + if (capexMetadata_ != null) { + output.writeMessage(12, getCapexMetadata()); + } + if (supportsRebootlessUpdate_ != false) { + output.writeBool(13, supportsRebootlessUpdate_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (version_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, version_); + } + if (!getPreInstallHookBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, preInstallHook_); + } + if (!getPostInstallHookBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, postInstallHook_); + } + if (!getVersionNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, versionName_); + } + if (noCode_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(6, noCode_); + } + { + int dataSize = 0; + for (int i = 0; i < provideNativeLibs_.size(); i++) { + dataSize += computeStringSizeNoTag(provideNativeLibs_.getRaw(i)); + } + size += dataSize; + size += 1 * getProvideNativeLibsList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < requireNativeLibs_.size(); i++) { + dataSize += computeStringSizeNoTag(requireNativeLibs_.getRaw(i)); + } + size += dataSize; + size += 1 * getRequireNativeLibsList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < jniLibs_.size(); i++) { + dataSize += computeStringSizeNoTag(jniLibs_.getRaw(i)); + } + size += dataSize; + size += 1 * getJniLibsList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < requireSharedApexLibs_.size(); i++) { + dataSize += computeStringSizeNoTag(requireSharedApexLibs_.getRaw(i)); + } + size += dataSize; + size += 1 * getRequireSharedApexLibsList().size(); + } + if (provideSharedApexLibs_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(11, provideSharedApexLibs_); + } + if (capexMetadata_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(12, getCapexMetadata()); + } + if (supportsRebootlessUpdate_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(13, supportsRebootlessUpdate_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.android.apex.ApexManifestOuterClass.ApexManifest)) { + return super.equals(obj); + } + com.android.apex.ApexManifestOuterClass.ApexManifest other = (com.android.apex.ApexManifestOuterClass.ApexManifest) obj; + + if (!getName() + .equals(other.getName())) return false; + if (getVersion() + != other.getVersion()) return false; + if (!getPreInstallHook() + .equals(other.getPreInstallHook())) return false; + if (!getPostInstallHook() + .equals(other.getPostInstallHook())) return false; + if (!getVersionName() + .equals(other.getVersionName())) return false; + if (getNoCode() + != other.getNoCode()) return false; + if (!getProvideNativeLibsList() + .equals(other.getProvideNativeLibsList())) return false; + if (!getRequireNativeLibsList() + .equals(other.getRequireNativeLibsList())) return false; + if (!getJniLibsList() + .equals(other.getJniLibsList())) return false; + if (!getRequireSharedApexLibsList() + .equals(other.getRequireSharedApexLibsList())) return false; + if (getProvideSharedApexLibs() + != other.getProvideSharedApexLibs()) return false; + if (hasCapexMetadata() != other.hasCapexMetadata()) return false; + if (hasCapexMetadata()) { + if (!getCapexMetadata() + .equals(other.getCapexMetadata())) return false; + } + if (getSupportsRebootlessUpdate() + != other.getSupportsRebootlessUpdate()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + hash = (37 * hash) + VERSION_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getVersion()); + hash = (37 * hash) + PREINSTALLHOOK_FIELD_NUMBER; + hash = (53 * hash) + getPreInstallHook().hashCode(); + hash = (37 * hash) + POSTINSTALLHOOK_FIELD_NUMBER; + hash = (53 * hash) + getPostInstallHook().hashCode(); + hash = (37 * hash) + VERSIONNAME_FIELD_NUMBER; + hash = (53 * hash) + getVersionName().hashCode(); + hash = (37 * hash) + NOCODE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getNoCode()); + if (getProvideNativeLibsCount() > 0) { + hash = (37 * hash) + PROVIDENATIVELIBS_FIELD_NUMBER; + hash = (53 * hash) + getProvideNativeLibsList().hashCode(); + } + if (getRequireNativeLibsCount() > 0) { + hash = (37 * hash) + REQUIRENATIVELIBS_FIELD_NUMBER; + hash = (53 * hash) + getRequireNativeLibsList().hashCode(); + } + if (getJniLibsCount() > 0) { + hash = (37 * hash) + JNILIBS_FIELD_NUMBER; + hash = (53 * hash) + getJniLibsList().hashCode(); + } + if (getRequireSharedApexLibsCount() > 0) { + hash = (37 * hash) + REQUIRESHAREDAPEXLIBS_FIELD_NUMBER; + hash = (53 * hash) + getRequireSharedApexLibsList().hashCode(); + } + hash = (37 * hash) + PROVIDESHAREDAPEXLIBS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getProvideSharedApexLibs()); + if (hasCapexMetadata()) { + hash = (37 * hash) + CAPEXMETADATA_FIELD_NUMBER; + hash = (53 * hash) + getCapexMetadata().hashCode(); + } + hash = (37 * hash) + SUPPORTSREBOOTLESSUPDATE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getSupportsRebootlessUpdate()); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.android.apex.ApexManifestOuterClass.ApexManifest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.android.apex.ApexManifestOuterClass.ApexManifest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code apex.proto.ApexManifest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:apex.proto.ApexManifest) + com.android.apex.ApexManifestOuterClass.ApexManifestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.android.apex.ApexManifestOuterClass.ApexManifest.class, com.android.apex.ApexManifestOuterClass.ApexManifest.Builder.class); + } + + // Construct using com.android.apex.ApexManifestOuterClass.ApexManifest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + name_ = ""; + + version_ = 0L; + + preInstallHook_ = ""; + + postInstallHook_ = ""; + + versionName_ = ""; + + noCode_ = false; + + provideNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + requireNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + jniLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + requireSharedApexLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + provideSharedApexLibs_ = false; + + if (capexMetadataBuilder_ == null) { + capexMetadata_ = null; + } else { + capexMetadata_ = null; + capexMetadataBuilder_ = null; + } + supportsRebootlessUpdate_ = false; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.android.apex.ApexManifestOuterClass.internal_static_apex_proto_ApexManifest_descriptor; + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest getDefaultInstanceForType() { + return com.android.apex.ApexManifestOuterClass.ApexManifest.getDefaultInstance(); + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest build() { + com.android.apex.ApexManifestOuterClass.ApexManifest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest buildPartial() { + com.android.apex.ApexManifestOuterClass.ApexManifest result = new com.android.apex.ApexManifestOuterClass.ApexManifest(this); + int from_bitField0_ = bitField0_; + result.name_ = name_; + result.version_ = version_; + result.preInstallHook_ = preInstallHook_; + result.postInstallHook_ = postInstallHook_; + result.versionName_ = versionName_; + result.noCode_ = noCode_; + if (((bitField0_ & 0x00000001) != 0)) { + provideNativeLibs_ = provideNativeLibs_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.provideNativeLibs_ = provideNativeLibs_; + if (((bitField0_ & 0x00000002) != 0)) { + requireNativeLibs_ = requireNativeLibs_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.requireNativeLibs_ = requireNativeLibs_; + if (((bitField0_ & 0x00000004) != 0)) { + jniLibs_ = jniLibs_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.jniLibs_ = jniLibs_; + if (((bitField0_ & 0x00000008) != 0)) { + requireSharedApexLibs_ = requireSharedApexLibs_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.requireSharedApexLibs_ = requireSharedApexLibs_; + result.provideSharedApexLibs_ = provideSharedApexLibs_; + if (capexMetadataBuilder_ == null) { + result.capexMetadata_ = capexMetadata_; + } else { + result.capexMetadata_ = capexMetadataBuilder_.build(); + } + result.supportsRebootlessUpdate_ = supportsRebootlessUpdate_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.android.apex.ApexManifestOuterClass.ApexManifest) { + return mergeFrom((com.android.apex.ApexManifestOuterClass.ApexManifest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.android.apex.ApexManifestOuterClass.ApexManifest other) { + if (other == com.android.apex.ApexManifestOuterClass.ApexManifest.getDefaultInstance()) return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + onChanged(); + } + if (other.getVersion() != 0L) { + setVersion(other.getVersion()); + } + if (!other.getPreInstallHook().isEmpty()) { + preInstallHook_ = other.preInstallHook_; + onChanged(); + } + if (!other.getPostInstallHook().isEmpty()) { + postInstallHook_ = other.postInstallHook_; + onChanged(); + } + if (!other.getVersionName().isEmpty()) { + versionName_ = other.versionName_; + onChanged(); + } + if (other.getNoCode() != false) { + setNoCode(other.getNoCode()); + } + if (!other.provideNativeLibs_.isEmpty()) { + if (provideNativeLibs_.isEmpty()) { + provideNativeLibs_ = other.provideNativeLibs_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureProvideNativeLibsIsMutable(); + provideNativeLibs_.addAll(other.provideNativeLibs_); + } + onChanged(); + } + if (!other.requireNativeLibs_.isEmpty()) { + if (requireNativeLibs_.isEmpty()) { + requireNativeLibs_ = other.requireNativeLibs_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureRequireNativeLibsIsMutable(); + requireNativeLibs_.addAll(other.requireNativeLibs_); + } + onChanged(); + } + if (!other.jniLibs_.isEmpty()) { + if (jniLibs_.isEmpty()) { + jniLibs_ = other.jniLibs_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureJniLibsIsMutable(); + jniLibs_.addAll(other.jniLibs_); + } + onChanged(); + } + if (!other.requireSharedApexLibs_.isEmpty()) { + if (requireSharedApexLibs_.isEmpty()) { + requireSharedApexLibs_ = other.requireSharedApexLibs_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureRequireSharedApexLibsIsMutable(); + requireSharedApexLibs_.addAll(other.requireSharedApexLibs_); + } + onChanged(); + } + if (other.getProvideSharedApexLibs() != false) { + setProvideSharedApexLibs(other.getProvideSharedApexLibs()); + } + if (other.hasCapexMetadata()) { + mergeCapexMetadata(other.getCapexMetadata()); + } + if (other.getSupportsRebootlessUpdate() != false) { + setSupportsRebootlessUpdate(other.getSupportsRebootlessUpdate()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.android.apex.ApexManifestOuterClass.ApexManifest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.android.apex.ApexManifestOuterClass.ApexManifest) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + *
+       * Package Name
+       * 
+ * + * string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Package Name
+       * 
+ * + * string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Package Name
+       * 
+ * + * string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + name_ = value; + onChanged(); + return this; + } + /** + *
+       * Package Name
+       * 
+ * + * string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + *
+       * Package Name
+       * 
+ * + * string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + name_ = value; + onChanged(); + return this; + } + + private long version_ ; + /** + *
+       * Version Number
+       * 
+ * + * int64 version = 2; + * @return The version. + */ + @java.lang.Override + public long getVersion() { + return version_; + } + /** + *
+       * Version Number
+       * 
+ * + * int64 version = 2; + * @param value The version to set. + * @return This builder for chaining. + */ + public Builder setVersion(long value) { + + version_ = value; + onChanged(); + return this; + } + /** + *
+       * Version Number
+       * 
+ * + * int64 version = 2; + * @return This builder for chaining. + */ + public Builder clearVersion() { + + version_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object preInstallHook_ = ""; + /** + *
+       * Pre Install Hook
+       * 
+ * + * string preInstallHook = 3; + * @return The preInstallHook. + */ + public java.lang.String getPreInstallHook() { + java.lang.Object ref = preInstallHook_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + preInstallHook_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Pre Install Hook
+       * 
+ * + * string preInstallHook = 3; + * @return The bytes for preInstallHook. + */ + public com.google.protobuf.ByteString + getPreInstallHookBytes() { + java.lang.Object ref = preInstallHook_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + preInstallHook_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Pre Install Hook
+       * 
+ * + * string preInstallHook = 3; + * @param value The preInstallHook to set. + * @return This builder for chaining. + */ + public Builder setPreInstallHook( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + preInstallHook_ = value; + onChanged(); + return this; + } + /** + *
+       * Pre Install Hook
+       * 
+ * + * string preInstallHook = 3; + * @return This builder for chaining. + */ + public Builder clearPreInstallHook() { + + preInstallHook_ = getDefaultInstance().getPreInstallHook(); + onChanged(); + return this; + } + /** + *
+       * Pre Install Hook
+       * 
+ * + * string preInstallHook = 3; + * @param value The bytes for preInstallHook to set. + * @return This builder for chaining. + */ + public Builder setPreInstallHookBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + preInstallHook_ = value; + onChanged(); + return this; + } + + private java.lang.Object postInstallHook_ = ""; + /** + *
+       * Post Install Hook
+       * 
+ * + * string postInstallHook = 4; + * @return The postInstallHook. + */ + public java.lang.String getPostInstallHook() { + java.lang.Object ref = postInstallHook_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + postInstallHook_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Post Install Hook
+       * 
+ * + * string postInstallHook = 4; + * @return The bytes for postInstallHook. + */ + public com.google.protobuf.ByteString + getPostInstallHookBytes() { + java.lang.Object ref = postInstallHook_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + postInstallHook_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Post Install Hook
+       * 
+ * + * string postInstallHook = 4; + * @param value The postInstallHook to set. + * @return This builder for chaining. + */ + public Builder setPostInstallHook( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + postInstallHook_ = value; + onChanged(); + return this; + } + /** + *
+       * Post Install Hook
+       * 
+ * + * string postInstallHook = 4; + * @return This builder for chaining. + */ + public Builder clearPostInstallHook() { + + postInstallHook_ = getDefaultInstance().getPostInstallHook(); + onChanged(); + return this; + } + /** + *
+       * Post Install Hook
+       * 
+ * + * string postInstallHook = 4; + * @param value The bytes for postInstallHook to set. + * @return This builder for chaining. + */ + public Builder setPostInstallHookBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + postInstallHook_ = value; + onChanged(); + return this; + } + + private java.lang.Object versionName_ = ""; + /** + *
+       * Version Name
+       * 
+ * + * string versionName = 5; + * @return The versionName. + */ + public java.lang.String getVersionName() { + java.lang.Object ref = versionName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + versionName_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * Version Name
+       * 
+ * + * string versionName = 5; + * @return The bytes for versionName. + */ + public com.google.protobuf.ByteString + getVersionNameBytes() { + java.lang.Object ref = versionName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + versionName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * Version Name
+       * 
+ * + * string versionName = 5; + * @param value The versionName to set. + * @return This builder for chaining. + */ + public Builder setVersionName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + versionName_ = value; + onChanged(); + return this; + } + /** + *
+       * Version Name
+       * 
+ * + * string versionName = 5; + * @return This builder for chaining. + */ + public Builder clearVersionName() { + + versionName_ = getDefaultInstance().getVersionName(); + onChanged(); + return this; + } + /** + *
+       * Version Name
+       * 
+ * + * string versionName = 5; + * @param value The bytes for versionName to set. + * @return This builder for chaining. + */ + public Builder setVersionNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + versionName_ = value; + onChanged(); + return this; + } + + private boolean noCode_ ; + /** + *
+       * Signals whenever this APEX doesn't contain any executable code.
+       * If this field is set to true, then apexd will mount this apex
+       * with MS_NOEXEC flag.
+       * 
+ * + * bool noCode = 6; + * @return The noCode. + */ + @java.lang.Override + public boolean getNoCode() { + return noCode_; + } + /** + *
+       * Signals whenever this APEX doesn't contain any executable code.
+       * If this field is set to true, then apexd will mount this apex
+       * with MS_NOEXEC flag.
+       * 
+ * + * bool noCode = 6; + * @param value The noCode to set. + * @return This builder for chaining. + */ + public Builder setNoCode(boolean value) { + + noCode_ = value; + onChanged(); + return this; + } + /** + *
+       * Signals whenever this APEX doesn't contain any executable code.
+       * If this field is set to true, then apexd will mount this apex
+       * with MS_NOEXEC flag.
+       * 
+ * + * bool noCode = 6; + * @return This builder for chaining. + */ + public Builder clearNoCode() { + + noCode_ = false; + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList provideNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureProvideNativeLibsIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + provideNativeLibs_ = new com.google.protobuf.LazyStringArrayList(provideNativeLibs_); + bitField0_ |= 0x00000001; + } + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @return A list containing the provideNativeLibs. + */ + public com.google.protobuf.ProtocolStringList + getProvideNativeLibsList() { + return provideNativeLibs_.getUnmodifiableView(); + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @return The count of provideNativeLibs. + */ + public int getProvideNativeLibsCount() { + return provideNativeLibs_.size(); + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index of the element to return. + * @return The provideNativeLibs at the given index. + */ + public java.lang.String getProvideNativeLibs(int index) { + return provideNativeLibs_.get(index); + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index of the value to return. + * @return The bytes of the provideNativeLibs at the given index. + */ + public com.google.protobuf.ByteString + getProvideNativeLibsBytes(int index) { + return provideNativeLibs_.getByteString(index); + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @param index The index to set the value at. + * @param value The provideNativeLibs to set. + * @return This builder for chaining. + */ + public Builder setProvideNativeLibs( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureProvideNativeLibsIsMutable(); + provideNativeLibs_.set(index, value); + onChanged(); + return this; + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @param value The provideNativeLibs to add. + * @return This builder for chaining. + */ + public Builder addProvideNativeLibs( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureProvideNativeLibsIsMutable(); + provideNativeLibs_.add(value); + onChanged(); + return this; + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @param values The provideNativeLibs to add. + * @return This builder for chaining. + */ + public Builder addAllProvideNativeLibs( + java.lang.Iterable values) { + ensureProvideNativeLibsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, provideNativeLibs_); + onChanged(); + return this; + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @return This builder for chaining. + */ + public Builder clearProvideNativeLibs() { + provideNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + *
+       * List of native libs which can be used by other apexes or system.
+       * 
+ * + * repeated string provideNativeLibs = 7; + * @param value The bytes of the provideNativeLibs to add. + * @return This builder for chaining. + */ + public Builder addProvideNativeLibsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureProvideNativeLibsIsMutable(); + provideNativeLibs_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList requireNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureRequireNativeLibsIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + requireNativeLibs_ = new com.google.protobuf.LazyStringArrayList(requireNativeLibs_); + bitField0_ |= 0x00000002; + } + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @return A list containing the requireNativeLibs. + */ + public com.google.protobuf.ProtocolStringList + getRequireNativeLibsList() { + return requireNativeLibs_.getUnmodifiableView(); + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @return The count of requireNativeLibs. + */ + public int getRequireNativeLibsCount() { + return requireNativeLibs_.size(); + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index of the element to return. + * @return The requireNativeLibs at the given index. + */ + public java.lang.String getRequireNativeLibs(int index) { + return requireNativeLibs_.get(index); + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index of the value to return. + * @return The bytes of the requireNativeLibs at the given index. + */ + public com.google.protobuf.ByteString + getRequireNativeLibsBytes(int index) { + return requireNativeLibs_.getByteString(index); + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @param index The index to set the value at. + * @param value The requireNativeLibs to set. + * @return This builder for chaining. + */ + public Builder setRequireNativeLibs( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRequireNativeLibsIsMutable(); + requireNativeLibs_.set(index, value); + onChanged(); + return this; + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @param value The requireNativeLibs to add. + * @return This builder for chaining. + */ + public Builder addRequireNativeLibs( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRequireNativeLibsIsMutable(); + requireNativeLibs_.add(value); + onChanged(); + return this; + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @param values The requireNativeLibs to add. + * @return This builder for chaining. + */ + public Builder addAllRequireNativeLibs( + java.lang.Iterable values) { + ensureRequireNativeLibsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, requireNativeLibs_); + onChanged(); + return this; + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @return This builder for chaining. + */ + public Builder clearRequireNativeLibs() { + requireNativeLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + *
+       * List of native libs which this apex uses from other apexes or system.
+       * 
+ * + * repeated string requireNativeLibs = 8; + * @param value The bytes of the requireNativeLibs to add. + * @return This builder for chaining. + */ + public Builder addRequireNativeLibsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureRequireNativeLibsIsMutable(); + requireNativeLibs_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList jniLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureJniLibsIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + jniLibs_ = new com.google.protobuf.LazyStringArrayList(jniLibs_); + bitField0_ |= 0x00000004; + } + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @return A list containing the jniLibs. + */ + public com.google.protobuf.ProtocolStringList + getJniLibsList() { + return jniLibs_.getUnmodifiableView(); + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @return The count of jniLibs. + */ + public int getJniLibsCount() { + return jniLibs_.size(); + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @param index The index of the element to return. + * @return The jniLibs at the given index. + */ + public java.lang.String getJniLibs(int index) { + return jniLibs_.get(index); + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @param index The index of the value to return. + * @return The bytes of the jniLibs at the given index. + */ + public com.google.protobuf.ByteString + getJniLibsBytes(int index) { + return jniLibs_.getByteString(index); + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @param index The index to set the value at. + * @param value The jniLibs to set. + * @return This builder for chaining. + */ + public Builder setJniLibs( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureJniLibsIsMutable(); + jniLibs_.set(index, value); + onChanged(); + return this; + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @param value The jniLibs to add. + * @return This builder for chaining. + */ + public Builder addJniLibs( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureJniLibsIsMutable(); + jniLibs_.add(value); + onChanged(); + return this; + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @param values The jniLibs to add. + * @return This builder for chaining. + */ + public Builder addAllJniLibs( + java.lang.Iterable values) { + ensureJniLibsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, jniLibs_); + onChanged(); + return this; + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @return This builder for chaining. + */ + public Builder clearJniLibs() { + jniLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + *
+       * List of JNI libs.
+       * linkerconfig/libnativeloader use this field so that java libraries can
+       * load JNI libraries in the same apex.
+       * This is supposed to be filled by the build system with libraries which are
+       * marked as "is_jni: true" from the list of "native_shared_libs".
+       * 
+ * + * repeated string jniLibs = 9; + * @param value The bytes of the jniLibs to add. + * @return This builder for chaining. + */ + public Builder addJniLibsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureJniLibsIsMutable(); + jniLibs_.add(value); + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList requireSharedApexLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureRequireSharedApexLibsIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + requireSharedApexLibs_ = new com.google.protobuf.LazyStringArrayList(requireSharedApexLibs_); + bitField0_ |= 0x00000008; + } + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return A list containing the requireSharedApexLibs. + */ + public com.google.protobuf.ProtocolStringList + getRequireSharedApexLibsList() { + return requireSharedApexLibs_.getUnmodifiableView(); + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return The count of requireSharedApexLibs. + */ + public int getRequireSharedApexLibsCount() { + return requireSharedApexLibs_.size(); + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index of the element to return. + * @return The requireSharedApexLibs at the given index. + */ + public java.lang.String getRequireSharedApexLibs(int index) { + return requireSharedApexLibs_.get(index); + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index of the value to return. + * @return The bytes of the requireSharedApexLibs at the given index. + */ + public com.google.protobuf.ByteString + getRequireSharedApexLibsBytes(int index) { + return requireSharedApexLibs_.getByteString(index); + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param index The index to set the value at. + * @param value The requireSharedApexLibs to set. + * @return This builder for chaining. + */ + public Builder setRequireSharedApexLibs( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRequireSharedApexLibsIsMutable(); + requireSharedApexLibs_.set(index, value); + onChanged(); + return this; + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param value The requireSharedApexLibs to add. + * @return This builder for chaining. + */ + public Builder addRequireSharedApexLibs( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRequireSharedApexLibsIsMutable(); + requireSharedApexLibs_.add(value); + onChanged(); + return this; + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param values The requireSharedApexLibs to add. + * @return This builder for chaining. + */ + public Builder addAllRequireSharedApexLibs( + java.lang.Iterable values) { + ensureRequireSharedApexLibsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, requireSharedApexLibs_); + onChanged(); + return this; + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @return This builder for chaining. + */ + public Builder clearRequireSharedApexLibs() { + requireSharedApexLibs_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + *
+       * List of libs required that are located in a shared libraries APEX.
+       * Format of the content is 'library:hash'.
+       * Example) libc++.so:83d8f50...
+       * 
+ * + * repeated string requireSharedApexLibs = 10; + * @param value The bytes of the requireSharedApexLibs to add. + * @return This builder for chaining. + */ + public Builder addRequireSharedApexLibsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + ensureRequireSharedApexLibsIsMutable(); + requireSharedApexLibs_.add(value); + onChanged(); + return this; + } + + private boolean provideSharedApexLibs_ ; + /** + *
+       * Whether this APEX provides libraries to be shared with other APEXs. This
+       * causes libraries contained in the APEX to be made available under
+       * /apex/sharedlibs .
+       * 
+ * + * bool provideSharedApexLibs = 11; + * @return The provideSharedApexLibs. + */ + @java.lang.Override + public boolean getProvideSharedApexLibs() { + return provideSharedApexLibs_; + } + /** + *
+       * Whether this APEX provides libraries to be shared with other APEXs. This
+       * causes libraries contained in the APEX to be made available under
+       * /apex/sharedlibs .
+       * 
+ * + * bool provideSharedApexLibs = 11; + * @param value The provideSharedApexLibs to set. + * @return This builder for chaining. + */ + public Builder setProvideSharedApexLibs(boolean value) { + + provideSharedApexLibs_ = value; + onChanged(); + return this; + } + /** + *
+       * Whether this APEX provides libraries to be shared with other APEXs. This
+       * causes libraries contained in the APEX to be made available under
+       * /apex/sharedlibs .
+       * 
+ * + * bool provideSharedApexLibs = 11; + * @return This builder for chaining. + */ + public Builder clearProvideSharedApexLibs() { + + provideSharedApexLibs_ = false; + onChanged(); + return this; + } + + private com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata capexMetadata_; + private com.google.protobuf.SingleFieldBuilderV3< + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder> capexMetadataBuilder_; + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + * @return Whether the capexMetadata field is set. + */ + public boolean hasCapexMetadata() { + return capexMetadataBuilder_ != null || capexMetadata_ != null; + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + * @return The capexMetadata. + */ + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata getCapexMetadata() { + if (capexMetadataBuilder_ == null) { + return capexMetadata_ == null ? com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.getDefaultInstance() : capexMetadata_; + } else { + return capexMetadataBuilder_.getMessage(); + } + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + public Builder setCapexMetadata(com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata value) { + if (capexMetadataBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + capexMetadata_ = value; + onChanged(); + } else { + capexMetadataBuilder_.setMessage(value); + } + + return this; + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + public Builder setCapexMetadata( + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder builderForValue) { + if (capexMetadataBuilder_ == null) { + capexMetadata_ = builderForValue.build(); + onChanged(); + } else { + capexMetadataBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + public Builder mergeCapexMetadata(com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata value) { + if (capexMetadataBuilder_ == null) { + if (capexMetadata_ != null) { + capexMetadata_ = + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.newBuilder(capexMetadata_).mergeFrom(value).buildPartial(); + } else { + capexMetadata_ = value; + } + onChanged(); + } else { + capexMetadataBuilder_.mergeFrom(value); + } + + return this; + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + public Builder clearCapexMetadata() { + if (capexMetadataBuilder_ == null) { + capexMetadata_ = null; + onChanged(); + } else { + capexMetadata_ = null; + capexMetadataBuilder_ = null; + } + + return this; + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder getCapexMetadataBuilder() { + + onChanged(); + return getCapexMetadataFieldBuilder().getBuilder(); + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + public com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder getCapexMetadataOrBuilder() { + if (capexMetadataBuilder_ != null) { + return capexMetadataBuilder_.getMessageOrBuilder(); + } else { + return capexMetadata_ == null ? + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.getDefaultInstance() : capexMetadata_; + } + } + /** + *
+       * Exists only for compressed APEX
+       * 
+ * + * .apex.proto.ApexManifest.CompressedApexMetadata capexMetadata = 12; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder> + getCapexMetadataFieldBuilder() { + if (capexMetadataBuilder_ == null) { + capexMetadataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadata.Builder, com.android.apex.ApexManifestOuterClass.ApexManifest.CompressedApexMetadataOrBuilder>( + getCapexMetadata(), + getParentForChildren(), + isClean()); + capexMetadata_ = null; + } + return capexMetadataBuilder_; + } + + private boolean supportsRebootlessUpdate_ ; + /** + *
+       * Indicates that this APEX can be updated without rebooting device.
+       * 
+ * + * bool supportsRebootlessUpdate = 13; + * @return The supportsRebootlessUpdate. + */ + @java.lang.Override + public boolean getSupportsRebootlessUpdate() { + return supportsRebootlessUpdate_; + } + /** + *
+       * Indicates that this APEX can be updated without rebooting device.
+       * 
+ * + * bool supportsRebootlessUpdate = 13; + * @param value The supportsRebootlessUpdate to set. + * @return This builder for chaining. + */ + public Builder setSupportsRebootlessUpdate(boolean value) { + + supportsRebootlessUpdate_ = value; + onChanged(); + return this; + } + /** + *
+       * Indicates that this APEX can be updated without rebooting device.
+       * 
+ * + * bool supportsRebootlessUpdate = 13; + * @return This builder for chaining. + */ + public Builder clearSupportsRebootlessUpdate() { + + supportsRebootlessUpdate_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:apex.proto.ApexManifest) + } + + // @@protoc_insertion_point(class_scope:apex.proto.ApexManifest) + private static final com.android.apex.ApexManifestOuterClass.ApexManifest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.android.apex.ApexManifestOuterClass.ApexManifest(); + } + + public static com.android.apex.ApexManifestOuterClass.ApexManifest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ApexManifest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ApexManifest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.android.apex.ApexManifestOuterClass.ApexManifest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_apex_proto_ApexManifest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_apex_proto_ApexManifest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_apex_proto_ApexManifest_CompressedApexMetadata_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_apex_proto_ApexManifest_CompressedApexMetadata_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\023apex_manifest.proto\022\napex.proto\"\250\003\n\014Ap" + + "exManifest\022\014\n\004name\030\001 \001(\t\022\017\n\007version\030\002 \001(" + + "\003\022\026\n\016preInstallHook\030\003 \001(\t\022\027\n\017postInstall" + + "Hook\030\004 \001(\t\022\023\n\013versionName\030\005 \001(\t\022\016\n\006noCod" + + "e\030\006 \001(\010\022\031\n\021provideNativeLibs\030\007 \003(\t\022\031\n\021re" + + "quireNativeLibs\030\010 \003(\t\022\017\n\007jniLibs\030\t \003(\t\022\035" + + "\n\025requireSharedApexLibs\030\n \003(\t\022\035\n\025provide" + + "SharedApexLibs\030\013 \001(\010\022F\n\rcapexMetadata\030\014 " + + "\001(\0132/.apex.proto.ApexManifest.Compressed" + + "ApexMetadata\022 \n\030supportsRebootlessUpdate" + + "\030\r \001(\010\0324\n\026CompressedApexMetadata\022\032\n\022orig" + + "inalApexDigest\030\001 \001(\tB\022\n\020com.android.apex" + + "b\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_apex_proto_ApexManifest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_apex_proto_ApexManifest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_apex_proto_ApexManifest_descriptor, + new java.lang.String[] { "Name", "Version", "PreInstallHook", "PostInstallHook", "VersionName", "NoCode", "ProvideNativeLibs", "RequireNativeLibs", "JniLibs", "RequireSharedApexLibs", "ProvideSharedApexLibs", "CapexMetadata", "SupportsRebootlessUpdate", }); + internal_static_apex_proto_ApexManifest_CompressedApexMetadata_descriptor = + internal_static_apex_proto_ApexManifest_descriptor.getNestedTypes().get(0); + internal_static_apex_proto_ApexManifest_CompressedApexMetadata_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_apex_proto_ApexManifest_CompressedApexMetadata_descriptor, + new java.lang.String[] { "OriginalApexDigest", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/bbootimg/src/main/resources/known_keys.json b/bbootimg/src/main/resources/known_keys.json index 768ad62..6b884a9 100644 --- a/bbootimg/src/main/resources/known_keys.json +++ b/bbootimg/src/main/resources/known_keys.json @@ -1,138 +1,121 @@ -[{ +[ { "device" : "ADT-3", "manufacturer" : "amlogic", "algorithm" : "SHA256_RSA2048", "pubk" : "AAAIAJHD1q2K7QEFh5MBfReSuk2oQ9vQLC1/kdSBfizd0iFTyNiVd57KUIjCzfN2uMJWiLtNUYa7gK+1TxMt8wkFZq61Mob563hmPl8FbNn2qb4+/g/DsaeZstuptD9L9pBVuIyUskl8hZ3GFO3Xn9BXW19NAhXYdi5qUxGsWsInRSqqASLxmV/zEQGFhhEVh9ZlCEyYukqaVaUunEDdkcAABRpcaT61QOww5QbZe8T8K/FgVxz1Mz4eF1plphSaah94TCG5Wc+RFeZ5QYATuBqsKPU7t9BAmnxXBbhAGiSkKUpI9Ln9N42MLvR9R+NBAiCZCoUOKPYBirqcyp48TZJiLuY4MgLbYr0mJ3OKgxUF6Q0MLPPrdKca/KagLkojDnshDTFmejPEWJS1b5snCI0lH3mr7HRVNfst4e8l4IfS5AxX2YLuAhWvjHql7Yvhdysy7toGZapQw6REjOgvleIUwI6QGBSHlr2PQ8zCgJFFk3dAo2EYuk3hjNEWRGkW8DB4l4ij2yMYI8w4vFVg5iacdfVL4lfgItQb6OYSJJZADOcCrHhqR+OWOLftyjFP/oSZC3T6I30F/PIBAb+i0FSm+np2yycv7T0GgxZQD3ESx1Vsm4QtXIy5E1ToLumXWUN2++yi30XM+wfqpargU0vNdG5pgWg2DR7SGcKjIkWqJ+LJ2B283A==", "sha1" : "294dbb09016c013c57750edce0df0187409d56ce" -}, -{ +}, { "device" : "GKI", "manufacturer" : "google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAN3haYGQPHFa9yJAviIpp5Feoyn9fr9IEOXPfDzY+SzDr0drrCjO5gY59btYOt/RbVhiXRZK3uSwN3OSiQ98CtECYG9AxUu+3m7o0W+y/UiQkvbbLN+gnbZjiAqWWBIdT0RUTdIf98eMBdgzbdpbDn7uzmwDjLvCkrc/rsWcYYeD6VuS0qKiw/Bzm/8hp7lqqtW0fgn4Y7OBPXRfckyNExjkSvktZZKDFFKp/Xcio5coGLBqXc+1g0Lmo2osbx4bSP4cwJSxKtEeSfH51DLPSc8w+tba/8Jmp+j0KAf5jowNzRKyxyjxavzs0c0Us087MkHN4MaBeLIRH4twUtBRUVKNwacmC3vkFjgnVhpATzXHQa6OYQdV6I8Hu1GyKJ1mr85vEOroNB710Kr7r4Y6YhkW4TpYJQzQ0YZGVQXgp0q00qAQGa9BANrsBaPHFLfLMt/oxGWmIIEeJPKMJ20VTojJqC0XJp39Ujbn0UXC/5V9lU94BQYwog84FOVh2THwcMYsDFb/WlJkF6ERKDYjQwEcIPwR18E1oM3nBM3x5TJpeCV929gxBKYVdf3uoPwiq/tJmM6m+HcHrqjnwN17i1SyG54Hg5rXRQG98Zx+jh4mam1j6dD9dnm0UYNbU24Bca5QhfSR9gwTXxj+9owvyNhKFF41/LcEeaIl+4W0azzj0Mcpf45+UlP0vG5mxKpzlasQthS8m6nPdkYrKrSTClWueuZRhiW0lnPF7PCj8n9jccJ2xYoqcdKRja3hQuBp5u6cRjZi0ACimdTwAMjw7IVkyNlJsTEHPCcQCMknWp5sncJtqady+BbO4W4AfGqSdi6zEZQc3bP5QdQsrnT3rocNHoX3gNwh+hDaED5Rj3MzPXFclb0xfLf1yMSIVuGCePKAcOqwlVbQIeoo2yfHPWX02EvS1JbBrkBCAJ6HRw3e5t/JQXm+faSBaTWGrSBwqaG/ykXgEDzjdeTsGnVr5g9vazd3Z3Lr6F7HqTIYvMZ+ovkIwiBC6dapTX0Ow35m+NjYSTUd15igmaqxjxq4zq2wxE5T5DQhF5ria8cp+0AJhWkfl35oxPWPnLworlDjvu2BdEb0RtfkHM8/po1BBlHzYqqTyV1NqkQq9nO6gVCyGW/X8XufeXKg1CDUiGfjn3IhIIXVcmjW4NxAgdCZdAjGNqIyaYR/LOksw0uaB1IFh0VQNjj300LOXUbJMXdaxzx1sQpw+nFSNYtTX6Uck/XfeBJDSiae5kbVQcey0hhbj1CDWT/u05hVvtxbmmcqVcS+pXk3wjJ/nnWJNga+DYtzK678/u9Fcj0dC+fsWXlEgRen9i4hDynaB7nkOFsnrweA014TLwuSSOmdEDnO0NMnxeQH", "sha1" : "144820003f9d46c96e9090dcf0e4feb84ca84810" -}, -{ +}, { "device" : "Pixel 3", "manufacturer" : "google", "algorithm" : "SHA256_RSA2048", "pubk" : "AAAIAH0QbcWadnydcrOvnaY8DvH/VQVZ4o2h/uUahVy2SY+E8krdSWU9Wcg0CZl/AvHPPL2rD1i6KoLDzqgS9cyybSJYH2LA+J7MIlBTV7+z0tMT+rYT7NkxcC+5AZjkQsmL+fbS1q0VIEtCM/ugPnOY1Imympq3rOxrGee8I/bNm5GxCT//2xUIjQn5D/1oQ6eCtBGBMgY4B2/r6ooUM8Dhp+xiuwxSs6iEoZuh5Ba/xWh6neRe7AHT54axGdXz50B8aQx3DXlvVjuz8LA9aUrlD9o6qYftNgg4hfaKPx5Vi0zw4teIL86F6Plte1F7HDgyjPDxYyAKsEk+PJPGexGJHeEPg3bzgRR3+ss18VcmMgL9Dk2afbuf2VANcxfNA5J7e4J3YGapPwILLMLlojIACk0b1gBclH1hffkQZ4O/SYC0AGsMJDI45kauUWJmYglONmqxgh+rDI5xQP1KiDkRDtBWjocGcf7mHlxvI0E7X+oK7V+cEFEbAK5sEvSs4QDGlb+bjFS+WRYpodO/HzF5M0Cinbn7izvek3uP+LMogj6ELEnZqe9u7ubmgKv/BIhQY/RiRx0goLkwXzVwaAp7y6vh/Vi6YB2pzR6IiItRCkoPK6U1xnVJY/oElv0icqDA2ynXbxZcc6D6OXqTcueKEmeuSGe7jan0y4oDnMLd3k5MaYn5iQ==", "sha1" : "ad8569837cc06521720a35357475f87283b59234" -}, -{ +}, { "device" : "Pixel 4", "manufacturer" : "google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQANeIn3+J2UI8Yc4LIB5gWoLlw4d/OHXZv0M5zfchR9JB/RNaGhW1ffN4AgsdQJ4vLBSdf4i5QNlzMTC7sQ5eFjKCGrAp20cht69eDM94UTmTEizWDTH3tGRNL0Z7qyQUA4p21QY0GCcsMYt/r3XY6OSpbSz9iqu6bByX6u1mZzv/Tbd4C5SyA8hHHuTth6/PqAUhKvkfzg8MhVfGYx2hVTvZlun5jnXJyZXX4tqbzE2hZbpSSdTG2LvvJ9fBCuqeTs9UQTVaRZsp07l4OKReIlHDZrcyt01Gq+HrvWtpnX8JxgBLSMtO88BAfS8sgTQjtE/OC5jcRbrr7b7WYVpwUjeUa5hxgEnMJbcWn3fE2RxWWTQUFJM99UTUuSQm6xygc2u7cBcphdnQdqHyrT+DL6WQHFxGo9wbhXuq4MChvOsilqyWmml3tjUYlfv8CqP88ltb56bFD3Igk1cyaLrIE01sPs7tdfrKQf8t4ljW6cAPSwf16VKKCR5dBx250S5ru76+dqdVk3h2XY3eAp2EjiSSSfFVW+ZyOy22+4b10pZCe1ruqdc6sUE0Y4QzgRGBy6Ek9MjXEijVjc+5X9ALS8ED6N0cgmWaclk/cw8AHQKCcBP3HlnccjK4dQXBOw97YolYSYNJFWljJUpm69TgFfyf2RyWeN2kCHqzRBDS105UOsjfgUf9yf8ubHKFITlyqhvMzl6dCBfUDgQgcMFccnMxXPEZy3g24m/kjyB9WiBI2KBn6SbC4BkiAOqjLB9f/pb1nn/6aILeY+iqirs77ucWkMz/H3Xlk5lCNos57g70r5gCBtjnTbWMFHs1m6X43v9iOsr3I4zPq4/QdEwpXnz9gBLz63n+kR/IT54ugiliYMdFRSyrTNyGd1L2mCczdxk5AapxVVZTQHdl3bMU1/Mu1YjGLh1F/ipug35VvlIfL+Y1Wded3vdFB0DAciG/8m0na6mQyfHYxEurt4Fq4ifkxMOP2NVh5CXOHCSbnHyqTDj5XvMT6fcnEEHE+Z25ALC4GI4kkHsMfoejdINmiJePTYDjCSgSBAoFCCul0HVeTH/VUBMotlf3LPhRuWGWuT3/Tk/yIR0JASSeCc03YUR0lsf1rCZEyWhPc1n1e6Rwlp8fCEa3J/Q7i/pHNXSWE5EJKlU8Jm4VH8J/oetSa+7NKgCeSUFtBcg00zg2YBfuam/dd53LM1FyJYRWV4ONWpL3Mhxi0TuSVb9j3BJL7R56wiMuuq/tVgsNzujhWdezYVo1oZTJrFj6LLdK4DHD51BK3erc62FlSGw7vcHFRVhgE8y6EJFcqKTVBhqJ0Qmr6XgTBA12BKArAjs4QG5/AwrDrImDqrB7udkAutzx2vHQ2ytR", "sha1" : "8c44014b96f0f41f3daa3825d4af410233372b65" -}, -{ +}, { "device" : "Pixel 5", "manufacturer" : "google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAJQ75c2T8qdhsNTAlO37M/QNDoIIS7jUkIqOINM+UygqTj8/BVbIih31wOT7oglvXR+3baLR90iAqrTCBhhMrWPw6cdFE5IrpIho+4y7heWCc8VCkR4MBsygEHuseYtB0WJegHnI3YxNOx9HyDo3HuWFkYx8VNlOSNCep6Ce2Xbn1BYjOTIUeWOzee0UY0lLCyriFAf6YkLDmplI1jYBWs4R0TANTJQlMzOThratZXW39IDLuCmlX6r0Wg5ljT25tb767ZG2NHUTQJoLHV95iOyUwuKZa/hvUOmOM0JGVDcVXpzwUX0HN2Q5i4LBulxtQVFrol5yHO1jbK+el76FMhlgZHjEto6peUmZodwLzXybAgbakK3vF8V91DOy0dnkbyHiejzgMhPCCat6wNjhtYs0EMsOtS+WOzxdxFUZMp+gPQrT3f+5HTBkfpTNHdvhiyxZsM+Xqyi4O5OX8LSszWMEviq67OkQawgc9tbsNX6tCc0gH9EiYro/ecOcI/JA5yfJce5gJlIUvavgFzsi9DFQqHcnVevd/C0D6CderCwv5QuGqGfSkt3FJv6ITmFAG7IhYU4Y9A/OkLInZChiQ4nxL+c63K1dVFmNidwQpFwo0+49hvZ9VJ5HsL6px7Z167VAVOkReFjBbqOPYAeq0Xy3wZoCxQapuqxO+VUtR4H5S6xw+ygZzGpXfJJA0BNIdxsOEO3DRlv1lx4Sa6efHYBhodtelrayF19izHpHHRifFMwQgDz1mOU9AcM4cvpqYKIhFaH9d6wRMsBif0L+rT1LJh691bfLR5P5EyPhrb28+1/agYI6EIt83Aaz3d9SnamqAqyGR2E86o8HXGo8x5NAPdp7UM1yt7rOyhNwcG+dVj535XsS2hzHsaUn+PWWanLF/bSuoOYwCbLf22eCmE08uCZW2JHJdzRCwMXy3ZSGbYxOCfaMcaHOpl//4KcHZNBd4j07ODKXiE8rueB/hfMx2NMmxpkeCIf1dxQsFgnC3iHtixgMVRkxuQTAh7ePOu9yEgj17ImTFOVLm1BaBBnd7dDdg7bgiOMloH8+1HvPWerDnz8ghLE044nz73NSsixKvEAm8wAeWbbG8/uOjCsi5opYh1oBgdjUTQEjsu8CApbvjrh8//f8/46n+/SJgBB0AJKY+F9pRk0p2duX2a1R/zbpM4Fa06qjvwRycyGw8A4gdmwFt7189dYjYAukPoQ4qONJn7BXQMFM2EhNLOUyfdz8SmekEL5d9NVG2UB0m9mYdYCbwgPvCZQAsqH3i2pNslx/9GbRS59Q6dSqsDDk2TSFst/2biBiAyl7glFoN/bggoGESxPc3t43Mi/O/ym3l1qd7oQGav7wZL0J8iZ/I575", "sha1" : "6908461c2ccd5568d1f39016a9da5aec5b10a785" -}, -{ +}, { "device" : "Pixel 5a", "manufacturer" : "google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAP2EZ6+lhRYjp4cE4WW11okXlC20K5OJWj7iX0bmAGcmPMtWNJt3Jq/w+5ZvfRMa5xy3CMZeJICV1XeD7R/Pwcs9Wadd+DR+Lsai209qJiuMv6R4Y+eF+EacD7NunRpDdaDGnTxdaWJUbYDSFDrwLO1PHBavewd3ujVCmuh1zaQ2CW3Y1lo0UvmO0tISRr4yvR5Ia+zaufQ0TtmlWwX6se7jJ0/ap9Z4wQYJS9R8WDRqV+XX9QUDuOU/w6TI4hB9oYDjiysCtzJe9zibK6jSNq1/3CfOm4GuaCLQEJseoqgsNh25MkTqg4rmmPsk+5Kcylr2gDFRmu4NOJ/sCRIVDXkigrz2WDaB3UaBTN/JZMjuFvxk6LAQSURE4oFuljzfTvnp2bIYbqZ8NUTHuzhEDwelj0eChAkW9hQ85OBTs23lJmAYQxJ+WqYixrB1lpmgz7MUzc/2PJBXLh96FdLJcU2jCzCfrAAepELWsutPfVcE8rOFAdrAF6PPeHUN87pfrbGZx/oj1Nkf0kOic77dqHERqWw//7WngbzHPahjyX33OheZK+xK5tzx2EUX09yXMK84d25UipJuHQ0SsBMM3EmI1b9U2IDEHfhIg5QpJFO5xF1DQyLTu5lG9mAqJcGAjnIt47Jkv3s5i6zBlmXWJJicgnnbDjN7sn/w4LiZY2Uu8ZSwsSobI5EDG5vIdD7NlueFB5zDoqhm19eG2z/QfywOdFlgsfYPDmg1JikeWnpDb3Yy5xPb1ua5TFYItduid0aM+VkoL/KbPt2oVgh4O2uZTFebUHMMCnyGw2zwfjeh4xrD9mD5xWdcjo3KYB1nuv/GtkNEDXpsUxIII4E3ipjfnNHJBz0UPlYnuxDB34KpvHoa/GG8wEWJCDcL0dZX5/KaaiTHwlypWUXnSi3rlm+qcMivO14f8LFmmabMEetiA2YIVqtIXB4MCIYKYr5aF6879LpHA2bFI/LXyGf6pL0tM1CAiQXZwNc+WHC24ujCngT/QD2nRdqWDKuwycG/DtRJVnn+Z5WVD28PZotv/6ODT/4f1OLgM9ufq38Vm2SETZNYCZr4Zcn5bgR7ObqyTnD+vCcpfTDifVp8xPlHT1iY7gdb0gSV8ZIIXpcxUB0kBpM6jO2HJST9hVOBQfMo3V5xjBJYkFwcrCI0bC58zf344C145YuUKchByC5NCkJXHe7YcD9Hut2fIxcZqO08w5XDgJucfS6hMOaspt7XhibxwsE/xF33pgqRz9kFOJ6DnjhGbvbWo3VfNpGdeBfu8vmSpNKI3plaxImWEaK360KHCBVgwqLrhoIgf91FdT6MSO7gGVOHbB+o41UZ8mjE71yrIWA4Opp4/qpVUJhVR0aR6z8d", "sha1" : "14e3fd68feb4fe7c9837787ed218d083050574da" -}, -{ +}, { "device" : "Pixel 6", "manufacturer" : "google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAPzSq6nF6uIU7cpTp90ATW+SFDH+L1Rv8NBew/USm5nNdFNhm+HXbWwz6cADn/dtUEd+eksUc6uxisT4EwziErAMbgYyN81+W1ndYFhp4zU1C0YhlS+LnlPxY+rNPmShpFvMIvMCH8GK24tO50FjjTBZrz5kwGfJt0kF7jQwZKQr6e3PMaKYZH11jeAdasEoxwsMjX31U74N8T4r92H8caaLzGJm2qaXn2Nec1HIWwUn7GSigG9yDf6RSzlc6PhKYZvcNG8AmiqghBxuN9HrBc4zo5z2IIm0+W2zxzoPkoRQrKR5LLRoBAifw9zO/xTiiuz/LcDjOesFrdk/vWKH1BJN3bx2etaH7qpqqQo3gjfc//VBZrZu1GelxL1KBNYQ+somh1NGUUKm3WDHtDBzMOrCph4zUyKLU5sqQIzVaqk3mjD4QpLM3nhsuZfheSDEFv38fmX34w0Y34bdogOqM7qsWOAEkxX4SugVrEakxuNoTDaXi765vxnrXcsgyWaalMZpsNra9AJujXATlfvBSRLqd/++B83voe41rnCLJUR3TRIy5PQiE7Zvpv2HZn0ix7EVg0ZRVRKBjubcAVFrtD8pXStqA5v6Jt4sy4g8QKHecgmKj3oad37ubWFDEQIRiEYceAA1xYRwCbMrJoFaBysNUuYp4a68FeZiRqbIg5pxC8LXZ5WfbGOcq4xzXkqk327J/1UxdTLvQT/HKkcefRPbrCh7yEFYSn+XCNCx+w+/GdYyKJ6X3sYPP6Ko4R2O+N7FC7SPfn7qfl9yIOeRcvX6EHaXXMfA4PG8EW7dNZvPXa5Sp1g79w2aFEIRWolj6czvgPfC0fHvflFrd60t1K9WiqxvcQFG5spOUrhqltobGjHo6FS7ohWiX5sE9mJxUZap7AR7avAkAWibFBSyv59uxt4KzXZGqsZJw2vuEWeImXAIc14xSkLLJgeoI0ZIfxqrs+sctno4HMwr7tdzMKpTS8Ni/sJSVplmSzdTJ01V74uDLC7VreL+rjXvYLcBV9363/knhX0Os+O01aTSVwGsYBbKwpEuiqonS4yNs5G2NydQvHoDaXUNAzztMd/UmC4WHZOV+vM/daqXAniafJx3lXi+Zgxw3nl/vU2mgNNek2U1Y5xmefhKjBwVhqmIzZY4Lab6Cobs7sEmXrwOe+578PjnFzzs0MDEaJd6vJExVOe5pLvWhUk4vBFb0eK8JcbY65rXWfOJhm0DKlMd7yIidIQaYK0drCNhCM4Fr33YJmQcFBo2QgLsmESnayMJgmPU/KhK3BwZU0OdUJbsGupzvoJIGdnFrp+0oTxO/X4Mr5ArUmoMSFx+rq6x0sMBJNt/kxvvFKcETHN9oRn15V8pRpDl", "sha1" : "85322346680a860c091fa14a64cef1fe4a3ffe31" -}, -{ +}, { "device" : "Pixel 6pro", "manufacturer" : "google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAAw4tB+0tXQVo8gxwKDukkqG5UfUBSsSy/Y46e/wBitpPv6EwpFsTzg8Jw+Xlgw1wXDJPk0nWnAWk2CrxI//64nVRiOMYquuL4PlUyB0JHkeDH9+2EH6YsOZABRUHkj8KvKovqFWxjXyS7pGbFTYxrZn2f04A1GfYJK9sG0TvW2CvuJs2/MgflXLie4N8V1hpjiuP5Qsu7xEzh/uJrzWDBKLEdgC8FjkxufHK366KaYqfrUuuX/bgQpO5MfzynFaf+PysG3YR2+JN2rnd4hpgqFt73qILm8EQ6Ls4gWijloA6M+MV4QW+jMtKjKhBCNITPLSjZx/0GgZNN5MS2/7kq4dNgmjBCP5qFL8V1xa+r1sdDG2WA3n5uEnW4WxddHgrTVg0F6owpHyaQ28uyNFRwKbUK5td7rS5RDFOS4f3Qpy9Gp0VAFXVylxUtpzJqU8e4UkgfdXDgOVcZrH80NtGasEKgZjvuvTVxv4WBVsyOqIxwv/rpMKm/zNUXxRLeX57UFRfhHTXi/Oyjz+ImGFeMSuv3vS3tIE1bH89sKDL9u6KshjqClK5Gv0p47XSSMaHzh2WDG7SM4Lf3zuqwOv1v1iN2QECaYeBDRuroMItmpqftP4D09p3SylEnK8DeJ8MHPFJHbjfMCo0S1GIs6maKNycYKr2SBKPGnjFaPpFqPLIXY4IU5bEKur+soemPDVylpRL2wV4UnUdhMgQAaESRTNqln4rIyNUCZRJPROshq5F4R8dX7Iy+XIb1B1ctI/njVNP+87qirrJmol71qnRPRSJ02SXUb48/cAjXVKqb678/9MoTwjW/t0XXDWPWJFnXC/zc0gATFz8oZdLtnizCkjeXZkkM4v916lvcQ2Zha2GXT2ZC11NU/K20rYjgtyRg2RT3MRfgwtwymjGMl3lI4PG4m0DL63foVpBvG6TDnIp2FJXbBoBZLfaSquP1A8Yqr0fcMfRPeWiTCfCiKIaXVN09SAsJA/ZB+VjeC3hX5hO/PMDfYBzgaJFOCfpLCqaEVZi0MKPgFoXcCc+wyIt2aW5LyplUEB7DS4BKnckZM1SP6MJZfBBalEcpbsB0g2koZHBDtC6I0C0F7pEJedATUCG8jHNha8wOTKZf2+I/nvJP7UMER+kjADHuyqr6TFvSbch3H7zOqT+oVPaxTqLA8tQ45cTNjeGPLb4CghfHrvKqDqQDkpF+w0zBLFbrzs0Ab3OKfaF7nhVPn7Qp/g41pF3Xo7pv/HVXwIL6WnbQhyJmQsdxFnVjndzFzkNwoL+it2v/cBXhAFbacm385E44DEZNTSehxgofGn5Y4ShVeVd2t3hC167vpBMsyxf9ilvn0jYeA8CTK7+ec2H0jrCBNyBxY5", "sha1" : "5f9cdcb2a3e84c93eb031529eb7b3a05b1887861" -}, -{ +}, { "device" : "Xiaomi Phone", "manufacturer" : "Mi", "algorithm" : "SHA256_RSA2048", "pubk" : "AAAIAN3C1onuaVOoEOIIpxRB4slj0xuKT7t2yrvDzvHQhOAlM8vz+rnR//6imJ+ET07/dMvAE893FM5LnFQLNcUJ+FYIGjbYdzFCVSYErfVTq96e37/sxVT86Zuz392q8OBkY4UFzpNdwwzWq6J+0tAsEyu778ECITiPceTJgol7IxzjIljHccK3ffP9dQf1FziB6BBTOQBKj26J2KCqtSmXM3Kk4GeV0wdCMZUUcuWXGrt0UjmrD+xHa8jSj9+YRb7BWe+RfYCXtqrAaree/Q24GAm4nSznDjfSH4T50JiNBkaeOf9YZwQlh67JtFZbueUP5prlQ3eXmubddodnA0LdDkOJooBHvMZAM/73+AWtsf145vMRUdtuvj5Dp9shR+kHaBoB78kQ2vUcrT7eetQynrH1TtwpXzXqAfzHRfv1tw2icvPnjFYV7m3njNcrb05Bx/oMvqKzrx99kCZEWuVm8un3gC/ucW9cXkAB+onTQnfJbeS5XcbEPcZkuQ0b7BepCScYnMrlOMSClYYl8OPNK576YRa2KQxdWEbdukihNIhaZhBN/tqdszA2w2960rO70ektljBVPP6m2jcT5iV0spMiers5KtqZ8cy++Urhvg0mWiuPcnue4L7W59lf9bJVlkaFrBfOHvxMdgmmrHCgZd9278zJrYDgFK17kojwSqqqwCkoFQ==", "sha1" : "b2a02f1e56e366d727a1a8e089762fe0b91bbc84" -}, -{ +}, { "device" : "Pixel 7", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAMzK1QHt1hQ63M2PaUFnvsCGwotv+i4QQuvHzwm+KydVQZZCmn9+7HpKsarbzo57sVelHojqQeTOvhGBF4DzztUx+IWIX4gor49MMgcnossbbMXf55Kkl/TXTSeWdwoxE4TLYUK3EYMr8xKY3vrraXD/mjUCmMv/hPDWqgLMt0HPX8kRCE8b4yTUQQgndgxioKAjfLY9gTIPb6Wl7RUF4cRgnvVthY+YhBpituQWGvBv47SFbDCtUK7F/aPlhhiXW2X01sh9HDbG0Z8mmTblUXFfcOVWYRm0kUPG3WunuAWVIqcxJ5Zy0NlbQkoC4LnPtjkVO7bEZ9/olJ9MiJPonuHg/baAHYxEl3TzQBDMNd/kVEG7y+0lyi9SABE/d5bdiWdEVi8Dg5J52phyK8bxV+qhXKVlYfN1EljWCCChLEbKa1zZ77eWbO4LN+UBo5wX3roAws2ATvcSUHCzhKFQSACV4X7QJSRFWIK+oY2/YmEkLYoIlD2e2smyZXw9is6eLb2+d+4LaNOG2BhvYRohsAO/Raei5dHQ/kKslL74txt6zJ/BucDrOdyyQNCpfuGA8dAcHFOnUXoDHLjGHBCHygEffbw+g24TlAj2MhIfnhOvdN6j8U8+7Dah9nBAhvtt+fPzsce01Wm/kQdtdqIbHo0EAURjLjaeKxyOPeRSKJY2ZJHU/zJp/FYnCQoeNA56zpHloYEMutNk9sLk7i2RbafnmKNA6G0sOMig1C6tYUoqlgUsQuT6s+iOpI0J0wykO91PW6kUYXXuf2yiuaZr7HJpm4DUX5qaAvK5cfdgxKHpxdkVODfImZh7XD3zNjdLVmiaVbzZNJmQpNnD1pXbYB4345xxAUDlFw7/2F3VFGiOpOGAukAXGXS4yxKqHxentAEZZU6E2Eaz58ajLAYd5tlSj5/IkVXJHGlw/Y0kja0UEBk3L3B9OFQYoMXBtdp6RwZQV5qtBkurYcDY/cvwYVZRWHA2AA0T1k6nGz1ZOnDV0fQeUgjnJB4u152wMSE+O1dHDR2hupNpYoDVQOZSpW+9z4qXR+FCL46zoTf2mMgqj3BM1b1gKQx1M43vzRACYpK3UsacVlZv090hpa9KVb9jKXriyp0irRKFt3rqbHEb/uqJC82yxerjKDoKIR1RS6T/P63p5GOZcKKdLeoBSk8Klr94sHa0LMfLSKzXgEveOxvqjyACAV+PZxE/Fe5VUfYt1sxGUEdcRoW54Z7TVioKwPKK+pByvX0y8GXstvuCJgdQawCUeI1JxzZL3V57uhK81Pc8EbsCDxglXqvFnaXvNs5NU20Arg7m2rHmC661CAgv3ScDA3pCdYXM2wj0byKXi6svW9pAj6ApS/pMtIWGhfUq", "sha1" : "572d31e590179862f896f8d71b93a39e93403d5f" -}, -{ +}, { "device" : "Pixel 7 vbmeta_system key", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", "pubk" : "AAAQAICxQRO/pQoucxxDsEeJDQkujdIIQtUDgRYJzkeF01P3gXqtv1sk7OPpoAj38qz0UkXwp7DV8TpxnimbwoDCD/tukWeFskGTgSYWIDiRAGAAsmuwpFVYogAwoHYxZsQYo6KFsWaiO4kIauilr5yu8GjwmhOy5Loz1+89fuEAA8imhxMN+SqlAMTZ+nFuPj2OiS+QkffhK2Vc2gU7lJgJArGi3ChHuVAWkf58HsT/nyf4IxEsKpiv59TcN16eYENyWZzRRXO0uqHQktzQRs3AvuWZYm1W8AHO4rNRPwK9DlC7WofDZh8hnBOPXDNna5yBiWAwDTgLL8NX5nI538BiOAGYtcnTsDqa/dgKXtGjqt4BYv2EEb0JmhczqDpwpwF1HjyaF8iokvPgk2E7I5FwY0wSr7QRJhTDsnVUlETDZAnc9AvmlWwUNrbF8FGU0IkyyPCeGpPwJOFTQdBDDYK9GtCxmiWriFJRGLcumwmj+vwC0AJJlVaeDiZcb67RgqIOxWvXC4gYOJSTdeMQRqgfhu3+Opc139SIUPRNz3AgmZJW7t41aurUz8x7B0zWleYffZRndUvUIwnj04zO4zVFeEwOLZc+Jp4WDOQwLWUps+AuS7oYzthqmgucNRKgEffLHnVIlcgW09uKyx9aaNgZDQihNWlJkVVpd4Y6C1BQPsatIo9O5av2gtH8ss+Y+F9Q5/evYIVOLPr+vXRPKguCW6tCACi6DEJAebNK34Kq9a12cNrGvGHGbyIvwbIvqzGsyXUNeNwaKQMhOHF6qDsbPuy2y2JPeAljdV2AdNyGNe5MFtEPNDDOxl6HW/GSdo3noHVca/n9kRiKtK6BAgchj5qFa2p1SwNmAp6HMY8YtQ/5/c+25aIX6OUoQAFcIH/4ZfQcg99np/vk6MLq89sk5b4ch6U17+xoGYGXf3STkKle4XFV5XRtFaEOJWxAZdXyaTCm46CChMfwW1kwcBB6NSTGaJHd510UDYSNKTwE4p4oI+PcMizOThNF+MLnOBJH6T/0Kt7DGiDmXz7BbNudPqM2eYKMHkBr3RG2xzBHyRC9HjQVmp64T8C3XxsuOofNS6tiZq7Yr781nkn3aXMAQ/ElucBj9awyPi1yuYsgwm6+yZUGdzbf7azM9PEhAHGyEogGUGTLq4ty6lsuVerpbgjn9sM4H/hDWd6m1Bt/PHZV7sFYRptjUJ8g1ZAxUV8zOe8RdreLlxHfkIyKYGTZV0FO5niE211QAzhZr49jY/IyCdFECZnA4zV5MxiOz5ssMmZWJOIG7p9USbCtGBxKbjNptEyeimiouuy5t/GKBmr6QQY1l0w8sfdUQyIy/rgQgCeqwHZcMjZdJcm1IRrm7eyFjLc4", - "sha1" : "" -}, -{ + "sha1" : "f88ba4bd6e5518bf185ce8106c6a9a1b997c0c20" +}, { "device" : "Pixel 7 Pro", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAEnai4emBts8xKHH5hbkA/kKbIf+BAdgbGeWPJGs/c9M/q7jBvp0iN2yER93RWPM3sgCb0NVpwgAhB0kaKRNm9TtbA0CdzB/k+wCO38/sr24t+eBTCka0bwgxwUD0TGYNS5tZLB595jnRsM/zMxp6J5aus+pyqF8wDejJH3WCjIy2aQ3yM6xn+8qJGL+mRrpgtTG6q3rjWupuldAsS5X1ACPnekK7glTL3rOXE32wqCeDH3fVpUSZDoZB9vo/qoj29nU3EwCnGWybRfYo1KPua4IaKDcUnOhxe4APHKzwzN8dwWzu5aN3TWL9kvQ8UXLMghL+CsXmdZAHjhfCJqquuwilFNpbMGDlyq0xkZ3zlw5LOLzJMaPiW8KiYfJFts6bsazYlVCOzsd9VyrDBLzmpgob3QXzqanwZTWGLJuyksTVUwDr6aUIJRqf2Ly/jEePoYZSElV9y90j+SEUabLO63VJD1Me1APW4D7UNUOa9LH6sNf/ZkLlHVk+bfFh1ChtgypeVQzgxsuqgZELKE0rreQ6v+MPIyJRFohG43fCz174SDZMJHIx8CBcae6yZSDPJlxWvqwB0DP5TGPps6XcRyIASAs2WcDesQ+ZTzvc1UMGCkESfs0/H7ytiFwd3jC3m566y5zkS/rKNtM8Ya2zh+emg8YwcENOpZT2VlKobejT661ySunWX+3Saf8CX+apSYm5WuTaWHu1BwY6r4hX+AWej8aGjFjtscDr1ZYb/l5jPQmcaMUzHpSfTvq5dCOrrShhvvRZw/2di1HRR76YexlshR3ikehhlGHGFAQs/vuZ84bJn3x5RtPCZ92vxTsMpnj4vqyZD8OSqdcxZoG3ZFLtfWBcduOIBg1mN1AGSNQdwlDbtL+X9FhI6tHZ3to/UMZy4jYxJ8tIePCqPEqQnmlg+Dlt7KeChU9BpMH4CkqBKZIN9DFk4mLk9NS6heabR1GW0u15G/oKBcmxcUYgtIpXmHtfzL7avwqS5F086vBmkcp6AX903GZsabZaIET/2AcWgLUAW+SJxq+IlP+3YGAWJC4pPZZRyBcmsvC8aslnrn+oZYttfNTZcOxdaSBgybG5TR9oITQYKyChlmJXVIkeDYneQkQP/dYwWgKK5HVF/mc4rpq6tQIU9ePOp/jWh6jOHlRpzjHaQwJnKnVyJ+FOyvgY8KjK3U4LfZu4XPpVJk2pY76xzjE/YbqDE5znb/4XyaEpuC4TmTVeswl97rCn+wlYTXWn3cllKkSne2KhKidW9XKG1BssoFiqNgM2CoW25+HHxhgEwoXcY41Bim7PhG6E7ByxjYtTr26M+PBDn4ONDACAQBqhPDPalud3ljHmQZV4SSO7PG/TB2naAONav3q" -}, -{ + "pubk" : "AAAQAEnai4emBts8xKHH5hbkA/kKbIf+BAdgbGeWPJGs/c9M/q7jBvp0iN2yER93RWPM3sgCb0NVpwgAhB0kaKRNm9TtbA0CdzB/k+wCO38/sr24t+eBTCka0bwgxwUD0TGYNS5tZLB595jnRsM/zMxp6J5aus+pyqF8wDejJH3WCjIy2aQ3yM6xn+8qJGL+mRrpgtTG6q3rjWupuldAsS5X1ACPnekK7glTL3rOXE32wqCeDH3fVpUSZDoZB9vo/qoj29nU3EwCnGWybRfYo1KPua4IaKDcUnOhxe4APHKzwzN8dwWzu5aN3TWL9kvQ8UXLMghL+CsXmdZAHjhfCJqquuwilFNpbMGDlyq0xkZ3zlw5LOLzJMaPiW8KiYfJFts6bsazYlVCOzsd9VyrDBLzmpgob3QXzqanwZTWGLJuyksTVUwDr6aUIJRqf2Ly/jEePoYZSElV9y90j+SEUabLO63VJD1Me1APW4D7UNUOa9LH6sNf/ZkLlHVk+bfFh1ChtgypeVQzgxsuqgZELKE0rreQ6v+MPIyJRFohG43fCz174SDZMJHIx8CBcae6yZSDPJlxWvqwB0DP5TGPps6XcRyIASAs2WcDesQ+ZTzvc1UMGCkESfs0/H7ytiFwd3jC3m566y5zkS/rKNtM8Ya2zh+emg8YwcENOpZT2VlKobejT661ySunWX+3Saf8CX+apSYm5WuTaWHu1BwY6r4hX+AWej8aGjFjtscDr1ZYb/l5jPQmcaMUzHpSfTvq5dCOrrShhvvRZw/2di1HRR76YexlshR3ikehhlGHGFAQs/vuZ84bJn3x5RtPCZ92vxTsMpnj4vqyZD8OSqdcxZoG3ZFLtfWBcduOIBg1mN1AGSNQdwlDbtL+X9FhI6tHZ3to/UMZy4jYxJ8tIePCqPEqQnmlg+Dlt7KeChU9BpMH4CkqBKZIN9DFk4mLk9NS6heabR1GW0u15G/oKBcmxcUYgtIpXmHtfzL7avwqS5F086vBmkcp6AX903GZsabZaIET/2AcWgLUAW+SJxq+IlP+3YGAWJC4pPZZRyBcmsvC8aslnrn+oZYttfNTZcOxdaSBgybG5TR9oITQYKyChlmJXVIkeDYneQkQP/dYwWgKK5HVF/mc4rpq6tQIU9ePOp/jWh6jOHlRpzjHaQwJnKnVyJ+FOyvgY8KjK3U4LfZu4XPpVJk2pY76xzjE/YbqDE5znb/4XyaEpuC4TmTVeswl97rCn+wlYTXWn3cllKkSne2KhKidW9XKG1BssoFiqNgM2CoW25+HHxhgEwoXcY41Bim7PhG6E7ByxjYtTr26M+PBDn4ONDACAQBqhPDPalud3ljHmQZV4SSO7PG/TB2naAONav3q", + "sha1" : "5dc124fbe57e84081995a14f5cbb6bd7cc30407a" +}, { "device" : "Pixel 7a", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAD45w23yHh3LbKgtav84KBVd0rRtMLL7djZPa+7w2dKJWY3gzJCvoXUhCUpqR/zVpCYHt+Is9xN4DciRbXMYwiKBEFGV/N/BvPDth7Dyf+UB5P9sbB1CE7eh9NPieT/rD85F+gNNG07exXb0cmu4GoL4prH7UHWsnntFmu22oGNTjBKYnKRnNjbP2/8Hp6qAiiNNwxlPllXHRoqZTtfMJ1g8ON7STZE9IKOEACVmXbzuda23UfayGUcMQZEZru+6drhh47H9BI6j3Ds56twb8yqcuRFt1+3umxdKIPypZHLbDcZ3rAF5O1hN3Mx8jZlb9KwhUdE/QA0irv98Miv3TT+OYYFB4E4JTfM12i9mZLxEecytH2SzXU1gCZXtz0UwnZthELeahrd74Mv3lI64y/8BVbSk2MiXb+s+VhZxnYOVHCQVX+jrAz00/dTqRsFRJI0HvIXltBrEcLO7ChtOeuBaIERF/Nj1p03dmL4LD1xuCIfqIwcy5VrqnLnqoobNwZDjauLjF8zLiYzlKYoUaPVeFX1AjHs7UrOK2WTdqlR/G9JiAOsKWN9tHp1S6PLQpZBIl8c5DVtzcPO1HZyn8KUeEM9yIHPOqAlVTbBA5rozP4w9SKqqk3HQAcxd8wX2n8ZPLyYL1uljzdFEk/bm1bvXxD/ePHDyw5bkPv7NGvayoQhBm9dqY6pGp9K0vMZgb95OCEsy2zRU/b3aeZHO0dzophwnERJ4Or/Triyt70ljltR6katbrEY3upFG1Aq1hI3IkcoXB2h1zODlGD6fm3zsL15/wTodi4G8h2cOWSdCWyyfqsTPH/pXw21aWvoT9OwI+E+Xoq//VDc5FgkP7u8nK1keFDjGH3YswsNpdZJQyz+MPmH41zrbGRKkAt1Cy3SGesAoQDP0b3BbP1l9muPz7cj7gTE1P8F7QTYrjGKh2oZehNsMXRRMw8jNk4ZWT69XDfd3LTPPX7YPWcChMUhAcuCBQmMZeJYY+oBNRM/PVgYQn5OEYZnE5TqUXWbUFSamnF7zPyfno1Jym7QNlAeTILYAay+LmIGDRAkXiArZ1Wb8qBvtpNxGY/4qPEcITNOT3LbH91P4xzNxATGhguq2n80h1reBikMmo132gxyX0mLpa2HRPuXAVdKDIE+fWj1ksHc5xrVs2hhizbllgmmgQ8j/gxuf+Gd3R7Ou9DM1fRgiJ1r8UxAJe6ZgIuLut13g2ApexbADWHqRo1keYd2dWP7adj+GQG7H71rBTGmvKs/uczYUWFgdWr3HElsiRnWucBkZLG5Ty65nFUYsBZQs3I1PLZ92yFYinps20BA0nHVwZgttCmByx5KzJTy5EEtyZBOGklUUkNHY/5p9WxEayEl0" -}, -{ + "pubk" : "AAAQAD45w23yHh3LbKgtav84KBVd0rRtMLL7djZPa+7w2dKJWY3gzJCvoXUhCUpqR/zVpCYHt+Is9xN4DciRbXMYwiKBEFGV/N/BvPDth7Dyf+UB5P9sbB1CE7eh9NPieT/rD85F+gNNG07exXb0cmu4GoL4prH7UHWsnntFmu22oGNTjBKYnKRnNjbP2/8Hp6qAiiNNwxlPllXHRoqZTtfMJ1g8ON7STZE9IKOEACVmXbzuda23UfayGUcMQZEZru+6drhh47H9BI6j3Ds56twb8yqcuRFt1+3umxdKIPypZHLbDcZ3rAF5O1hN3Mx8jZlb9KwhUdE/QA0irv98Miv3TT+OYYFB4E4JTfM12i9mZLxEecytH2SzXU1gCZXtz0UwnZthELeahrd74Mv3lI64y/8BVbSk2MiXb+s+VhZxnYOVHCQVX+jrAz00/dTqRsFRJI0HvIXltBrEcLO7ChtOeuBaIERF/Nj1p03dmL4LD1xuCIfqIwcy5VrqnLnqoobNwZDjauLjF8zLiYzlKYoUaPVeFX1AjHs7UrOK2WTdqlR/G9JiAOsKWN9tHp1S6PLQpZBIl8c5DVtzcPO1HZyn8KUeEM9yIHPOqAlVTbBA5rozP4w9SKqqk3HQAcxd8wX2n8ZPLyYL1uljzdFEk/bm1bvXxD/ePHDyw5bkPv7NGvayoQhBm9dqY6pGp9K0vMZgb95OCEsy2zRU/b3aeZHO0dzophwnERJ4Or/Triyt70ljltR6katbrEY3upFG1Aq1hI3IkcoXB2h1zODlGD6fm3zsL15/wTodi4G8h2cOWSdCWyyfqsTPH/pXw21aWvoT9OwI+E+Xoq//VDc5FgkP7u8nK1keFDjGH3YswsNpdZJQyz+MPmH41zrbGRKkAt1Cy3SGesAoQDP0b3BbP1l9muPz7cj7gTE1P8F7QTYrjGKh2oZehNsMXRRMw8jNk4ZWT69XDfd3LTPPX7YPWcChMUhAcuCBQmMZeJYY+oBNRM/PVgYQn5OEYZnE5TqUXWbUFSamnF7zPyfno1Jym7QNlAeTILYAay+LmIGDRAkXiArZ1Wb8qBvtpNxGY/4qPEcITNOT3LbH91P4xzNxATGhguq2n80h1reBikMmo132gxyX0mLpa2HRPuXAVdKDIE+fWj1ksHc5xrVs2hhizbllgmmgQ8j/gxuf+Gd3R7Ou9DM1fRgiJ1r8UxAJe6ZgIuLut13g2ApexbADWHqRo1keYd2dWP7adj+GQG7H71rBTGmvKs/uczYUWFgdWr3HElsiRnWucBkZLG5Ty65nFUYsBZQs3I1PLZ92yFYinps20BA0nHVwZgttCmByx5KzJTy5EEtyZBOGklUUkNHY/5p9WxEayEl0", + "sha1" : "6690bcc2be14ff28a1622531a940bcfffc4382c9" +}, { "device" : "Pixel 7a vbmeta_system", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAFH4m2nVzHTbT2t/hyOzB8ShVQz6yU+q4r0RYykhglRyCv3bcdcct95uROiCYyhZTB//G0IN4g+U4ifEdvaMQo3wVg81Lyd20FZvZE0/giIdWtcjPaKFux+0A6Kb4iyfABwNnVoX6ZSPHRpBjSlvjp0PBekB6EH9RnPE8eNW/roqE5IItIJsbASvyOPhDN/DZO7a507v1TXMjGNNU+1xJNi8glW0ilEwiwaB4TLGQd6jEh7NM9Be0HVKI6OSEACbP6xUA+9zVJNGvchi5FcYhi5TVnBPDSGScYvCpMdiNKFvGYpcYhgpXmR7WhoeJKwQ40umLAfho3YD3w/iJVCWopW5hx44u4dPFfE7cbI/Za9EJITF/3S8hXcesk65bNYngIslWW4id6FhRhvQxPMNolJBnnqwDjN2cjA711+6OVxXg8rQyqxigrM9a9AKr2BZIKmyoaJ8mhcIcapTC5dGIZnyB0MLYWatelINj3xdpYRYzFpzstTdnLjkPSvbo135UIwWX0puiZz4ce7mH1ChE4NlvZ63X28gPui4ZLmnJiA+OF7/UWU+AlJDMriHkuj/M+C7sML9ZQsR186Sl7iK18sLSaaxD0gpvhF1pt68Ylar54furCjOvxuorQ2dN1Q/z+5ThpQFhPIVZ5wyaW5kD85plVk8utrY1lfFeLPwgLXAMpJbJyvxPPMqLxf5ZLYWwA4TdWMYSTkIzz29vG7rnrRIGkPqpi/rWpAHzC5iZK0mTJq8UJAggbzCVSkXcxisfAfwU5gLl8n+cy58+slQAXFDmGNHKk1eFZ1y2TTiwydo6Qv62bQfsW58I3D1PkI6Zdw65sUeJhO3hIkY40S+sK2wiZcO38gIgHG6720eDAu0oFU2DzuhHE0XxPT1YhlKbkBs8r7c47lXQGmShXkC3IeGKpHJxpvvARRlynTrvsW41KJvgNB7TEeUL8Xm1jsMFusS/+PN6ZFXMYGNYpP4ZtG5IWi2T5fPQlM7YyB8ltPaEeG9HeVYfda+xg1XGdOzxjDvGeM3a+ozdAMdtAidzi0dbKLTwe1Wd6RtRxE/Wo+hVIFS/8C6QIi93kvXJ4oz2hwCvuuGUzRDcUg0HG1jnFEkqBgC9pIRsGEX1Z9lfJDB9R8K7ZRvXwJavEcDIT9D23/bXdWfuUq2dTFMmynlRb/04G85DRi7sbrjmVYCPbLRH9fMeY7R5qvcsWu/FHCI8BrJNZPfyFMEtzZSD0CKRKmTSyxLrKstY28AkO0odzRhji/sq9h/X4r/FqvJLD0qagAiVhAW5CuR2N26qSQ41z7WGdISoQdZPSbb5eNKnzRNHgqAYoWWdTaiZalyeh85HIvd3VsB2E/o5hozdozCGjacFQk9" -}, -{ - "device" : "GKI 2.0", - "manufacturer" : "Google", - "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAB696fOqmcvPXp24WvrWaiOAGtKfhdEcA1qb8i/z1aNA7pMnUaJrP+eWn22VfnViO9+OhvdM6c7+9f6BtThWfyMgtYhGC1iLwBdy9ywNOqY+/AxLKv5IpCCAVL4AyRPf+22ETAjyIqdDykGCRC6LWIGXoWT+fBuZaGGQ635A5lqp1ZhMvaCaCd+fJpZ2NvymO3RRISZyhMaVSMJbGi3p6aLT8NuAzk7VxMIooBV5U5FQ3ExhWSakrjR/zoyFVazzhBtywAv/dXSxivaN/2BpoEXUWlZShk2A1hNkvxT2vIslxXhKUyo38D3f328bDDl9j6hdrZPRwd/iZFH2sWsnzQNZ1Uq/CWIqJxr73sZCx0+EC+h2nYGrhUxPeY1M9ST/bhRroLb67JjGwidKo3LlX5BAysTiUj0jevYmEMRgzCQERxWmknNI/FpySAkAvxO2h9eaJtdcU34MfI62xck3p3rpp+jv88OTV2xUsmaPU2WCVuECkZALzKwGkVpc9uuTRBtviXOpqZcmRjKAcVg1bWFqEsgAONzwyLSUMNkZQbidz+MAObmE5I4NpqDXFU6nz7XWXfKbKQzaG5Mg9TGacBSQY4+dubeUJrO41FxtjHHzImvaLfXD+/EGbaaeqGAjB2Vo02v6dBCXd8bOyOL0rq9kzfTmfQQHjUaEvfGxE1mVJb8oxZ/EwsMVoCj0oz8cgGVVJg65JfvHjHnUKGwWHg9jQIedAZawHvRcYlSulh4BvfiDsHY9zIT5NkZ5gNXP8BFVsXMhX/xWYXa39Tlls2eq6n0s3B/YU+myyYiOL6QFsoNB1QX1fNkZKAgEQpcwRapXHHlvRwdKP8FscyLKmwdBfKg8RZeIZ/9TXL49mq3ocbfrX8se/DdPT61V2nGbApmPErcCrgtbUrxwV1a4LI3C5aMP+52brzOrUYLMeotd8xFgZj1DVgP0nKmuYeq2kzgeTOBWud53KQ+qBcegk942LGGNr1BSuBynkBywTm7iZHidjONcJUgiaB+NnCYewbLDwF21bRphkXthvak/Di2KcVugDUOGblb6X4XNR++ZTnZiBw6IbY85eL2YddPJg4ZH1zNIWa9rRuv9q6VWX1XD5+J92bd34EPuMLrmGvXgYpbfzfuqqLGpPBvbqoRfdgHe7CSe0xa3lDePOTll8sDsKKnr8jOW9CvsbS1s6+x8Nie2UFPwsb/LvfmhhsRTmlZaESRltCOjdZ+XbnSaCw7of/4oQfjk3gLiFNlH6uHDOTdi/QuFsGselWCi8I3NsMf57+1FXiQZsXbR59D+uooDC+J75IDlp2/fkBOVsyTEXe3C4gznsbvoN9GjzkAEo7uti2hjTwhaXHTQ2o3T6XpEBQzj" -}, -{ + "pubk" : "AAAQAFH4m2nVzHTbT2t/hyOzB8ShVQz6yU+q4r0RYykhglRyCv3bcdcct95uROiCYyhZTB//G0IN4g+U4ifEdvaMQo3wVg81Lyd20FZvZE0/giIdWtcjPaKFux+0A6Kb4iyfABwNnVoX6ZSPHRpBjSlvjp0PBekB6EH9RnPE8eNW/roqE5IItIJsbASvyOPhDN/DZO7a507v1TXMjGNNU+1xJNi8glW0ilEwiwaB4TLGQd6jEh7NM9Be0HVKI6OSEACbP6xUA+9zVJNGvchi5FcYhi5TVnBPDSGScYvCpMdiNKFvGYpcYhgpXmR7WhoeJKwQ40umLAfho3YD3w/iJVCWopW5hx44u4dPFfE7cbI/Za9EJITF/3S8hXcesk65bNYngIslWW4id6FhRhvQxPMNolJBnnqwDjN2cjA711+6OVxXg8rQyqxigrM9a9AKr2BZIKmyoaJ8mhcIcapTC5dGIZnyB0MLYWatelINj3xdpYRYzFpzstTdnLjkPSvbo135UIwWX0puiZz4ce7mH1ChE4NlvZ63X28gPui4ZLmnJiA+OF7/UWU+AlJDMriHkuj/M+C7sML9ZQsR186Sl7iK18sLSaaxD0gpvhF1pt68Ylar54furCjOvxuorQ2dN1Q/z+5ThpQFhPIVZ5wyaW5kD85plVk8utrY1lfFeLPwgLXAMpJbJyvxPPMqLxf5ZLYWwA4TdWMYSTkIzz29vG7rnrRIGkPqpi/rWpAHzC5iZK0mTJq8UJAggbzCVSkXcxisfAfwU5gLl8n+cy58+slQAXFDmGNHKk1eFZ1y2TTiwydo6Qv62bQfsW58I3D1PkI6Zdw65sUeJhO3hIkY40S+sK2wiZcO38gIgHG6720eDAu0oFU2DzuhHE0XxPT1YhlKbkBs8r7c47lXQGmShXkC3IeGKpHJxpvvARRlynTrvsW41KJvgNB7TEeUL8Xm1jsMFusS/+PN6ZFXMYGNYpP4ZtG5IWi2T5fPQlM7YyB8ltPaEeG9HeVYfda+xg1XGdOzxjDvGeM3a+ozdAMdtAidzi0dbKLTwe1Wd6RtRxE/Wo+hVIFS/8C6QIi93kvXJ4oz2hwCvuuGUzRDcUg0HG1jnFEkqBgC9pIRsGEX1Z9lfJDB9R8K7ZRvXwJavEcDIT9D23/bXdWfuUq2dTFMmynlRb/04G85DRi7sbrjmVYCPbLRH9fMeY7R5qvcsWu/FHCI8BrJNZPfyFMEtzZSD0CKRKmTSyxLrKstY28AkO0odzRhji/sq9h/X4r/FqvJLD0qagAiVhAW5CuR2N26qSQ41z7WGdISoQdZPSbb5eNKnzRNHgqAYoWWdTaiZalyeh85HIvd3VsB2E/o5hozdozCGjacFQk9", + "sha1" : "0d783fa67143be62c899029d33f8e4a8f1df5492" +}, { "device" : "Android 12/13/14 GSI", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAMR2F3OdWxaZ3gHcVYO3vMcw/d6UTo5j65MPd5a0/w6V3qLyOtw92OuidhUtvJgx6fBoG9aqjXMcrQkpwLcl630/VFQd+VS75Oqe4joEmxVe3LBY+n4BjUdvbegSZpanzD/lRBht1/6OR4mtMe2jfev1t3DQLroglH7+Ujb9lzL/O1TWLrZ7Lf32N6wH/KZZdnpLKGIaUo0pamQb2njYj5F/kx5Agm8j2ffnCKmYrRI66cyUhOZm5jsOFrdVTwM+CcXn1DNNkvYs5mr4WTpNiPhpOMEKC50Xrhq/H1U/L836nW5q2ZTUhEMYCxbcNS9ezAVyxe6vLLnktb2onX7NnJ+5MTzN+erFjVRHOdBESSwDpcPJANIP3us9bporBtgrIvE1+g+7R5pNsc8kBQ2wyuMfodlt45n2kYIgncKRgfE9AHLhePyoWUcrVewaWgXjp0F9qFeXLOTg385PLdulvxW5HsZ43+oeY+sz6jjJQI19wnTYXS0geb5CrjRFgsP9rljud8K52lqdmi8yV49NkHr2S18nt6cIj4AsCiVLY/9x0Qr52GvhP/nzqr2lYm09DDPlfDonR9+xzKpC78fRlbtQHjESc63uFa0FNS3BkCv+2t8wK6dJtkBAoxNhm2KgfQ3z6K610aBomur7y/N3bcA6OkWI0Agtw9ts4NY7TYjOxI4aRUBL3WAtZRXt5SWsJdbDMja36lDSq28/LksLeKXiTQkr+r9HetuAak3Zyi0a/EbWElkmOBh+h83IE0XtPTytixaLqAV+pLY2UPFR9H87vbsgXnns0f20qEQwlAqypbrtqEj0Cen+ZTQhuGin4EwuQMfJwyI6CNdH01gmUUTvOB2BITOouN8Utukw51fivDaGOCPIGwCUKZkdqR3EHRNb9DqpWXZm+0SmFh+1nFlWQB9gulMC5PTz2RZ/BpJcUoLRe6x+3aDxEOcyTLIC3KG3HDYmGDDpLoLhVBNXer0BECyJ55tvIXYy1PjROgn6CGO96R5ygbWEavrSq2sCa+H5aBfwKf/SBFtYGxyd8504s5SYDFDzF1SHVpnKYyHiDXQUnvoEszHYGpKeNTcV3wL5yB1X/jJr0Tz+r8tG5AkzAfQukCV+xF44vvGZzCx4xUCufwoeMFhnjpU0S4ZfLDC9XycNZR/E/WKhZhPQ4hBUI9d/QyvoUiuoHqoWWYbRU4kyvhHdy6s69pBNNRJdFH7LSmotqA9eDs8NYkiJa/ritElk+WNS6Q5E5Li4MpEySwsQznmvm9SDXxBsAfU9sMeWsYHgMPrEehV6t7iSfdS59GNyamotkPmOyaczUALHuDnuLojMErMHtIewJP40tyBodWs+FkVkVUJYO6r9A5Q7mLmE" -}, -{ - "device" : "qcar-gsi key", + "pubk" : "AAAQAMR2F3OdWxaZ3gHcVYO3vMcw/d6UTo5j65MPd5a0/w6V3qLyOtw92OuidhUtvJgx6fBoG9aqjXMcrQkpwLcl630/VFQd+VS75Oqe4joEmxVe3LBY+n4BjUdvbegSZpanzD/lRBht1/6OR4mtMe2jfev1t3DQLroglH7+Ujb9lzL/O1TWLrZ7Lf32N6wH/KZZdnpLKGIaUo0pamQb2njYj5F/kx5Agm8j2ffnCKmYrRI66cyUhOZm5jsOFrdVTwM+CcXn1DNNkvYs5mr4WTpNiPhpOMEKC50Xrhq/H1U/L836nW5q2ZTUhEMYCxbcNS9ezAVyxe6vLLnktb2onX7NnJ+5MTzN+erFjVRHOdBESSwDpcPJANIP3us9bporBtgrIvE1+g+7R5pNsc8kBQ2wyuMfodlt45n2kYIgncKRgfE9AHLhePyoWUcrVewaWgXjp0F9qFeXLOTg385PLdulvxW5HsZ43+oeY+sz6jjJQI19wnTYXS0geb5CrjRFgsP9rljud8K52lqdmi8yV49NkHr2S18nt6cIj4AsCiVLY/9x0Qr52GvhP/nzqr2lYm09DDPlfDonR9+xzKpC78fRlbtQHjESc63uFa0FNS3BkCv+2t8wK6dJtkBAoxNhm2KgfQ3z6K610aBomur7y/N3bcA6OkWI0Agtw9ts4NY7TYjOxI4aRUBL3WAtZRXt5SWsJdbDMja36lDSq28/LksLeKXiTQkr+r9HetuAak3Zyi0a/EbWElkmOBh+h83IE0XtPTytixaLqAV+pLY2UPFR9H87vbsgXnns0f20qEQwlAqypbrtqEj0Cen+ZTQhuGin4EwuQMfJwyI6CNdH01gmUUTvOB2BITOouN8Utukw51fivDaGOCPIGwCUKZkdqR3EHRNb9DqpWXZm+0SmFh+1nFlWQB9gulMC5PTz2RZ/BpJcUoLRe6x+3aDxEOcyTLIC3KG3HDYmGDDpLoLhVBNXer0BECyJ55tvIXYy1PjROgn6CGO96R5ygbWEavrSq2sCa+H5aBfwKf/SBFtYGxyd8504s5SYDFDzF1SHVpnKYyHiDXQUnvoEszHYGpKeNTcV3wL5yB1X/jJr0Tz+r8tG5AkzAfQukCV+xF44vvGZzCx4xUCufwoeMFhnjpU0S4ZfLDC9XycNZR/E/WKhZhPQ4hBUI9d/QyvoUiuoHqoWWYbRU4kyvhHdy6s69pBNNRJdFH7LSmotqA9eDs8NYkiJa/ritElk+WNS6Q5E5Li4MpEySwsQznmvm9SDXxBsAfU9sMeWsYHgMPrEehV6t7iSfdS59GNyamotkPmOyaczUALHuDnuLojMErMHtIewJP40tyBodWs+FkVkVUJYO6r9A5Q7mLmE", + "sha1" : "1ffb1af796b18ebf40d18faed213f686720f73f2" +}, { + "device" : "qcar-gsi.avbpubkey", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAGL6Cpu6jstCSfiylEV8LXCpKCMzYhgSLT3ORW4fRLCRet+2sPW6J0KFUkXYIB3iwlaNADGOMU/l+R3mZRAK3vIQ+RFLybU9lKQVCwK1Dn95k+jLviRg96sWL0/O7gELYx97FlI/MkfxEhzfZXzZfE3jKPROJwls/TnMGhFE3hF5rlvxZiEhRkbmrTFdggpiLrhSTIcS2gx5moeVbJkLNzfydnRGVtD7hkv2k519Vga8o67q0GCVscrJYkPuwm/HBZSQZZq0QZK/b1+GSucfLaEaxLJg+yteap1xaoh16llF/V+U45jodW588N/apt2QSYC647QIRJMMRIUNzruCGT1qDjrHx4IwqjWt7y7K21LSEYeVVZRS2YycT4ORkKwMY5nkyz3yxN3AzYhRt0F2vp5dK17XNLZgp5M8FVqYyZ9TCYx33Y7ZpR3ILnvPQMQQxi3s3jWKa2s1Vp2eAwMEIGkj24lGcd+ZnMWJb75EhkJghtj+EVq4Dugv4H31KuU1QKuo4Ttc8TASRPuwwFKqzOPGfoQgFgbqK5qSrjp8+khdd5g1lCRO/IbfXKeoFXxfI7PVgNxziEWuObwVlNmZK04I6p9wnjB/AeQo1a8nSOcfCqMkYc+Ee7NBE68WCFoPwCXCY/kWY3cefj/gbyj9cie/w+KbufdtYSe13bM9C/QTsUY0bVfhGX+2ak92aOR8caHWAM5lESOlmbSPJk86wXYPOF8sXIbRecw6B2X8m1h2+y7At09xTtCt1++DY3UqbgpFxcjy5mAIsIkw6VNfGujTu795CTsK3sZ1prA0KmhQ+tjZ5kFALe9zwDJIIEoqGtpL+oqKTa0xiGYf5pMpSvtSsAEWbuibttpkOqLUZA6l2kYsIeMaeLb8SKj2jOxiST4b1eTtKUYp1Vf/v/vfAzhnk8bd6mB8FVfdLRCD+tKDbVZHM8dYki/jhX6evyzCPvYfnSslP2iKA2oZPIB4KZT+0Bs70TK/gQ0VY6Ydlw3pwxzKkEc1kvhknKBm7rN7nuvlIhEKe8d/e1wA97JoiK7fSuCHW9f3aJdaPs+HKAPc3r2e6OO1dTixaLal24l3YRsxOWljH4bapf+FJwyIFwcV9c6EENsA65mjSzFPPfSbszrnmbLQPWydMRKn/0M7sU62izwGiAw/2RNi6kMNY/7VCKJTRiUOKlusxP0I5I8nKLoL1AxjJ8sBXk0P+zlTHKjJf0Ku2j13XlEXxXqR5MsYnHL9evW6QLpHu9dE5sFqxmhb7bP57HEUWPxg6QBq4CcZ92tgYYlwMDbbQPgVHh5s+47hXxAk3BmlxaW6W6vJTuGmnGtBdMNHK4xQdZREypSutVAvKgoY6RmShqIzG18c7vG/" -}, -{ - "device" : "q-gsi key", + "pubk" : "AAAQAGL6Cpu6jstCSfiylEV8LXCpKCMzYhgSLT3ORW4fRLCRet+2sPW6J0KFUkXYIB3iwlaNADGOMU/l+R3mZRAK3vIQ+RFLybU9lKQVCwK1Dn95k+jLviRg96sWL0/O7gELYx97FlI/MkfxEhzfZXzZfE3jKPROJwls/TnMGhFE3hF5rlvxZiEhRkbmrTFdggpiLrhSTIcS2gx5moeVbJkLNzfydnRGVtD7hkv2k519Vga8o67q0GCVscrJYkPuwm/HBZSQZZq0QZK/b1+GSucfLaEaxLJg+yteap1xaoh16llF/V+U45jodW588N/apt2QSYC647QIRJMMRIUNzruCGT1qDjrHx4IwqjWt7y7K21LSEYeVVZRS2YycT4ORkKwMY5nkyz3yxN3AzYhRt0F2vp5dK17XNLZgp5M8FVqYyZ9TCYx33Y7ZpR3ILnvPQMQQxi3s3jWKa2s1Vp2eAwMEIGkj24lGcd+ZnMWJb75EhkJghtj+EVq4Dugv4H31KuU1QKuo4Ttc8TASRPuwwFKqzOPGfoQgFgbqK5qSrjp8+khdd5g1lCRO/IbfXKeoFXxfI7PVgNxziEWuObwVlNmZK04I6p9wnjB/AeQo1a8nSOcfCqMkYc+Ee7NBE68WCFoPwCXCY/kWY3cefj/gbyj9cie/w+KbufdtYSe13bM9C/QTsUY0bVfhGX+2ak92aOR8caHWAM5lESOlmbSPJk86wXYPOF8sXIbRecw6B2X8m1h2+y7At09xTtCt1++DY3UqbgpFxcjy5mAIsIkw6VNfGujTu795CTsK3sZ1prA0KmhQ+tjZ5kFALe9zwDJIIEoqGtpL+oqKTa0xiGYf5pMpSvtSsAEWbuibttpkOqLUZA6l2kYsIeMaeLb8SKj2jOxiST4b1eTtKUYp1Vf/v/vfAzhnk8bd6mB8FVfdLRCD+tKDbVZHM8dYki/jhX6evyzCPvYfnSslP2iKA2oZPIB4KZT+0Bs70TK/gQ0VY6Ydlw3pwxzKkEc1kvhknKBm7rN7nuvlIhEKe8d/e1wA97JoiK7fSuCHW9f3aJdaPs+HKAPc3r2e6OO1dTixaLal24l3YRsxOWljH4bapf+FJwyIFwcV9c6EENsA65mjSzFPPfSbszrnmbLQPWydMRKn/0M7sU62izwGiAw/2RNi6kMNY/7VCKJTRiUOKlusxP0I5I8nKLoL1AxjJ8sBXk0P+zlTHKjJf0Ku2j13XlEXxXqR5MsYnHL9evW6QLpHu9dE5sFqxmhb7bP57HEUWPxg6QBq4CcZ92tgYYlwMDbbQPgVHh5s+47hXxAk3BmlxaW6W6vJTuGmnGtBdMNHK4xQdZREypSutVAvKgoY6RmShqIzG18c7vG/", + "sha1" : "594f70f6344799cb39fa2fc569a0c646d716a060" +}, { + "device" : "q-gsi.avbpubkey", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAN3haYGQPHFa9yJAviIpp5Feoyn9fr9IEOXPfDzY+SzDr0drrCjO5gY59btYOt/RbVhiXRZK3uSwN3OSiQ98CtECYG9AxUu+3m7o0W+y/UiQkvbbLN+gnbZjiAqWWBIdT0RUTdIf98eMBdgzbdpbDn7uzmwDjLvCkrc/rsWcYYeD6VuS0qKiw/Bzm/8hp7lqqtW0fgn4Y7OBPXRfckyNExjkSvktZZKDFFKp/Xcio5coGLBqXc+1g0Lmo2osbx4bSP4cwJSxKtEeSfH51DLPSc8w+tba/8Jmp+j0KAf5jowNzRKyxyjxavzs0c0Us087MkHN4MaBeLIRH4twUtBRUVKNwacmC3vkFjgnVhpATzXHQa6OYQdV6I8Hu1GyKJ1mr85vEOroNB710Kr7r4Y6YhkW4TpYJQzQ0YZGVQXgp0q00qAQGa9BANrsBaPHFLfLMt/oxGWmIIEeJPKMJ20VTojJqC0XJp39Ujbn0UXC/5V9lU94BQYwog84FOVh2THwcMYsDFb/WlJkF6ERKDYjQwEcIPwR18E1oM3nBM3x5TJpeCV929gxBKYVdf3uoPwiq/tJmM6m+HcHrqjnwN17i1SyG54Hg5rXRQG98Zx+jh4mam1j6dD9dnm0UYNbU24Bca5QhfSR9gwTXxj+9owvyNhKFF41/LcEeaIl+4W0azzj0Mcpf45+UlP0vG5mxKpzlasQthS8m6nPdkYrKrSTClWueuZRhiW0lnPF7PCj8n9jccJ2xYoqcdKRja3hQuBp5u6cRjZi0ACimdTwAMjw7IVkyNlJsTEHPCcQCMknWp5sncJtqady+BbO4W4AfGqSdi6zEZQc3bP5QdQsrnT3rocNHoX3gNwh+hDaED5Rj3MzPXFclb0xfLf1yMSIVuGCePKAcOqwlVbQIeoo2yfHPWX02EvS1JbBrkBCAJ6HRw3e5t/JQXm+faSBaTWGrSBwqaG/ykXgEDzjdeTsGnVr5g9vazd3Z3Lr6F7HqTIYvMZ+ovkIwiBC6dapTX0Ow35m+NjYSTUd15igmaqxjxq4zq2wxE5T5DQhF5ria8cp+0AJhWkfl35oxPWPnLworlDjvu2BdEb0RtfkHM8/po1BBlHzYqqTyV1NqkQq9nO6gVCyGW/X8XufeXKg1CDUiGfjn3IhIIXVcmjW4NxAgdCZdAjGNqIyaYR/LOksw0uaB1IFh0VQNjj300LOXUbJMXdaxzx1sQpw+nFSNYtTX6Uck/XfeBJDSiae5kbVQcey0hhbj1CDWT/u05hVvtxbmmcqVcS+pXk3wjJ/nnWJNga+DYtzK678/u9Fcj0dC+fsWXlEgRen9i4hDynaB7nkOFsnrweA014TLwuSSOmdEDnO0NMnxeQH" -}, -{ - "device" : "r-gsi key", + "pubk" : "AAAQAN3haYGQPHFa9yJAviIpp5Feoyn9fr9IEOXPfDzY+SzDr0drrCjO5gY59btYOt/RbVhiXRZK3uSwN3OSiQ98CtECYG9AxUu+3m7o0W+y/UiQkvbbLN+gnbZjiAqWWBIdT0RUTdIf98eMBdgzbdpbDn7uzmwDjLvCkrc/rsWcYYeD6VuS0qKiw/Bzm/8hp7lqqtW0fgn4Y7OBPXRfckyNExjkSvktZZKDFFKp/Xcio5coGLBqXc+1g0Lmo2osbx4bSP4cwJSxKtEeSfH51DLPSc8w+tba/8Jmp+j0KAf5jowNzRKyxyjxavzs0c0Us087MkHN4MaBeLIRH4twUtBRUVKNwacmC3vkFjgnVhpATzXHQa6OYQdV6I8Hu1GyKJ1mr85vEOroNB710Kr7r4Y6YhkW4TpYJQzQ0YZGVQXgp0q00qAQGa9BANrsBaPHFLfLMt/oxGWmIIEeJPKMJ20VTojJqC0XJp39Ujbn0UXC/5V9lU94BQYwog84FOVh2THwcMYsDFb/WlJkF6ERKDYjQwEcIPwR18E1oM3nBM3x5TJpeCV929gxBKYVdf3uoPwiq/tJmM6m+HcHrqjnwN17i1SyG54Hg5rXRQG98Zx+jh4mam1j6dD9dnm0UYNbU24Bca5QhfSR9gwTXxj+9owvyNhKFF41/LcEeaIl+4W0azzj0Mcpf45+UlP0vG5mxKpzlasQthS8m6nPdkYrKrSTClWueuZRhiW0lnPF7PCj8n9jccJ2xYoqcdKRja3hQuBp5u6cRjZi0ACimdTwAMjw7IVkyNlJsTEHPCcQCMknWp5sncJtqady+BbO4W4AfGqSdi6zEZQc3bP5QdQsrnT3rocNHoX3gNwh+hDaED5Rj3MzPXFclb0xfLf1yMSIVuGCePKAcOqwlVbQIeoo2yfHPWX02EvS1JbBrkBCAJ6HRw3e5t/JQXm+faSBaTWGrSBwqaG/ykXgEDzjdeTsGnVr5g9vazd3Z3Lr6F7HqTIYvMZ+ovkIwiBC6dapTX0Ow35m+NjYSTUd15igmaqxjxq4zq2wxE5T5DQhF5ria8cp+0AJhWkfl35oxPWPnLworlDjvu2BdEb0RtfkHM8/po1BBlHzYqqTyV1NqkQq9nO6gVCyGW/X8XufeXKg1CDUiGfjn3IhIIXVcmjW4NxAgdCZdAjGNqIyaYR/LOksw0uaB1IFh0VQNjj300LOXUbJMXdaxzx1sQpw+nFSNYtTX6Uck/XfeBJDSiae5kbVQcey0hhbj1CDWT/u05hVvtxbmmcqVcS+pXk3wjJ/nnWJNga+DYtzK678/u9Fcj0dC+fsWXlEgRen9i4hDynaB7nkOFsnrweA014TLwuSSOmdEDnO0NMnxeQH", + "sha1" : "144820003f9d46c96e9090dcf0e4feb84ca84810" +}, { + "device" : "r-gsi.avbpubkey", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAGb+3nuKBXXDQgj/dBdxprzFpUgV6IEMnpGYSIaYcIoQzQIJ0jJ8nc/IeI3qzmaOg4obVl6O7xqMDeHkIzv+HAdW3vth4K1kCKED4vZOxwp8h3qbx4Xg2Bc0ynxL4FUWs7E1+p9uqEkyIYs5shgWN1ORI0z2hh71XzzxReielLUNMp0Ub5Km1q9h7nWj2KlxMNVvppaXXb4GTVoBfFfw/xJnCa7GEdd2vnrnLJU9jKjHWo3R472yyDCU6iBrdHycKWyFNzg7HFQLRD/IapnK31Cle7wD+wzRxN/M47zYWLBSLUsL3iYvRPupYZjPWzsMUZuris86DEm0SdfE0IzhYitB55CT4Vo3CXXrVNg3rYWNOpjd/kK++bvzUxO0tycxkEvAJfc9vlJbYJyaXr7eHXuVq+BlagJeTGLL4SCe4/inguL/xr7/j4Du0miVO/bMz2Pxg1cxCnsXjd52x7dxVzQljSnLwaS9z5bbQRkKfEYra6GIPk9v/ZedYLOBgkV/k06n31FUT3EJG/Kd3X3HLbRSEqz4LyehU3hOfwIDWTtlnnyVWAnS36rAT22IH6+Lrgi6sPIYqJqXG8jTYoqNTnD2oSRui5VhRd+4gx2YWF6xcXvPkkNIgdp3QkONfxxwLHWkW+bawhOuRo7NHX6rqc0RxdEzA+N+6H/6G02gA3inbnOvTTUmQteC/EvT0nMubYGRcOuyiueTY+M36OwtBwnKnBNMP/IaCIP7xWH5fBqzT6+yHwhDsDLg5WhvBI+Nd5gYZYicO+p9ImeomI92BRRHI0xsa0X7a5we0YD9+q/QG34KjNGU21Ovni7PHjhrd4koMfuFXdTA5yMMgifjB816N4NhlUKOFPGcpUu4q7bUURCgIa1kmlxohLiTJv2zPE1mAHJxoq96ZiJy7mpsnrL+Wl+/bc7/bBru5KojvjOQrLCKfk7djWLKuaRVD3aPFw4ZdQHSdgNZvIc+a4a9IeD/V1M62poaQLnzWC2gaOlIVwhjOtTIpWw896xMq/ayVz/dchYsgtt+yHQfx+MYFsJ0m4YV6RNIhrDp5AuE57SJRNdqLp6OgpTkJpbqXN9tLVFX0j5/5uioZJ7pV3mVLh+weX4gRTxo4wBC0ugPa+ltuXCg1DLBgS3/kLE4e/nSq5ZueFZoBJ7iFPvBAvjGaSCjoxkAgYMCrBkev4inIGUHOiZ8vGVXBZllUV/4YpzBkBLPvdcp//K3Hd7TggfVRu5PrkmpeakdRsBcj6uCtpQUwXvpQ4WzhGxIClmBo8wpa8U60iaWbWsQVu+C6EayPZvMrTnBui6M5NxjhtD/LeyyMNiC0jMQlgLyjrKn6FUl+jZRhW+n3dLrK+MqMkcW7/5Q6FFK" -}, -{ - "device" : "s-gsi key", + "pubk" : "AAAQAGb+3nuKBXXDQgj/dBdxprzFpUgV6IEMnpGYSIaYcIoQzQIJ0jJ8nc/IeI3qzmaOg4obVl6O7xqMDeHkIzv+HAdW3vth4K1kCKED4vZOxwp8h3qbx4Xg2Bc0ynxL4FUWs7E1+p9uqEkyIYs5shgWN1ORI0z2hh71XzzxReielLUNMp0Ub5Km1q9h7nWj2KlxMNVvppaXXb4GTVoBfFfw/xJnCa7GEdd2vnrnLJU9jKjHWo3R472yyDCU6iBrdHycKWyFNzg7HFQLRD/IapnK31Cle7wD+wzRxN/M47zYWLBSLUsL3iYvRPupYZjPWzsMUZuris86DEm0SdfE0IzhYitB55CT4Vo3CXXrVNg3rYWNOpjd/kK++bvzUxO0tycxkEvAJfc9vlJbYJyaXr7eHXuVq+BlagJeTGLL4SCe4/inguL/xr7/j4Du0miVO/bMz2Pxg1cxCnsXjd52x7dxVzQljSnLwaS9z5bbQRkKfEYra6GIPk9v/ZedYLOBgkV/k06n31FUT3EJG/Kd3X3HLbRSEqz4LyehU3hOfwIDWTtlnnyVWAnS36rAT22IH6+Lrgi6sPIYqJqXG8jTYoqNTnD2oSRui5VhRd+4gx2YWF6xcXvPkkNIgdp3QkONfxxwLHWkW+bawhOuRo7NHX6rqc0RxdEzA+N+6H/6G02gA3inbnOvTTUmQteC/EvT0nMubYGRcOuyiueTY+M36OwtBwnKnBNMP/IaCIP7xWH5fBqzT6+yHwhDsDLg5WhvBI+Nd5gYZYicO+p9ImeomI92BRRHI0xsa0X7a5we0YD9+q/QG34KjNGU21Ovni7PHjhrd4koMfuFXdTA5yMMgifjB816N4NhlUKOFPGcpUu4q7bUURCgIa1kmlxohLiTJv2zPE1mAHJxoq96ZiJy7mpsnrL+Wl+/bc7/bBru5KojvjOQrLCKfk7djWLKuaRVD3aPFw4ZdQHSdgNZvIc+a4a9IeD/V1M62poaQLnzWC2gaOlIVwhjOtTIpWw896xMq/ayVz/dchYsgtt+yHQfx+MYFsJ0m4YV6RNIhrDp5AuE57SJRNdqLp6OgpTkJpbqXN9tLVFX0j5/5uioZJ7pV3mVLh+weX4gRTxo4wBC0ugPa+ltuXCg1DLBgS3/kLE4e/nSq5ZueFZoBJ7iFPvBAvjGaSCjoxkAgYMCrBkev4inIGUHOiZ8vGVXBZllUV/4YpzBkBLPvdcp//K3Hd7TggfVRu5PrkmpeakdRsBcj6uCtpQUwXvpQ4WzhGxIClmBo8wpa8U60iaWbWsQVu+C6EayPZvMrTnBui6M5NxjhtD/LeyyMNiC0jMQlgLyjrKn6FUl+jZRhW+n3dLrK+MqMkcW7/5Q6FFK", + "sha1" : "e3cc565489737d7c5a54fff8337fe4279783c8ce" +}, { + "device" : "s-gsi.avbpubkey", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAD1N+Zmv1D3jU0dOiBZKfV4npeO5Y1Q7FHWisVGhCOiLh2yRjF9RPvo8gaoND2kIaJEgEwGp/gc7o30Y+loiPRU1/7DvEEQ38nHmlsQtzTMqSkZVhaAhtmsMRVgKZIeCEN8LEXsX1/yYwOSVCQ3XHRBfIs2pvR9hi1Fd752z4ZiUqQVueprGkEZM1Wu/Ef2hLUIwRduQPivGTxZUzo3WzwBlyxv7ANXL4DuhuE7ojRtDXB67aZ83eMp0ukF+5k0nDaOo9bWDk82HHuXf5wJrNcBA0qS3PYfM1q07byc0tQFRQBsD4fxPWsNzTpoMn232qGLKovjkJ6ejUmfdcdRiMDuyAmgM8RNLKWtpZmGfIf5HpIEvqxmt29GUDDsPSA0Fl/RE5rmF9Yq2URhMlA7PlSJSK1XFp72B2whSvxpmIHdoZ3rjTAcDY4cio3laBLM8OHQEwhN8+Y+12BNl65mmvTw1ZCBZ4wnRrQcSg/PMVcV87Jq7SmL4NhAprX0Vmkxmh/Cacle1/Q8sx1XntZ7WC0Z57OjId7pxxZLTRw/JAtYzqu8KotsvuybnEvJdjYkIUVPuVaz20ZWbwkZbq8MkGpxE/nwM65QoADWLxj8THAnI0tkg8FHPaC5HJfFUGIPpYDF8XB8SkLhLBYmxEr2ylQmtSU0h481tQox+YUruvliO+5+1V3si+/F3X4mi8YOJB4dbbbLY6iyYMN23hkP0pT+4lY7gLuFfETBDvh7ItcNTU440eC7Y3CMlLpxCoIh3+x9cMXikr9Y5BmkjTgffRr1wk7nUbEm5aLy2oei+qbK0x7UJYMX6xlf3gMJ3yINAFMIghRRfQ1Jwjf3yY/PwClxJ1Mr07DnH1vNz/Tnb3E9jZ/JSzCaxHT6jY4Qp2zM1vjS6CXV98yZ6hn35HY39EsZlQ8lngKpWWHwo5BIqjIiG3AZeOoYz8p2yE8awQLNgvtdOEBc1L0jjOg18n7KN5h+Y8Utby396Qp9oaP4rhp2hAIcuWWaOR3ITvBhmRZ3wPk1iBUDbyZtj2TGsQ/HDF3Q77ZLkqRdaBM2J2oAH8J2TLrCpBsO2UzNFaYu4l9eGe/DlMPzdU+0JDVZJKYMthdun/HDhRJI14n3mMzOi8lCtB4OaP3SxkA7TJk19u1RNUiUGBLuADbw69/ZTqjhMaFfYNByqgAue7ZudiTcZYYxYV27TCoP9YNy+u/9gwdddnjqwBhIcrpV03EhGnmrgTYS0+JRUQnDwcNui183Gg2GePR/AjYf/zkI7WEP/rR6CVzF2urT+e7Wx59fp0f0+a4kiFjkims8iwZIZ6Uujdm7tkDmCVkMzll0beZtKxzh1n6CcA5Ju+WyrmN+lj5opNbD4Qnot" -}, -{ - "device" : "t-gsi key", + "pubk" : "AAAQAD1N+Zmv1D3jU0dOiBZKfV4npeO5Y1Q7FHWisVGhCOiLh2yRjF9RPvo8gaoND2kIaJEgEwGp/gc7o30Y+loiPRU1/7DvEEQ38nHmlsQtzTMqSkZVhaAhtmsMRVgKZIeCEN8LEXsX1/yYwOSVCQ3XHRBfIs2pvR9hi1Fd752z4ZiUqQVueprGkEZM1Wu/Ef2hLUIwRduQPivGTxZUzo3WzwBlyxv7ANXL4DuhuE7ojRtDXB67aZ83eMp0ukF+5k0nDaOo9bWDk82HHuXf5wJrNcBA0qS3PYfM1q07byc0tQFRQBsD4fxPWsNzTpoMn232qGLKovjkJ6ejUmfdcdRiMDuyAmgM8RNLKWtpZmGfIf5HpIEvqxmt29GUDDsPSA0Fl/RE5rmF9Yq2URhMlA7PlSJSK1XFp72B2whSvxpmIHdoZ3rjTAcDY4cio3laBLM8OHQEwhN8+Y+12BNl65mmvTw1ZCBZ4wnRrQcSg/PMVcV87Jq7SmL4NhAprX0Vmkxmh/Cacle1/Q8sx1XntZ7WC0Z57OjId7pxxZLTRw/JAtYzqu8KotsvuybnEvJdjYkIUVPuVaz20ZWbwkZbq8MkGpxE/nwM65QoADWLxj8THAnI0tkg8FHPaC5HJfFUGIPpYDF8XB8SkLhLBYmxEr2ylQmtSU0h481tQox+YUruvliO+5+1V3si+/F3X4mi8YOJB4dbbbLY6iyYMN23hkP0pT+4lY7gLuFfETBDvh7ItcNTU440eC7Y3CMlLpxCoIh3+x9cMXikr9Y5BmkjTgffRr1wk7nUbEm5aLy2oei+qbK0x7UJYMX6xlf3gMJ3yINAFMIghRRfQ1Jwjf3yY/PwClxJ1Mr07DnH1vNz/Tnb3E9jZ/JSzCaxHT6jY4Qp2zM1vjS6CXV98yZ6hn35HY39EsZlQ8lngKpWWHwo5BIqjIiG3AZeOoYz8p2yE8awQLNgvtdOEBc1L0jjOg18n7KN5h+Y8Utby396Qp9oaP4rhp2hAIcuWWaOR3ITvBhmRZ3wPk1iBUDbyZtj2TGsQ/HDF3Q77ZLkqRdaBM2J2oAH8J2TLrCpBsO2UzNFaYu4l9eGe/DlMPzdU+0JDVZJKYMthdun/HDhRJI14n3mMzOi8lCtB4OaP3SxkA7TJk19u1RNUiUGBLuADbw69/ZTqjhMaFfYNByqgAue7ZudiTcZYYxYV27TCoP9YNy+u/9gwdddnjqwBhIcrpV03EhGnmrgTYS0+JRUQnDwcNui183Gg2GePR/AjYf/zkI7WEP/rR6CVzF2urT+e7Wx59fp0f0+a4kiFjkims8iwZIZ6Uujdm7tkDmCVkMzll0beZtKxzh1n6CcA5Ju+WyrmN+lj5opNbD4Qnot", + "sha1" : "152cb9d664a600bd37fa1ea6713816a4f3265243" +}, { + "device" : "t-gsi.avbpubkey", "manufacturer" : "Google", "algorithm" : "SHA256_RSA4096", - "pubk" : "AAAQAB696fOqmcvPXp24WvrWaiOAGtKfhdEcA1qb8i/z1aNA7pMnUaJrP+eWn22VfnViO9+OhvdM6c7+9f6BtThWfyMgtYhGC1iLwBdy9ywNOqY+/AxLKv5IpCCAVL4AyRPf+22ETAjyIqdDykGCRC6LWIGXoWT+fBuZaGGQ635A5lqp1ZhMvaCaCd+fJpZ2NvymO3RRISZyhMaVSMJbGi3p6aLT8NuAzk7VxMIooBV5U5FQ3ExhWSakrjR/zoyFVazzhBtywAv/dXSxivaN/2BpoEXUWlZShk2A1hNkvxT2vIslxXhKUyo38D3f328bDDl9j6hdrZPRwd/iZFH2sWsnzQNZ1Uq/CWIqJxr73sZCx0+EC+h2nYGrhUxPeY1M9ST/bhRroLb67JjGwidKo3LlX5BAysTiUj0jevYmEMRgzCQERxWmknNI/FpySAkAvxO2h9eaJtdcU34MfI62xck3p3rpp+jv88OTV2xUsmaPU2WCVuECkZALzKwGkVpc9uuTRBtviXOpqZcmRjKAcVg1bWFqEsgAONzwyLSUMNkZQbidz+MAObmE5I4NpqDXFU6nz7XWXfKbKQzaG5Mg9TGacBSQY4+dubeUJrO41FxtjHHzImvaLfXD+/EGbaaeqGAjB2Vo02v6dBCXd8bOyOL0rq9kzfTmfQQHjUaEvfGxE1mVJb8oxZ/EwsMVoCj0oz8cgGVVJg65JfvHjHnUKGwWHg9jQIedAZawHvRcYlSulh4BvfiDsHY9zIT5NkZ5gNXP8BFVsXMhX/xWYXa39Tlls2eq6n0s3B/YU+myyYiOL6QFsoNB1QX1fNkZKAgEQpcwRapXHHlvRwdKP8FscyLKmwdBfKg8RZeIZ/9TXL49mq3ocbfrX8se/DdPT61V2nGbApmPErcCrgtbUrxwV1a4LI3C5aMP+52brzOrUYLMeotd8xFgZj1DVgP0nKmuYeq2kzgeTOBWud53KQ+qBcegk942LGGNr1BSuBynkBywTm7iZHidjONcJUgiaB+NnCYewbLDwF21bRphkXthvak/Di2KcVugDUOGblb6X4XNR++ZTnZiBw6IbY85eL2YddPJg4ZH1zNIWa9rRuv9q6VWX1XD5+J92bd34EPuMLrmGvXgYpbfzfuqqLGpPBvbqoRfdgHe7CSe0xa3lDePOTll8sDsKKnr8jOW9CvsbS1s6+x8Nie2UFPwsb/LvfmhhsRTmlZaESRltCOjdZ+XbnSaCw7of/4oQfjk3gLiFNlH6uHDOTdi/QuFsGselWCi8I3NsMf57+1FXiQZsXbR59D+uooDC+J75IDlp2/fkBOVsyTEXe3C4gznsbvoN9GjzkAEo7uti2hjTwhaXHTQ2o3T6XpEBQzj" -} -] + "pubk" : "AAAQAB696fOqmcvPXp24WvrWaiOAGtKfhdEcA1qb8i/z1aNA7pMnUaJrP+eWn22VfnViO9+OhvdM6c7+9f6BtThWfyMgtYhGC1iLwBdy9ywNOqY+/AxLKv5IpCCAVL4AyRPf+22ETAjyIqdDykGCRC6LWIGXoWT+fBuZaGGQ635A5lqp1ZhMvaCaCd+fJpZ2NvymO3RRISZyhMaVSMJbGi3p6aLT8NuAzk7VxMIooBV5U5FQ3ExhWSakrjR/zoyFVazzhBtywAv/dXSxivaN/2BpoEXUWlZShk2A1hNkvxT2vIslxXhKUyo38D3f328bDDl9j6hdrZPRwd/iZFH2sWsnzQNZ1Uq/CWIqJxr73sZCx0+EC+h2nYGrhUxPeY1M9ST/bhRroLb67JjGwidKo3LlX5BAysTiUj0jevYmEMRgzCQERxWmknNI/FpySAkAvxO2h9eaJtdcU34MfI62xck3p3rpp+jv88OTV2xUsmaPU2WCVuECkZALzKwGkVpc9uuTRBtviXOpqZcmRjKAcVg1bWFqEsgAONzwyLSUMNkZQbidz+MAObmE5I4NpqDXFU6nz7XWXfKbKQzaG5Mg9TGacBSQY4+dubeUJrO41FxtjHHzImvaLfXD+/EGbaaeqGAjB2Vo02v6dBCXd8bOyOL0rq9kzfTmfQQHjUaEvfGxE1mVJb8oxZ/EwsMVoCj0oz8cgGVVJg65JfvHjHnUKGwWHg9jQIedAZawHvRcYlSulh4BvfiDsHY9zIT5NkZ5gNXP8BFVsXMhX/xWYXa39Tlls2eq6n0s3B/YU+myyYiOL6QFsoNB1QX1fNkZKAgEQpcwRapXHHlvRwdKP8FscyLKmwdBfKg8RZeIZ/9TXL49mq3ocbfrX8se/DdPT61V2nGbApmPErcCrgtbUrxwV1a4LI3C5aMP+52brzOrUYLMeotd8xFgZj1DVgP0nKmuYeq2kzgeTOBWud53KQ+qBcegk942LGGNr1BSuBynkBywTm7iZHidjONcJUgiaB+NnCYewbLDwF21bRphkXthvak/Di2KcVugDUOGblb6X4XNR++ZTnZiBw6IbY85eL2YddPJg4ZH1zNIWa9rRuv9q6VWX1XD5+J92bd34EPuMLrmGvXgYpbfzfuqqLGpPBvbqoRfdgHe7CSe0xa3lDePOTll8sDsKKnr8jOW9CvsbS1s6+x8Nie2UFPwsb/LvfmhhsRTmlZaESRltCOjdZ+XbnSaCw7of/4oQfjk3gLiFNlH6uHDOTdi/QuFsGselWCi8I3NsMf57+1FXiQZsXbR59D+uooDC+J75IDlp2/fkBOVsyTEXe3C4gznsbvoN9GjzkAEo7uti2hjTwhaXHTQ2o3T6XpEBQzj", + "sha1" : "b42c87bedcf600d7bebe3dbade2444e9724c3159" +} ] \ No newline at end of file diff --git a/bbootimg/src/test/kotlin/AvbTest.kt b/bbootimg/src/test/kotlin/AvbTest.kt index da8bb44..2cf0c1d 100644 --- a/bbootimg/src/test/kotlin/AvbTest.kt +++ b/bbootimg/src/test/kotlin/AvbTest.kt @@ -14,12 +14,17 @@ import avb.desc.UnknownDescriptor import avb.desc.HashDescriptor +import cfig.Avb +import cfig.helper.CryptoHelper +import cfig.helper.Dumpling +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper import org.apache.commons.codec.binary.Hex import org.junit.Test - import org.junit.Assert.* import org.slf4j.LoggerFactory import java.io.ByteArrayInputStream +import java.io.File class AvbTest { private val log = LoggerFactory.getLogger(AvbTest::class.java) @@ -41,4 +46,31 @@ class AvbTest { val descAnalyzed = desc.analyze() assertTrue(descAnalyzed is HashDescriptor) } + + @Test + fun verifyKnownKeysJson() { + val keys = ObjectMapper().readValue( + this::class.java.classLoader.getResource("known_keys.json"), + object : TypeReference>() {}) + keys.forEachIndexed { _, knownPublicKey -> + verifySha1(knownPublicKey) + } + val outStr = ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(keys) + log.info(outStr) + } + + private fun verifySha1(known: Avb.Companion.KnownPublicKey) { + val hash = CryptoHelper.Hasher.hash(Dumpling(known.pubk), "sha-1") + if (known.sha1.isBlank()) { + log.info("+ add new sha1") + known.sha1 = Hex.encodeHexString(hash) + } else { + if (known.sha1 == Hex.encodeHexString(hash)) { + log.info("= sha1 match") + } else { + log.error("- sha1 mismatch") + throw IllegalArgumentException("sha1 mismatch") + } + } + } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 070cb70..84a0b92 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/helper/build.gradle.kts b/helper/build.gradle.kts index 10b34b0..3248ccc 100644 --- a/helper/build.gradle.kts +++ b/helper/build.gradle.kts @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.8.0" + kotlin("jvm") version "1.9.0" `java-library` application } @@ -42,6 +42,10 @@ dependencies { implementation("org.apache.commons:commons-compress:1.21") implementation("org.tukaani:xz:1.9") implementation("com.github.freva:ascii-table:1.2.0") + implementation("com.nimbusds:nimbus-jose-jwt:9.31") + // jackson + implementation("com.fasterxml.jackson.core:jackson-annotations:2.14.0") + implementation("com.fasterxml.jackson.core:jackson-databind:2.14.0") testImplementation("org.jetbrains.kotlin:kotlin-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit") diff --git a/helper/src/main/kotlin/cfig/helper/CryptoHelper.kt b/helper/src/main/kotlin/cfig/helper/CryptoHelper.kt index d43b0c2..e82d519 100644 --- a/helper/src/main/kotlin/cfig/helper/CryptoHelper.kt +++ b/helper/src/main/kotlin/cfig/helper/CryptoHelper.kt @@ -4,11 +4,19 @@ package cfig.helper import cc.cfig.io.Struct import com.google.common.math.BigIntegerMath +import com.nimbusds.jose.Algorithm +import com.nimbusds.jose.jwk.KeyUse +import com.nimbusds.jose.util.Base64URL import org.apache.commons.exec.CommandLine import org.apache.commons.exec.DefaultExecutor import org.apache.commons.exec.ExecuteException import org.apache.commons.exec.PumpStreamHandler +import org.bouncycastle.asn1.ASN1InputStream +import org.bouncycastle.asn1.ASN1Primitive +import org.bouncycastle.asn1.ASN1Sequence +import org.bouncycastle.asn1.pkcs.PrivateKeyInfo import org.bouncycastle.pkcs.PKCS10CertificationRequest +import org.bouncycastle.util.io.pem.PemObject import org.bouncycastle.util.io.pem.PemReader import org.slf4j.LoggerFactory import java.io.* @@ -17,10 +25,8 @@ import java.math.RoundingMode import java.security.* import java.security.cert.Certificate import java.security.cert.CertificateFactory -import java.security.spec.PKCS8EncodedKeySpec -import java.security.spec.RSAPrivateKeySpec -import java.security.spec.RSAPublicKeySpec -import java.security.spec.X509EncodedKeySpec +import java.security.cert.X509Certificate +import java.security.spec.* import java.util.* import javax.crypto.Cipher import kotlin.reflect.KClass @@ -52,6 +58,7 @@ class CryptoHelper { .generatePublic(keySpec) as java.security.interfaces.RSAPublicKey } } + "RSA PRIVATE KEY", "PRIVATE KEY" -> { try { retClazz = org.bouncycastle.asn1.pkcs.RSAPrivateKey::class @@ -63,14 +70,17 @@ class CryptoHelper { .generatePrivate(keySpec) as sun.security.rsa.RSAPrivateCrtKeyImpl } } + "CERTIFICATE REQUEST" -> { retClazz = PKCS10CertificationRequest::class PKCS10CertificationRequest(p.content) } + "CERTIFICATE" -> { retClazz = Certificate::class CertificateFactory.getInstance("X.509").generateCertificate(ByteArrayInputStream(p.content)) } + else -> throw IllegalArgumentException("unsupported type: ${p.type}") } return KeyBox(KeyFormat.PEM, retClazz, ret) @@ -166,16 +176,16 @@ class CryptoHelper { from avbtool::encode_rsa_key() */ fun encodeRSAkey(rsa: org.bouncycastle.asn1.pkcs.RSAPrivateKey): ByteArray { - require(65537.toBigInteger() == rsa.publicExponent) + check(65537.toBigInteger() == rsa.publicExponent) val numBits: Int = BigIntegerMath.log2(rsa.modulus, RoundingMode.CEILING) - require(rsa.modulus.bitLength() == numBits) + check(rsa.modulus.bitLength() == numBits) val b = BigInteger.valueOf(2).pow(32) val n0inv = b.minus(rsa.modulus.modInverse(b)).toLong() val rrModn = BigInteger.valueOf(4).pow(numBits).rem(rsa.modulus).toByteArray().let { - it.sliceArray(it.size - numBits/8 until it.size) + it.sliceArray(it.size - numBits / 8 until it.size) } val unsignedModulo = rsa.modulus.toByteArray().let { - it.sliceArray(it.size - numBits/8 until it.size) + it.sliceArray(it.size - numBits / 8 until it.size) } return Struct("!II${numBits / 8}b${numBits / 8}b").pack( numBits, @@ -199,14 +209,39 @@ class CryptoHelper { return KeyFactory.getInstance("RSA").generatePublic(keySpec) as java.security.interfaces.RSAPublicKey } - fun decodePem(keyText: String): ByteArray { - val publicKeyPEM = keyText - .replace("-----BEGIN .*-----".toRegex(), "") - .replace(System.lineSeparator().toRegex(), "") - .replace("\n", "") - .replace("\r", "") - .replace("-----END .*-----".toRegex(), "") - return Base64.getDecoder().decode(publicKeyPEM) + fun rsa2jwk( + inK: java.security.interfaces.RSAPrivateCrtKey, + keyName: String = "thePrivateKey" + ): com.nimbusds.jose.jwk.RSAKey { + return com.nimbusds.jose.jwk.RSAKey.Builder(Base64URL.encode(inK.modulus), Base64URL.encode(inK.publicExponent)) + .algorithm(Algorithm(inK.algorithm)) + .privateKey(inK) + .keyUse(KeyUse.SIGNATURE) + .keyID(keyName) + .build() + } + fun rsa2jwk( + inK: java.security.interfaces.RSAPublicKey, + keyName: String = "thePublicKey" + ): com.nimbusds.jose.jwk.RSAKey { + return com.nimbusds.jose.jwk.RSAKey.Builder(Base64URL.encode(inK.modulus), Base64URL.encode(inK.publicExponent)) + .algorithm(Algorithm(inK.algorithm)) + .keyUse(KeyUse.SIGNATURE) + .keyID(keyName) + .build() + } + + fun bcRSA2RSA(inK: org.bouncycastle.asn1.pkcs.RSAPrivateKey): PrivateKey { + return KeyFactory.getInstance("RSA").generatePrivate( + RSAPrivateCrtKeySpec( + inK.modulus, inK.publicExponent, inK.privateExponent, inK.prime1, + inK.prime2, inK.exponent1, inK.exponent2, inK.coefficient + ) + ) + } + + fun pk8toPk1(pk8: java.security.PrivateKey): ASN1Primitive { + return PrivateKeyInfo.getInstance(pk8.encoded).parsePrivateKey().toASN1Primitive() } } //end-companion } @@ -232,9 +267,9 @@ class CryptoHelper { } fun hash(ds: Dumpling<*>, coordinates: List>, algorithm: String): ByteArray { - require(coordinates.isNotEmpty()) + check(coordinates.isNotEmpty()) coordinates.forEach { - require(it.first >= 0 && it.second > 0) + check(it.first >= 0 && it.second > 0) } return MessageDigest.getInstance(algorithm).let { md -> coordinates.forEach { coordinate -> @@ -333,6 +368,191 @@ class CryptoHelper { } } + data class UnBoxed( + /* + EC PRIVATE KEY, OPENSSH PRIVATE KEY, CERTIFICATE REQUEST, CERTIFICATE + RSA PRIVATE KEY, PRIVATE KEY, RSA PUBLIC KEY, PUBLIC KEY + */ + val pemType: String? = null, + val asn1: Boolean = false, + val data: ByteArray = byteArrayOf(), + // RSA PRIVATE KEY, RSA PUBLIC KEY + var rawAsn1Type: String? = null, + // AvbRSAPublicKey + var rawType: String? = null, + ) { + fun parse(): Any? { + var ret: Any? = null + when (this.pemType) { + "EC PRIVATE KEY" -> { + check(this.asn1) + log.warn("not supported yet: " + this.pemType) + } + + "OPENSSH PRIVATE KEY" -> { //Since OpenSSH 7.8 + check(!this.asn1) + log.warn("not supported yet: " + this.pemType) + } + + "CERTIFICATE REQUEST" -> { + ret = PKCS10CertificationRequest(this.data) + log.warn("Found: PEM(${ret.subject} CSR)") + } + + "CERTIFICATE" -> { + ret = CertificateFactory.getInstance("X.509").generateCertificate(ByteArrayInputStream(this.data)) + check(ret is X509Certificate) + log.info("alg=" + ret.sigAlgName) + check(ret.publicKey is java.security.interfaces.RSAPublicKey) + log.info("Found: PEM(${ret.type} Cert) -> ${this.pemType}") + } + + "RSA PRIVATE KEY", "PRIVATE KEY" -> run { + check(this.asn1) + //org.bouncycastle.asn1.pkcs.RSAPrivateKey::class + try { + ret = org.bouncycastle.asn1.pkcs.RSAPrivateKey.getInstance(this.data) + check(ret is org.bouncycastle.asn1.pkcs.RSAPrivateKey) + log.info("Found: PEM(PKCS1v2) -> ${this.pemType}") + return@run + } catch (_: java.lang.ClassCastException) { + } + val keySpec = PKCS8EncodedKeySpec(this.data) + // sun.security.rsa.RSAPrivateCrtKeyImpl sun.security.rsa.RSAPrivateKeyImpl + ret = KeyFactory.getInstance("RSA").generatePrivate(keySpec) + check(ret is java.security.interfaces.RSAPrivateKey) + log.info("Found: PEM(PKCS#8) -> ${this.pemType}") + } + + "RSA PUBLIC KEY", "PUBLIC KEY" -> { + check(this.asn1) + try { + ret = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(this.data) + check(ret is org.bouncycastle.asn1.pkcs.RSAPublicKey) + log.info(ret.toString()) + log.info("Found: PEM -> ${this.pemType}") + } catch (_: IllegalArgumentException) { + } + val keySpec = X509EncodedKeySpec(this.data) + ret = KeyFactory.getInstance("RSA").generatePublic(keySpec) + check(ret is java.security.interfaces.RSAPublicKey) + log.info("Found: PEM(PKCS#8) -> ${this.pemType}") + } + + null -> run { + // AvbRSAPublicKey + if (!this.asn1) { + try { + ret = KeyBox.decodeRSAkey(this.data) + this.rawType = "AvbRSAPublicKey" + log.info("Found: raw(AVB Public Key) -> ${this.rawType}") + return@run + } catch (_: IllegalStateException) { + } + } + check(this.asn1) + // PRIVATE KEY (RSA) + try { + ret = org.bouncycastle.asn1.pkcs.RSAPrivateKey.getInstance(this.data) + check(ret is org.bouncycastle.asn1.pkcs.RSAPrivateKey) + this.rawAsn1Type = "RSA PRIVATE KEY" + log.info("Found: raw(PKCS1v2) -> ${this.rawAsn1Type}") + return@run + } catch (_: java.lang.ClassCastException) { + } + // PRIVATE KEY (RSA) + try { + val keySpec = PKCS8EncodedKeySpec(this.data) + // java.security.interfaces.RSAPrivateCrtKey || java.security.interfaces.RSAPrivateKey + ret = KeyFactory.getInstance("RSA").generatePrivate(keySpec) + check(ret is java.security.interfaces.RSAPrivateCrtKey) + this.rawAsn1Type = "RSA PRIVATE KEY" + log.info("Found: raw(PKCS#8) -> ${this.rawAsn1Type}") + return@run + } catch (_: InvalidKeySpecException) { + } + // PUBLIC KEY (RSA) + try { + ret = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(this.data) + check(ret is org.bouncycastle.asn1.pkcs.RSAPublicKey) + this.rawAsn1Type = "RSA PUBLIC KEY" + log.info(ret.toString()) + log.info("Found: raw() -> ${this.rawAsn1Type}") + return@run + } catch (_: IllegalArgumentException) { + } + // PUBLIC KEY (RSA) + val keySpec = X509EncodedKeySpec(this.data) + ret = KeyFactory.getInstance("RSA").generatePublic(keySpec) + check(ret is java.security.interfaces.RSAPublicKey) + this.rawAsn1Type = "RSA PUBLIC KEY" + log.info("Found: raw(PKCS#8) -> ${this.rawAsn1Type}") + } + + else -> { + log.warn("#####################: ${this.pemType}") + } + } + return ret + } + + companion object { + fun fromData(data: ByteArray): UnBoxed { + PemReader(InputStreamReader(ByteArrayInputStream(data))).use { pr -> + var obj: PemObject? = null + if (pr.readPemObject().also { obj = it } != null) { + //log.debug("PEM: ${obj!!.type}") + val isAsn1 = isValidAsn1(obj!!.content) + //log.debug("asn1=$isAsn1") + return UnBoxed(obj!!.type!!, isAsn1, obj!!.content) + } else { + //log.info("not pem") + val isAsn1 = isValidAsn1(data) + //log.info("asn1=$isAsn1") + return UnBoxed(null, isAsn1, data) + } + } + } + + @Throws(IOException::class) + fun isValidAsn1(data: ByteArray): Boolean { + return try { + ASN1InputStream(data).use { input -> + var obj: ASN1Primitive? = null + while (input.readObject() != null) { + } + true + } + } catch (e: IOException) { + false + } + } + + fun parseASN1(data: ByteArray) { + ASN1InputStream(data).use { input -> + var obj: ASN1Primitive? = null + while (input.readObject().also { obj = it } != null) { + parseASN1Object(obj!!) + } + } + } + + private fun parseASN1Object(asn1Object: ASN1Primitive) { + if (asn1Object is ASN1Sequence) { + log.info("[SEQ] " + asn1Object.size() + " objects") + for (i in 0 until asn1Object.size()) { + val element = asn1Object.getObjectAt(i).toASN1Primitive() + parseASN1Object(element) // Recursively parse each element + } + } else { + // Handle other ASN1Primitive types as needed + // For example, you can print the element's content: + log.info("[OBJ] $asn1Object") + } + } + } + } + companion object { private val log = LoggerFactory.getLogger(CryptoHelper::class.java) fun listAll() { diff --git a/helper/src/main/kotlin/cfig/helper/Launcher.kt b/helper/src/main/kotlin/cfig/helper/Launcher.kt index dab8203..8f690ec 100644 --- a/helper/src/main/kotlin/cfig/helper/Launcher.kt +++ b/helper/src/main/kotlin/cfig/helper/Launcher.kt @@ -2,8 +2,10 @@ package cfig.helper -import org.bouncycastle.asn1.ASN1Primitive -import org.bouncycastle.asn1.pkcs.PrivateKeyInfo +import cfig.helper.CryptoHelper.KeyBox.Companion.bcRSA2RSA +import cfig.helper.CryptoHelper.KeyBox.Companion.pk8toPk1 +import cfig.helper.CryptoHelper.KeyBox.Companion.rsa2jwk +import com.fasterxml.jackson.databind.ObjectMapper import org.bouncycastle.util.io.pem.PemObject import org.bouncycastle.util.io.pem.PemWriter import org.slf4j.LoggerFactory @@ -14,6 +16,7 @@ import java.io.FileWriter import java.math.BigInteger import java.security.KeyFactory import java.security.KeyPairGenerator +import java.security.cert.X509Certificate import java.security.spec.RSAPublicKeySpec import java.util.* import kotlin.system.exitProcess @@ -70,10 +73,6 @@ class Launcher { } } - private fun pk8toPk1(pk8: java.security.PrivateKey): ASN1Primitive { - return PrivateKeyInfo.getInstance(pk8.encoded).parsePrivateKey().toASN1Primitive() - } - fun processCommand(inFile: String, info2: Properties) { FileInputStream(inFile).use { fis -> info2.load(fis) @@ -88,7 +87,7 @@ class Launcher { it.initialize(kLen) it.generateKeyPair() } - FileOutputStream(kFile, false).use { + FileOutputStream(kFile + ".pk8", false).use { it.write(keyPair.private.encoded) log.info("RSA priv key(len=$kLen) written to $kFile.pk8") } @@ -101,6 +100,7 @@ class Launcher { } dumpPem(PemObject("RSA PUBLIC KEY", keyPair.public.encoded), "$kFile.pem.pub") } + "toPub" -> { val k = CryptoHelper.KeyBox.parse4(File(kFile).readBytes()) if (k.key is org.bouncycastle.asn1.pkcs.RSAPrivateKey) { @@ -111,12 +111,14 @@ class Launcher { throw IllegalArgumentException("not supported") } } + "parse" -> { val k = CryptoHelper.KeyBox.parse4(File(kFile).readBytes()) log.info("fmt=" + k.fmt.toString()) log.info("clazz=" + k.clazz) log.info("key=" + k.key) } + else -> { //pass } @@ -127,38 +129,33 @@ class Launcher { val preFile = info2.getProperty("file") info2["file"] = (if (preFile == null) "" else "$preFile,") + File(inFile).canonicalFile.path info2["propFile"] = File(info2.getProperty("file")).name + ".prop" - val k = CryptoHelper.KeyBox.parse4(File(inFile).readBytes()) - info2["fileType"] = k.fmt - info2["fileClazz"] = k.clazz - log.info("Recognized ${k.fmt}: " + k.clazz) - if (k.key is sun.security.x509.X509CertImpl) { - val crt = k.key - val crtSubj = (crt.get("x509.info") as sun.security.x509.X509CertInfo).get("subject").toString() - val subj2 = crtSubj - .replace(", ", "/") - .replace("EMAILADDRESS", "emailAddress") - .replace("\\s".toRegex(), "") - info2.setProperty("csr.info", "/$subj2") - } - if (k.key is sun.security.rsa.RSAPrivateCrtKeyImpl) { - val pk8 = k.key - info2.setProperty("rsa.len", pk8.modulus.bitLength().toString()) - info2["rsa.modulus"] = Helper.toHexString(pk8.modulus.toByteArray()) - info2["rsa.privateExponent"] = Helper.toHexString(pk8.privateExponent.toByteArray()) - info2["rsa.publicExponent"] = Helper.toHexString(pk8.publicExponent.toByteArray()) - info2["rsa.primeP"] = Helper.toHexString(pk8.primeP.toByteArray()) - info2["rsa.primeQ"] = Helper.toHexString(pk8.primeQ.toByteArray()) + val unboxed = CryptoHelper.UnBoxed.fromData(File(inFile).readBytes()) + val k2 = unboxed.parse() + var retJwk: com.nimbusds.jose.jwk.RSAKey? = null + if (k2 is java.security.interfaces.RSAPrivateCrtKey) { + retJwk = rsa2jwk(k2) + //log.info(retJwk.toJSONString()) + } else if (k2 is org.bouncycastle.asn1.pkcs.RSAPrivateKey) { + val privk = bcRSA2RSA(k2) + check(privk is java.security.interfaces.RSAPrivateCrtKey) + retJwk = rsa2jwk(privk) + //log.info(retJwk.toJSONString()) + } else if (k2 is java.security.interfaces.RSAPublicKey) { + retJwk = rsa2jwk(k2) + //log.info(retJwk.toJSONString()) + } else if (k2 is X509Certificate) { + retJwk = rsa2jwk(k2.publicKey as java.security.interfaces.RSAPublicKey) + } else { + log.info("Found other: " + k2!!::class.java.toString()) } - if (k.key is org.bouncycastle.asn1.pkcs.RSAPrivateKey) { - val rsa = k.key - info2.setProperty("rsa.len", rsa.modulus.bitLength().toString()) - info2["rsa.modulus"] = Helper.toHexString(rsa.modulus.toByteArray()) - info2["rsa.privateExponent"] = Helper.toHexString(rsa.privateExponent.toByteArray()) - info2["rsa.publicExponent"] = Helper.toHexString(rsa.publicExponent.toByteArray()) - info2["rsa.primeP"] = Helper.toHexString(rsa.prime1.toByteArray()) - info2["rsa.primeQ"] = Helper.toHexString(rsa.prime2.toByteArray()) + if (retJwk != null) { + log.info("transforming: $inFile --> out.jwk ...") + File("out.jwk").writeText( + ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString( + ObjectMapper().readValue(retJwk.toJSONString(), Any::class.java) + ) + ) } - } } @@ -196,10 +193,5 @@ fun main(args: Array) { log.warn("[${index + 1}/${args.size}] Processing $s ...") Launcher().processFile(s, info2) } - FileOutputStream(info2.getProperty("propFile")).use { fos -> - info2.setProperty("all_cmds", allSupportedCommands) - info2.store(fos, null) - log.info("Writing to " + info2.getProperty("propFile")) - } } } diff --git a/integrationTest.py b/integrationTest.py index ce1a081..9a7393c 100755 --- a/integrationTest.py +++ b/integrationTest.py @@ -10,6 +10,7 @@ successLogo = """ """ resDir = "src/integrationTest/resources" resDir2 = "src/integrationTest/resources_2" +resDir3 = "src/integrationTest/resources_3" log = logging.getLogger('TEST') log.setLevel(logging.DEBUG) consoleHandler = logging.StreamHandler(sys.stdout) @@ -182,6 +183,8 @@ def main(): verifySingleDir(resDir2, "issue_122_ramdisk_img") # Issue 123: dtb verifySingleDir(resDir2, "issue_123_dtb") + # Issue 125: cmdline trim + verifySingleDir(resDir3, "issue_125_trim_cmdline") log.info(successLogo) diff --git a/src/integrationTest/resources_3 b/src/integrationTest/resources_3 new file mode 160000 index 0000000..1cd0019 --- /dev/null +++ b/src/integrationTest/resources_3 @@ -0,0 +1 @@ +Subproject commit 1cd001925f550d82c5dc1b8b6f69611bf4c6490b