SignTool.pl 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #!usr/bin/perl
  2. # Copyright Statement:
  3. #
  4. # This software/firmware and related documentation ("MediaTek Software") are
  5. # protected under relevant copyright laws. The information contained herein
  6. # is confidential and proprietary to MediaTek Inc. and/or its licensors.
  7. # Without the prior written permission of MediaTek inc. and/or its licensors,
  8. # any reproduction, modification, use or disclosure of MediaTek Software,
  9. # and information contained herein, in whole or in part, shall be strictly prohibited.
  10. #
  11. # MediaTek Inc. (C) 2010. All rights reserved.
  12. #
  13. # BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. # THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  15. # RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  16. # AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  17. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  18. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  19. # NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  20. # SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  21. # SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  22. # THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  23. # THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  24. # CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  25. # SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  26. # STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  27. # CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  28. # AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  29. # OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  30. # MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  31. #
  32. # The following software/firmware and/or related documentation ("MediaTek Software")
  33. # have been modified by MediaTek Inc. All revisions are subject to any receiver's
  34. # applicable license agreements with MediaTek Inc.
  35. my $base_prj = $ARGV[0];
  36. my $prj = $ARGV[1];
  37. my $custom_dir = $ARGV[2];
  38. my $secro_ac = $ARGV[3];
  39. my $nand_page_size = $ARGV[4];
  40. my $board_avb_enable = $ARGV[5];
  41. my $dir = $ARGV[6];
  42. my $tgt = $ARGV[7];
  43. my $sdl_only = $ARGV[8];
  44. my $cfg_dir = "$custom_dir";
  45. my $cfg_def = "IMG_AUTH_CFG.ini";
  46. my $cfg = "$cfg_dir/$cfg_def";
  47. my $key = "$cfg_dir/IMG_AUTH_KEY.ini";
  48. my $oemkey = "$cfg_dir/VERIFIED_BOOT_IMG_AUTH_KEY.ini";
  49. $ENV{PROJECT}=$prj;
  50. my $secro_type = "GMP";
  51. ##########################################################
  52. # Dump Parameter
  53. ##########################################################
  54. print "\n\n";
  55. print "********************************************\n";
  56. print " Dump Paramter \n";
  57. print "********************************************\n";
  58. print " Base Project : $base_prj\n";
  59. print " Project : $prj\n";
  60. print " Custom Directory : $custom_dir\n";
  61. print " SECRO AC : $secro_ac\n";
  62. print " NAND Page Size : $nand_page_size\n";
  63. print " BOARD_AVB_ENABLE : $board_avb_enable\n";
  64. print " PRODUCT_OUT : $dir\n";
  65. print " SDL_ONLY : $sdl_only\n";
  66. print " TGT : $tgt\n";
  67. ##########################################################
  68. # Create Folder
  69. ##########################################################
  70. print "\n\n";
  71. print "********************************************\n";
  72. print " Create Folder \n";
  73. print "********************************************\n";
  74. `mkdir $dir/sig` if ( ! -d "$dir/sig" );
  75. print "Image Dir '$dir'\n";
  76. my $command = "scripts/sign/SignTool.sh";
  77. #tool for signing image with SHA256 + RSA2048 for verified boot
  78. my $command_2048 = "scripts/sign/SignTool_2048";
  79. ##########################################################
  80. # File Check
  81. ##########################################################
  82. my @imgs_need_sign_raw = ("lk.img", "logo.bin", "secro.img", "odmdtbo.img", "dtbo.img");
  83. my @imgs_need_sign = ("system.img", "system_other.img", "userdata.img", "efuse.img", "vendor.img", "odm.img", "vbmeta.img", "vbmeta_system.img", "vbmeta_vendor.img", "super.img");
  84. if ($board_avb_enable ne "true") {
  85. push (@imgs_need_sign_raw, "boot.img");
  86. push (@imgs_need_sign_raw, "recovery.img");
  87. } else {
  88. push (@imgs_need_sign, "boot.img");
  89. push (@imgs_need_sign, "recovery.img");
  90. }
  91. # ProjectConfig.mk settings is not imported here, and try all the possible names
  92. push (@imgs_need_sign, "trustzone.bin");
  93. push (@imgs_need_sign, "mobicore.bin");
  94. push (@imgs_need_sign, "tz.img");
  95. push (@imgs_need_sign, "tee.img");
  96. # Does not check whether all images in the list exist. Sign all the images which can be found.
  97. ##########################################################
  98. # Process Common Files
  99. ##########################################################
  100. print "\n\n";
  101. print "********************************************\n";
  102. print " Sign Common Images \n";
  103. print "********************************************\n";
  104. # for these images, two layers of signature is applied, one for verified boot, one for secure download.
  105. foreach my $img (@imgs_need_sign_raw) {
  106. if ("$tgt" ne "all") {
  107. if ("$tgt" ne $img) {
  108. warn "$img not selected target($tgt), bypass\n";
  109. next;
  110. }
  111. }
  112. if ( ! -e "$dir/$img") {
  113. warn "the $img does NOT exist, please check\n";
  114. next;
  115. }
  116. my $signed_verified_img = $img;
  117. $signed_verified_img =~ s/\./-verified\./;
  118. if ($sdl_only eq "yes") {
  119. print "secure boot signature generation bypassed for '$dir/$img'"
  120. } else {
  121. my $sig_img = $img;
  122. $sig_img =~ s/\.bin/\.sig/;
  123. $sig_img =~ s/\.img/\.sig/;
  124. print "Sign Image '$dir/$img' with key '$oemkey'... output = '$dir/$signed_verified_img'\n";
  125. system("$command_2048 $oemkey $dir/$img $dir/$signed_verified_img $dir/sig/$sig_img") == 0 or die "sign image(verified boot) fail";
  126. }
  127. my $signed_img = $img;
  128. $signed_img =~ s/\./-sign\./;
  129. my $signed_cfg = "$cfg_dir/$img.ini";
  130. if ( ! -e "$signed_cfg" ) {
  131. $signed_cfg = $cfg;
  132. }
  133. print "Sign Image '$dir/$img' with cfg '$signed_cfg'...\n";
  134. system("$command $key $signed_cfg $dir/$signed_verified_img $dir/$signed_img $nand_page_size") == 0 or die "sign image fail";
  135. }
  136. # these images are signed for secure download only and not covered by verified boot.
  137. foreach my $img (@imgs_need_sign) {
  138. if ("$tgt" ne "all") {
  139. if ("$tgt" ne $img) {
  140. warn "$img not selected target($tgt), bypass\n";
  141. next;
  142. }
  143. }
  144. if ( ! -e "$dir/$img") {
  145. warn "the $img does NOT exist, please check\n";
  146. next;
  147. }
  148. my $signed_img = $img;
  149. $signed_img =~ s/\./-sign\./;
  150. my $signed_cfg = "$cfg_dir/$img.ini";
  151. if ( ! -e "$signed_cfg" ) {
  152. $signed_cfg = $cfg;
  153. }
  154. print "Sign Image '$dir/$img' with cfg '$signed_cfg'...\n";
  155. system("$command $key $signed_cfg $dir/$img $dir/$signed_img $nand_page_size") == 0 or die "sign image fail";
  156. }
  157. sub print_system {
  158. my $command = $_[0];
  159. my $rslt = system($command);
  160. print "$command: $rslt\n";
  161. die "Failed to execute $command" if ($rslt != 0);
  162. }
  163. ##########################################################
  164. # Process EMMC Files
  165. ##########################################################
  166. print "\n\n";
  167. print "********************************************\n";
  168. print " Sign EMMC Images \n";
  169. print "********************************************\n";
  170. my @imgs_need_sign = ("MBR", "EBR1", "EBR2");
  171. foreach my $img (@imgs_need_sign) {
  172. if ("$tgt" ne "all") {
  173. if ("$tgt" ne $img) {
  174. warn "$img not selected target($tgt), bypass\n";
  175. next;
  176. }
  177. }
  178. if (-e "$dir/$img") {
  179. my $signed_cfg = "$cfg_dir/$img.ini";
  180. if ( ! -e "$signed_cfg" ) {
  181. $signed_cfg = $cfg;
  182. }
  183. print "Sign Image '$dir/$img' with cfg '$signed_cfg'...\n";
  184. system("$command $key $signed_cfg $dir/$img $dir/${img}-sign $nand_page_size") == 0 or die "sign EMMC image fail";
  185. }
  186. }
  187. my @imgs_need_sign = ("cache.img", "custom.img");
  188. foreach my $img (@imgs_need_sign) {
  189. if ("$tgt" ne "all") {
  190. if ("$tgt" ne $img) {
  191. warn "$img not selected target($tgt), bypass\n";
  192. next;
  193. }
  194. }
  195. if (-e "$dir/$img") {
  196. my $signed_img = $img;
  197. $signed_img =~ s/\./-sign\./;
  198. my $signed_cfg = "$cfg_dir/$img.ini";
  199. if ( ! -e "$signed_cfg" ) {
  200. $signed_cfg = $cfg;
  201. }
  202. print "Sign Image '$dir/$img' with cfg '$signed_cfg'...\n";
  203. system("$command $key $signed_cfg $dir/$img $dir/$signed_img $nand_page_size") == 0 or die "sign EMMC image fail";
  204. }
  205. }
  206. print "remove unused *sig files \n";
  207. system("rm -f $dir/*.sig ");