1*e7b1675dSTing-Kang Chang // Copyright 2017 Google Inc. 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 17*e7b1675dSTing-Kang Chang #include "tink/util/enums.h" 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Chang #include "absl/status/status.h" 20*e7b1675dSTing-Kang Chang #include "absl/strings/str_cat.h" 21*e7b1675dSTing-Kang Chang #include "tink/util/status.h" 22*e7b1675dSTing-Kang Chang #include "proto/common.pb.h" 23*e7b1675dSTing-Kang Chang #include "proto/ecdsa.pb.h" 24*e7b1675dSTing-Kang Chang #include "proto/tink.pb.h" 25*e7b1675dSTing-Kang Chang 26*e7b1675dSTing-Kang Chang namespace crypto { 27*e7b1675dSTing-Kang Chang namespace tink { 28*e7b1675dSTing-Kang Chang namespace util { 29*e7b1675dSTing-Kang Chang 30*e7b1675dSTing-Kang Chang namespace pb = google::crypto::tink; 31*e7b1675dSTing-Kang Chang 32*e7b1675dSTing-Kang Chang // static SubtleToProto(subtle::EllipticCurveType type)33*e7b1675dSTing-Kang Changpb::EllipticCurveType Enums::SubtleToProto(subtle::EllipticCurveType type) { 34*e7b1675dSTing-Kang Chang switch (type) { 35*e7b1675dSTing-Kang Chang case subtle::EllipticCurveType::NIST_P256: 36*e7b1675dSTing-Kang Chang return pb::EllipticCurveType::NIST_P256; 37*e7b1675dSTing-Kang Chang case subtle::EllipticCurveType::NIST_P384: 38*e7b1675dSTing-Kang Chang return pb::EllipticCurveType::NIST_P384; 39*e7b1675dSTing-Kang Chang case subtle::EllipticCurveType::NIST_P521: 40*e7b1675dSTing-Kang Chang return pb::EllipticCurveType::NIST_P521; 41*e7b1675dSTing-Kang Chang case subtle::EllipticCurveType::CURVE25519: 42*e7b1675dSTing-Kang Chang return pb::EllipticCurveType::CURVE25519; 43*e7b1675dSTing-Kang Chang default: 44*e7b1675dSTing-Kang Chang return pb::EllipticCurveType::UNKNOWN_CURVE; 45*e7b1675dSTing-Kang Chang } 46*e7b1675dSTing-Kang Chang } 47*e7b1675dSTing-Kang Chang 48*e7b1675dSTing-Kang Chang // static ProtoToSubtle(pb::EllipticCurveType type)49*e7b1675dSTing-Kang Changsubtle::EllipticCurveType Enums::ProtoToSubtle(pb::EllipticCurveType type) { 50*e7b1675dSTing-Kang Chang switch (type) { 51*e7b1675dSTing-Kang Chang case pb::EllipticCurveType::NIST_P256: 52*e7b1675dSTing-Kang Chang return subtle::EllipticCurveType::NIST_P256; 53*e7b1675dSTing-Kang Chang case pb::EllipticCurveType::NIST_P384: 54*e7b1675dSTing-Kang Chang return subtle::EllipticCurveType::NIST_P384; 55*e7b1675dSTing-Kang Chang case pb::EllipticCurveType::NIST_P521: 56*e7b1675dSTing-Kang Chang return subtle::EllipticCurveType::NIST_P521; 57*e7b1675dSTing-Kang Chang case pb::EllipticCurveType::CURVE25519: 58*e7b1675dSTing-Kang Chang return subtle::EllipticCurveType::CURVE25519; 59*e7b1675dSTing-Kang Chang default: 60*e7b1675dSTing-Kang Chang return subtle::EllipticCurveType::UNKNOWN_CURVE; 61*e7b1675dSTing-Kang Chang } 62*e7b1675dSTing-Kang Chang } 63*e7b1675dSTing-Kang Chang 64*e7b1675dSTing-Kang Chang // static SubtleToProto(subtle::EcPointFormat format)65*e7b1675dSTing-Kang Changpb::EcPointFormat Enums::SubtleToProto(subtle::EcPointFormat format) { 66*e7b1675dSTing-Kang Chang switch (format) { 67*e7b1675dSTing-Kang Chang case subtle::EcPointFormat::UNCOMPRESSED: 68*e7b1675dSTing-Kang Chang return pb::EcPointFormat::UNCOMPRESSED; 69*e7b1675dSTing-Kang Chang case subtle::EcPointFormat::DO_NOT_USE_CRUNCHY_UNCOMPRESSED: 70*e7b1675dSTing-Kang Chang return pb::EcPointFormat::DO_NOT_USE_CRUNCHY_UNCOMPRESSED; 71*e7b1675dSTing-Kang Chang case subtle::EcPointFormat::COMPRESSED: 72*e7b1675dSTing-Kang Chang return pb::EcPointFormat::COMPRESSED; 73*e7b1675dSTing-Kang Chang default: 74*e7b1675dSTing-Kang Chang return pb::EcPointFormat::UNKNOWN_FORMAT; 75*e7b1675dSTing-Kang Chang } 76*e7b1675dSTing-Kang Chang } 77*e7b1675dSTing-Kang Chang 78*e7b1675dSTing-Kang Chang // static ProtoToSubtle(pb::EcPointFormat format)79*e7b1675dSTing-Kang Changsubtle::EcPointFormat Enums::ProtoToSubtle(pb::EcPointFormat format) { 80*e7b1675dSTing-Kang Chang switch (format) { 81*e7b1675dSTing-Kang Chang case pb::EcPointFormat::UNCOMPRESSED: 82*e7b1675dSTing-Kang Chang return subtle::EcPointFormat::UNCOMPRESSED; 83*e7b1675dSTing-Kang Chang case pb::EcPointFormat::DO_NOT_USE_CRUNCHY_UNCOMPRESSED: 84*e7b1675dSTing-Kang Chang return subtle::EcPointFormat::DO_NOT_USE_CRUNCHY_UNCOMPRESSED; 85*e7b1675dSTing-Kang Chang case pb::EcPointFormat::COMPRESSED: 86*e7b1675dSTing-Kang Chang return subtle::EcPointFormat::COMPRESSED; 87*e7b1675dSTing-Kang Chang default: 88*e7b1675dSTing-Kang Chang return subtle::EcPointFormat::UNKNOWN_FORMAT; 89*e7b1675dSTing-Kang Chang } 90*e7b1675dSTing-Kang Chang } 91*e7b1675dSTing-Kang Chang 92*e7b1675dSTing-Kang Chang // static SubtleToProto(subtle::HashType type)93*e7b1675dSTing-Kang Changpb::HashType Enums::SubtleToProto(subtle::HashType type) { 94*e7b1675dSTing-Kang Chang switch (type) { 95*e7b1675dSTing-Kang Chang case subtle::HashType::SHA1: 96*e7b1675dSTing-Kang Chang return pb::HashType::SHA1; 97*e7b1675dSTing-Kang Chang case subtle::HashType::SHA224: 98*e7b1675dSTing-Kang Chang return pb::HashType::SHA224; 99*e7b1675dSTing-Kang Chang case subtle::HashType::SHA256: 100*e7b1675dSTing-Kang Chang return pb::HashType::SHA256; 101*e7b1675dSTing-Kang Chang case subtle::HashType::SHA384: 102*e7b1675dSTing-Kang Chang return pb::HashType::SHA384; 103*e7b1675dSTing-Kang Chang case subtle::HashType::SHA512: 104*e7b1675dSTing-Kang Chang return pb::HashType::SHA512; 105*e7b1675dSTing-Kang Chang default: 106*e7b1675dSTing-Kang Chang return pb::HashType::UNKNOWN_HASH; 107*e7b1675dSTing-Kang Chang } 108*e7b1675dSTing-Kang Chang } 109*e7b1675dSTing-Kang Chang 110*e7b1675dSTing-Kang Chang // static ProtoToSubtle(pb::HashType type)111*e7b1675dSTing-Kang Changsubtle::HashType Enums::ProtoToSubtle(pb::HashType type) { 112*e7b1675dSTing-Kang Chang switch (type) { 113*e7b1675dSTing-Kang Chang case pb::HashType::SHA1: 114*e7b1675dSTing-Kang Chang return subtle::HashType::SHA1; 115*e7b1675dSTing-Kang Chang case pb::HashType::SHA224: 116*e7b1675dSTing-Kang Chang return subtle::HashType::SHA224; 117*e7b1675dSTing-Kang Chang case pb::HashType::SHA256: 118*e7b1675dSTing-Kang Chang return subtle::HashType::SHA256; 119*e7b1675dSTing-Kang Chang case pb::HashType::SHA384: 120*e7b1675dSTing-Kang Chang return subtle::HashType::SHA384; 121*e7b1675dSTing-Kang Chang case pb::HashType::SHA512: 122*e7b1675dSTing-Kang Chang return subtle::HashType::SHA512; 123*e7b1675dSTing-Kang Chang default: 124*e7b1675dSTing-Kang Chang return subtle::HashType::UNKNOWN_HASH; 125*e7b1675dSTing-Kang Chang } 126*e7b1675dSTing-Kang Chang } 127*e7b1675dSTing-Kang Chang 128*e7b1675dSTing-Kang Chang // static ProtoToSubtle(pb::EcdsaSignatureEncoding encoding)129*e7b1675dSTing-Kang Changsubtle::EcdsaSignatureEncoding Enums::ProtoToSubtle( 130*e7b1675dSTing-Kang Chang pb::EcdsaSignatureEncoding encoding) { 131*e7b1675dSTing-Kang Chang switch (encoding) { 132*e7b1675dSTing-Kang Chang case pb::EcdsaSignatureEncoding::DER: 133*e7b1675dSTing-Kang Chang return subtle::EcdsaSignatureEncoding::DER; 134*e7b1675dSTing-Kang Chang case pb::EcdsaSignatureEncoding::IEEE_P1363: 135*e7b1675dSTing-Kang Chang return subtle::EcdsaSignatureEncoding::IEEE_P1363; 136*e7b1675dSTing-Kang Chang default: 137*e7b1675dSTing-Kang Chang return subtle::EcdsaSignatureEncoding::UNKNOWN_ENCODING; 138*e7b1675dSTing-Kang Chang } 139*e7b1675dSTing-Kang Chang } 140*e7b1675dSTing-Kang Chang 141*e7b1675dSTing-Kang Chang // static SubtleToProto(subtle::EcdsaSignatureEncoding encoding)142*e7b1675dSTing-Kang Changpb::EcdsaSignatureEncoding Enums::SubtleToProto( 143*e7b1675dSTing-Kang Chang subtle::EcdsaSignatureEncoding encoding) { 144*e7b1675dSTing-Kang Chang switch (encoding) { 145*e7b1675dSTing-Kang Chang case subtle::EcdsaSignatureEncoding::DER: 146*e7b1675dSTing-Kang Chang return pb::EcdsaSignatureEncoding::DER; 147*e7b1675dSTing-Kang Chang case subtle::EcdsaSignatureEncoding::IEEE_P1363: 148*e7b1675dSTing-Kang Chang return pb::EcdsaSignatureEncoding::IEEE_P1363; 149*e7b1675dSTing-Kang Chang default: 150*e7b1675dSTing-Kang Chang return pb::EcdsaSignatureEncoding::UNKNOWN_ENCODING; 151*e7b1675dSTing-Kang Chang } 152*e7b1675dSTing-Kang Chang } 153*e7b1675dSTing-Kang Chang 154*e7b1675dSTing-Kang Chang // static KeyStatusName(pb::KeyStatusType key_status_type)155*e7b1675dSTing-Kang Changconst char* Enums::KeyStatusName(pb::KeyStatusType key_status_type) { 156*e7b1675dSTing-Kang Chang switch (key_status_type) { 157*e7b1675dSTing-Kang Chang case pb::KeyStatusType::ENABLED: 158*e7b1675dSTing-Kang Chang return "ENABLED"; 159*e7b1675dSTing-Kang Chang case pb::KeyStatusType::DISABLED: 160*e7b1675dSTing-Kang Chang return "DISABLED"; 161*e7b1675dSTing-Kang Chang case pb::KeyStatusType::DESTROYED: 162*e7b1675dSTing-Kang Chang return "DESTROYED"; 163*e7b1675dSTing-Kang Chang default: 164*e7b1675dSTing-Kang Chang return "UNKNOWN_STATUS"; 165*e7b1675dSTing-Kang Chang } 166*e7b1675dSTing-Kang Chang } 167*e7b1675dSTing-Kang Chang 168*e7b1675dSTing-Kang Chang // static HashName(pb::HashType hash_type)169*e7b1675dSTing-Kang Changconst char* Enums::HashName(pb::HashType hash_type) { 170*e7b1675dSTing-Kang Chang switch (hash_type) { 171*e7b1675dSTing-Kang Chang case pb::HashType::SHA1: 172*e7b1675dSTing-Kang Chang return "SHA1"; 173*e7b1675dSTing-Kang Chang case pb::HashType::SHA224: 174*e7b1675dSTing-Kang Chang return "SHA224"; 175*e7b1675dSTing-Kang Chang case pb::HashType::SHA256: 176*e7b1675dSTing-Kang Chang return "SHA256"; 177*e7b1675dSTing-Kang Chang case pb::HashType::SHA384: 178*e7b1675dSTing-Kang Chang return "SHA384"; 179*e7b1675dSTing-Kang Chang case pb::HashType::SHA512: 180*e7b1675dSTing-Kang Chang return "SHA512"; 181*e7b1675dSTing-Kang Chang default: 182*e7b1675dSTing-Kang Chang return "UNKNOWN_HASH"; 183*e7b1675dSTing-Kang Chang } 184*e7b1675dSTing-Kang Chang } 185*e7b1675dSTing-Kang Chang 186*e7b1675dSTing-Kang Chang // static HashLength(pb::HashType hash_type)187*e7b1675dSTing-Kang Changutil::StatusOr<int> Enums::HashLength(pb::HashType hash_type) { 188*e7b1675dSTing-Kang Chang switch (hash_type) { 189*e7b1675dSTing-Kang Chang case pb::HashType::SHA224: 190*e7b1675dSTing-Kang Chang return 28; 191*e7b1675dSTing-Kang Chang case pb::HashType::SHA256: 192*e7b1675dSTing-Kang Chang return 32; 193*e7b1675dSTing-Kang Chang case pb::HashType::SHA384: 194*e7b1675dSTing-Kang Chang return 48; 195*e7b1675dSTing-Kang Chang case pb::HashType::SHA512: 196*e7b1675dSTing-Kang Chang return 64; 197*e7b1675dSTing-Kang Chang default: 198*e7b1675dSTing-Kang Chang return util::Status(absl::StatusCode::kInvalidArgument, 199*e7b1675dSTing-Kang Chang absl::StrCat("Unsupported hashing algorithm ", 200*e7b1675dSTing-Kang Chang util::Enums::HashName(hash_type))); 201*e7b1675dSTing-Kang Chang } 202*e7b1675dSTing-Kang Chang } 203*e7b1675dSTing-Kang Chang 204*e7b1675dSTing-Kang Chang // static KeyMaterialName(pb::KeyData::KeyMaterialType key_material_type)205*e7b1675dSTing-Kang Changconst char* Enums::KeyMaterialName( 206*e7b1675dSTing-Kang Chang pb::KeyData::KeyMaterialType key_material_type) { 207*e7b1675dSTing-Kang Chang switch (key_material_type) { 208*e7b1675dSTing-Kang Chang case pb::KeyData::SYMMETRIC: 209*e7b1675dSTing-Kang Chang return "SYMMETRIC"; 210*e7b1675dSTing-Kang Chang case pb::KeyData::ASYMMETRIC_PRIVATE: 211*e7b1675dSTing-Kang Chang return "ASYMMETRIC_PRIVATE"; 212*e7b1675dSTing-Kang Chang case pb::KeyData::ASYMMETRIC_PUBLIC: 213*e7b1675dSTing-Kang Chang return "ASYMMETRIC_PUBLIC"; 214*e7b1675dSTing-Kang Chang case pb::KeyData::REMOTE: 215*e7b1675dSTing-Kang Chang return "REMOTE"; 216*e7b1675dSTing-Kang Chang default: 217*e7b1675dSTing-Kang Chang return "UNKNOWN_KEYMATERIAL"; 218*e7b1675dSTing-Kang Chang } 219*e7b1675dSTing-Kang Chang } 220*e7b1675dSTing-Kang Chang 221*e7b1675dSTing-Kang Chang // static OutputPrefixName(pb::OutputPrefixType output_prefix_type)222*e7b1675dSTing-Kang Changconst char* Enums::OutputPrefixName(pb::OutputPrefixType output_prefix_type) { 223*e7b1675dSTing-Kang Chang switch (output_prefix_type) { 224*e7b1675dSTing-Kang Chang case pb::OutputPrefixType::TINK: 225*e7b1675dSTing-Kang Chang return "TINK"; 226*e7b1675dSTing-Kang Chang case pb::OutputPrefixType::LEGACY: 227*e7b1675dSTing-Kang Chang return "LEGACY"; 228*e7b1675dSTing-Kang Chang case pb::OutputPrefixType::RAW: 229*e7b1675dSTing-Kang Chang return "RAW"; 230*e7b1675dSTing-Kang Chang case pb::OutputPrefixType::CRUNCHY: 231*e7b1675dSTing-Kang Chang return "CRUNCHY"; 232*e7b1675dSTing-Kang Chang default: 233*e7b1675dSTing-Kang Chang return "UNKNOWN_PREFIX"; 234*e7b1675dSTing-Kang Chang } 235*e7b1675dSTing-Kang Chang } 236*e7b1675dSTing-Kang Chang 237*e7b1675dSTing-Kang Chang // static KeyStatus(absl::string_view name)238*e7b1675dSTing-Kang Changpb::KeyStatusType Enums::KeyStatus(absl::string_view name) { 239*e7b1675dSTing-Kang Chang if (name == "ENABLED") return pb::KeyStatusType::ENABLED; 240*e7b1675dSTing-Kang Chang if (name == "DISABLED") return pb::KeyStatusType::DISABLED; 241*e7b1675dSTing-Kang Chang if (name == "DESTROYED") return pb::KeyStatusType::DESTROYED; 242*e7b1675dSTing-Kang Chang return pb::KeyStatusType::UNKNOWN_STATUS; 243*e7b1675dSTing-Kang Chang } 244*e7b1675dSTing-Kang Chang 245*e7b1675dSTing-Kang Chang // static Hash(absl::string_view name)246*e7b1675dSTing-Kang Changpb::HashType Enums::Hash(absl::string_view name) { 247*e7b1675dSTing-Kang Chang if (name == "SHA1") return pb::HashType::SHA1; 248*e7b1675dSTing-Kang Chang if (name == "SHA224") return pb::HashType::SHA224; 249*e7b1675dSTing-Kang Chang if (name == "SHA256") return pb::HashType::SHA256; 250*e7b1675dSTing-Kang Chang if (name == "SHA384") return pb::HashType::SHA384; 251*e7b1675dSTing-Kang Chang if (name == "SHA512") return pb::HashType::SHA512; 252*e7b1675dSTing-Kang Chang return pb::HashType::UNKNOWN_HASH; 253*e7b1675dSTing-Kang Chang } 254*e7b1675dSTing-Kang Chang 255*e7b1675dSTing-Kang Chang // static KeyMaterial(absl::string_view name)256*e7b1675dSTing-Kang Changpb::KeyData::KeyMaterialType Enums::KeyMaterial(absl::string_view name) { 257*e7b1675dSTing-Kang Chang if (name == "SYMMETRIC") return pb::KeyData::SYMMETRIC; 258*e7b1675dSTing-Kang Chang if (name == "ASYMMETRIC_PRIVATE") return pb::KeyData::ASYMMETRIC_PRIVATE; 259*e7b1675dSTing-Kang Chang if (name == "ASYMMETRIC_PUBLIC") return pb::KeyData::ASYMMETRIC_PUBLIC; 260*e7b1675dSTing-Kang Chang if (name == "REMOTE") return pb::KeyData::REMOTE; 261*e7b1675dSTing-Kang Chang return pb::KeyData::UNKNOWN_KEYMATERIAL; 262*e7b1675dSTing-Kang Chang } 263*e7b1675dSTing-Kang Chang 264*e7b1675dSTing-Kang Chang // static OutputPrefix(absl::string_view name)265*e7b1675dSTing-Kang Changpb::OutputPrefixType Enums::OutputPrefix(absl::string_view name) { 266*e7b1675dSTing-Kang Chang if (name == "TINK") return pb::OutputPrefixType::TINK; 267*e7b1675dSTing-Kang Chang if (name == "LEGACY") return pb::OutputPrefixType::LEGACY; 268*e7b1675dSTing-Kang Chang if (name == "RAW") return pb::OutputPrefixType::RAW; 269*e7b1675dSTing-Kang Chang if (name == "CRUNCHY") return pb::OutputPrefixType::CRUNCHY; 270*e7b1675dSTing-Kang Chang return pb::OutputPrefixType::UNKNOWN_PREFIX; 271*e7b1675dSTing-Kang Chang } 272*e7b1675dSTing-Kang Chang 273*e7b1675dSTing-Kang Chang } // namespace util 274*e7b1675dSTing-Kang Chang } // namespace tink 275*e7b1675dSTing-Kang Chang } // namespace crypto 276