// 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
