1 // Copyright (c) 2013 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.
5 #ifndef NET_QUIC_CRYPTO_AEAD_BASE_ENCRYPTER_H_
6 #define NET_QUIC_CRYPTO_AEAD_BASE_ENCRYPTER_H_
8 #include "base/compiler_specific.h"
9 #include "net/quic/crypto/quic_encrypter.h"
11 #if defined(USE_OPENSSL)
12 #include "net/quic/crypto/scoped_evp_aead_ctx.h"
16 typedef struct PK11SymKeyStr PK11SymKey
;
17 typedef SECStatus (*PK11_EncryptFunction
)(
18 PK11SymKey
* symKey
, CK_MECHANISM_TYPE mechanism
, SECItem
* param
,
19 unsigned char* out
, unsigned int* outLen
, unsigned int maxLen
,
20 const unsigned char* data
, unsigned int dataLen
);
25 // AeadBaseEncrypter is the base class of AEAD QuicEncrypter subclasses.
26 class NET_EXPORT_PRIVATE AeadBaseEncrypter
: public QuicEncrypter
{
28 #if defined(USE_OPENSSL)
29 AeadBaseEncrypter(const EVP_AEAD
* aead_alg
,
32 size_t nonce_prefix_size
);
34 AeadBaseEncrypter(CK_MECHANISM_TYPE aead_mechanism
,
35 PK11_EncryptFunction pk11_encrypt
,
38 size_t nonce_prefix_size
);
40 virtual ~AeadBaseEncrypter();
42 // QuicEncrypter implementation
43 virtual bool SetKey(base::StringPiece key
) OVERRIDE
;
44 virtual bool SetNoncePrefix(base::StringPiece nonce_prefix
) OVERRIDE
;
45 virtual bool Encrypt(base::StringPiece nonce
,
46 base::StringPiece associated_data
,
47 base::StringPiece plaintext
,
48 unsigned char* output
) OVERRIDE
;
49 virtual QuicData
* EncryptPacket(QuicPacketSequenceNumber sequence_number
,
50 base::StringPiece associated_data
,
51 base::StringPiece plaintext
) OVERRIDE
;
52 virtual size_t GetKeySize() const OVERRIDE
;
53 virtual size_t GetNoncePrefixSize() const OVERRIDE
;
54 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size
) const OVERRIDE
;
55 virtual size_t GetCiphertextSize(size_t plaintext_size
) const OVERRIDE
;
56 virtual base::StringPiece
GetKey() const OVERRIDE
;
57 virtual base::StringPiece
GetNoncePrefix() const OVERRIDE
;
60 // Make these constants available to the subclasses so that the subclasses
61 // can assert at compile time their key_size_ and nonce_prefix_size_ do not
62 // exceed the maximum.
63 static const size_t kMaxKeySize
= 32;
64 static const size_t kMaxNoncePrefixSize
= 4;
66 #if !defined(USE_OPENSSL)
70 CK_GCM_PARAMS gcm_params
;
72 // USE_NSS means we are using system NSS rather than our copy of NSS.
73 // The system NSS <pkcs11n.h> header doesn't define this type yet.
74 CK_NSS_AEAD_PARAMS nss_aead_params
;
79 virtual void FillAeadParams(base::StringPiece nonce
,
80 base::StringPiece associated_data
,
82 AeadParams
* aead_params
) const = 0;
86 #if defined(USE_OPENSSL)
87 const EVP_AEAD
* const aead_alg_
;
89 const CK_MECHANISM_TYPE aead_mechanism_
;
90 const PK11_EncryptFunction pk11_encrypt_
;
92 const size_t key_size_
;
93 const size_t auth_tag_size_
;
94 const size_t nonce_prefix_size_
;
97 unsigned char key_
[kMaxKeySize
];
99 unsigned char nonce_prefix_
[kMaxNoncePrefixSize
];
101 #if defined(USE_OPENSSL)
102 ScopedEVPAEADCtx ctx_
;
105 DISALLOW_COPY_AND_ASSIGN(AeadBaseEncrypter
);
110 #endif // NET_QUIC_CRYPTO_AEAD_BASE_ENCRYPTER_H_