// Common, group Crypto
// Copyright Alexander Liss
#include "certificate.h"
#include "wirepack.h" // need its special functions
#include "datacoder.h"
#include "array2.h"
#include "encoding.h"
// Certificate
int Certificate::pack(CommBuffer& z)const
{
int g=0;
if(z.encoding==Encoding::wire)
{
WirePacker p(z);
g=p.put_tail(size(),size_bytes);
if(g) return 1;
for(int i=0;i<size();++i)
{
if(!g) g=p.put(operator[](i),unit_size_bytes);
}
}
else
{
g=::pack(z,static_cast<SimpleArray<CertificateUnit> >(*this));
}
return g;
}
int Certificate::unpack(const CommBuffer& z,ReadControl& c)
{
int g=0;
if(z.encoding==Encoding::wire)
{
WirePacker p(z,c);
int size=0;
g=p.get_tail(size,size_bytes);
if(!g) g=set_size(size);
if(g) return 1;
for(int i=0;i<size;++i)
{
if(!g) g=p.get(operator[](i),unit_size_bytes);
}
}
else
{
g=::unpack(static_cast<SimpleArray<CertificateUnit> >(*this),z,c);
}
return g;
}
// OpenCertificateUnit
int OpenCertificateUnit::pack(CommBuffer& d)const
{
int g=::pack(d,data);
if(!g) g=::pack(d,pub_key);
if(!g) g=::pack(d,assured);
return g;
}
int OpenCertificateUnit::unpack(const CommBuffer& s,ReadControl& c)
{
int g=::unpack(data,s,c);
if(!g) g=::unpack(pub_key,s,c);
if(!g) g=::unpack(assured,s,c);
return g;
}