| Index: components/webcrypto/algorithms/secret_key_util.cc
|
| diff --git a/components/webcrypto/algorithms/secret_key_util.cc b/components/webcrypto/algorithms/secret_key_util.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e20144b5297a9e632b584b47937341a2447cc55
|
| --- /dev/null
|
| +++ b/components/webcrypto/algorithms/secret_key_util.cc
|
| @@ -0,0 +1,84 @@
|
| +// 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 "components/webcrypto/algorithms/secret_key_util.h"
|
| +
|
| +#include <openssl/rand.h>
|
| +
|
| +#include "base/stl_util.h"
|
| +#include "components/webcrypto/crypto_data.h"
|
| +#include "components/webcrypto/generate_key_result.h"
|
| +#include "components/webcrypto/jwk.h"
|
| +#include "components/webcrypto/key.h"
|
| +#include "components/webcrypto/status.h"
|
| +#include "components/webcrypto/webcrypto_util.h"
|
| +#include "crypto/openssl_util.h"
|
| +
|
| +namespace webcrypto {
|
| +
|
| +Status GenerateWebCryptoSecretKey(const blink::WebCryptoKeyAlgorithm& algorithm,
|
| + bool extractable,
|
| + blink::WebCryptoKeyUsageMask usages,
|
| + unsigned int keylen_bits,
|
| + GenerateKeyResult* result) {
|
| + crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
|
| +
|
| + unsigned int keylen_bytes = NumBitsToBytes(keylen_bits);
|
| + std::vector<unsigned char> random_bytes(keylen_bytes, 0);
|
| +
|
| + if (keylen_bytes > 0) {
|
| + if (!RAND_bytes(vector_as_array(&random_bytes), keylen_bytes))
|
| + return Status::OperationError();
|
| + TruncateToBitLength(keylen_bits, &random_bytes);
|
| + }
|
| +
|
| + result->AssignSecretKey(blink::WebCryptoKey::create(
|
| + CreateSymmetricKeyHandle(CryptoData(random_bytes)),
|
| + blink::WebCryptoKeyTypeSecret, extractable, algorithm, usages));
|
| +
|
| + return Status::Success();
|
| +}
|
| +
|
| +Status CreateWebCryptoSecretKey(const CryptoData& key_data,
|
| + const blink::WebCryptoKeyAlgorithm& algorithm,
|
| + bool extractable,
|
| + blink::WebCryptoKeyUsageMask usages,
|
| + blink::WebCryptoKey* key) {
|
| + *key = blink::WebCryptoKey::create(CreateSymmetricKeyHandle(key_data),
|
| + blink::WebCryptoKeyTypeSecret, extractable,
|
| + algorithm, usages);
|
| + return Status::Success();
|
| +}
|
| +
|
| +void WriteSecretKeyJwk(const CryptoData& raw_key_data,
|
| + const std::string& algorithm,
|
| + bool extractable,
|
| + blink::WebCryptoKeyUsageMask usages,
|
| + std::vector<uint8_t>* jwk_key_data) {
|
| + JwkWriter writer(algorithm, extractable, usages, "oct");
|
| + writer.SetBytes("k", raw_key_data);
|
| + writer.ToJson(jwk_key_data);
|
| +}
|
| +
|
| +Status ReadSecretKeyNoExpectedAlgJwk(
|
| + const CryptoData& key_data,
|
| + bool expected_extractable,
|
| + blink::WebCryptoKeyUsageMask expected_usages,
|
| + std::vector<uint8_t>* raw_key_data,
|
| + JwkReader* jwk) {
|
| + Status status = jwk->Init(key_data, expected_extractable, expected_usages,
|
| + "oct", std::string());
|
| + if (status.IsError())
|
| + return status;
|
| +
|
| + std::string jwk_k_value;
|
| + status = jwk->GetBytes("k", &jwk_k_value);
|
| + if (status.IsError())
|
| + return status;
|
| + raw_key_data->assign(jwk_k_value.begin(), jwk_k_value.end());
|
| +
|
| + return Status::Success();
|
| +}
|
| +
|
| +} // namespace webcrypto
|
|
|