123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- =pod
- =head1 NAME
- ASN1_generate_nconf, ASN1_generate_v3 - ASN1 string generation functions
- =head1 SYNOPSIS
- #include <openssl/asn1.h>
- ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf);
- ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf);
- =head1 DESCRIPTION
- These functions generate the ASN1 encoding of a string
- in an B<ASN1_TYPE> structure.
- I<str> contains the string to encode. I<nconf> or I<cnf> contains
- the optional configuration information where additional strings
- will be read from. I<nconf> will typically come from a config
- file whereas I<cnf> is obtained from an B<X509V3_CTX> structure,
- which will typically be used by X509 v3 certificate extension
- functions. I<cnf> or I<nconf> can be set to NULL if no additional
- configuration will be used.
- =head1 GENERATION STRING FORMAT
- The actual data encoded is determined by the string I<str> and
- the configuration information. The general format of the string
- is:
- =over 4
- =item [I<modifier>,]I<type>[:I<value>]
- =back
- That is zero or more comma separated modifiers followed by a type
- followed by an optional colon and a value. The formats of I<type>,
- I<value> and I<modifier> are explained below.
- =head2 Supported Types
- The supported types are listed below.
- Case is not significant in the type names.
- Unless otherwise specified only the B<ASCII> format is permissible.
- =over 4
- =item B<BOOLEAN>, B<BOOL>
- This encodes a boolean type. The I<value> string is mandatory and
- should be B<TRUE> or B<FALSE>. Additionally B<TRUE>, B<true>, B<Y>,
- B<y>, B<YES>, B<yes>, B<FALSE>, B<false>, B<N>, B<n>, B<NO> and B<no>
- are acceptable.
- =item B<NULL>
- Encode the B<NULL> type, the I<value> string must not be present.
- =item B<INTEGER>, B<INT>
- Encodes an ASN1 B<INTEGER> type. The I<value> string represents
- the value of the integer, it can be prefaced by a minus sign and
- is normally interpreted as a decimal value unless the prefix B<0x>
- is included.
- =item B<ENUMERATED>, B<ENUM>
- Encodes the ASN1 B<ENUMERATED> type, it is otherwise identical to
- B<INTEGER>.
- =item B<OBJECT>, B<OID>
- Encodes an ASN1 B<OBJECT IDENTIFIER>, the I<value> string can be
- a short name, a long name or numerical format.
- =item B<UTCTIME>, B<UTC>
- Encodes an ASN1 B<UTCTime> structure, the value should be in
- the format B<YYMMDDHHMMSSZ>.
- =item B<GENERALIZEDTIME>, B<GENTIME>
- Encodes an ASN1 B<GeneralizedTime> structure, the value should be in
- the format B<YYYYMMDDHHMMSSZ>.
- =item B<OCTETSTRING>, B<OCT>
- Encodes an ASN1 B<OCTET STRING>. I<value> represents the contents
- of this structure, the format strings B<ASCII> and B<HEX> can be
- used to specify the format of I<value>.
- =item B<BITSTRING>, B<BITSTR>
- Encodes an ASN1 B<BIT STRING>. I<value> represents the contents
- of this structure, the format strings B<ASCII>, B<HEX> and B<BITLIST>
- can be used to specify the format of I<value>.
- If the format is anything other than B<BITLIST> the number of unused
- bits is set to zero.
- =item B<UNIVERSALSTRING>, B<UNIV>, B<IA5>, B<IA5STRING>, B<UTF8>,
- B<UTF8String>, B<BMP>, B<BMPSTRING>, B<VISIBLESTRING>,
- B<VISIBLE>, B<PRINTABLESTRING>, B<PRINTABLE>, B<T61>,
- B<T61STRING>, B<TELETEXSTRING>, B<GeneralString>, B<NUMERICSTRING>,
- B<NUMERIC>
- These encode the corresponding string types. I<value> represents the
- contents of this structure. The format can be B<ASCII> or B<UTF8>.
- =item B<SEQUENCE>, B<SEQ>, B<SET>
- Formats the result as an ASN1 B<SEQUENCE> or B<SET> type. I<value>
- should be a section name which will contain the contents. The
- field names in the section are ignored and the values are in the
- generated string format. If I<value> is absent then an empty SEQUENCE
- will be encoded.
- =back
- =head2 Modifiers
- Modifiers affect the following structure, they can be used to
- add EXPLICIT or IMPLICIT tagging, add wrappers or to change
- the string format of the final type and value. The supported
- formats are documented below.
- =over 4
- =item B<EXPLICIT>, B<EXP>
- Add an explicit tag to the following structure. This string
- should be followed by a colon and the tag value to use as a
- decimal value.
- By following the number with B<U>, B<A>, B<P> or B<C> UNIVERSAL,
- APPLICATION, PRIVATE or CONTEXT SPECIFIC tagging can be used,
- the default is CONTEXT SPECIFIC.
- =item B<IMPLICIT>, B<IMP>
- This is the same as B<EXPLICIT> except IMPLICIT tagging is used
- instead.
- =item B<OCTWRAP>, B<SEQWRAP>, B<SETWRAP>, B<BITWRAP>
- The following structure is surrounded by an OCTET STRING, a SEQUENCE,
- a SET or a BIT STRING respectively. For a BIT STRING the number of unused
- bits is set to zero.
- =item B<FORMAT>
- This specifies the format of the ultimate value. It should be followed
- by a colon and one of the strings B<ASCII>, B<UTF8>, B<HEX> or B<BITLIST>.
- If no format specifier is included then B<ASCII> is used. If B<UTF8> is
- specified then the value string must be a valid B<UTF8> string. For B<HEX> the
- output must be a set of hex digits. B<BITLIST> (which is only valid for a BIT
- STRING) is a comma separated list of the indices of the set bits, all other
- bits are zero.
- =back
- =head1 RETURN VALUES
- ASN1_generate_nconf() and ASN1_generate_v3() return the encoded
- data as an B<ASN1_TYPE> structure or NULL if an error occurred.
- The error codes that can be obtained by L<ERR_get_error(3)>.
- =head1 EXAMPLES
- A simple IA5String:
- IA5STRING:Hello World
- An IA5String explicitly tagged:
- EXPLICIT:0,IA5STRING:Hello World
- An IA5String explicitly tagged using APPLICATION tagging:
- EXPLICIT:0A,IA5STRING:Hello World
- A BITSTRING with bits 1 and 5 set and all others zero:
- FORMAT:BITLIST,BITSTRING:1,5
- A more complex example using a config file to produce a
- SEQUENCE consisting of a BOOL an OID and a UTF8String:
- asn1 = SEQUENCE:seq_section
- [seq_section]
- field1 = BOOLEAN:TRUE
- field2 = OID:commonName
- field3 = UTF8:Third field
- This example produces an RSAPrivateKey structure, this is the
- key contained in the file client.pem in all OpenSSL distributions
- (note: the field names such as 'coeff' are ignored and are present just
- for clarity):
- asn1=SEQUENCE:private_key
- [private_key]
- version=INTEGER:0
- n=INTEGER:0xBB6FE79432CC6EA2D8F970675A5A87BFBE1AFF0BE63E879F2AFFB93644\
- D4D2C6D000430DEC66ABF47829E74B8C5108623A1C0EE8BE217B3AD8D36D5EB4FCA1D9
- e=INTEGER:0x010001
- d=INTEGER:0x6F05EAD2F27FFAEC84BEC360C4B928FD5F3A9865D0FCAAD291E2A52F4A\
- F810DC6373278C006A0ABBA27DC8C63BF97F7E666E27C5284D7D3B1FFFE16B7A87B51D
- p=INTEGER:0xF3929B9435608F8A22C208D86795271D54EBDFB09DDEF539AB083DA912\
- D4BD57
- q=INTEGER:0xC50016F89DFF2561347ED1186A46E150E28BF2D0F539A1594BBD7FE467\
- 46EC4F
- exp1=INTEGER:0x9E7D4326C924AFC1DEA40B45650134966D6F9DFA3A7F9D698CD4ABEA\
- 9C0A39B9
- exp2=INTEGER:0xBA84003BB95355AFB7C50DF140C60513D0BA51D637272E355E397779\
- E7B2458F
- coeff=INTEGER:0x30B9E4F2AFA5AC679F920FC83F1F2DF1BAF1779CF989447FABC2F5\
- 628657053A
- This example is the corresponding public key in a SubjectPublicKeyInfo
- structure:
- # Start with a SEQUENCE
- asn1=SEQUENCE:pubkeyinfo
- # pubkeyinfo contains an algorithm identifier and the public key wrapped
- # in a BIT STRING
- [pubkeyinfo]
- algorithm=SEQUENCE:rsa_alg
- pubkey=BITWRAP,SEQUENCE:rsapubkey
- # algorithm ID for RSA is just an OID and a NULL
- [rsa_alg]
- algorithm=OID:rsaEncryption
- parameter=NULL
- # Actual public key: modulus and exponent
- [rsapubkey]
- n=INTEGER:0xBB6FE79432CC6EA2D8F970675A5A87BFBE1AFF0BE63E879F2AFFB93644\
- D4D2C6D000430DEC66ABF47829E74B8C5108623A1C0EE8BE217B3AD8D36D5EB4FCA1D9
- e=INTEGER:0x010001
- =head1 SEE ALSO
- L<ERR_get_error(3)>
- =head1 COPYRIGHT
- Copyright 2002-2021 The OpenSSL Project Authors. All Rights Reserved.
- Licensed under the Apache License 2.0 (the "License"). You may not use
- this file except in compliance with the License. You can obtain a copy
- in the file LICENSE in the source distribution or at
- L<https://www.openssl.org/source/license.html>.
- =cut
|