1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/public/web/web_crypto_histograms.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/web_crypto_algorithm.h"
#include "third_party/blink/public/platform/web_crypto_algorithm_params.h"
#include "third_party/blink/public/platform/web_crypto_key_algorithm.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
#include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
namespace blink {
static WebFeature AlgorithmIdToFeature(WebCryptoAlgorithmId id) {
switch (id) {
case kWebCryptoAlgorithmIdAesCbc:
return WebFeature::kCryptoAlgorithmAesCbc;
case kWebCryptoAlgorithmIdHmac:
return WebFeature::kCryptoAlgorithmHmac;
case kWebCryptoAlgorithmIdRsaSsaPkcs1v1_5:
return WebFeature::kCryptoAlgorithmRsaSsaPkcs1v1_5;
case kWebCryptoAlgorithmIdSha1:
return WebFeature::kCryptoAlgorithmSha1;
case kWebCryptoAlgorithmIdSha256:
return WebFeature::kCryptoAlgorithmSha256;
case kWebCryptoAlgorithmIdSha384:
return WebFeature::kCryptoAlgorithmSha384;
case kWebCryptoAlgorithmIdSha512:
return WebFeature::kCryptoAlgorithmSha512;
case kWebCryptoAlgorithmIdAesGcm:
return WebFeature::kCryptoAlgorithmAesGcm;
case kWebCryptoAlgorithmIdRsaOaep:
return WebFeature::kCryptoAlgorithmRsaOaep;
case kWebCryptoAlgorithmIdAesCtr:
return WebFeature::kCryptoAlgorithmAesCtr;
case kWebCryptoAlgorithmIdAesKw:
return WebFeature::kCryptoAlgorithmAesKw;
case kWebCryptoAlgorithmIdRsaPss:
return WebFeature::kCryptoAlgorithmRsaPss;
case kWebCryptoAlgorithmIdEcdsa:
return WebFeature::kCryptoAlgorithmEcdsa;
case kWebCryptoAlgorithmIdEcdh:
return WebFeature::kCryptoAlgorithmEcdh;
case kWebCryptoAlgorithmIdHkdf:
return WebFeature::kCryptoAlgorithmHkdf;
case kWebCryptoAlgorithmIdPbkdf2:
return WebFeature::kCryptoAlgorithmPbkdf2;
case kWebCryptoAlgorithmIdEd25519:
return WebFeature::kCryptoAlgorithmEd25519;
case kWebCryptoAlgorithmIdX25519:
return WebFeature::kCryptoAlgorithmX25519;
}
NOTREACHED();
}
static void HistogramAlgorithmId(ExecutionContext* context,
WebCryptoAlgorithmId algorithm_id) {
WebFeature feature = AlgorithmIdToFeature(algorithm_id);
if (static_cast<bool>(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 kWebCryptoAlgorithmParamsTypeHmacImportParams:
HistogramAlgorithm(context, algorithm.HmacImportParams()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypeHmacKeyGenParams:
HistogramAlgorithm(context, algorithm.HmacKeyGenParams()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams:
HistogramAlgorithm(context, algorithm.RsaHashedKeyGenParams()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypeRsaHashedImportParams:
HistogramAlgorithm(context, algorithm.RsaHashedImportParams()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypeEcdsaParams:
HistogramAlgorithm(context, algorithm.EcdsaParams()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypeHkdfParams:
HistogramAlgorithm(context, algorithm.HkdfParams()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypePbkdf2Params:
HistogramAlgorithm(context, algorithm.Pbkdf2Params()->GetHash());
break;
case kWebCryptoAlgorithmParamsTypeEcdhKeyDeriveParams:
case kWebCryptoAlgorithmParamsTypeNone:
case kWebCryptoAlgorithmParamsTypeAesCbcParams:
case kWebCryptoAlgorithmParamsTypeAesGcmParams:
case kWebCryptoAlgorithmParamsTypeAesKeyGenParams:
case kWebCryptoAlgorithmParamsTypeRsaOaepParams:
case kWebCryptoAlgorithmParamsTypeAesCtrParams:
case kWebCryptoAlgorithmParamsTypeRsaPssParams:
case kWebCryptoAlgorithmParamsTypeEcKeyGenParams:
case kWebCryptoAlgorithmParamsTypeEcKeyImportParams:
case kWebCryptoAlgorithmParamsTypeAesDerivedKeyParams:
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 kWebCryptoKeyAlgorithmParamsTypeHmac:
HistogramAlgorithm(context, algorithm.HmacParams()->GetHash());
break;
case kWebCryptoKeyAlgorithmParamsTypeRsaHashed:
HistogramAlgorithm(context, algorithm.RsaHashedParams()->GetHash());
break;
case kWebCryptoKeyAlgorithmParamsTypeNone:
case kWebCryptoKeyAlgorithmParamsTypeAes:
case kWebCryptoKeyAlgorithmParamsTypeEc:
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);
}
void HistogramDeriveBitsTruncation(ExecutionContext* context,
std::optional<unsigned int> length_bits,
WebCryptoWarningType status) {
if (length_bits == 0) {
UseCounter::Count(context, WebFeature::kSubtleCryptoDeriveBitsZeroLength);
} else if (status == blink::kWebCryptoWarningTypeDeriveBitsTruncated) {
UseCounter::Count(context, WebFeature::kSubtleCryptoDeriveBitsTruncation);
}
}
} // namespace blink
|