| #!/system/bin/sh |
| |
| # Copyright (C) 2019 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. |
| # |
| |
| alias log_info="log -t art_apex -p i" |
| alias log_error="log -t art_apex -p f" |
| |
| # Set |ARCHES| to a string containing the architectures of the device. |
| function set_arches { |
| # Derive architectures. For now, stop at two. |
| local abilist_prop=`getprop ro.product.cpu.abilist` |
| local abilist=`echo $abilist_prop | tr "," "\n"` |
| ARCHES="" |
| for abi in $abilist ; do |
| case "$abi" in |
| arm64-v8a) |
| ARCHES="$ARCHES\narm64" |
| ;; |
| armeabi-v7a|armeabi) |
| ARCHES="$ARCHES\narm" |
| ;; |
| x86) |
| ARCHES="$ARCHES\nx86" |
| ;; |
| x86_64) |
| ARCHES="$ARCHES\nx86_64" |
| ;; |
| *) |
| log_error "Unsupported ABI $abi" |
| return 1 |
| ;; |
| esac |
| done |
| ARCHES=`echo $ARCHES | uniq` |
| return 0 |
| } |
| |
| function setup_fsverity { |
| local full_shell_path=`readlink -f $0` |
| local bin_dir=`dirname $full_shell_path` |
| local apex_dir=`dirname $bin_dir` |
| local sig_dir="${apex_dir}.signatures" |
| local file=$1 |
| local signature_file="$sig_dir/$file.sig" |
| # Setup. |
| log_info "fsverity setup for $file" |
| SETUP_MSG=`fsverity setup $file --signature=$signature_file --hash=sha256 2>&1` || \ |
| { log_error "Setup failed: $SETUP_MSG" ; return 300 ; } |
| # Enable. |
| log_info "fsverity enable for $file" |
| ENABLE_MSG=`fsverity enable $file 2>&1` || \ |
| { log_error "Enable failed: $ENABLE_MSG" ; return 301 ; } |
| # Test integrity. |
| INTEGRITY_MSG=`dd if=$file of=/dev/null bs=4k 2>&1` || \ |
| { log_error "Integrity failed: $INTEGRITY_MSG" ; return 302 ; } |
| return 0 |
| } |