1f290793bc65b8483332ac8b568962395c4a63927Zonr Chang/*
2f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * copyright 2012, the android open source project
3f290793bc65b8483332ac8b568962395c4a63927Zonr Chang *
4f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * licensed under the apache license, version 2.0 (the "license");
5f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * you may not use this file except in compliance with the license.
6f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * you may obtain a copy of the license at
7f290793bc65b8483332ac8b568962395c4a63927Zonr Chang *
8f290793bc65b8483332ac8b568962395c4a63927Zonr Chang *     http://www.apache.org/licenses/license-2.0
9f290793bc65b8483332ac8b568962395c4a63927Zonr Chang *
10f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * unless required by applicable law or agreed to in writing, software
11f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * distributed under the license is distributed on an "as is" basis,
12f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * without warranties or conditions of any kind, either express or implied.
13f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * see the license for the specific language governing permissions and
14f290793bc65b8483332ac8b568962395c4a63927Zonr Chang * limitations under the license.
15f290793bc65b8483332ac8b568962395c4a63927Zonr Chang */
16f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
17f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include "bcc/Support/Sha1Util.h"
18f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
19f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include <sha1.h>
20f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
21f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include <cstring>
22f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
23f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include "bcc/Support/Log.h"
24f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include "bcc/Support/InputFile.h"
25f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
26f290793bc65b8483332ac8b568962395c4a63927Zonr Changusing namespace bcc;
27f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
28f290793bc65b8483332ac8b568962395c4a63927Zonr Changbool Sha1Util::GetSHA1DigestFromFile(uint8_t pResult[SHA1_DIGEST_LENGTH],
29f290793bc65b8483332ac8b568962395c4a63927Zonr Chang                                     const char *pFilename) {
30f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  InputFile file(pFilename);
31f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
32f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  if (file.hasError()) {
33f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    ALOGE("Unable to open the file %s before SHA-1 checksum "
34f290793bc65b8483332ac8b568962395c4a63927Zonr Chang          "calculation! (%s)", pFilename, file.getErrorMessage().c_str());
35f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    return false;
36f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  }
37f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
38f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1_CTX sha1_context;
39f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1Init(&sha1_context);
40f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
41f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  char buf[256];
42f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  while (true) {
43f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    ssize_t nread = file.read(buf, sizeof(buf));
44f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
45f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    if (nread < 0) {
46f290793bc65b8483332ac8b568962395c4a63927Zonr Chang      // Some errors occurred during file reading.
47f290793bc65b8483332ac8b568962395c4a63927Zonr Chang      return false;
48f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    }
49f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
50f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    SHA1Update(&sha1_context,
51f290793bc65b8483332ac8b568962395c4a63927Zonr Chang               reinterpret_cast<unsigned char *>(buf),
52f290793bc65b8483332ac8b568962395c4a63927Zonr Chang               static_cast<unsigned long>(nread));
53f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
54f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    if (static_cast<size_t>(nread) < sizeof(buf)) {
55f290793bc65b8483332ac8b568962395c4a63927Zonr Chang      break;
56f290793bc65b8483332ac8b568962395c4a63927Zonr Chang    }
57f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  }
58f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
59f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1Final(pResult, &sha1_context);
60f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
61f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  return true;
62f290793bc65b8483332ac8b568962395c4a63927Zonr Chang}
63f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
64f290793bc65b8483332ac8b568962395c4a63927Zonr Changbool Sha1Util::GetSHA1DigestFromBuffer(uint8_t pResult[SHA1_DIGEST_LENGTH],
65f290793bc65b8483332ac8b568962395c4a63927Zonr Chang                                       const uint8_t *pData, size_t pSize) {
66f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1_CTX sha1_context;
67f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
68f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1Init(&sha1_context);
69f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
70f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1Update(&sha1_context,
71f290793bc65b8483332ac8b568962395c4a63927Zonr Chang             reinterpret_cast<const unsigned char *>(pData),
72f290793bc65b8483332ac8b568962395c4a63927Zonr Chang             static_cast<unsigned long>(pSize));
73f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
74f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  SHA1Final(pResult, &sha1_context);
75f290793bc65b8483332ac8b568962395c4a63927Zonr Chang
76f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  return true;
77f290793bc65b8483332ac8b568962395c4a63927Zonr Chang}
78