Annotation of embedaddon/strongswan/src/libstrongswan/utils/identification.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2009-2015 Tobias Brunner
        !             3:  * Copyright (C) 2005-2009 Martin Willi
        !             4:  * Copyright (C) 2005 Jan Hutter
        !             5:  * HSR Hochschule fuer Technik Rapperswil
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or modify it
        !             8:  * under the terms of the GNU General Public License as published by the
        !             9:  * Free Software Foundation; either version 2 of the License, or (at your
        !            10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            15:  * for more details.
        !            16:  */
        !            17: 
        !            18: /**
        !            19:  * @defgroup identification identification
        !            20:  * @{ @ingroup utils
        !            21:  */
        !            22: 
        !            23: 
        !            24: #ifndef IDENTIFICATION_H_
        !            25: #define IDENTIFICATION_H_
        !            26: 
        !            27: typedef enum id_type_t id_type_t;
        !            28: typedef struct identification_t identification_t;
        !            29: typedef enum id_match_t id_match_t;
        !            30: typedef enum id_part_t id_part_t;
        !            31: 
        !            32: #include <utils/chunk.h>
        !            33: #include <collections/enumerator.h>
        !            34: 
        !            35: /**
        !            36:  * Matches returned from identification_t.match
        !            37:  */
        !            38: enum id_match_t {
        !            39:        /* no match */
        !            40:        ID_MATCH_NONE = 0,
        !            41:        /* match to %any ID */
        !            42:        ID_MATCH_ANY = 1,
        !            43:        /* match with maximum allowed wildcards */
        !            44:        ID_MATCH_MAX_WILDCARDS = 2,
        !            45:        /* match with only one wildcard */
        !            46:        ID_MATCH_ONE_WILDCARD = 19,
        !            47:        /* perfect match, won't get better */
        !            48:        ID_MATCH_PERFECT = 20,
        !            49: };
        !            50: 
        !            51: /**
        !            52:  * enum names for id_match_t.
        !            53:  */
        !            54: extern enum_name_t *id_match_names;
        !            55: 
        !            56: /**
        !            57:  * ID Types in a ID payload.
        !            58:  */
        !            59: enum id_type_t {
        !            60: 
        !            61:        /**
        !            62:         * private type which matches any other id.
        !            63:         */
        !            64:        ID_ANY = 0,
        !            65: 
        !            66:        /**
        !            67:         * ID data is a single four (4) octet IPv4 address.
        !            68:         */
        !            69:        ID_IPV4_ADDR = 1,
        !            70: 
        !            71:        /**
        !            72:         * ID data is a fully-qualified domain name string.
        !            73:         * An example of a ID_FQDN is "example.com".
        !            74:         * The string MUST not contain any terminators (e.g., NULL, CR, etc.).
        !            75:         */
        !            76:        ID_FQDN = 2,
        !            77: 
        !            78:        /**
        !            79:         * ID data is a fully-qualified RFC822 email address string.
        !            80:         * An example of an ID_RFC822_ADDR is "jsmith@example.com".
        !            81:         * The string MUST NOT contain any terminators.
        !            82:         */
        !            83:        ID_USER_FQDN   = 3,     /* IKEv1 only */
        !            84:        ID_RFC822_ADDR = 3,     /* IKEv2 only */
        !            85: 
        !            86:        /**
        !            87:         * ID data is an IPv4 subnet (IKEv1 only)
        !            88:         */
        !            89:        ID_IPV4_ADDR_SUBNET = 4,
        !            90: 
        !            91:        /**
        !            92:         * ID data is a single sixteen (16) octet IPv6 address.
        !            93:         */
        !            94:        ID_IPV6_ADDR = 5,
        !            95: 
        !            96:        /**
        !            97:         * ID data is an IPv6 subnet (IKEv1 only)
        !            98:         */
        !            99:        ID_IPV6_ADDR_SUBNET = 6,
        !           100: 
        !           101:        /**
        !           102:         * ID data is an IPv4 address range (IKEv1 only)
        !           103:         */
        !           104:        ID_IPV4_ADDR_RANGE = 7,
        !           105: 
        !           106:        /**
        !           107:         * ID data is an IPv6 address range (IKEv1 only)
        !           108:         */
        !           109:        ID_IPV6_ADDR_RANGE = 8,
        !           110: 
        !           111:        /**
        !           112:         * ID data is the binary DER encoding of an ASN.1 X.501 Distinguished Name
        !           113:         */
        !           114:        ID_DER_ASN1_DN = 9,
        !           115: 
        !           116:        /**
        !           117:         * ID data is the binary DER encoding of an ASN.1 X.509 GeneralName
        !           118:         */
        !           119:        ID_DER_ASN1_GN = 10,
        !           120: 
        !           121:        /**
        !           122:         * ID data is an opaque octet stream which may be used to pass vendor-
        !           123:         * specific information necessary to do certain proprietary
        !           124:         * types of identification.
        !           125:         */
        !           126:        ID_KEY_ID = 11,
        !           127: 
        !           128:        /**
        !           129:         * Private ID type which represents a GeneralName of type URI
        !           130:         */
        !           131:        ID_DER_ASN1_GN_URI = 201,
        !           132: };
        !           133: 
        !           134: /**
        !           135:  * enum names for id_type_t.
        !           136:  */
        !           137: extern enum_name_t *id_type_names;
        !           138: 
        !           139: /**
        !           140:  * Type of an ID sub part.
        !           141:  */
        !           142: enum id_part_t {
        !           143:        /** Username part of an RFC822_ADDR */
        !           144:        ID_PART_USERNAME,
        !           145:        /** Domain part of an RFC822_ADDR */
        !           146:        ID_PART_DOMAIN,
        !           147: 
        !           148:        /** Top-Level domain of a FQDN */
        !           149:        ID_PART_TLD,
        !           150:        /** Second-Level domain of a FQDN */
        !           151:        ID_PART_SLD,
        !           152:        /** Another Level domain of a FQDN */
        !           153:        ID_PART_ALD,
        !           154: 
        !           155:        /** Country RDN of a DN */
        !           156:        ID_PART_RDN_C,
        !           157:        /** CommonName RDN of a DN */
        !           158:        ID_PART_RDN_CN,
        !           159:        /** Description RDN of a DN */
        !           160:        ID_PART_RDN_D,
        !           161:        /** Email RDN of a DN */
        !           162:        ID_PART_RDN_E,
        !           163:        /** EmployeeNumber RDN of a DN */
        !           164:        ID_PART_RDN_EN,
        !           165:        /** GivenName RDN of a DN */
        !           166:        ID_PART_RDN_G,
        !           167:        /** Initials RDN of a DN */
        !           168:        ID_PART_RDN_I,
        !           169:        /** DN Qualifier RDN of a DN */
        !           170:        ID_PART_RDN_DNQ,
        !           171:        /** dmdName RDN of a DN */
        !           172:        ID_PART_RDN_DMDN,
        !           173:        /** Pseudonym RDN of a DN */
        !           174:        ID_PART_RDN_PN,
        !           175:        /** UniqueIdentifier RDN of a DN */
        !           176:        ID_PART_RDN_ID,
        !           177:        /** Locality RDN of a DN */
        !           178:        ID_PART_RDN_L,
        !           179:        /** Name RDN of a DN */
        !           180:        ID_PART_RDN_N,
        !           181:        /** Organization RDN of a DN */
        !           182:        ID_PART_RDN_O,
        !           183:        /** OrganizationUnit RDN of a DN */
        !           184:        ID_PART_RDN_OU,
        !           185:        /** Surname RDN of a DN */
        !           186:        ID_PART_RDN_S,
        !           187:        /** SerialNumber RDN of a DN */
        !           188:        ID_PART_RDN_SN,
        !           189:        /** StateOrProvince RDN of a DN */
        !           190:        ID_PART_RDN_ST,
        !           191:        /** Title RDN of a DN */
        !           192:        ID_PART_RDN_T,
        !           193: };
        !           194: 
        !           195: /**
        !           196:  * Generic identification, such as used in ID payload.
        !           197:  *
        !           198:  * @todo Support for ID_DER_ASN1_GN is minimal right now. Comparison
        !           199:  * between them and ID_IPV4_ADDR/RFC822_ADDR would be nice.
        !           200:  */
        !           201: struct identification_t {
        !           202: 
        !           203:        /**
        !           204:         * Get the encoding of this id, to send over
        !           205:         * the network.
        !           206:         *
        !           207:         * Result points to internal data, do not free.
        !           208:         *
        !           209:         * @return                      a chunk containing the encoded bytes
        !           210:         */
        !           211:        chunk_t (*get_encoding) (identification_t *this);
        !           212: 
        !           213:        /**
        !           214:         * Get the type of this identification.
        !           215:         *
        !           216:         * @return                      id_type_t
        !           217:         */
        !           218:        id_type_t (*get_type) (identification_t *this);
        !           219: 
        !           220:        /**
        !           221:         * Create a hash value for this identification_t object.
        !           222:         *
        !           223:         * @param inc           optional value for incremental hashing
        !           224:         * @return                      hash value
        !           225:         */
        !           226:        u_int (*hash) (identification_t *this, u_int inc);
        !           227: 
        !           228:        /**
        !           229:         * Check if two identification_t objects are equal.
        !           230:         *
        !           231:         * @param other         other identification_t object
        !           232:         * @return                      TRUE if the IDs are equal
        !           233:         */
        !           234:        bool (*equals) (identification_t *this, identification_t *other);
        !           235: 
        !           236:        /**
        !           237:         * Check if an ID matches a wildcard ID.
        !           238:         *
        !           239:         * An identification_t may contain wildcards, such as
        !           240:         * *.strongswan.org. This call checks if a given ID
        !           241:         * (e.g. tester.strongswan.org) belongs to a such wildcard
        !           242:         * ID. Returns > 0 if
        !           243:         * - IDs are identical
        !           244:         * - other is of type ID_ANY
        !           245:         * - other contains a wildcard and matches this
        !           246:         *
        !           247:         * The larger the return value is, the better is the match. Zero means
        !           248:         * no match at all, 1 means a bad match, and 2 a slightly better match.
        !           249:         *
        !           250:         * @param other         the ID containing one or more wildcards
        !           251:         * @return                      match value as described above
        !           252:         */
        !           253:        id_match_t (*matches) (identification_t *this, identification_t *other);
        !           254: 
        !           255:        /**
        !           256:         * Check if an ID is a wildcard ID.
        !           257:         *
        !           258:         * If the ID represents multiple IDs (with wildcards, or
        !           259:         * as the type ID_ANY), TRUE is returned. If it is unique,
        !           260:         * FALSE is returned.
        !           261:         *
        !           262:         * @return                      TRUE if ID contains wildcards
        !           263:         */
        !           264:        bool (*contains_wildcards) (identification_t *this);
        !           265: 
        !           266:        /**
        !           267:         * Create an enumerator over subparts of an identity.
        !           268:         *
        !           269:         * Some identities are built from several parts, e.g. an E-Mail consists
        !           270:         * of a username and a domain part, or a DistinguishedName contains several
        !           271:         * RDNs.
        !           272:         * For identity without subtypes (support), an empty enumerator is
        !           273:         * returned.
        !           274:         *
        !           275:         * @return                      an enumerator over (id_part_t type, chunk_t data)
        !           276:         */
        !           277:        enumerator_t* (*create_part_enumerator)(identification_t *this);
        !           278: 
        !           279:        /**
        !           280:         * Clone a identification_t instance.
        !           281:         *
        !           282:         * @return                      clone of this
        !           283:         */
        !           284:        identification_t *(*clone) (identification_t *this);
        !           285: 
        !           286:        /**
        !           287:         * Destroys a identification_t object.
        !           288:         */
        !           289:        void (*destroy) (identification_t *this);
        !           290: };
        !           291: 
        !           292: /**
        !           293:  * Creates an identification_t object from a string.
        !           294:  *
        !           295:  * The input string may be e.g. one of the following:
        !           296:  * - ID_IPV4_ADDR:             192.168.0.1
        !           297:  * - ID_IPV6_ADDR:             2001:0db8:85a3:08d3:1319:8a2e:0370:7345
        !           298:  * - ID_FQDN:                  www.strongswan.org (optionally with a prepended @)
        !           299:  * - ID_RFC822_ADDR:   alice@wonderland.org
        !           300:  * - ID_DER_ASN1_DN:   C=CH, O=Linux strongSwan, CN=bob
        !           301:  *
        !           302:  * In favour of pluto, domainnames are prepended with an @, since
        !           303:  * pluto resolves domainnames without an @ to IPv4 addresses. Since
        !           304:  * we use a separate host_t class for addresses, this doesn't
        !           305:  * make sense for us.
        !           306:  *
        !           307:  * A distinguished name may contain one or more of the following RDNs:
        !           308:  * ND, UID, DC, CN, S, SN, serialNumber, C, L, ST, O, OU, T, D,
        !           309:  * N, G, I, dnQualifier, ID, EN, EmployeeNumber, E, Email, emailAddress, UN,
        !           310:  * unstructuredName, TCGID.
        !           311:  *
        !           312:  * To skip automatic type detection the following prefixes may be used to
        !           313:  * enforce a specific type: ipv4:, ipv6:, rfc822:, email:, userfqdn:, fqdn:,
        !           314:  * dns:, asn1dn:, asn1gn: and keyid:. If a # follows the :, the remaining data
        !           315:  * is interpreted as hex encoded binary data for that ID, otherwise the raw
        !           316:  * string following the prefix is used as identity data, without conversion.
        !           317:  * To specify a non-standard ID type, the numerical type may be prefixed
        !           318:  * between curly brackets, building a prefix. For instance the "{1}:" prefix
        !           319:  * defines an ID_IPV4_ADDR type.
        !           320:  *
        !           321:  * This constructor never returns NULL. If it does not find a suitable
        !           322:  * conversion function, it will copy the string to an ID_KEY_ID.
        !           323:  *
        !           324:  * @param string       input string, which will be converted
        !           325:  * @return                     identification_t
        !           326:  */
        !           327: identification_t * identification_create_from_string(char *string);
        !           328: 
        !           329: /**
        !           330:  * Creates an identification from a chunk of data, guessing its type.
        !           331:  *
        !           332:  * @param data         identification data
        !           333:  * @return                     identification_t
        !           334:  */
        !           335: identification_t * identification_create_from_data(chunk_t data);
        !           336: 
        !           337: /**
        !           338:  * Creates an identification_t object from an encoded chunk.
        !           339:  *
        !           340:  * @param type         type of this id, such as ID_IPV4_ADDR
        !           341:  * @param encoded      encoded bytes, such as from identification_t.get_encoding
        !           342:  * @return                     identification_t
        !           343:  */
        !           344: identification_t * identification_create_from_encoding(id_type_t type, chunk_t encoded);
        !           345: 
        !           346: /**
        !           347:  * Creates an identification_t object from a sockaddr struct
        !           348:  *
        !           349:  * @param sockaddr             sockaddr struct which contains family and address
        !           350:  * @return                             identification_t
        !           351:  */
        !           352: identification_t * identification_create_from_sockaddr(sockaddr_t *sockaddr);
        !           353: 
        !           354: /**
        !           355:  * printf hook function for identification_t.
        !           356:  *
        !           357:  * Arguments are:
        !           358:  *     identification_t *identification
        !           359:  */
        !           360: int identification_printf_hook(printf_hook_data_t *data,
        !           361:                                                        printf_hook_spec_t *spec, const void *const *args);
        !           362: 
        !           363: #endif /** IDENTIFICATION_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>