xref: /src/crypto/openssl/include/internal/der.h (revision f25b8c9fb4f58cf61adb47d7570abe7caa6d385d)
1e4520c8bSEnji Cooper /*
2e4520c8bSEnji Cooper  * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
3e4520c8bSEnji Cooper  *
4e4520c8bSEnji Cooper  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e4520c8bSEnji Cooper  * this file except in compliance with the License.  You can obtain a copy
6e4520c8bSEnji Cooper  * in the file LICENSE in the source distribution or at
7e4520c8bSEnji Cooper  * https://www.openssl.org/source/license.html
8e4520c8bSEnji Cooper  */
9e4520c8bSEnji Cooper 
1029536654SEnji Cooper #ifndef OSSL_INTERNAL_DER_H
1129536654SEnji Cooper #define OSSL_INTERNAL_DER_H
1229536654SEnji Cooper #pragma once
1329536654SEnji Cooper 
14e4520c8bSEnji Cooper #include <openssl/bn.h>
15e4520c8bSEnji Cooper #include "internal/packet.h"
16e4520c8bSEnji Cooper 
17e4520c8bSEnji Cooper /*
18e4520c8bSEnji Cooper  * NOTE: X.690 numbers the identifier octet bits 1 to 8.
19e4520c8bSEnji Cooper  * We use the same numbering in comments here.
20e4520c8bSEnji Cooper  */
21e4520c8bSEnji Cooper 
22e4520c8bSEnji Cooper /* Well known primitive tags */
23e4520c8bSEnji Cooper 
24e4520c8bSEnji Cooper /*
25e4520c8bSEnji Cooper  * DER UNIVERSAL tags, occupying bits 1-5 in the DER identifier byte
26e4520c8bSEnji Cooper  * These are only valid for the UNIVERSAL class.  With the other classes,
27e4520c8bSEnji Cooper  * these bits have a different meaning.
28e4520c8bSEnji Cooper  */
29e4520c8bSEnji Cooper #define DER_P_EOC 0 /* BER End Of Contents tag */
30e4520c8bSEnji Cooper #define DER_P_BOOLEAN 1
31e4520c8bSEnji Cooper #define DER_P_INTEGER 2
32e4520c8bSEnji Cooper #define DER_P_BIT_STRING 3
33e4520c8bSEnji Cooper #define DER_P_OCTET_STRING 4
34e4520c8bSEnji Cooper #define DER_P_NULL 5
35e4520c8bSEnji Cooper #define DER_P_OBJECT 6
36e4520c8bSEnji Cooper #define DER_P_OBJECT_DESCRIPTOR 7
37e4520c8bSEnji Cooper #define DER_P_EXTERNAL 8
38e4520c8bSEnji Cooper #define DER_P_REAL 9
39e4520c8bSEnji Cooper #define DER_P_ENUMERATED 10
40e4520c8bSEnji Cooper #define DER_P_UTF8STRING 12
41e4520c8bSEnji Cooper #define DER_P_SEQUENCE 16
42e4520c8bSEnji Cooper #define DER_P_SET 17
43e4520c8bSEnji Cooper #define DER_P_NUMERICSTRING 18
44e4520c8bSEnji Cooper #define DER_P_PRINTABLESTRING 19
45e4520c8bSEnji Cooper #define DER_P_T61STRING 20
46e4520c8bSEnji Cooper #define DER_P_VIDEOTEXSTRING 21
47e4520c8bSEnji Cooper #define DER_P_IA5STRING 22
48e4520c8bSEnji Cooper #define DER_P_UTCTIME 23
49e4520c8bSEnji Cooper #define DER_P_GENERALIZEDTIME 24
50e4520c8bSEnji Cooper #define DER_P_GRAPHICSTRING 25
51e4520c8bSEnji Cooper #define DER_P_ISO64STRING 26
52e4520c8bSEnji Cooper #define DER_P_GENERALSTRING 27
53e4520c8bSEnji Cooper #define DER_P_UNIVERSALSTRING 28
54e4520c8bSEnji Cooper #define DER_P_BMPSTRING 30
55e4520c8bSEnji Cooper 
56e4520c8bSEnji Cooper /* DER Flags, occupying bit 6 in the DER identifier byte */
57e4520c8bSEnji Cooper #define DER_F_PRIMITIVE 0x00
58e4520c8bSEnji Cooper #define DER_F_CONSTRUCTED 0x20
59e4520c8bSEnji Cooper 
60e4520c8bSEnji Cooper /* DER classes tags, occupying bits 7-8 in the DER identifier byte */
61e4520c8bSEnji Cooper #define DER_C_UNIVERSAL 0x00
62e4520c8bSEnji Cooper #define DER_C_APPLICATION 0x40
63e4520c8bSEnji Cooper #define DER_C_CONTEXT 0x80
64e4520c8bSEnji Cooper #define DER_C_PRIVATE 0xC0
65e4520c8bSEnji Cooper 
66e4520c8bSEnji Cooper /*
67e4520c8bSEnji Cooper  * Run-time constructors.
68e4520c8bSEnji Cooper  *
69e4520c8bSEnji Cooper  * They all construct DER backwards, so care should be taken to use them
70e4520c8bSEnji Cooper  * that way.
71e4520c8bSEnji Cooper  */
72e4520c8bSEnji Cooper 
73e4520c8bSEnji Cooper /* This can be used for all items that don't have a context */
74e4520c8bSEnji Cooper #define DER_NO_CONTEXT -1
75e4520c8bSEnji Cooper 
76e4520c8bSEnji Cooper int ossl_DER_w_precompiled(WPACKET *pkt, int tag,
77e4520c8bSEnji Cooper     const unsigned char *precompiled,
78e4520c8bSEnji Cooper     size_t precompiled_n);
79e4520c8bSEnji Cooper 
80e4520c8bSEnji Cooper int ossl_DER_w_boolean(WPACKET *pkt, int tag, int b);
81e4520c8bSEnji Cooper int ossl_DER_w_uint32(WPACKET *pkt, int tag, uint32_t v);
82e4520c8bSEnji Cooper int ossl_DER_w_bn(WPACKET *pkt, int tag, const BIGNUM *v);
83e4520c8bSEnji Cooper int ossl_DER_w_null(WPACKET *pkt, int tag);
84e4520c8bSEnji Cooper int ossl_DER_w_octet_string(WPACKET *pkt, int tag,
85e4520c8bSEnji Cooper     const unsigned char *data, size_t data_n);
86e4520c8bSEnji Cooper int ossl_DER_w_octet_string_uint32(WPACKET *pkt, int tag, uint32_t value);
87e4520c8bSEnji Cooper 
88e4520c8bSEnji Cooper /*
89e4520c8bSEnji Cooper  * All constructors for constructed elements have a begin and a end function
90e4520c8bSEnji Cooper  */
91e4520c8bSEnji Cooper int ossl_DER_w_begin_sequence(WPACKET *pkt, int tag);
92e4520c8bSEnji Cooper int ossl_DER_w_end_sequence(WPACKET *pkt, int tag);
9329536654SEnji Cooper 
9429536654SEnji Cooper #endif
95