• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*############################################################################
2   # Copyright 2017 Intel Corporation
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 /// Basename management implementation
17 /*! \file */
18 
19 #include "epid/member/tiny/src/allowed_basenames.h"
20 #include "epid/member/tiny/stdlib/tiny_stdlib.h"
21 
22 #if defined(SHA256_SUPPORT)
23 #define BASENAME_SHA_ALG kSha256
24 #elif defined(SHA512_SUPPORT)
25 #define BASENAME_SHA_ALG kSha512
26 #endif
27 
BasenamesGetSize(size_t num_basenames)28 size_t BasenamesGetSize(size_t num_basenames) {
29   return sizeof(AllowedBasenames) - sizeof(sha_digest) +
30          sizeof(sha_digest) * (num_basenames);
31 }
32 
InitBasenames(AllowedBasenames * basename_container,size_t num_basenames)33 void InitBasenames(AllowedBasenames* basename_container, size_t num_basenames) {
34   basename_container->current_bsn_number = 0;
35   basename_container->max_bsn_number = num_basenames;
36   memset(basename_container->basename_digest->digest, 0,
37          sizeof(basename_container->basename_digest) * num_basenames);
38 }
39 
IsBasenameAllowed(AllowedBasenames const * basename_container,void const * basename,size_t length)40 int IsBasenameAllowed(AllowedBasenames const* basename_container,
41                       void const* basename, size_t length) {
42   size_t d = 0;
43   tiny_sha sha_state;
44   sha_digest digest;
45   // calculate hash of input basename
46   tinysha_init(BASENAME_SHA_ALG, &sha_state);
47   tinysha_update(&sha_state, basename, length);
48   tinysha_final(digest.digest, &sha_state);
49   // compare hash of input basename with stored hashes
50   for (d = 0; d < basename_container->current_bsn_number; d++) {
51     if (!memcmp(digest.digest, &basename_container->basename_digest[d].digest,
52                 tinysha_digest_size(&sha_state))) {
53       return 1;
54     }
55   }
56   return 0;
57 }
58 
AllowBasename(AllowedBasenames * basename_container,void const * basename,size_t length)59 int AllowBasename(AllowedBasenames* basename_container, void const* basename,
60                   size_t length) {
61   tiny_sha sha_state;
62   sha_digest digest;
63   if (basename_container->max_bsn_number <=
64       basename_container->current_bsn_number) {
65     return 0;
66   }
67   // calculate hash of input basename
68   tinysha_init(BASENAME_SHA_ALG, &sha_state);
69   tinysha_update(&sha_state, basename, length);
70   tinysha_final(digest.digest, &sha_state);
71   // copy hash of input basename into digest buffer
72   basename_container->basename_digest[basename_container->current_bsn_number] =
73       digest;
74   basename_container->current_bsn_number++;
75   return 1;
76 }
77