| // 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<UseCounter::Feature>(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 |