1*14675a02SAndroid Build Coastguard Worker /* 2*14675a02SAndroid Build Coastguard Worker * Copyright 2018 Google LLC 3*14675a02SAndroid Build Coastguard Worker * 4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*14675a02SAndroid Build Coastguard Worker * 8*14675a02SAndroid Build Coastguard Worker * https://www.apache.org/licenses/LICENSE-2.0 9*14675a02SAndroid Build Coastguard Worker * 10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*14675a02SAndroid Build Coastguard Worker * limitations under the License. 15*14675a02SAndroid Build Coastguard Worker */ 16*14675a02SAndroid Build Coastguard Worker 17*14675a02SAndroid Build Coastguard Worker #ifndef FCP_SECAGG_SHARED_AES_KEY_H_ 18*14675a02SAndroid Build Coastguard Worker #define FCP_SECAGG_SHARED_AES_KEY_H_ 19*14675a02SAndroid Build Coastguard Worker 20*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h" 21*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/key.h" 22*14675a02SAndroid Build Coastguard Worker #include "fcp/secagg/shared/shamir_secret_sharing.h" 23*14675a02SAndroid Build Coastguard Worker 24*14675a02SAndroid Build Coastguard Worker namespace fcp { 25*14675a02SAndroid Build Coastguard Worker namespace secagg { 26*14675a02SAndroid Build Coastguard Worker // A Key specifically intended for use with AES symmetric encryption. 27*14675a02SAndroid Build Coastguard Worker // Keys originating on Java clients are 17 bytes or shorter (typically 28*14675a02SAndroid Build Coastguard Worker // 16 or 17 bytes, but sometimes shorter). 29*14675a02SAndroid Build Coastguard Worker // Keys originating on C++ clients must have 32 bytes. 30*14675a02SAndroid Build Coastguard Worker // A 0-byte key should not be used for anything, and represents the absence of 31*14675a02SAndroid Build Coastguard Worker // a key in a collection of keys. 32*14675a02SAndroid Build Coastguard Worker // 33*14675a02SAndroid Build Coastguard Worker class AesKey : public Key { 34*14675a02SAndroid Build Coastguard Worker public: 35*14675a02SAndroid Build Coastguard Worker static constexpr int kSize = 32; // Expected key size for AES-256 36*14675a02SAndroid Build Coastguard Worker 37*14675a02SAndroid Build Coastguard Worker // The key is blank. AesKey()38*14675a02SAndroid Build Coastguard Worker AesKey() : Key() {} 39*14675a02SAndroid Build Coastguard Worker 40*14675a02SAndroid Build Coastguard Worker // The key is a standard-size 32 byte key. 41*14675a02SAndroid Build Coastguard Worker explicit AesKey(const uint8_t* data, int key_size = kSize); 42*14675a02SAndroid Build Coastguard Worker 43*14675a02SAndroid Build Coastguard Worker // Create a key by reconstructing it from key shares. Length depends on the 44*14675a02SAndroid Build Coastguard Worker // key shares, and may not be 32 bytes. Threshold is the threshold used when 45*14675a02SAndroid Build Coastguard Worker // the secret was shared, i.e. the minimum number of clients to reconstruct. 46*14675a02SAndroid Build Coastguard Worker static StatusOr<AesKey> CreateFromShares( 47*14675a02SAndroid Build Coastguard Worker const std::vector<ShamirShare>& shares, int threshold); 48*14675a02SAndroid Build Coastguard Worker }; 49*14675a02SAndroid Build Coastguard Worker } // namespace secagg 50*14675a02SAndroid Build Coastguard Worker } // namespace fcp 51*14675a02SAndroid Build Coastguard Worker 52*14675a02SAndroid Build Coastguard Worker #endif // FCP_SECAGG_SHARED_AES_KEY_H_ 53