15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/child/webcrypto/openssl/sym_key_openssl.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <openssl/rand.h>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/child/webcrypto/crypto_data.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/child/webcrypto/openssl/key_openssl.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/child/webcrypto/status.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "crypto/openssl_util.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace content {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace webcrypto {
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status GenerateSecretKeyOpenSsl(const blink::WebCryptoKeyAlgorithm& algorithm,
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                bool extractable,
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                blink::WebCryptoKeyUsageMask usage_mask,
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                unsigned keylen_bytes,
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                blink::WebCryptoKey* key) {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::vector<unsigned char> random_bytes(keylen_bytes, 0);
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (keylen_bytes > 0) {
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!(RAND_bytes(&random_bytes[0], keylen_bytes)))
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return Status::OperationError();
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  *key =
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      blink::WebCryptoKey::create(new SymKeyOpenSsl(CryptoData(random_bytes)),
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  blink::WebCryptoKeyTypeSecret,
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  extractable,
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  algorithm,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  usage_mask);
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Status::Success();
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status ImportKeyRawOpenSsl(const CryptoData& key_data,
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           const blink::WebCryptoKeyAlgorithm& algorithm,
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           bool extractable,
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           blink::WebCryptoKeyUsageMask usage_mask,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           blink::WebCryptoKey* key) {
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  *key = blink::WebCryptoKey::create(new SymKeyOpenSsl(key_data),
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     blink::WebCryptoKeyTypeSecret,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     extractable,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     algorithm,
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     usage_mask);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Status::Success();
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace webcrypto
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace content
59