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 "net/quic/crypto/chacha20_poly1305_encrypter.h" 6 7 #include <pk11pub.h> 8 9 #include "base/logging.h" 10 11 using base::StringPiece; 12 13 namespace net { 14 15 namespace { 16 17 const size_t kKeySize = 32; 18 const size_t kNoncePrefixSize = 0; 19 20 } // namespace 21 22 #if defined(USE_NSS) 23 24 // System NSS doesn't support ChaCha20+Poly1305 yet. 25 26 ChaCha20Poly1305Encrypter::ChaCha20Poly1305Encrypter() 27 : AeadBaseEncrypter(CKM_INVALID_MECHANISM, NULL, kKeySize, 28 kAuthTagSize, kNoncePrefixSize) { 29 NOTIMPLEMENTED(); 30 } 31 32 ChaCha20Poly1305Encrypter::~ChaCha20Poly1305Encrypter() {} 33 34 // static 35 bool ChaCha20Poly1305Encrypter::IsSupported() { 36 return false; 37 } 38 39 void ChaCha20Poly1305Encrypter::FillAeadParams(StringPiece nonce, 40 StringPiece associated_data, 41 size_t auth_tag_size, 42 AeadParams* aead_params) const { 43 NOTIMPLEMENTED(); 44 } 45 46 #else // defined(USE_NSS) 47 48 ChaCha20Poly1305Encrypter::ChaCha20Poly1305Encrypter() 49 : AeadBaseEncrypter(CKM_NSS_CHACHA20_POLY1305, PK11_Encrypt, kKeySize, 50 kAuthTagSize, kNoncePrefixSize) { 51 COMPILE_ASSERT(kKeySize <= kMaxKeySize, key_size_too_big); 52 COMPILE_ASSERT(kNoncePrefixSize <= kMaxNoncePrefixSize, 53 nonce_prefix_size_too_big); 54 } 55 56 ChaCha20Poly1305Encrypter::~ChaCha20Poly1305Encrypter() {} 57 58 // static 59 bool ChaCha20Poly1305Encrypter::IsSupported() { 60 return true; 61 } 62 63 void ChaCha20Poly1305Encrypter::FillAeadParams(StringPiece nonce, 64 StringPiece associated_data, 65 size_t auth_tag_size, 66 AeadParams* aead_params) const { 67 aead_params->len = sizeof(aead_params->data.nss_aead_params); 68 CK_NSS_AEAD_PARAMS* nss_aead_params = &aead_params->data.nss_aead_params; 69 nss_aead_params->pIv = 70 reinterpret_cast<CK_BYTE*>(const_cast<char*>(nonce.data())); 71 nss_aead_params->ulIvLen = nonce.size(); 72 nss_aead_params->pAAD = 73 reinterpret_cast<CK_BYTE*>(const_cast<char*>(associated_data.data())); 74 nss_aead_params->ulAADLen = associated_data.size(); 75 nss_aead_params->ulTagLen = auth_tag_size; 76 } 77 78 #endif // defined(USE_NSS) 79 80 } // namespace net 81