Android签名验证简介


http://blog.csdn.net/hudashi/article/details/8245105

http://blog.csdn.net/hudashi/article/details/8245105

http://blog.csdn.net/hudashi/article/details/8245105





Android签名验证简介

7300人阅读 评论(1) 收藏 举报
本文章已收录于:
分类:

本文博客原文

Android 原生自带了个安装器(packages\apps\PackageInstaller),
通过其中的源码 PackageParser.java  (frameworks\base\core\java\android\content\pm)
我们大概就能知道其签名验证机制的验证过程。
其中主要涉及2个函数:
函数1
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span class="kwd" style="color:rgb(0,0,136)">public</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">boolean</span><span class="pln"> collectCertificates</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">Package</span><span class="pln"> pkg</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> flags</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">        pkg</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">mSignatures </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div>
</div><div><span class="pln">        </span><span class="typ" style="color:rgb(102,0,102)">WeakReference</span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[]></span><span class="pln"> readBufferRef</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> readBuffer </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">synchronized</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">mSync</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">            readBufferRef </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> mReadBuffer</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">readBufferRef </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                mReadBuffer </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">                readBuffer </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> readBufferRef</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="kwd" style="color:rgb(0,0,136)">get</span><span class="pun" style="color:rgb(102,102,0)">();</span></div><div><span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">readBuffer </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                readBuffer </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="lit" style="color:rgb(0,102,102)">8192</span><span class="pun" style="color:rgb(102,102,0)">];</span></div><div><span class="pln">                readBufferRef </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">WeakReference</span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[]>(</span><span class="pln">readBuffer</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div><span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div>
</div><div><span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">try</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pln"> jarFile </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">mArchiveSourcePath</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div>
</div><div><span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">Certificate</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> certs </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div>
</div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">((</span><span class="pln">flags</span><span class="pun" style="color:rgb(102,102,0)">&</span><span class="pln">PARSE_IS_SYSTEM</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                </span><span class="com" style="color:rgb(136,0,0)">// If this package comes from the system image, then we</span></div><div><span class="com" style="color:rgb(136,0,0)">                // can trust it...  we'll just use the AndroidManifest.xml</span></div><div><span class="com" style="color:rgb(136,0,0)">                // to retrieve its signatures, not validating all of the</span></div><div><span class="com" style="color:rgb(136,0,0)">                // files.</span></div><div><span class="com" style="color:rgb(136,0,0)">                JarEntry jarEntry = jarFile.getJarEntry(ANDROID_MANIFEST_FILENAME);</span></div><div><span class="com" style="color:rgb(136,0,0)">                certs = loadCertificates(jarFile, jarEntry, readBuffer);</span></div><div><span class="com" style="color:rgb(136,0,0)">                if (certs == null) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                    Slog.e(TAG, "Package " + pkg.packageName</span></div><div><span class="com" style="color:rgb(136,0,0)">                            + " has no certificates at entry "</span></div><div><span class="com" style="color:rgb(136,0,0)">                            + jarEntry.getName() + "; ignoring!");</span></div><div><span class="com" style="color:rgb(136,0,0)">                    jarFile.close();</span></div><div><span class="com" style="color:rgb(136,0,0)">                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;</span></div><div><span class="com" style="color:rgb(136,0,0)">                    return false;</span></div><div><span class="com" style="color:rgb(136,0,0)">                }</span></div><div><span class="com" style="color:rgb(136,0,0)">                if (DEBUG_JAR) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                    Slog.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry</span></div><div><span class="com" style="color:rgb(136,0,0)">                            + " certs=" + (certs != null ? certs.length : 0));</span></div><div><span class="com" style="color:rgb(136,0,0)">                    if (certs != null) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                        final int N = certs.length;</span></div><div><span class="com" style="color:rgb(136,0,0)">                        for (int i=0; i<N; i++) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                            Slog.i(TAG, "  Public key: "</span></div><div><span class="com" style="color:rgb(136,0,0)">                                    + certs[i].getPublicKey().getEncoded()</span></div><div><span class="com" style="color:rgb(136,0,0)">                                    + " " + certs[i].getPublicKey());</span></div><div><span class="com" style="color:rgb(136,0,0)">                        }</span></div><div><span class="com" style="color:rgb(136,0,0)">                    }</span></div><div><span class="com" style="color:rgb(136,0,0)">                }</span></div><div><span class="com" style="color:rgb(136,0,0)">            } else {</span></div><div><span class="com" style="color:rgb(136,0,0)">                Enumeration<JarEntry> entries = jarFile.entries();</span></div><div><span class="com" style="color:rgb(136,0,0)">                final Manifest manifest = jarFile.getManifest();</span></div><div><span class="com" style="color:rgb(136,0,0)">                while (entries.hasMoreElements()) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                    final JarEntry je = entries.nextElement();</span></div><div><span class="com" style="color:rgb(136,0,0)">                    if (je.isDirectory()) continue;</span></div><div>
</div><div><span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">final</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pln"> name </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getName</span><span class="pun" style="color:rgb(102,102,0)">();</span></div><div>
</div><div><span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">name</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">startsWith</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"META-INF/"</span><span class="pun" style="color:rgb(102,102,0)">))</span></div><div><span class="pln">                        </span><span class="kwd" style="color:rgb(0,0,136)">continue</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div>
</div><div><span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">ANDROID_MANIFEST_FILENAME</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">equals</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">name</span><span class="pun" style="color:rgb(102,102,0)">))</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                        </span><span class="kwd" style="color:rgb(0,0,136)">final</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Attributes</span><span class="pln"> attributes </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> manifest</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getAttributes</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">name</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">                        pkg</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">manifestDigest </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">ManifestDigest</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">fromAttributes</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">attributes</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">                    </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div>
</div><div><span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">final</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Certificate</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> localCerts </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> loadCertificates</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">jarFile</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> readBuffer</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">DEBUG_JAR</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                        </span><span class="typ" style="color:rgb(102,0,102)">Slog</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">TAG</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"File "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> mArchiveSourcePath </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">" entry "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getName</span><span class="pun" style="color:rgb(102,102,0)">()</span></div><div><span class="pln">                                </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">": certs="</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> certs </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">" ("</span></div><div><span class="pln">                                </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">certs </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">?</span><span class="pln"> certs</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length </span><span class="pun" style="color:rgb(102,102,0)">:</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">")"</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">                    </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div>
</div><div><span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">localCerts </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                        </span><span class="typ" style="color:rgb(102,0,102)">Slog</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">e</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">TAG</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"Package "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> pkg</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">packageName</span></div><div><span class="pln">                                </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">" has no certificates at entry "</span></div><div><span class="pln">                                </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getName</span><span class="pun" style="color:rgb(102,102,0)">()</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"; ignoring!"</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">                        jarFile</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">close</span><span class="pun" style="color:rgb(102,102,0)">();</span></div><div><span class="pln">                        mParseError </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">INSTALL_PARSE_FAILED_NO_CERTIFICATES</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">                        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">false</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">                    </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">else</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">certs </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                        certs </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> localCerts</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">                    </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">else</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                        </span><span class="com" style="color:rgb(136,0,0)">// Ensure all certificates match.</span></div><div><span class="com" style="color:rgb(136,0,0)">                        for (int i=0; i<certs.length; i++) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                            boolean found = false;</span></div><div><span class="com" style="color:rgb(136,0,0)">                            for (int j=0; j<localCerts.length; j++) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                                if (certs[i] != null &&</span></div><div><span class="com" style="color:rgb(136,0,0)">                                        certs[i].equals(localCerts[j])) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                                    found = true;</span></div><div><span class="com" style="color:rgb(136,0,0)">                                    break;</span></div><div><span class="com" style="color:rgb(136,0,0)">                                }</span></div><div><span class="com" style="color:rgb(136,0,0)">                            }</span></div><div><span class="com" style="color:rgb(136,0,0)">                            if (!found || certs.length != localCerts.length) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                                Slog.e(TAG, "Package " + pkg.packageName</span></div><div><span class="com" style="color:rgb(136,0,0)">                                        + " has mismatched certificates at entry "</span></div><div><span class="com" style="color:rgb(136,0,0)">                                        + je.getName() + "; ignoring!");</span></div><div><span class="com" style="color:rgb(136,0,0)">                                jarFile.close();</span></div><div><span class="com" style="color:rgb(136,0,0)">                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;</span></div><div><span class="com" style="color:rgb(136,0,0)">                                return false;</span></div><div><span class="com" style="color:rgb(136,0,0)">                            }</span></div><div><span class="com" style="color:rgb(136,0,0)">                        }</span></div><div><span class="com" style="color:rgb(136,0,0)">                    }</span></div><div><span class="com" style="color:rgb(136,0,0)">                }</span></div><div><span class="com" style="color:rgb(136,0,0)">            }</span></div><div><span class="com" style="color:rgb(136,0,0)">            jarFile.close();</span></div><div>
</div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">synchronized</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">mSync</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                mReadBuffer </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> readBufferRef</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div>
</div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">certs </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&&</span><span class="pln"> certs</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length </span><span class="pun" style="color:rgb(102,102,0)">></span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">final</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> N </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> certs</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">                pkg</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">mSignatures </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Signature</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">certs</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">];</span></div><div><span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">for</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="pln">N</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">++)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                    pkg</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">mSignatures</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">]</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Signature</span><span class="pun" style="color:rgb(102,102,0)">(</span></div><div><span class="pln">                            certs</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">].</span><span class="pln">getEncoded</span><span class="pun" style="color:rgb(102,102,0)">());</span></div><div><span class="pln">                </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div><span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">else</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">                </span><span class="typ" style="color:rgb(102,0,102)">Slog</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">e</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">TAG</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"Package "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> pkg</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">packageName</span></div><div><span class="pln">                        </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">" has no certificates; ignoring!"</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">                mParseError </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">INSTALL_PARSE_FAILED_NO_CERTIFICATES</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">false</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div><span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">CertificateEncodingException</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">Slog</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">w</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">TAG</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"Exception reading "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> mArchiveSourcePath</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">            mParseError </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">false</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">IOException</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">Slog</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">w</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">TAG</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"Exception reading "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> mArchiveSourcePath</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">            mParseError </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">false</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">RuntimeException</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">Slog</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">w</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">TAG</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"Exception reading "</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">+</span><span class="pln"> mArchiveSourcePath</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">);</span></div><div><span class="pln">            mParseError </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">false</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><div>
</div><div><span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">true</span><span class="pun" style="color:rgb(102,102,0)">;</span></div><div><span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">}</span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
函数2
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">private</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Certificate</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> loadCertificates</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pln"> jarFile</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">JarEntry</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">,</span></div><div><span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> readBuffer</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">try</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">{</span></div><div><span class="pln">            </span><span class="com" style="color:rgb(136,0,0)">// We must read the stream for the JarEntry to retrieve</span></div><div><span class="com" style="color:rgb(136,0,0)">            // its certificates.</span></div><div><span class="com" style="color:rgb(136,0,0)">            InputStream is = new BufferedInputStream(jarFile.getInputStream(je));</span></div><div><span class="com" style="color:rgb(136,0,0)">            while (is.read(readBuffer, 0, readBuffer.length) != -1) {</span></div><div><span class="com" style="color:rgb(136,0,0)">                // not using</span></div><div><span class="com" style="color:rgb(136,0,0)">            }</span></div><div><span class="com" style="color:rgb(136,0,0)">            is.close();</span></div><div><span class="com" style="color:rgb(136,0,0)">            return je != null ? je.getCertificates() : null;</span></div><div><span class="com" style="color:rgb(136,0,0)">        } catch (IOException e) {</span></div><div><span class="com" style="color:rgb(136,0,0)">            Slog.w(TAG, "Exception reading " + je.getName() + " in "</span></div><div><span class="com" style="color:rgb(136,0,0)">                    + jarFile.getName(), e);</span></div><div><span class="com" style="color:rgb(136,0,0)">        } catch (RuntimeException e) {</span></div><div><span class="com" style="color:rgb(136,0,0)">            Slog.w(TAG, "Exception reading " + je.getName() + " in "</span></div><div><span class="com" style="color:rgb(136,0,0)">                    + jarFile.getName(), e);</span></div><div><span class="com" style="color:rgb(136,0,0)">        }</span></div><div><span class="com" style="color:rgb(136,0,0)">        return null;</span></div><div><span class="com" style="color:rgb(136,0,0)">    }</span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
通过上面的代码,我们已经能够得到了签名的证书,通过证书我们就得到PublicKey,通过比较PublicKey我们就能比较签名是否一致,当然这里假设的是只有一个签名。
实例1
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span class="kwd" style="color:rgb(0,0,136)">package</span><span class="pln"> edu</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">edut</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">robin</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">utils</span><span class="pun" style="color:rgb(102,102,0)">;</span>

<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">io</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">ByteArrayInputStream</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">io</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">IOException</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">io</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">InputStream</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">security</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">security</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">cert</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">Certificate</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">security</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">cert</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">CertificateFactory</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">security</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">cert</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">X509Certificate</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">util</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">jar</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">JarEntry</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> java</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">util</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">jar</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pun" style="color:rgb(102,102,0)">;</span>

<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> android</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">content</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">Context</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> android</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">content</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">pm</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">PackageInfo</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> android</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">content</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">pm</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> android</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">content</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">pm</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">NameNotFoundException</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="kwd" style="color:rgb(0,0,136)">import</span><span class="pln"> android</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">util</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="typ" style="color:rgb(102,0,102)">Base64</span><span class="pun" style="color:rgb(102,102,0)">;</span>

<span class="kwd" style="color:rgb(0,0,136)">public</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">class</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">SigntureUtil</span>
<span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">final</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">static</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pln"> TAG </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="str" style="color:rgb(0,136,0)">"Signture"</span><span class="pun" style="color:rgb(102,102,0)">;</span>

<span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">public</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">static</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> getPublicKeyString</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">PackageInfo</span><span class="pln"> pi</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">        </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pln"> pubKeys</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> getPublicKey</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pi</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pubKeys </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">||</span><span class="pln"> pubKeys</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">        </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> strPubKeys </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">pubKeys</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">];</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">for</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="pln"> pubKeys</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">++)</span>
<span class="pln">            strPubKeys</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">]</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Base64</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">encodeToString</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pubKeys</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">].</span><span class="pln">getEncoded</span><span class="pun" style="color:rgb(102,102,0)">(),</span>
<span class="pln">                    </span><span class="typ" style="color:rgb(102,0,102)">Base64</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">DEFAULT</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> strPubKeys</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">private</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">static</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> getPublicKey</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">PackageInfo</span><span class="pln"> pi</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">try</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pi</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">signatures </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">||</span><span class="pln"> pi</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">signatures</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> publicKeys </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">pi</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">signatures</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">];</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">for</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="pln"> publicKeys</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">++)</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> signature </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> pi</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">signatures</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">].</span><span class="pln">toByteArray</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">                </span><span class="typ" style="color:rgb(102,0,102)">CertificateFactory</span><span class="pln"> certFactory </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">CertificateFactory</span>
<span class="pln">                        </span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getInstance</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"X.509"</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">                </span><span class="typ" style="color:rgb(102,0,102)">InputStream</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">is</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">ByteArrayInputStream</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">signature</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">                X509Certificate cert </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">X509Certificate</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> certFactory</span>
<span class="pln">                        </span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">generateCertificate</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">is</span><span class="pun" style="color:rgb(102,102,0)">);</span>

<span class="pln">                publicKeys</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">]</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> cert</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getPublicKey</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">Exception</span><span class="pln"> ex</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>

<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">private</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">static</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> getInstalledAppPublicKey</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">Context</span><span class="pln"> context</span><span class="pun" style="color:rgb(102,102,0)">,</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pln"> packageName</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">        </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pln"> pm </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> context</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getPackageManager</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">        </span><span class="typ" style="color:rgb(102,0,102)">PackageInfo</span><span class="pln"> pi</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">try</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            pi </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> pm</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getPackageInfo</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">packageName</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">PackageManager</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">GET_SIGNATURES</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pi </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&&</span><span class="pln"> pi</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">versionName </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> getPublicKey</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pi</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">NameNotFoundException</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            </span><span class="com" style="color:rgb(136,0,0)">// not installed</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">Exception</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            e</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">printStackTrace</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">private</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">static</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">Certificate</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> loadCertificates</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pln"> jarFile</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">JarEntry</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">try</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            </span><span class="com" style="color:rgb(136,0,0)">// We must read the stream for the JarEntry to retrieve</span>
<span class="pln">            </span><span class="com" style="color:rgb(136,0,0)">// its certificates.</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> readBuffer </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">byte</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="lit" style="color:rgb(0,102,102)">1024</span><span class="pun" style="color:rgb(102,102,0)">];</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">InputStream</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">is</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> jarFile</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getInputStream</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">je</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">while</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">is</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">read</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">readBuffer</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> readBuffer</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="lit" style="color:rgb(0,102,102)">1</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">                </span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">is</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">close</span><span class="pun" style="color:rgb(102,102,0)">();</span>

<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">je </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">)</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">?</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getCertificates</span><span class="pun" style="color:rgb(102,102,0)">()</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">:</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">IOException</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            e</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">printStackTrace</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">    </span><span class="kwd" style="color:rgb(0,0,136)">public</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">static</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">boolean</span><span class="pln"> verifySignature</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">Context</span><span class="pln"> context</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pln"> packageName</span><span class="pun" style="color:rgb(102,102,0)">,</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">String</span><span class="pln"> filePath</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">boolean</span><span class="pln"> verifyed </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">true</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">try</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> installedAppPubKeys </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> getInstalledAppPublicKey</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">context</span><span class="pun" style="color:rgb(102,102,0)">,</span>
<span class="pln">                    packageName</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">installedAppPubKeys </span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pun" style="color:rgb(102,102,0)">||</span><span class="pln">installedAppPubKeys</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">==</span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                </span><span class="com" style="color:rgb(136,0,0)">// package not installed</span>
<span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">true</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pln"> jarFile </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">new</span><span class="pln"> </span><span class="typ" style="color:rgb(102,0,102)">JarFile</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">filePath</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            verifyed </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">false</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">JarEntry</span><span class="pln"> je </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> jarFile</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">getJarEntry</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="str" style="color:rgb(0,136,0)">"classes.dex"</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            </span><span class="typ" style="color:rgb(102,0,102)">Certificate</span><span class="pun" style="color:rgb(102,102,0)">[]</span><span class="pln"> certs </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> loadCertificates</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">jarFile</span><span class="pun" style="color:rgb(102,102,0)">,</span><span class="pln"> je</span><span class="pun" style="color:rgb(102,102,0)">);</span>
<span class="pln">            </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">certs </span><span class="pun" style="color:rgb(102,102,0)">!=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">null</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">&&</span><span class="pln"> certs</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length </span><span class="pun" style="color:rgb(102,102,0)">></span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                </span><span class="kwd" style="color:rgb(0,0,136)">for</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i </span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="pln"> certs</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln"> i</span><span class="pun" style="color:rgb(102,102,0)">++)</span>
<span class="pln">                </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                    </span><span class="typ" style="color:rgb(102,0,102)">PublicKey</span><span class="pln"> pubKey </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> certs</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">i</span><span class="pun" style="color:rgb(102,102,0)">].</span><span class="pln">getPublicKey</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">for</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="kwd" style="color:rgb(0,0,136)">int</span><span class="pln"> j</span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="lit" style="color:rgb(0,102,102)">0</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln">j</span><span class="pun" style="color:rgb(102,102,0)"><</span><span class="pln">installedAppPubKeys</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">length</span><span class="pun" style="color:rgb(102,102,0)">;</span><span class="pln">j</span><span class="pun" style="color:rgb(102,102,0)">++)</span>
<span class="pln">                    </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                        </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">pubKey</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">equals</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">installedAppPubKeys</span><span class="pun" style="color:rgb(102,102,0)">[</span><span class="pln">j</span><span class="pun" style="color:rgb(102,102,0)">]))</span>
<span class="pln">                        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                            verifyed </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">true</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">                            </span><span class="kwd" style="color:rgb(0,0,136)">break</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">                        </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">                    </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">                    </span><span class="kwd" style="color:rgb(0,0,136)">if</span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="pln">verifyed</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">                        </span><span class="kwd" style="color:rgb(0,0,136)">break</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">                </span><span class="pun" style="color:rgb(102,102,0)">}</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">else</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">                verifyed </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">true</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">            </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">            jarFile</span><span class="pun" style="color:rgb(102,102,0)">.</span><span class="pln">close</span><span class="pun" style="color:rgb(102,102,0)">();</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">catch</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">(</span><span class="typ" style="color:rgb(102,0,102)">Exception</span><span class="pln"> e</span><span class="pun" style="color:rgb(102,102,0)">)</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">{</span>
<span class="pln">            verifyed </span><span class="pun" style="color:rgb(102,102,0)">=</span><span class="pln"> </span><span class="kwd" style="color:rgb(0,0,136)">true</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">        </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pln">        </span><span class="kwd" style="color:rgb(0,0,136)">return</span><span class="pln"> verifyed</span><span class="pun" style="color:rgb(102,102,0)">;</span>
<span class="pln">    </span><span class="pun" style="color:rgb(102,102,0)">}</span>

<span class="pun" style="color:rgb(102,102,0)">}</span>
</div><div>
</div><div></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
关于数字签名的更多内容请阅读《 数字签名简介
关于java本身的数字签名和数字证书请参考《 Java中的数字签名和数字证书 》和 Jar文件的数字签名
结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值