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