/*
 * Copyright(C) 2003 Проект ИОК
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто Про.
 */

/*!
 * \file $RCSfile: CA_CMP_CRL.h,v $
 * \version $Revision: 1.18 $
 * \date $Date: 2005/01/24 12:36:43 $
 * \author $Author: cav $
 *
 * \brief Определения для СОС
 */

#ifndef CA_CMP_CRL_H
#define CA_CMP_CRL_H

#include "CA_CMP_Types.h"

enum CrlReason {
    CRLREASON_UNSPECIFIED = 0,
    CRLREASON_KEYCOMPROMISE = 1, 
    CRLREASON_CACOMPROMISE = 2, 
    CRLREASON_AFFILIATIONCHANGED = 3,
    CRLREASON_SUPERSEDED = 4, 
    CRLREASON_CESSATIONOFOPERATION = 5, 
    CRLREASON_CERTIFICATEHOLD = 6, 
    CRLREASON_REMOVEFROMCRL = 8,
    CRLREASON_PRIVILEDGEWITHDRAWN = 9,
    CRLREASON_AACOMPROMISE = 10
};

enum HoldInstruction {
    HOLDINSTRUCTION_UNSPECIFIED = 0,
    HOLDINSTRUCTION_NONE = 1,
    HOLDINSTRUCTION_CALLISSUER = 2,
    HOLDINSTRUCTION_REJECT = 3
};

std::string CrlReason_toString( CrlReason r );
CrlReason CrlReason_fromString( const char* );
HoldInstruction HoldInstruction_fromString( const char* );
HoldInstruction HoldInstruction_fromOid( const char* );

class CrlInfoItem
{
public:
    CrlInfoItem() {*SerialNumber = 0;}
    CrlInfoItem( const CrlInfoItem &item ) { assign( item ); }
    CrlInfoItem( const char* Serial, const CACMPT_Date Date = CACMPT_Date() );
    ~CrlInfoItem() {}
    CrlInfoItem& operator =( const CrlInfoItem &right )
    { assign( right ); return *this; }
    bool operator ==( const CrlInfoItem &right ) const
    { return !strcmp( SerialNumber, right.SerialNumber ); }

    // Получение CrlReason из extenion
    // возвращает CRLREASON_UNSPECIFIED, если Extension отсутствует
    CrlReason GetReason() const;
    // Установка CrlReason в extenion
    // При CRLREASON_UNSPECIFIED Extension удаляется
    void SetReason( CrlReason );

    // Получение HoldInstruction из extenion
    // возвращает HOLDINSTRUCTION_UNSPECIFIED, если Extension отсутствует
    HoldInstruction GetHoldInstruction() const;
    // Установка HoldInstruction в extenion
    // При HOLDINSTRUCTION_UNSPECIFIED Extension удаляется
    void SetHoldInstruction( HoldInstruction );

    // Получение InvalidityDate из extenion
    // возвращает CACMPT_Date(), если Extension отсутствует
    CACMPT_Date GetInvalidityDate() const;
    // Установка InvalidityDate в extenion
    // При invalidity_date == CACMPT_Date() Extension удаляется
    void SetInvalidityDate( const CACMPT_Date &invalidity_date );

    // Дата отзыва
    CACMPT_Date RevokedWhen;

    // Серийный номер
    CACMPT_SERIAL SerialNumber;

    // extensions
    CACMPT_Extensions Extensions;

protected:
    void assign( const CrlInfoItem &right );
};

class CrlInfo : public std::list<CrlInfoItem>
{
public:
    CrlInfo();
    ~CrlInfo() {}

    CrlInfo( const CrlInfo& crl ): std::list<CrlInfoItem>()
    {
	*this = crl;
    }
    CrlInfo& operator=( const CrlInfo& crl );
    void clear();

    // binary blob
    CACMPT_BLOB RawCRL;

    // thisUpdate
    CACMPT_Date ThisUpdate;

    // nextUpdate
    CACMPT_Date NextUpdate;

    // Use ThisUpdate & NextUpdate
    bool UseUpdate;

    // Строка - ASN1T_AlgorithmIdentifier signatureAlgorithm;
    char CrlSignatureAlgorithm[ 254 ];

    // dim: в Стандарте чудно используются
    int Status;
    int RequestID;

    CACMPT_PARSED_RDN issuerRDN;

    // Идентификатор ключа субъекта
    CACMPT_BLOB SubjectKeyIdentifier;

    // Идентификатор ключа издателя
    CACMPT_BLOB AuthorityKeyIdentifier;

    // extensions
    CACMPT_Extensions Extensions;
};
#endif // CA_CMP_CRL_H
