175cc8a5c58b3260e530eae9f2edd502b71d25373Logan/* 275cc8a5c58b3260e530eae9f2edd502b71d25373Logan * copyright 2010, the android open source project 375cc8a5c58b3260e530eae9f2edd502b71d25373Logan * 475cc8a5c58b3260e530eae9f2edd502b71d25373Logan * licensed under the apache license, version 2.0 (the "license"); 575cc8a5c58b3260e530eae9f2edd502b71d25373Logan * you may not use this file except in compliance with the license. 675cc8a5c58b3260e530eae9f2edd502b71d25373Logan * you may obtain a copy of the license at 775cc8a5c58b3260e530eae9f2edd502b71d25373Logan * 875cc8a5c58b3260e530eae9f2edd502b71d25373Logan * http://www.apache.org/licenses/license-2.0 975cc8a5c58b3260e530eae9f2edd502b71d25373Logan * 1075cc8a5c58b3260e530eae9f2edd502b71d25373Logan * unless required by applicable law or agreed to in writing, software 1175cc8a5c58b3260e530eae9f2edd502b71d25373Logan * distributed under the license is distributed on an "as is" basis, 1275cc8a5c58b3260e530eae9f2edd502b71d25373Logan * without warranties or conditions of any kind, either express or implied. 1375cc8a5c58b3260e530eae9f2edd502b71d25373Logan * see the license for the specific language governing permissions and 1475cc8a5c58b3260e530eae9f2edd502b71d25373Logan * limitations under the license. 1575cc8a5c58b3260e530eae9f2edd502b71d25373Logan */ 1675cc8a5c58b3260e530eae9f2edd502b71d25373Logan 1775cc8a5c58b3260e530eae9f2edd502b71d25373Logan#include "Sha1Helper.h" 1875cc8a5c58b3260e530eae9f2edd502b71d25373Logan 19358490082d8435aa36feaff8107aa55c3cf363adLogan#include "Config.h" 20358490082d8435aa36feaff8107aa55c3cf363adLogan 214dcd6798f3db374a056ea6acc6b425f544c5207cLogan#include "DebugHelper.h" 2275cc8a5c58b3260e530eae9f2edd502b71d25373Logan#include "FileHandle.h" 2375cc8a5c58b3260e530eae9f2edd502b71d25373Logan 2475cc8a5c58b3260e530eae9f2edd502b71d25373Logan#include <string.h> 2575cc8a5c58b3260e530eae9f2edd502b71d25373Logan 26e132399eb9dc93123d50e9492ac7b01c2c9a4d35Logan#include <utils/StopWatch.h> 27e132399eb9dc93123d50e9492ac7b01c2c9a4d35Logan 2875cc8a5c58b3260e530eae9f2edd502b71d25373Logan#include <sha1.h> 2975cc8a5c58b3260e530eae9f2edd502b71d25373Logan 3075cc8a5c58b3260e530eae9f2edd502b71d25373Logannamespace bcc { 3175cc8a5c58b3260e530eae9f2edd502b71d25373Logan 322ca6e576421e86e0128991b825c238f1d4221910Joseph Wenunsigned char sha1LibBCC_SHA1[20]; 3326fea10655613ad184b37dfd24dd21e92a5afa95Ying Wangchar const *pathLibBCC_SHA1 = "/system/lib/libbcc.so.sha1"; 3475cc8a5c58b3260e530eae9f2edd502b71d25373Logan 35769190765f7a920ac7f30ff6d424f3ae850b1c3aJoseph Wenunsigned char sha1LibRS[20]; 36769190765f7a920ac7f30ff6d424f3ae850b1c3aJoseph Wenchar const *pathLibRS = "/system/lib/libRS.so"; 37769190765f7a920ac7f30ff6d424f3ae850b1c3aJoseph Wen 3875cc8a5c58b3260e530eae9f2edd502b71d25373Loganvoid calcSHA1(unsigned char *result, char const *data, size_t size) { 3975cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1_CTX hashContext; 4075cc8a5c58b3260e530eae9f2edd502b71d25373Logan 4175cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1Init(&hashContext); 4275cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1Update(&hashContext, 4375cc8a5c58b3260e530eae9f2edd502b71d25373Logan reinterpret_cast<const unsigned char *>(data), 4475cc8a5c58b3260e530eae9f2edd502b71d25373Logan static_cast<unsigned long>(size)); 4575cc8a5c58b3260e530eae9f2edd502b71d25373Logan 4675cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1Final(result, &hashContext); 4775cc8a5c58b3260e530eae9f2edd502b71d25373Logan} 4875cc8a5c58b3260e530eae9f2edd502b71d25373Logan 4975cc8a5c58b3260e530eae9f2edd502b71d25373Logan 5075cc8a5c58b3260e530eae9f2edd502b71d25373Loganvoid calcFileSHA1(unsigned char *result, char const *filename) { 51e132399eb9dc93123d50e9492ac7b01c2c9a4d35Logan android::StopWatch calcFileSHA1Timer("calcFileSHA1 time"); 52e132399eb9dc93123d50e9492ac7b01c2c9a4d35Logan 5375cc8a5c58b3260e530eae9f2edd502b71d25373Logan FileHandle file; 5475cc8a5c58b3260e530eae9f2edd502b71d25373Logan 5575cc8a5c58b3260e530eae9f2edd502b71d25373Logan if (file.open(filename, OpenMode::Read) < 0) { 5675cc8a5c58b3260e530eae9f2edd502b71d25373Logan LOGE("Unable to calculate the sha1 checksum of %s\n", filename); 5775cc8a5c58b3260e530eae9f2edd502b71d25373Logan memset(result, '\0', 20); 5875cc8a5c58b3260e530eae9f2edd502b71d25373Logan return; 5975cc8a5c58b3260e530eae9f2edd502b71d25373Logan } 6075cc8a5c58b3260e530eae9f2edd502b71d25373Logan 6175cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1_CTX hashContext; 6275cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1Init(&hashContext); 6375cc8a5c58b3260e530eae9f2edd502b71d25373Logan 6475cc8a5c58b3260e530eae9f2edd502b71d25373Logan char buf[256]; 6575cc8a5c58b3260e530eae9f2edd502b71d25373Logan while (true) { 6675cc8a5c58b3260e530eae9f2edd502b71d25373Logan ssize_t nread = file.read(buf, sizeof(buf)); 67f7cfc026ec9e3a307d1252c46be9a089d74d3ef3Shih-wei Liao 6875cc8a5c58b3260e530eae9f2edd502b71d25373Logan if (nread < 0) { 6975cc8a5c58b3260e530eae9f2edd502b71d25373Logan break; 7075cc8a5c58b3260e530eae9f2edd502b71d25373Logan } 7175cc8a5c58b3260e530eae9f2edd502b71d25373Logan 7275cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1Update(&hashContext, 7375cc8a5c58b3260e530eae9f2edd502b71d25373Logan reinterpret_cast<unsigned char *>(buf), 7475cc8a5c58b3260e530eae9f2edd502b71d25373Logan static_cast<unsigned long>(nread)); 7575cc8a5c58b3260e530eae9f2edd502b71d25373Logan 7675cc8a5c58b3260e530eae9f2edd502b71d25373Logan if ((size_t)nread < sizeof(buf)) { 7775cc8a5c58b3260e530eae9f2edd502b71d25373Logan // finished. 7875cc8a5c58b3260e530eae9f2edd502b71d25373Logan break; 7975cc8a5c58b3260e530eae9f2edd502b71d25373Logan } 8075cc8a5c58b3260e530eae9f2edd502b71d25373Logan } 8175cc8a5c58b3260e530eae9f2edd502b71d25373Logan 8275cc8a5c58b3260e530eae9f2edd502b71d25373Logan SHA1Final(result, &hashContext); 8375cc8a5c58b3260e530eae9f2edd502b71d25373Logan} 8475cc8a5c58b3260e530eae9f2edd502b71d25373Logan 8526fea10655613ad184b37dfd24dd21e92a5afa95Ying Wangvoid readSHA1(unsigned char *result, int result_size, char const *filename) { 8626fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang FileHandle file; 8726fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang if (file.open(filename, OpenMode::Read) < 0) { 8826fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang LOGE("Unable to read binary sha1 file %s\n", filename); 8926fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang memset(result, '\0', result_size); 9026fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang return; 9126fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang } 9226fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang file.read((char *)result, result_size); 9326fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang} 9426fea10655613ad184b37dfd24dd21e92a5afa95Ying Wang 9575cc8a5c58b3260e530eae9f2edd502b71d25373Logan} // namespace bcc 96