1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/quic/crypto/chacha20_poly1305_decrypter.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <pk11pub.h>
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using base::StringPiece;
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace net {
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const size_t kKeySize = 32;
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const size_t kNoncePrefixSize = 0;
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(USE_NSS)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// System NSS doesn't support ChaCha20+Poly1305 yet.
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChaCha20Poly1305Decrypter::ChaCha20Poly1305Decrypter()
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : AeadBaseDecrypter(CKM_INVALID_MECHANISM, NULL, kKeySize,
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        kAuthTagSize, kNoncePrefixSize) {
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTIMPLEMENTED();
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChaCha20Poly1305Decrypter::~ChaCha20Poly1305Decrypter() {}
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ChaCha20Poly1305Decrypter::IsSupported() {
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChaCha20Poly1305Decrypter::FillAeadParams(StringPiece nonce,
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               StringPiece associated_data,
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               size_t auth_tag_size,
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               AeadParams* aead_params) const {
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTIMPLEMENTED();
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else  // defined(USE_NSS)
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChaCha20Poly1305Decrypter::ChaCha20Poly1305Decrypter()
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : AeadBaseDecrypter(CKM_NSS_CHACHA20_POLY1305, PK11_Decrypt, kKeySize,
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        kAuthTagSize, kNoncePrefixSize) {
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  COMPILE_ASSERT(kKeySize <= kMaxKeySize, key_size_too_big);
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  COMPILE_ASSERT(kNoncePrefixSize <= kMaxNoncePrefixSize,
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 nonce_prefix_size_too_big);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChaCha20Poly1305Decrypter::~ChaCha20Poly1305Decrypter() {}
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ChaCha20Poly1305Decrypter::IsSupported() {
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return true;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChaCha20Poly1305Decrypter::FillAeadParams(StringPiece nonce,
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               StringPiece associated_data,
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               size_t auth_tag_size,
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               AeadParams* aead_params) const {
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  aead_params->len = sizeof(aead_params->data.nss_aead_params);
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CK_NSS_AEAD_PARAMS* nss_aead_params = &aead_params->data.nss_aead_params;
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  nss_aead_params->pIv =
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      reinterpret_cast<CK_BYTE*>(const_cast<char*>(nonce.data()));
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  nss_aead_params->ulIvLen = nonce.size();
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  nss_aead_params->pAAD =
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      reinterpret_cast<CK_BYTE*>(const_cast<char*>(associated_data.data()));
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  nss_aead_params->ulAADLen = associated_data.size();
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  nss_aead_params->ulTagLen = auth_tag_size;
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(USE_NSS)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace net
81