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