// 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;
}