package Ġcom . vin ners . cube _ v ish w ak arma . core Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . security . Message Digest Ċ import Ġjava . security . NoSuch AlgorithmException Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠApp Signature Helper Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠContext Wrapper ( context ) Ġ{ ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġthe Ġapp Ġsignatures Ġfor Ġthe Ġcurrent Ġpackage ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠGet Ġall Ġpackage Ġsignatures Ġfor Ġthe Ġcurrent Ġpackage ĊĠĠĠ Ġ// ĠFor Ġeach Ġsignature Ġcreate Ġa Ġcompatible Ġhash ĊĠĠĠ Ġval Ġapp Signatures : ĠArrayList < String > ĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . KIT K AT ) ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Codes Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= ĠpackageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Manager Ġ= Ġpackage Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignatures Ġ= Ġpackage Manager . get Package Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ SIGNATURE S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). signatures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( signature Ġin Ġsignatures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġhash ( packageName , Ġsignature . to Chars String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hash Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Codes . add ( String . format ("% s ", Ġhash )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġfind Ġpackage Ġto Ġobtain Ġhash .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapp Codes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠApp Signature Helper :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġval ĠNUM _ HASH ED _ BYTES Ġ= Ġ 9 ĊĠĠĠĠĠĠĠ Ġval ĠNUM _ BASE 6 4 _ CHAR Ġ= Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠHASH _ TYPE Ġ= Ġ" SHA - 2 5 6 " ĊĊĠĠĠĠĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . KIT K AT ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhash ( packageName : ĠString , Ġsignature : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Info Ġ= Ġ"$ packageName Ġ$ signature " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Digest Ġ= ĠMessage Digest . getInstance ( HASH _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Digest . update ( app Info . toByteArray ( StandardCharsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhash Signature Ġ= Ġmessage Digest . digest () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtruncated Ġinto ĠNUM _ HASH ED _ BYTES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Signature Ġ= ĠArrays . copyOf Range ( hash Signature , Ġ 0 , ĠNUM _ HASH ED _ BYTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġencode Ġinto ĠBase 6 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbase 6 4 Hash Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . encode ToString ( hash Signature , ĠBase 6 4 . NO _ P ADDING Ġor ĠBase 6 4 . NO _ WRAP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Hash Ġ= Ġbase 6 4 Hash . substring ( 0 , ĠNUM _ BASE 6 4 _ CHAR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase 6 4 Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" hash : NoSuch Algorithm ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }