//========================================================================
//
// CertificateInfo.h
//
// This file is licensed under the GPLv2 or later
//
// Copyright 2018 Chinmoy Ranjan Pradhan <chinmoyrp65@gmail.com>
// Copyright 2018 Albert Astals Cid <aacid@kde.org>
// Copyright 2018 Oliver Sander <oliver.sander@tu-dresden.de>
//
//========================================================================

#ifndef CERTIFICATEINFO_H
#define CERTIFICATEINFO_H

#include <memory>
#include <time.h>
#include "goo/GooString.h"

enum CertificateKeyUsageExtension
{
  KU_DIGITAL_SIGNATURE = 0x80,
  KU_NON_REPUDIATION   = 0x40,
  KU_KEY_ENCIPHERMENT  = 0x20,
  KU_DATA_ENCIPHERMENT = 0x10,
  KU_KEY_AGREEMENT     = 0x08,
  KU_KEY_CERT_SIGN     = 0x04,
  KU_CRL_SIGN          = 0x02,
  KU_ENCIPHER_ONLY     = 0x01,
  KU_NONE              = 0x00
};

enum PublicKeyType
{
  RSAKEY,
  DSAKEY,
  ECKEY,
  OTHERKEY
};

class X509CertificateInfo {
public:
  X509CertificateInfo();
  ~X509CertificateInfo();

  struct PublicKeyInfo {
    PublicKeyInfo();

    PublicKeyInfo(PublicKeyInfo &&);
    PublicKeyInfo &operator=(PublicKeyInfo &&);

    PublicKeyInfo(const PublicKeyInfo &) = delete;
    PublicKeyInfo &operator=(const PublicKeyInfo &) = delete;

    GooString publicKey;
    PublicKeyType publicKeyType;
    unsigned int publicKeyStrength; // in bits
  };

  struct EntityInfo {
    EntityInfo();
    ~EntityInfo();

    EntityInfo(EntityInfo &&);
    EntityInfo &operator=(EntityInfo &&);

    EntityInfo(const EntityInfo &) = delete;
    EntityInfo &operator=(const EntityInfo &) = delete;

    std::string commonName;
    std::string distinguishedName;
    std::string email;
    std::string organization;
  };

   struct Validity {
    Validity() : notBefore(0), notAfter(0) {}

    time_t notBefore;
    time_t notAfter;
  };

  /* GETTERS */
  int getVersion() const;
  const GooString &getSerialNumber() const;
  const EntityInfo &getIssuerInfo() const;
  const Validity &getValidity() const;
  const EntityInfo &getSubjectInfo() const;
  const PublicKeyInfo &getPublicKeyInfo() const;
  unsigned int getKeyUsageExtensions() const;
  const GooString &getCertificateDER() const;
  bool getIsSelfSigned() const;

  /* SETTERS */
  void setVersion(int);
  void setSerialNumber(const GooString &);
  void setIssuerInfo(EntityInfo &&);
  void setValidity(Validity);
  void setSubjectInfo(EntityInfo &&);
  void setPublicKeyInfo(PublicKeyInfo &&);
  void setKeyUsageExtensions(unsigned int);
  void setCertificateDER(const GooString &);
  void setIsSelfSigned(bool);

private:
  X509CertificateInfo(const X509CertificateInfo &) = delete;
  X509CertificateInfo& operator=(const X509CertificateInfo &) = delete;

  EntityInfo issuer_info;
  EntityInfo subject_info;
  PublicKeyInfo public_key_info;
  Validity cert_validity;
  GooString cert_serial;
  GooString cert_der;
  unsigned int ku_extensions;
  int cert_version;
  bool is_self_signed;
};

#endif
