1*e7b1675dSTing-Kang Chang // Copyright 2019 Google LLC 2*e7b1675dSTing-Kang Chang // 3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License"); 4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License. 5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at 6*e7b1675dSTing-Kang Chang // 7*e7b1675dSTing-Kang Chang // http://www.apache.org/licenses/LICENSE-2.0 8*e7b1675dSTing-Kang Chang // 9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software 10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS, 11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and 13*e7b1675dSTing-Kang Chang // limitations under the License. 14*e7b1675dSTing-Kang Chang // 15*e7b1675dSTing-Kang Chang //////////////////////////////////////////////////////////////////////////////// 16*e7b1675dSTing-Kang Chang #include "tink/prf/prf_key_templates.h" 17*e7b1675dSTing-Kang Chang 18*e7b1675dSTing-Kang Chang #include <memory> 19*e7b1675dSTing-Kang Chang 20*e7b1675dSTing-Kang Chang #include "absl/memory/memory.h" 21*e7b1675dSTing-Kang Chang #include "tink/prf/aes_cmac_prf_key_manager.h" 22*e7b1675dSTing-Kang Chang #include "tink/prf/hkdf_prf_key_manager.h" 23*e7b1675dSTing-Kang Chang #include "tink/prf/hmac_prf_key_manager.h" 24*e7b1675dSTing-Kang Chang #include "proto/aes_cmac_prf.pb.h" 25*e7b1675dSTing-Kang Chang #include "proto/hkdf_prf.pb.h" 26*e7b1675dSTing-Kang Chang #include "proto/hmac_prf.pb.h" 27*e7b1675dSTing-Kang Chang 28*e7b1675dSTing-Kang Chang namespace crypto { 29*e7b1675dSTing-Kang Chang namespace tink { 30*e7b1675dSTing-Kang Chang 31*e7b1675dSTing-Kang Chang namespace { 32*e7b1675dSTing-Kang Chang 33*e7b1675dSTing-Kang Chang using google::crypto::tink::AesCmacPrfKeyFormat; 34*e7b1675dSTing-Kang Chang using google::crypto::tink::HkdfPrfKeyFormat; 35*e7b1675dSTing-Kang Chang using google::crypto::tink::HmacPrfKeyFormat; 36*e7b1675dSTing-Kang Chang NewHkdfSha256Template()37*e7b1675dSTing-Kang Changstd::unique_ptr<google::crypto::tink::KeyTemplate> NewHkdfSha256Template() { 38*e7b1675dSTing-Kang Chang auto key_template = absl::make_unique<google::crypto::tink::KeyTemplate>(); 39*e7b1675dSTing-Kang Chang auto hkdf_prf_key_manager = absl::make_unique<HkdfPrfKeyManager>(); 40*e7b1675dSTing-Kang Chang key_template->set_type_url(hkdf_prf_key_manager->get_key_type()); 41*e7b1675dSTing-Kang Chang key_template->set_output_prefix_type( 42*e7b1675dSTing-Kang Chang google::crypto::tink::OutputPrefixType::RAW); 43*e7b1675dSTing-Kang Chang HkdfPrfKeyFormat key_format; 44*e7b1675dSTing-Kang Chang key_format.set_key_size(32); 45*e7b1675dSTing-Kang Chang key_format.set_version(hkdf_prf_key_manager->get_version()); 46*e7b1675dSTing-Kang Chang key_format.mutable_params()->set_hash(google::crypto::tink::HashType::SHA256); 47*e7b1675dSTing-Kang Chang key_format.SerializeToString(key_template->mutable_value()); 48*e7b1675dSTing-Kang Chang return key_template; 49*e7b1675dSTing-Kang Chang } 50*e7b1675dSTing-Kang Chang NewHmacTemplate(google::crypto::tink::HashType hash_type,uint32_t key_size)51*e7b1675dSTing-Kang Changstd::unique_ptr<google::crypto::tink::KeyTemplate> NewHmacTemplate( 52*e7b1675dSTing-Kang Chang google::crypto::tink::HashType hash_type, uint32_t key_size) { 53*e7b1675dSTing-Kang Chang auto key_template = absl::make_unique<google::crypto::tink::KeyTemplate>(); 54*e7b1675dSTing-Kang Chang auto hmac_prf_key_manager = absl::make_unique<HmacPrfKeyManager>(); 55*e7b1675dSTing-Kang Chang key_template->set_type_url(hmac_prf_key_manager->get_key_type()); 56*e7b1675dSTing-Kang Chang key_template->set_output_prefix_type( 57*e7b1675dSTing-Kang Chang google::crypto::tink::OutputPrefixType::RAW); 58*e7b1675dSTing-Kang Chang HmacPrfKeyFormat key_format; 59*e7b1675dSTing-Kang Chang key_format.set_key_size(key_size); 60*e7b1675dSTing-Kang Chang key_format.set_version(hmac_prf_key_manager->get_version()); 61*e7b1675dSTing-Kang Chang key_format.mutable_params()->set_hash(hash_type); 62*e7b1675dSTing-Kang Chang key_format.SerializeToString(key_template->mutable_value()); 63*e7b1675dSTing-Kang Chang return key_template; 64*e7b1675dSTing-Kang Chang } 65*e7b1675dSTing-Kang Chang NewAesCmacTemplate()66*e7b1675dSTing-Kang Changstd::unique_ptr<google::crypto::tink::KeyTemplate> NewAesCmacTemplate() { 67*e7b1675dSTing-Kang Chang auto key_template = absl::make_unique<google::crypto::tink::KeyTemplate>(); 68*e7b1675dSTing-Kang Chang auto aes_cmac_prf_key_manager = absl::make_unique<AesCmacPrfKeyManager>(); 69*e7b1675dSTing-Kang Chang key_template->set_type_url(aes_cmac_prf_key_manager->get_key_type()); 70*e7b1675dSTing-Kang Chang key_template->set_output_prefix_type( 71*e7b1675dSTing-Kang Chang google::crypto::tink::OutputPrefixType::RAW); 72*e7b1675dSTing-Kang Chang AesCmacPrfKeyFormat key_format; 73*e7b1675dSTing-Kang Chang key_format.set_version(aes_cmac_prf_key_manager->get_version()); 74*e7b1675dSTing-Kang Chang key_format.set_key_size(32); 75*e7b1675dSTing-Kang Chang key_format.SerializeToString(key_template->mutable_value()); 76*e7b1675dSTing-Kang Chang return key_template; 77*e7b1675dSTing-Kang Chang } 78*e7b1675dSTing-Kang Chang 79*e7b1675dSTing-Kang Chang } // namespace 80*e7b1675dSTing-Kang Chang HkdfSha256()81*e7b1675dSTing-Kang Changconst google::crypto::tink::KeyTemplate& PrfKeyTemplates::HkdfSha256() { 82*e7b1675dSTing-Kang Chang static const google::crypto::tink::KeyTemplate* key_template = 83*e7b1675dSTing-Kang Chang NewHkdfSha256Template().release(); 84*e7b1675dSTing-Kang Chang return *key_template; 85*e7b1675dSTing-Kang Chang } 86*e7b1675dSTing-Kang Chang HmacSha256()87*e7b1675dSTing-Kang Changconst google::crypto::tink::KeyTemplate& PrfKeyTemplates::HmacSha256() { 88*e7b1675dSTing-Kang Chang static const google::crypto::tink::KeyTemplate* key_template = 89*e7b1675dSTing-Kang Chang NewHmacTemplate(google::crypto::tink::HashType::SHA256, 32).release(); 90*e7b1675dSTing-Kang Chang return *key_template; 91*e7b1675dSTing-Kang Chang } 92*e7b1675dSTing-Kang Chang HmacSha512()93*e7b1675dSTing-Kang Changconst google::crypto::tink::KeyTemplate& PrfKeyTemplates::HmacSha512() { 94*e7b1675dSTing-Kang Chang static const google::crypto::tink::KeyTemplate* key_template = 95*e7b1675dSTing-Kang Chang NewHmacTemplate(google::crypto::tink::HashType::SHA512, 64).release(); 96*e7b1675dSTing-Kang Chang return *key_template; 97*e7b1675dSTing-Kang Chang } 98*e7b1675dSTing-Kang Chang AesCmac()99*e7b1675dSTing-Kang Changconst google::crypto::tink::KeyTemplate& PrfKeyTemplates::AesCmac() { 100*e7b1675dSTing-Kang Chang static const google::crypto::tink::KeyTemplate* key_template = 101*e7b1675dSTing-Kang Chang NewAesCmacTemplate().release(); 102*e7b1675dSTing-Kang Chang return *key_template; 103*e7b1675dSTing-Kang Chang } 104*e7b1675dSTing-Kang Chang 105*e7b1675dSTing-Kang Chang } // namespace tink 106*e7b1675dSTing-Kang Chang } // namespace crypto 107