1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/child/webcrypto/openssl/sym_key_openssl.h"
6
7#include <vector>
8#include <openssl/rand.h>
9
10#include "content/child/webcrypto/crypto_data.h"
11#include "content/child/webcrypto/openssl/key_openssl.h"
12#include "content/child/webcrypto/status.h"
13#include "crypto/openssl_util.h"
14#include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h"
15
16namespace content {
17
18namespace webcrypto {
19
20Status GenerateSecretKeyOpenSsl(const blink::WebCryptoKeyAlgorithm& algorithm,
21                                bool extractable,
22                                blink::WebCryptoKeyUsageMask usage_mask,
23                                unsigned keylen_bytes,
24                                blink::WebCryptoKey* key) {
25  crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
26
27  std::vector<unsigned char> random_bytes(keylen_bytes, 0);
28
29  if (keylen_bytes > 0) {
30    if (!(RAND_bytes(&random_bytes[0], keylen_bytes)))
31      return Status::OperationError();
32  }
33
34  *key =
35      blink::WebCryptoKey::create(new SymKeyOpenSsl(CryptoData(random_bytes)),
36                                  blink::WebCryptoKeyTypeSecret,
37                                  extractable,
38                                  algorithm,
39                                  usage_mask);
40  return Status::Success();
41}
42
43Status ImportKeyRawOpenSsl(const CryptoData& key_data,
44                           const blink::WebCryptoKeyAlgorithm& algorithm,
45                           bool extractable,
46                           blink::WebCryptoKeyUsageMask usage_mask,
47                           blink::WebCryptoKey* key) {
48  *key = blink::WebCryptoKey::create(new SymKeyOpenSsl(key_data),
49                                     blink::WebCryptoKeyTypeSecret,
50                                     extractable,
51                                     algorithm,
52                                     usage_mask);
53  return Status::Success();
54}
55
56}  // namespace webcrypto
57
58}  // namespace content
59