diff options
Diffstat (limited to 'shared/ossp_uuid/uuid.pod')
-rw-r--r-- | shared/ossp_uuid/uuid.pod | 529 |
1 files changed, 529 insertions, 0 deletions
diff --git a/shared/ossp_uuid/uuid.pod b/shared/ossp_uuid/uuid.pod new file mode 100644 index 00000000..4ad3742b --- /dev/null +++ b/shared/ossp_uuid/uuid.pod @@ -0,0 +1,529 @@ +## +## OSSP uuid - Universally Unique Identifier +## Copyright (c) 2004-2008 Ralf S. Engelschall <rse@engelschall.com> +## Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> +## +## This file is part of OSSP uuid, a library for the generation +## of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/ +## +## Permission to use, copy, modify, and distribute this software for +## any purpose with or without fee is hereby granted, provided that +## the above copyright notice and this permission notice appear in all +## copies. +## +## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +## SUCH DAMAGE. +## +## uuid.pod: manual page +## + +=pod + +=head1 NAME + +B<OSSP uuid> - B<Universally Unique Identifier> + +=head1 VERSION + +OSSP uuid UUID_VERSION_STR + +=head1 DESCRIPTION + +B<OSSP uuid> is a ISO-C:1999 application programming interface (API) and +corresponding command line interface (CLI) for the generation of DCE +1.1, ISO/IEC 11578:1996 and IETF RFC-4122 compliant I<Universally Unique +Identifier> (UUID). It supports DCE 1.1 variant UUIDs of version 1 (time +and node based), version 3 (name based, MD5), version 4 (random number +based) and version 5 (name based, SHA-1). Additional API bindings are +provided for the languages ISO-C++:1998, Perl:5 and PHP:4/5. Optional +backward compatibility exists for the ISO-C DCE-1.1 and Perl Data::UUID +APIs. + +UUIDs are 128 bit numbers which are intended to have a high likelihood +of uniqueness over space and time and are computationally difficult +to guess. They are globally unique identifiers which can be locally +generated without contacting a global registration authority. UUIDs +are intended as unique identifiers for both mass tagging objects +with an extremely short lifetime and to reliably identifying very +persistent objects across a network. + +This is the ISO-C application programming interface (API) of B<OSSP uuid>. + +=head2 UUID Binary Representation + +According to the DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122 +standards, a DCE 1.1 variant UUID is a 128 bit number defined out of 7 +fields, each field a multiple of an octet in size and stored in network +byte order: + + [4] + version + -->| |<-- + | | + | | [16] + [32] [16] | |time_hi + time_low time_mid | _and_version + |<---------------------------->||<------------>||<------------>| + | MSB || || | | + | / || || | | + |/ || || | | + + +------++------++------++------++------++------++------++------+~~ + | 15 || 14 || 13 || 12 || 11 || 10 |####9 || 8 | + | MSO || || || || || |#### || | + +------++------++------++------++------++------++------++------+~~ + 7654321076543210765432107654321076543210765432107654321076543210 + + ~~+------++------++------++------++------++------++------++------+ + ##* 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0 | + ##* || || || || || || || LSO | + ~~+------++------++------++------++------++------++------++------+ + 7654321076543210765432107654321076543210765432107654321076543210 + + | | || || /| + | | || || / | + | | || || LSB | + |<---->||<---->||<-------------------------------------------->| + |clk_seq clk_seq node + |_hi_res _low [48] + |[5-6] [8] + | | + -->| |<-- + variant + [2-3] + +An example of a UUID binary representation is the octet stream C<0xF8 +0x1D 0x4F 0xAE 0x7D 0xEC 0x11 0xD0 0xA7 0x65 0x00 0xA0 0xC9 0x1E 0x6B +0xF6>. The binary representation format is exactly what the B<OSSP uuid> +API functions B<uuid_import>() and B<uuid_export>() deal with under +C<UUID_FMT_BIN>. + +=head2 UUID ASCII String Representation + +According to the DCE 1.1, ISO/IEC 11578:1996 and IETF RFC-4122 +standards, a DCE 1.1 variant UUID is represented as an ASCII string +consisting of 8 hexadecimal digits followed by a hyphen, then three +groups of 4 hexadecimal digits each followed by a hyphen, then 12 +hexadecimal digits. Formally, the string representation is defined by +the following grammar: + + uuid = <time_low> "-" + <time_mid> "-" + <time_high_and_version> "-" + <clock_seq_high_and_reserved> + <clock_seq_low> "-" + <node> + time_low = 4*<hex_octet> + time_mid = 2*<hex_octet> + time_high_and_version = 2*<hex_octet> + clock_seq_high_and_reserved = <hex_octet> + clock_seq_low = <hex_octet> + node = 6*<hex_octet> + hex_octet = <hex_digit> <hex_digit> + hex_digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" + |"a"|"b"|"c"|"d"|"e"|"f" + |"A"|"B"|"C"|"D"|"E"|"F" + +An example of a UUID string representation is the ASCII string +"C<f81d4fae-7dec-11d0-a765-00a0c91e6bf6>". The string representation +format is exactly what the B<OSSP uuid> API functions B<uuid_import>() +and B<uuid_export>() deal with under C<UUID_FMT_STR>. + +Notice: a corresponding URL can be generated out of a ASCII string +representation of an UUID by prefixing with "C<urn:uuid:>" as in +"C<urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>". + +=head2 UUID Single Integer Value Representation + +According to the ISO/IEC 11578:1996 and ITU-T Rec. X.667 standards, a +DCE 1.1 variant UUID can be also represented as a single integer value +consisting of a decimal number with up to 39 digits. + +An example of a UUID single integer value representation is the decimal +number "C<329800735698586629295641978511506172918>". The string +representation format is exactly what the B<OSSP uuid> API functions +B<uuid_import>() and B<uuid_export>() deal with under C<UUID_FMT_SIV>. + +Notice: a corresponding ISO OID can be generated under the +"{joint-iso-itu-t(2) uuid(25)}" arc out of a single integer value +representation of a UUID by prefixing with "C<2.25.>". An example OID +is "C<2.25.329800735698586629295641978511506172918>". Additionally, +an URL can be generated by further prefixing with "C<urn:oid:>" as in +"C<urn:oid:2.25.329800735698586629295641978511506172918>". + +=head2 UUID Variants and Versions + +A UUID has a variant and version. The variant defines the layout of the +UUID. The version defines the content of the UUID. The UUID variant +supported in B<OSSP uuid> is the DCE 1.1 variant only. The DCE 1.1 UUID +variant versions supported in B<OSSP uuid> are: + +=over 4 + +=item B<Version 1> (time and node based) + +These are the classical UUIDs, created out of a 60-bit system time, +a 14-bit local clock sequence and 48-bit system MAC address. The MAC +address can be either the real one of a physical network interface card +(NIC) or a random multi-cast MAC address. Version 1 UUIDs are usually +used as one-time global unique identifiers. + +=item B<Version 3> (name based, MD5) + +These are UUIDs which are based on the 128-bit MD5 message digest of the +concatenation of a 128-bit namespace UUID and a name string of arbitrary +length. Version 3 UUIDs are usually used for non-unique but repeatable +message digest identifiers. + +=item B<Version 4> (random data based) + +These are UUIDs which are based on just 128-bit of random data. Version +4 UUIDs are usually used as one-time local unique identifiers. + +=item B<Version 5> (name based, SHA-1) + +These are UUIDs which are based on the 160-bit SHA-1 message digest of the +concatenation of a 128-bit namespace UUID and a name string of arbitrary +length. Version 5 UUIDs are usually used for non-unique but repeatable +message digest identifiers. + +=back + +=head2 UUID Uniqueness + +Version 1 UUIDs are guaranteed to be unique through combinations of +hardware addresses, time stamps and random seeds. There is a reference +in the UUID to the hardware (MAC) address of the first network interface +card (NIC) on the host which generated the UUID -- this reference +is intended to ensure the UUID will be unique in space as the MAC +address of every network card is assigned by a single global authority +(IEEE) and is guaranteed to be unique. The next component in a UUID +is a timestamp which, as clock always (should) move forward, will +be unique in time. Just in case some part of the above goes wrong +(the hardware address cannot be determined or the clock moved steps +backward), there is a random clock sequence component placed into the +UUID as a "catch-all" for uniqueness. + +Version 3 and version 5 UUIDs are guaranteed to be inherently globally +unique if the combination of namespace and name used to generate them is +unique. + +Version 4 UUIDs are not guaranteed to be globally unique, because they +are generated out of locally gathered pseudo-random numbers only. +Nevertheless there is still a high likelihood of uniqueness over space +and time and that they are computationally difficult to guess. + +=head2 Nil UUID + +There is a special I<Nil> UUID consisting of all octets set to zero in +the binary representation. It can be used as a special UUID value which does +not conflict with real UUIDs. + +=head1 APPLICATION PROGRAMMING INTERFACE + +The ISO-C Application Programming Interface (API) of B<OSSP uuid> +consists of the following components. + +=head2 CONSTANTS + +The following constants are provided: + +=over 4 + +=item B<UUID_VERSION> + +The hexadecimal encoded B<OSSP uuid> version. This allows compile-time +checking of the B<OSSP uuid> version. For run-time checking use +B<uuid_version>() instead. + +The hexadecimal encoding for a version "$I<v>.$I<r>$I<t>$I<l>" is +calculated with the B<GNU shtool> B<version> command and is (in +Perl-style for concise description) "sprintf('0x%x%02x%d%02x', $I<v>, +$I<r>, {qw(s 9 . 2 b 1 a 0)}->{$I<t>}, ($I<t> eq 's' ? 99 : $I<l>))", +i.e., the version 0.9.6 is encoded as "0x009206". + +=item B<UUID_LEN_BIN>, B<UUID_LEN_STR>, B<UUID_LEN_SIV> + +The number of octets of the UUID binary and string representations. +Notice that the lengths of the string representation (B<UUID_LEN_STR>) +and the lengths of the single integer value representation +(B<UUID_LEN_SIV>) does I<not> include the necessary C<NUL> termination +character. + +=item B<UUID_MAKE_V1>, B<UUID_MAKE_V3>, B<UUID_MAKE_V4>, B<UUID_MAKE_V5>, B<UUID_MAKE_MC> + +The I<mode> bits for use with B<uuid_make>(). The B<UUID_MAKE_V>I<N> +specify which UUID version to generate. The B<UUID_MAKE_MC> forces the +use of a random multi-cast MAC address instead of the real physical MAC +address in version 1 UUIDs. + +=item B<UUID_RC_OK>, B<UUID_RC_ARG>, B<UUID_RC_MEM>, B<UUID_RC_SYS>, B<UUID_RC_INT>, B<UUID_RC_IMP> + +The possible numerical return-codes of API functions. +The C<UUID_RC_OK> indicates success, the others indicate errors. +Use B<uuid_error>() to translate them into string versions. + +=item B<UUID_FMT_BIN>, B<UUID_FMT_STR>, B<UUID_FMT_SIV>, B<UUID_FMT_TXT> + +The I<fmt> formats for use with B<uuid_import>() and B<uuid_export>(). +The B<UUID_FMT_BIN> indicates the UUID binary representation (of +length B<UUID_LEN_BIN>), the B<UUID_FMT_STR> indicates the UUID string +representation (of length B<UUID_LEN_STR>), the B<UUID_FMT_SIV> +indicates the UUID single integer value representation (of maximum +length B<UUID_LEN_SIV>) and the B<UUID_FMT_TXT> indicates the textual +description (of arbitrary length) of a UUID. + +=back + +=head2 FUNCTIONS + +The following functions are provided: + +=over 4 + +=item uuid_rc_t B<uuid_create>(uuid_t **I<uuid>); + +Create a new UUID object and store a pointer to it in C<*>I<uuid>. +A UUID object consists of an internal representation of a UUID, the +internal PRNG and MD5 generator contexts, and cached MAC address and +timestamp information. The initial UUID is the I<Nil> UUID. + +=item uuid_rc_t B<uuid_destroy>(uuid_t *I<uuid>); + +Destroy UUID object I<uuid>. + +=item uuid_rc_t B<uuid_clone>(const uuid_t *I<uuid>, uuid_t **I<uuid_clone>); + +Clone UUID object I<uuid> and store new UUID object in I<uuid_clone>. + +=item uuid_rc_t B<uuid_isnil>(const uuid_t *I<uuid>, int *I<result>); + +Checks whether the UUID in I<uuid> is the I<Nil> UUID. +If this is the case, it returns I<true> in C<*>I<result>. +Else it returns I<false> in C<*>I<result>. + +=item uuid_rc_t B<uuid_compare>(const uuid_t *I<uuid>, const uuid_t *I<uuid2>, int *I<result>); + +Compares the order of the two UUIDs in I<uuid1> and I<uuid2> +and returns the result in C<*>I<result>: C<-1> if I<uuid1> is +smaller than I<uuid2>, C<0> if I<uuid1> is equal to I<uuid2> +and C<+1> if I<uuid1> is greater than I<uuid2>. + +=item uuid_rc_t B<uuid_import>(uuid_t *I<uuid>, uuid_fmt_t I<fmt>, const void *I<data_ptr>, size_t I<data_len>); + +Imports a UUID I<uuid> from an external representation of format I<fmt>. +The data is read from the buffer at I<data_ptr> which contains at least +I<data_len> bytes. + +The format of the external representation is specified by I<fmt> and the +minimum expected length in I<data_len> depends on it. Valid values for +I<fmt> are B<UUID_FMT_BIN>, B<UUID_FMT_STR> and B<UUID_FMT_SIV>. + +=item uuid_rc_t B<uuid_export>(const uuid_t *I<uuid>, uuid_fmt_t I<fmt>, void *I<data_ptr>, size_t *I<data_len>); + +Exports a UUID I<uuid> into an external representation of format +I<fmt>. Valid values for I<fmt> are B<UUID_FMT_BIN>, B<UUID_FMT_STR>, +B<UUID_FMT_SIV> and B<UUID_FMT_TXT>. + +The data is written to the buffer whose location is obtained +by dereferencing I<data_ptr> after a "cast" to the appropriate +pointer-to-pointer type. Hence the generic pointer argument I<data_ptr> +is expected to be a pointer to a "pointer of a particular type", i.e., +it has to be of type "C<unsigned char **>" for B<UUID_FMT_BIN> and +"C<char **>" for B<UUID_FMT_STR>, B<UUID_FMT_SIV> and B<UUID_FMT_TXT>. + +The buffer has to be room for at least C<*>I<data_len> bytes. If the +value of the pointer after "casting" and dereferencing I<data_ptr> +is C<NULL>, I<data_len> is ignored as input and a new buffer is +allocated and returned in the pointer after "casting" and dereferencing +I<data_ptr> (the caller has to free(3) it later on). + +If I<data_len> is not C<NULL>, the number of available bytes in the +buffer has to be provided in C<*>I<data_len> and the number of actually +written bytes are returned in C<*>I<data_len> again. The minimum +required buffer length depends on the external representation as +specified by I<fmt> and is at least B<UUID_LEN_BIN> for B<UUID_FMT_BIN>, +B<UUID_LEN_STR> for B<UUID_FMT_STR> and B<UUID_LEN_SIV> for +B<UUID_FMT_SIV>. For B<UUID_FMT_TXT> a buffer of unspecified length is +required and hence it is recommended to allow B<OSSP uuid> to allocate +the buffer as necessary. + +=item uuid_rc_t B<uuid_load>(uuid_t *I<uuid>, const char *I<name>); + +Loads a pre-defined UUID value into the UUID object I<uuid>. The +following I<name> arguments are currently known: + +=over 4 + +=item I<name> I<UUID> + +=item nil 00000000-0000-0000-0000-000000000000 + +=item ns:DNS 6ba7b810-9dad-11d1-80b4-00c04fd430c8 + +=item ns:URL 6ba7b811-9dad-11d1-80b4-00c04fd430c8 + +=item ns:OID 6ba7b812-9dad-11d1-80b4-00c04fd430c8 + +=item ns:X500 6ba7b814-9dad-11d1-80b4-00c04fd430c8 + +=back + +The "C<ns:>I<XXX>" are names of pre-defined name-space UUIDs for use in +the generation of DCE 1.1 version 3 and version 5 UUIDs. + +=item uuid_rc_t B<uuid_make>(uuid_t *I<uuid>, unsigned int I<mode>, ...); + +Generates a new UUID in I<uuid> according to I<mode> and optional +arguments (dependent on I<mode>). + +If I<mode> contains the C<UUID_MAKE_V1> bit, a DCE 1.1 variant UUID of +version 1 is generated. Then optionally the bit C<UUID_MAKE_MC> forces +the use of random multi-cast MAC address instead of the real physical +MAC address (the default). The UUID is generated out of the 60-bit current +system time, a 12-bit clock sequence and the 48-bit MAC address. + +If I<mode> contains the C<UUID_MAKE_V3> or C<UUID_MAKE_V5> bit, a DCE +1.1 variant UUID of version 3 or 5 is generated and two additional +arguments are expected: first, a namespace UUID object (C<uuid_t *>). +Second, a name string of arbitrary length (C<const char *>). The UUID is +generated out of the 128-bit MD5 or 160-bit SHA-1 from the concatenated +octet stream of namespace UUID and name string. + +If I<mode> contains the C<UUID_MAKE_V4> bit, a DCE 1.1 variant UUID +of version 4 is generated. The UUID is generated out of 128-bit random +data. + +=item char *B<uuid_error>(uuid_rc_t I<rc>); + +Returns a constant string representation corresponding to the +return-code I<rc> for use in displaying B<OSSP uuid> errors. + +=item unsigned long B<uuid_version>(void); + +Returns the hexadecimal encoded B<OSSP uuid> version as compiled into +the library object files. This allows run-time checking of the B<OSSP +uuid> version. For compile-time checking use C<UUID_VERSION> instead. + +=back + +=head1 EXAMPLE + +The following shows an example usage of the API. Error handling is +omitted for code simplification and has to be re-added for production +code. + + /* generate a DCE 1.1 v1 UUID from system environment */ + char *uuid_v1(void) + { + uuid_t *uuid; + char *str; + + uuid_create(&uuid); + uuid_make(uuid, UUID_MAKE_V1); + str = NULL; + uuid_export(uuid, UUID_FMT_STR, &str, NULL); + uuid_destroy(uuid); + return str; + } + + /* generate a DCE 1.1 v3 UUID from an URL */ + char *uuid_v3(const char *url) + { + uuid_t *uuid; + uuid_t *uuid_ns; + char *str; + + uuid_create(&uuid); + uuid_create(&uuid_ns); + uuid_load(uuid_ns, "ns:URL"); + uuid_make(uuid, UUID_MAKE_V3, uuid_ns, url); + str = NULL; + uuid_export(uuid, UUID_FMT_STR, &str, NULL); + uuid_destroy(uuid_ns); + uuid_destroy(uuid); + return str; + } + +=head1 SEE ALSO + +The following are references to B<UUID> documentation and specifications: + +=over 4 + +=item + +B<A Universally Unique IDentifier (UUID) URN Namespace>, +P. Leach, M. Mealling, R. Salz, +IETF RFC-4122, +July 2005, 32 pages, +http://www.ietf.org/rfc/rfc4122.txt + +=item + +Information Technology -- Open Systems Interconnection (OSI), +B<Procedures for the operation of OSI Registration Authorities: +Generation and Registration of Universally Unique Identifiers (UUIDs) +and their Use as ASN.1 Object Identifier Components>, +ISO/IEC 9834-8:2004 / ITU-T Rec. X.667, 2004, +December 2004, 25 pages, +http://www.itu.int/ITU-T/studygroups/com17/oid/X.667-E.pdf + +=item + +B<DCE 1.1: Remote Procedure Call>, +appendix B<Universally Unique Identifier>, +Open Group Technical Standard +Document Number C706, August 1997, 737 pages, +(supersedes C309 DCE: Remote Procedure Call 8/1994, +which was basis for ISO/IEC 11578:1996 specification), +http://www.opengroup.org/publications/catalog/c706.htm + +=item + +Information technology -- Open Systems Interconnection (OSI), +B<Remote Procedure Call (RPC)>, +ISO/IEC 11578:1996, +August 2001, 570 pages, (CHF 340,00), +http://www.iso.ch/cate/d2229.html + +=item + +B<HTTP Extensions for Distributed Authoring (WebDAV)>, +section B<6.4.1 Node Field Generation Without the IEEE 802 Address>, +IETF RFC-2518, +February 1999, 94 pages, +http://www.ietf.org/rfc/rfc2518.txt + +=item + +B<DCE 1.1 compliant UUID functions>, +FreeBSD manual pages uuid(3) and uuidgen(2), +http://www.freebsd.org/cgi/man.cgi?query=uuid&manpath=FreeBSD+6.0-RELEASE + +=back + +=head1 HISTORY + +B<OSSP uuid> was implemented in January 2004 by Ralf S. Engelschall +E<lt>rse@engelschall.comE<gt>. It was prompted by the use of UUIDs +in the B<OSSP as> and B<OpenPKG> projects. It is a clean room +implementation intended to be strictly standards compliant and maximum +portable. + +=head1 SEE ALSO + +uuid(1), uuid-config(1), OSSP::uuid(3). + +=cut + |