blob: ee7c60220ad933dd0987f4e1411ae451891ca179 [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#ifndef NDN_SECURITY_VALIDITY_PERIOD_HPP
#define NDN_SECURITY_VALIDITY_PERIOD_HPP
#include "../common.hpp"
#include "../encoding/tlv.hpp"
#include "../encoding/block.hpp"
#include "../util/time.hpp"
namespace ndn {
namespace security {
/** @brief Abstraction of validity period
* @sa docs/tutorials/certificate-format.rst
*/
class ValidityPeriod
{
public:
class Error : public tlv::Error
{
public:
using tlv::Error::Error;
};
public:
/** @brief Set validity period [UNIX epoch + 1 nanosecond, UNIX epoch] that is always invalid
*/
ValidityPeriod();
/** @brief Create validity period from @p block
*/
explicit
ValidityPeriod(const Block& block);
/** @brief Create validity period [@p notBefore, @p notAfter]
* @param notBefore exclusive beginning of the validity period range
* @param notAfter exclusive end of the validity period range
*
* @note The supplied time points will be rounded up to the whole seconds:
* - @p notBefore is rounded up the next whole second
* - @p notAfter is truncated to the previous whole second
*/
ValidityPeriod(const time::system_clock::TimePoint& notBefore,
const time::system_clock::TimePoint& notAfter);
/** @brief Check if @p now falls within the validity period
* @param now Time point to check if it falls within the period
* @return periodBegin <= @p now and @p now <= periodEnd
*/
bool
isValid(const time::system_clock::TimePoint& now = time::system_clock::now()) const;
/** @brief Set validity period [@p notBefore, @p notAfter]
* @param notBefore exclusive beginning of the validity period range
* @param notAfter exclusive end of the validity period range
*
* @note The supplied time points will be rounded up to the whole seconds:
* - @p notBefore is rounded up the next whole second
* - @p notAfter is truncated to the previous whole second
*/
ValidityPeriod&
setPeriod(const time::system_clock::TimePoint& notBefore,
const time::system_clock::TimePoint& notAfter);
/** @brief Get the stored validity period
*/
std::pair<time::system_clock::TimePoint, time::system_clock::TimePoint>
getPeriod() const;
/** @brief Fast encoding or block size estimation
*/
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<TAG>& encoder) const;
/** @brief Encode ValidityPeriod into TLV block
*/
const Block&
wireEncode() const;
/** @brief Decode ValidityPeriod from TLV block
* @throw Error when an invalid TLV block supplied
*/
void
wireDecode(const Block& wire);
public: // EqualityComparable concept
bool
operator==(const ValidityPeriod& other) const;
bool
operator!=(const ValidityPeriod& other) const;
private:
typedef boost::chrono::time_point<time::system_clock, time::seconds> TimePoint;
TimePoint m_notBefore;
TimePoint m_notAfter;
mutable Block m_wire;
};
NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(ValidityPeriod);
std::ostream&
operator<<(std::ostream& os, const ValidityPeriod& period);
} // namespace security
} // namespace ndn
#endif // NDN_SECURITY_VALIDITY_PERIOD_HPP