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