// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "modules/crypto/CryptoHistograms.h" #include "core/frame/UseCounter.h" #include "public/platform/Platform.h" #include "public/platform/WebCryptoAlgorithm.h" #include "public/platform/WebCryptoAlgorithmParams.h" #include "public/platform/WebCryptoKeyAlgorithm.h" namespace blink { static UseCounter::Feature algorithmIdToFeature(WebCryptoAlgorithmId id) { switch (id) { case WebCryptoAlgorithmIdAesCbc: return UseCounter::CryptoAlgorithmAesCbc; case WebCryptoAlgorithmIdHmac: return UseCounter::CryptoAlgorithmHmac; case WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: return UseCounter::CryptoAlgorithmRsaSsaPkcs1v1_5; case WebCryptoAlgorithmIdSha1: return UseCounter::CryptoAlgorithmSha1; case WebCryptoAlgorithmIdSha256: return UseCounter::CryptoAlgorithmSha256; case WebCryptoAlgorithmIdSha384: return UseCounter::CryptoAlgorithmSha384; case WebCryptoAlgorithmIdSha512: return UseCounter::CryptoAlgorithmSha512; case WebCryptoAlgorithmIdAesGcm: return UseCounter::CryptoAlgorithmAesGcm; case WebCryptoAlgorithmIdRsaOaep: return UseCounter::CryptoAlgorithmRsaOaep; case WebCryptoAlgorithmIdAesCtr: return UseCounter::CryptoAlgorithmAesCtr; case WebCryptoAlgorithmIdAesKw: return UseCounter::CryptoAlgorithmAesKw; case WebCryptoAlgorithmIdRsaPss: return UseCounter::CryptoAlgorithmRsaPss; case WebCryptoAlgorithmIdEcdsa: return UseCounter::CryptoAlgorithmEcdsa; case WebCryptoAlgorithmIdEcdh: return UseCounter::CryptoAlgorithmEcdh; case WebCryptoAlgorithmIdHkdf: return UseCounter::CryptoAlgorithmHkdf; case WebCryptoAlgorithmIdPbkdf2: return UseCounter::CryptoAlgorithmPbkdf2; } ASSERT_NOT_REACHED(); return static_cast(0); } static void histogramAlgorithmId(ExecutionContext* context, WebCryptoAlgorithmId algorithmId) { UseCounter::Feature feature = algorithmIdToFeature(algorithmId); if (feature) UseCounter::count(context, feature); } void histogramAlgorithm(ExecutionContext* context, const WebCryptoAlgorithm& algorithm) { histogramAlgorithmId(context, algorithm.id()); // Histogram any interesting parameters for the algorithm. For instance // the inner hash for algorithms which include one (HMAC, RSA-PSS, etc) switch (algorithm.paramsType()) { case WebCryptoAlgorithmParamsTypeHmacImportParams: histogramAlgorithm(context, algorithm.hmacImportParams()->hash()); break; case WebCryptoAlgorithmParamsTypeHmacKeyGenParams: histogramAlgorithm(context, algorithm.hmacKeyGenParams()->hash()); break; case WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams: histogramAlgorithm(context, algorithm.rsaHashedKeyGenParams()->hash()); break; case WebCryptoAlgorithmParamsTypeRsaHashedImportParams: histogramAlgorithm(context, algorithm.rsaHashedImportParams()->hash()); break; case WebCryptoAlgorithmParamsTypeEcdsaParams: histogramAlgorithm(context, algorithm.ecdsaParams()->hash()); break; case WebCryptoAlgorithmParamsTypeHkdfParams: histogramAlgorithm(context, algorithm.hkdfParams()->hash()); break; case WebCryptoAlgorithmParamsTypePbkdf2Params: histogramAlgorithm(context, algorithm.pbkdf2Params()->hash()); break; case WebCryptoAlgorithmParamsTypeEcdhKeyDeriveParams: case WebCryptoAlgorithmParamsTypeNone: case WebCryptoAlgorithmParamsTypeAesCbcParams: case WebCryptoAlgorithmParamsTypeAesGcmParams: case WebCryptoAlgorithmParamsTypeAesKeyGenParams: case WebCryptoAlgorithmParamsTypeRsaOaepParams: case WebCryptoAlgorithmParamsTypeAesCtrParams: case WebCryptoAlgorithmParamsTypeRsaPssParams: case WebCryptoAlgorithmParamsTypeEcKeyGenParams: case WebCryptoAlgorithmParamsTypeEcKeyImportParams: case WebCryptoAlgorithmParamsTypeAesDerivedKeyParams: break; } } void histogramKey(ExecutionContext* context, const WebCryptoKey& key) { const WebCryptoKeyAlgorithm& algorithm = key.algorithm(); histogramAlgorithmId(context, algorithm.id()); // Histogram any interesting parameters that are attached to the key. For // instance the inner hash being used for HMAC. switch (algorithm.paramsType()) { case WebCryptoKeyAlgorithmParamsTypeHmac: histogramAlgorithm(context, algorithm.hmacParams()->hash()); break; case WebCryptoKeyAlgorithmParamsTypeRsaHashed: histogramAlgorithm(context, algorithm.rsaHashedParams()->hash()); break; case WebCryptoKeyAlgorithmParamsTypeNone: case WebCryptoKeyAlgorithmParamsTypeAes: case WebCryptoKeyAlgorithmParamsTypeEc: break; } } void histogramAlgorithmAndKey(ExecutionContext* context, const WebCryptoAlgorithm& algorithm, const WebCryptoKey& key) { // Note that the algorithm ID for |algorithm| and |key| will usually be the // same. This is OK because UseCounter only increments things once per the // context. histogramAlgorithm(context, algorithm); histogramKey(context, key); } } // namespace blink