blob: feb7827165a8269d3f4a664b9a01c502b626643b [file] [log] [blame]
Yingdi Yu87516612015-07-10 18:03:52 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento8aad3722017-09-16 20:57:28 -04002/*
Davide Pesavento794f6872017-05-15 23:33:38 -04003 * Copyright (c) 2013-2017 Regents of the University of California.
Yingdi Yu87516612015-07-10 18:03:52 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#ifndef NDN_CXX_SECURITY_TRANSFORM_BLOCK_CIPHER_HPP
23#define NDN_CXX_SECURITY_TRANSFORM_BLOCK_CIPHER_HPP
24
25#include "transform-base.hpp"
26#include "../security-common.hpp"
27
28namespace ndn {
29namespace security {
30namespace transform {
31
32/**
33 * @brief The module to encrypt data using block cipher.
34 *
Davide Pesaventoeaa93f42017-09-17 00:21:00 -040035 * The padding scheme of the block cipher is set to the OpenSSL default,
Yingdi Yu87516612015-07-10 18:03:52 -070036 * which is PKCS padding.
37 */
38class BlockCipher : public Transform
39{
40public:
41 /**
42 * @brief Create a block cipher
43 *
Davide Pesaventoeaa93f42017-09-17 00:21:00 -040044 * @param algo The block cipher algorithm to use.
45 * @param op Whether to encrypt or decrypt.
46 * @param key Pointer to the key.
47 * @param keyLen Size of the key.
48 * @param iv Pointer to the initialization vector.
49 * @param ivLen Length of the initialization vector.
Yingdi Yu87516612015-07-10 18:03:52 -070050 */
51 BlockCipher(BlockCipherAlgorithm algo, CipherOperator op,
52 const uint8_t* key, size_t keyLen,
53 const uint8_t* iv, size_t ivLen);
54
Davide Pesavento8aad3722017-09-16 20:57:28 -040055 ~BlockCipher();
56
Yingdi Yu87516612015-07-10 18:03:52 -070057private:
58 /**
59 * @brief Read partial transformation result (if exists) from BIO
60 */
Davide Pesavento57c07df2016-12-11 18:41:45 -050061 void
Yingdi Yu87516612015-07-10 18:03:52 -070062 preTransform() final;
63
64 /**
65 * @brief Write @p data into the cipher
66 *
67 * @return number of bytes that are actually accepted
68 */
Davide Pesavento57c07df2016-12-11 18:41:45 -050069 size_t
Yingdi Yu87516612015-07-10 18:03:52 -070070 convert(const uint8_t* data, size_t dataLen) final;
71
72 /**
73 * @brief Finalize the encryption
74 */
Davide Pesavento57c07df2016-12-11 18:41:45 -050075 void
Yingdi Yu87516612015-07-10 18:03:52 -070076 finalize() final;
77
78 /**
79 * @brief Fill output buffer with the encryption result from BIO.
80 */
81 void
82 fillOutputBuffer();
83
84 /**
85 * @return true if the cipher does not have partial result.
86 */
87 bool
88 isConverterEmpty() const;
89
90private:
Yingdi Yu87516612015-07-10 18:03:52 -070091 void
92 initializeAesCbc(const uint8_t* key, size_t keyLen,
Davide Pesaventoeaa93f42017-09-17 00:21:00 -040093 const uint8_t* iv, size_t ivLen, CipherOperator op);
Yingdi Yu87516612015-07-10 18:03:52 -070094
95private:
96 class Impl;
Davide Pesavento794f6872017-05-15 23:33:38 -040097 const unique_ptr<Impl> m_impl;
Yingdi Yu87516612015-07-10 18:03:52 -070098};
99
100unique_ptr<Transform>
101blockCipher(BlockCipherAlgorithm algo, CipherOperator op,
102 const uint8_t* key, size_t keyLen,
103 const uint8_t* iv, size_t ivLen);
104
105} // namespace transform
106} // namespace security
107} // namespace ndn
108
109#endif // NDN_CXX_SECURITY_TRANSFORM_BLOCK_CIPHER_HPP