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