aboutsummaryrefslogtreecommitdiffstats
path: root/src/cert/cvc/cvc_ca.cpp
blob: 19b35e07435f923fcaa65c4b44537e26a138c83f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <botan/cvc_ca.h>
#include <botan/cvc_cert.h>
#include <botan/der_enc.h>
#include <botan/util.h>
#include <botan/oids.h>
namespace Botan {

    EAC1_1_CVC EAC1_1_CVC_CA::make_cert(
                                        std::auto_ptr<PK_Signer> signer,
                                        MemoryRegion<byte> const& public_key,
                                        ASN1_Car const& car,
                                        ASN1_Chr const& chr,
                                        byte holder_auth_templ,
                                        ASN1_Ced ced,
                                        ASN1_Cex cex
                                       )
    {
        OID chat_oid(OIDS::lookup("CertificateHolderAuthorizationTemplate"));
        MemoryVector<byte> enc_chat_val;
        enc_chat_val.append(holder_auth_templ);

        MemoryVector<byte> enc_cpi;
        enc_cpi.append(0x00);
                           MemoryVector<byte> tbs = DER_Encoder()
                                    .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) // cpi
                                    .encode(car)
                                    .raw_bytes(public_key)
                                    .encode(chr)
                                    .start_cons(ASN1_Tag(76), APPLICATION)
                                        .encode(chat_oid)
                                        .encode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION)
                                    .end_cons()
                                    .encode(ced)
                                    .encode(cex)
                            .get_contents();

                           MemoryVector<byte> signed_cert = EAC1_1_CVC::make_signed(signer, EAC1_1_CVC::build_cert_body(tbs));
        std::tr1::shared_ptr<DataSource> source(new DataSource_Memory(signed_cert));
        return EAC1_1_CVC(source);
    }

}