Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2019 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 #ifndef ANDROID_ML_NN_COMMON_TOKEN_HASHER_H
     18 #define ANDROID_ML_NN_COMMON_TOKEN_HASHER_H
     19 
     20 #include <cstring>
     21 #include <vector>
     22 
     23 #include <android-base/macros.h>
     24 #include <openssl/sha.h>
     25 
     26 namespace android {
     27 namespace nn {
     28 
     29 class TokenHasher {
     30     DISALLOW_COPY_AND_ASSIGN(TokenHasher);
     31 
     32    public:
     33     // Initializes the hasher with token. If token is nullptr, the hasher is set to be empty;
     34     // otherwise, it must be of length ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN.
     35     TokenHasher(const uint8_t* token);
     36 
     37     // Updates with a byte array. Returns false and sets to be empty on fail.
     38     // The client must check if the hasher is valid before invoking this method.
     39     bool update(const void* bytes, size_t length);
     40 
     41     // Updates with a string ended with '\0'. Returns false and sets to be empty on fail.
     42     // The client must check if the hasher is valid before invoking this method.
     43     bool updateFromString(const char* s) { return update(s, strlen(s)); }
     44 
     45     // Finishes the hasher, and writes re-hashed token to mToken.
     46     // Returns false and sets to be empty on fail.
     47     // The client must check if the hasher is valid before invoking this method.
     48     bool finish();
     49 
     50     // Returns a pointer to the transformed token if the hasher is successfully finished.
     51     // Returns nullptr if the hasher is initialized with a nullptr, or some call on the
     52     // hasher failed.
     53     // Aborts if the hasher is valid but finish has not been called.
     54     const uint8_t* getCacheToken() const;
     55 
     56     bool ok() const { return !mIsError; }
     57 
     58    private:
     59     // Stores the transformed token, non-empty iff the hasher is not initialized
     60     // with nullptr and finish is called.
     61     std::vector<uint8_t> mToken;
     62     SHA256_CTX mHasher;
     63     // Indicates that either the hasher is initialized with a nullptr, or some call on
     64     // the hasher failed.
     65     bool mIsError;
     66 };
     67 
     68 }  // namespace nn
     69 }  // namespace android
     70 
     71 #endif  // ANDROID_ML_NN_COMMON_TOKEN_HASHER_H
     72