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