diff options
Diffstat (limited to 'src/lib/libssl')
| -rw-r--r-- | src/lib/libssl/LICENSE | 127 | ||||
| -rw-r--r-- | src/lib/libssl/doc/openssl.cnf | 214 | ||||
| -rw-r--r-- | src/lib/libssl/doc/openssl.txt | 1174 | ||||
| -rw-r--r-- | src/lib/libssl/doc/standards.txt | 121 | ||||
| -rw-r--r-- | src/lib/libssl/test/VMSca-response.1 | 1 | ||||
| -rw-r--r-- | src/lib/libssl/test/VMSca-response.2 | 2 | ||||
| -rw-r--r-- | src/lib/libssl/test/bctest | 111 |
7 files changed, 1750 insertions, 0 deletions
diff --git a/src/lib/libssl/LICENSE b/src/lib/libssl/LICENSE new file mode 100644 index 0000000000..b9e18d5e7b --- /dev/null +++ b/src/lib/libssl/LICENSE | |||
| @@ -0,0 +1,127 @@ | |||
| 1 | |||
| 2 | LICENSE ISSUES | ||
| 3 | ============== | ||
| 4 | |||
| 5 | The OpenSSL toolkit stays under a dual license, i.e. both the conditions of | ||
| 6 | the OpenSSL License and the original SSLeay license apply to the toolkit. | ||
| 7 | See below for the actual license texts. Actually both licenses are BSD-style | ||
| 8 | Open Source licenses. In case of any license issues related to OpenSSL | ||
| 9 | please contact openssl-core@openssl.org. | ||
| 10 | |||
| 11 | OpenSSL License | ||
| 12 | --------------- | ||
| 13 | |||
| 14 | /* ==================================================================== | ||
| 15 | * Copyright (c) 1998-1999 The OpenSSL Project. All rights reserved. | ||
| 16 | * | ||
| 17 | * Redistribution and use in source and binary forms, with or without | ||
| 18 | * modification, are permitted provided that the following conditions | ||
| 19 | * are met: | ||
| 20 | * | ||
| 21 | * 1. Redistributions of source code must retain the above copyright | ||
| 22 | * notice, this list of conditions and the following disclaimer. | ||
| 23 | * | ||
| 24 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 25 | * notice, this list of conditions and the following disclaimer in | ||
| 26 | * the documentation and/or other materials provided with the | ||
| 27 | * distribution. | ||
| 28 | * | ||
| 29 | * 3. All advertising materials mentioning features or use of this | ||
| 30 | * software must display the following acknowledgment: | ||
| 31 | * "This product includes software developed by the OpenSSL Project | ||
| 32 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | ||
| 33 | * | ||
| 34 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 35 | * endorse or promote products derived from this software without | ||
| 36 | * prior written permission. For written permission, please contact | ||
| 37 | * openssl-core@openssl.org. | ||
| 38 | * | ||
| 39 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 40 | * nor may "OpenSSL" appear in their names without prior written | ||
| 41 | * permission of the OpenSSL Project. | ||
| 42 | * | ||
| 43 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 44 | * acknowledgment: | ||
| 45 | * "This product includes software developed by the OpenSSL Project | ||
| 46 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" | ||
| 47 | * | ||
| 48 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 49 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 50 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 51 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 52 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 53 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 54 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 55 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 56 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 57 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 58 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 59 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 60 | * ==================================================================== | ||
| 61 | * | ||
| 62 | * This product includes cryptographic software written by Eric Young | ||
| 63 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 64 | * Hudson (tjh@cryptsoft.com). | ||
| 65 | * | ||
| 66 | */ | ||
| 67 | |||
| 68 | Original SSLeay License | ||
| 69 | ----------------------- | ||
| 70 | |||
| 71 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | ||
| 72 | * All rights reserved. | ||
| 73 | * | ||
| 74 | * This package is an SSL implementation written | ||
| 75 | * by Eric Young (eay@cryptsoft.com). | ||
| 76 | * The implementation was written so as to conform with Netscapes SSL. | ||
| 77 | * | ||
| 78 | * This library is free for commercial and non-commercial use as long as | ||
| 79 | * the following conditions are aheared to. The following conditions | ||
| 80 | * apply to all code found in this distribution, be it the RC4, RSA, | ||
| 81 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation | ||
| 82 | * included with this distribution is covered by the same copyright terms | ||
| 83 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | ||
| 84 | * | ||
| 85 | * Copyright remains Eric Young's, and as such any Copyright notices in | ||
| 86 | * the code are not to be removed. | ||
| 87 | * If this package is used in a product, Eric Young should be given attribution | ||
| 88 | * as the author of the parts of the library used. | ||
| 89 | * This can be in the form of a textual message at program startup or | ||
| 90 | * in documentation (online or textual) provided with the package. | ||
| 91 | * | ||
| 92 | * Redistribution and use in source and binary forms, with or without | ||
| 93 | * modification, are permitted provided that the following conditions | ||
| 94 | * are met: | ||
| 95 | * 1. Redistributions of source code must retain the copyright | ||
| 96 | * notice, this list of conditions and the following disclaimer. | ||
| 97 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 98 | * notice, this list of conditions and the following disclaimer in the | ||
| 99 | * documentation and/or other materials provided with the distribution. | ||
| 100 | * 3. All advertising materials mentioning features or use of this software | ||
| 101 | * must display the following acknowledgement: | ||
| 102 | * "This product includes cryptographic software written by | ||
| 103 | * Eric Young (eay@cryptsoft.com)" | ||
| 104 | * The word 'cryptographic' can be left out if the rouines from the library | ||
| 105 | * being used are not cryptographic related :-). | ||
| 106 | * 4. If you include any Windows specific code (or a derivative thereof) from | ||
| 107 | * the apps directory (application code) you must include an acknowledgement: | ||
| 108 | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | ||
| 109 | * | ||
| 110 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | ||
| 111 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 112 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 113 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||
| 114 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 115 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 116 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 117 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 118 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
| 119 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 120 | * SUCH DAMAGE. | ||
| 121 | * | ||
| 122 | * The licence and distribution terms for any publically available version or | ||
| 123 | * derivative of this code cannot be changed. i.e. this code cannot simply be | ||
| 124 | * copied and put under another distribution licence | ||
| 125 | * [including the GNU Public Licence.] | ||
| 126 | */ | ||
| 127 | |||
diff --git a/src/lib/libssl/doc/openssl.cnf b/src/lib/libssl/doc/openssl.cnf new file mode 100644 index 0000000000..d70dd25622 --- /dev/null +++ b/src/lib/libssl/doc/openssl.cnf | |||
| @@ -0,0 +1,214 @@ | |||
| 1 | # | ||
| 2 | # OpenSSL example configuration file. | ||
| 3 | # This is mostly being used for generation of certificate requests. | ||
| 4 | # | ||
| 5 | |||
| 6 | RANDFILE = $ENV::HOME/.rnd | ||
| 7 | oid_file = $ENV::HOME/.oid | ||
| 8 | oid_section = new_oids | ||
| 9 | |||
| 10 | # To use this configuration file with the "-extfile" option of the | ||
| 11 | # "openssl x509" utility, name here the section containing the | ||
| 12 | # X.509v3 extensions to use: | ||
| 13 | # extensions = | ||
| 14 | # (Alternatively, use a configuration file that has only | ||
| 15 | # X.509v3 extensions in its main [= default] section.) | ||
| 16 | |||
| 17 | [ new_oids ] | ||
| 18 | |||
| 19 | # We can add new OIDs in here for use by 'ca' and 'req'. | ||
| 20 | # Add a simple OID like this: | ||
| 21 | # testoid1=1.2.3.4 | ||
| 22 | # Or use config file substitution like this: | ||
| 23 | # testoid2=${testoid1}.5.6 | ||
| 24 | |||
| 25 | #################################################################### | ||
| 26 | [ ca ] | ||
| 27 | default_ca = CA_default # The default ca section | ||
| 28 | |||
| 29 | #################################################################### | ||
| 30 | [ CA_default ] | ||
| 31 | |||
| 32 | dir = ./demoCA # Where everything is kept | ||
| 33 | certs = $dir/certs # Where the issued certs are kept | ||
| 34 | crl_dir = $dir/crl # Where the issued crl are kept | ||
| 35 | database = $dir/index.txt # database index file. | ||
| 36 | new_certs_dir = $dir/newcerts # default place for new certs. | ||
| 37 | |||
| 38 | certificate = $dir/cacert.pem # The CA certificate | ||
| 39 | serial = $dir/serial # The current serial number | ||
| 40 | crl = $dir/crl.pem # The current CRL | ||
| 41 | private_key = $dir/private/cakey.pem# The private key | ||
| 42 | RANDFILE = $dir/private/.rand # private random number file | ||
| 43 | |||
| 44 | x509_extensions = usr_cert # The extentions to add to the cert | ||
| 45 | |||
| 46 | # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs | ||
| 47 | # so this is commented out by default to leave a V1 CRL. | ||
| 48 | # crl_extensions = crl_ext | ||
| 49 | |||
| 50 | default_days = 365 # how long to certify for | ||
| 51 | default_crl_days= 30 # how long before next CRL | ||
| 52 | default_md = md5 # which md to use. | ||
| 53 | preserve = no # keep passed DN ordering | ||
| 54 | |||
| 55 | # A few difference way of specifying how similar the request should look | ||
| 56 | # For type CA, the listed attributes must be the same, and the optional | ||
| 57 | # and supplied fields are just that :-) | ||
| 58 | policy = policy_match | ||
| 59 | |||
| 60 | # For the CA policy | ||
| 61 | [ policy_match ] | ||
| 62 | countryName = match | ||
| 63 | stateOrProvinceName = match | ||
| 64 | organizationName = match | ||
| 65 | organizationalUnitName = optional | ||
| 66 | commonName = supplied | ||
| 67 | emailAddress = optional | ||
| 68 | |||
| 69 | # For the 'anything' policy | ||
| 70 | # At this point in time, you must list all acceptable 'object' | ||
| 71 | # types. | ||
| 72 | [ policy_anything ] | ||
| 73 | countryName = optional | ||
| 74 | stateOrProvinceName = optional | ||
| 75 | localityName = optional | ||
| 76 | organizationName = optional | ||
| 77 | organizationalUnitName = optional | ||
| 78 | commonName = supplied | ||
| 79 | emailAddress = optional | ||
| 80 | |||
| 81 | #################################################################### | ||
| 82 | [ req ] | ||
| 83 | default_bits = 1024 | ||
| 84 | default_keyfile = privkey.pem | ||
| 85 | distinguished_name = req_distinguished_name | ||
| 86 | attributes = req_attributes | ||
| 87 | x509_extensions = v3_ca # The extentions to add to the self signed cert | ||
| 88 | |||
| 89 | [ req_distinguished_name ] | ||
| 90 | countryName = Country Name (2 letter code) | ||
| 91 | countryName_default = AU | ||
| 92 | countryName_min = 2 | ||
| 93 | countryName_max = 2 | ||
| 94 | |||
| 95 | stateOrProvinceName = State or Province Name (full name) | ||
| 96 | stateOrProvinceName_default = Some-State | ||
| 97 | |||
| 98 | localityName = Locality Name (eg, city) | ||
| 99 | |||
| 100 | 0.organizationName = Organization Name (eg, company) | ||
| 101 | 0.organizationName_default = Internet Widgits Pty Ltd | ||
| 102 | |||
| 103 | # we can do this but it is not needed normally :-) | ||
| 104 | #1.organizationName = Second Organization Name (eg, company) | ||
| 105 | #1.organizationName_default = World Wide Web Pty Ltd | ||
| 106 | |||
| 107 | organizationalUnitName = Organizational Unit Name (eg, section) | ||
| 108 | #organizationalUnitName_default = | ||
| 109 | |||
| 110 | commonName = Common Name (eg, YOUR name) | ||
| 111 | commonName_max = 64 | ||
| 112 | |||
| 113 | emailAddress = Email Address | ||
| 114 | emailAddress_max = 40 | ||
| 115 | |||
| 116 | # SET-ex3 = SET extension number 3 | ||
| 117 | |||
| 118 | [ req_attributes ] | ||
| 119 | challengePassword = A challenge password | ||
| 120 | challengePassword_min = 4 | ||
| 121 | challengePassword_max = 20 | ||
| 122 | |||
| 123 | unstructuredName = An optional company name | ||
| 124 | |||
| 125 | [ usr_cert ] | ||
| 126 | |||
| 127 | # These extensions are added when 'ca' signs a request. | ||
| 128 | |||
| 129 | # This goes against PKIX guidelines but some CAs do it and some software | ||
| 130 | # requires this to avoid interpreting an end user certificate as a CA. | ||
| 131 | |||
| 132 | basicConstraints=CA:FALSE | ||
| 133 | |||
| 134 | # Here are some examples of the usage of nsCertType. If it is omitted | ||
| 135 | # the certificate can be used for anything *except* object signing. | ||
| 136 | |||
| 137 | # This is OK for an SSL server. | ||
| 138 | # nsCertType = server | ||
| 139 | |||
| 140 | # For an object signing certificate this would be used. | ||
| 141 | # nsCertType = objsign | ||
| 142 | |||
| 143 | # For normal client use this is typical | ||
| 144 | # nsCertType = client, email | ||
| 145 | |||
| 146 | # and for everything including object signing: | ||
| 147 | # nsCertType = client, email, objsign | ||
| 148 | |||
| 149 | # This is typical in keyUsage for a client certificate. | ||
| 150 | # keyUsage = nonRepudiation, digitalSignature, keyEncipherment | ||
| 151 | |||
| 152 | # This will be displayed in Netscape's comment listbox. | ||
| 153 | nsComment = "OpenSSL Generated Certificate" | ||
| 154 | |||
| 155 | # PKIX recommendations harmless if included in all certificates. | ||
| 156 | subjectKeyIdentifier=hash | ||
| 157 | authorityKeyIdentifier=keyid,issuer:always | ||
| 158 | |||
| 159 | # This stuff is for subjectAltName and issuerAltname. | ||
| 160 | # Import the email address. | ||
| 161 | # subjectAltName=email:copy | ||
| 162 | |||
| 163 | # Copy subject details | ||
| 164 | # issuerAltName=issuer:copy | ||
| 165 | |||
| 166 | #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem | ||
| 167 | #nsBaseUrl | ||
| 168 | #nsRevocationUrl | ||
| 169 | #nsRenewalUrl | ||
| 170 | #nsCaPolicyUrl | ||
| 171 | #nsSslServerName | ||
| 172 | |||
| 173 | [ v3_ca ] | ||
| 174 | |||
| 175 | # Extensions for a typical CA | ||
| 176 | |||
| 177 | |||
| 178 | # PKIX recommendation. | ||
| 179 | |||
| 180 | subjectKeyIdentifier=hash | ||
| 181 | |||
| 182 | authorityKeyIdentifier=keyid:always,issuer:always | ||
| 183 | |||
| 184 | # This is what PKIX recommends but some broken software chokes on critical | ||
| 185 | # extensions. | ||
| 186 | #basicConstraints = critical,CA:true | ||
| 187 | # So we do this instead. | ||
| 188 | basicConstraints = CA:true | ||
| 189 | |||
| 190 | # Key usage: this is typical for a CA certificate. However since it will | ||
| 191 | # prevent it being used as an test self-signed certificate it is best | ||
| 192 | # left out by default. | ||
| 193 | # keyUsage = cRLSign, keyCertSign | ||
| 194 | |||
| 195 | # Some might want this also | ||
| 196 | # nsCertType = sslCA, emailCA | ||
| 197 | |||
| 198 | # Include email address in subject alt name: another PKIX recommendation | ||
| 199 | # subjectAltName=email:copy | ||
| 200 | # Copy issuer details | ||
| 201 | # issuerAltName=issuer:copy | ||
| 202 | |||
| 203 | # RAW DER hex encoding of an extension: beware experts only! | ||
| 204 | # 1.2.3.5=RAW:02:03 | ||
| 205 | # You can even override a supported extension: | ||
| 206 | # basicConstraints= critical, RAW:30:03:01:01:FF | ||
| 207 | |||
| 208 | [ crl_ext ] | ||
| 209 | |||
| 210 | # CRL extensions. | ||
| 211 | # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. | ||
| 212 | |||
| 213 | # issuerAltName=issuer:copy | ||
| 214 | authorityKeyIdentifier=keyid:always,issuer:always | ||
diff --git a/src/lib/libssl/doc/openssl.txt b/src/lib/libssl/doc/openssl.txt new file mode 100644 index 0000000000..91b85e5f14 --- /dev/null +++ b/src/lib/libssl/doc/openssl.txt | |||
| @@ -0,0 +1,1174 @@ | |||
| 1 | |||
| 2 | This is some preliminary documentation for OpenSSL. | ||
| 3 | |||
| 4 | ============================================================================== | ||
| 5 | BUFFER Library | ||
| 6 | ============================================================================== | ||
| 7 | |||
| 8 | The buffer library handles simple character arrays. Buffers are used for | ||
| 9 | various purposes in the library, most notably memory BIOs. | ||
| 10 | |||
| 11 | The library uses the BUF_MEM structure defined in buffer.h: | ||
| 12 | |||
| 13 | typedef struct buf_mem_st | ||
| 14 | { | ||
| 15 | int length; /* current number of bytes */ | ||
| 16 | char *data; | ||
| 17 | int max; /* size of buffer */ | ||
| 18 | } BUF_MEM; | ||
| 19 | |||
| 20 | 'length' is the current size of the buffer in bytes, 'max' is the amount of | ||
| 21 | memory allocated to the buffer. There are three functions which handle these | ||
| 22 | and one "miscellaneous" function. | ||
| 23 | |||
| 24 | BUF_MEM *BUF_MEM_new() | ||
| 25 | |||
| 26 | This allocates a new buffer of zero size. Returns the buffer or NULL on error. | ||
| 27 | |||
| 28 | void BUF_MEM_free(BUF_MEM *a) | ||
| 29 | |||
| 30 | This frees up an already existing buffer. The data is zeroed before freeing | ||
| 31 | up in case the buffer contains sensitive data. | ||
| 32 | |||
| 33 | int BUF_MEM_grow(BUF_MEM *str, int len) | ||
| 34 | |||
| 35 | This changes the size of an already existing buffer. It returns zero on error | ||
| 36 | or the new size (i.e. 'len'). Any data already in the buffer is preserved if | ||
| 37 | it increases in size. | ||
| 38 | |||
| 39 | char * BUF_strdup(char *str) | ||
| 40 | |||
| 41 | This is the previously mentioned strdup function: like the standard library | ||
| 42 | strdup() it copies a null terminated string into a block of allocated memory | ||
| 43 | and returns a pointer to the allocated block. | ||
| 44 | |||
| 45 | Unlike the standard C library strdup() this function uses Malloc() and so | ||
| 46 | should be used in preference to the standard library strdup() because it can | ||
| 47 | be used for memory leak checking or replacing the malloc() function. | ||
| 48 | |||
| 49 | The memory allocated from BUF_strdup() should be freed up using the Free() | ||
| 50 | function. | ||
| 51 | |||
| 52 | ============================================================================== | ||
| 53 | OpenSSL X509V3 extension configuration | ||
| 54 | ============================================================================== | ||
| 55 | |||
| 56 | OpenSSL X509V3 extension configuration: preliminary documentation. | ||
| 57 | |||
| 58 | INTRODUCTION. | ||
| 59 | |||
| 60 | For OpenSSL 0.9.2 the extension code has be considerably enhanced. It is now | ||
| 61 | possible to add and print out common X509 V3 certificate and CRL extensions. | ||
| 62 | |||
| 63 | BEGINNERS NOTE | ||
| 64 | |||
| 65 | For most simple applications you don't need to know too much about extensions: | ||
| 66 | the default openssl.cnf values will usually do sensible things. | ||
| 67 | |||
| 68 | If you want to know more you can initially quickly look through the sections | ||
| 69 | describing how the standard OpenSSL utilities display and add extensions and | ||
| 70 | then the list of supported extensions. | ||
| 71 | |||
| 72 | For more technical information about the meaning of extensions see: | ||
| 73 | |||
| 74 | http://www.imc.org/ietf-pkix/ | ||
| 75 | http://home.netscape.com/eng/security/certs.html | ||
| 76 | |||
| 77 | PRINTING EXTENSIONS. | ||
| 78 | |||
| 79 | Extension values are automatically printed out for supported extensions. | ||
| 80 | |||
| 81 | openssl x509 -in cert.pem -text | ||
| 82 | openssl crl -in crl.pem -text | ||
| 83 | |||
| 84 | will give information in the extension printout, for example: | ||
| 85 | |||
| 86 | X509v3 extensions: | ||
| 87 | X509v3 Basic Constraints: | ||
| 88 | CA:TRUE | ||
| 89 | X509v3 Subject Key Identifier: | ||
| 90 | 73:FE:F7:59:A7:E1:26:84:44:D6:44:36:EE:79:1A:95:7C:B1:4B:15 | ||
| 91 | X509v3 Authority Key Identifier: | ||
| 92 | keyid:73:FE:F7:59:A7:E1:26:84:44:D6:44:36:EE:79:1A:95:7C:B1:4B:15, DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/Email=email@1.address/Email=email@2.address, serial:00 | ||
| 93 | X509v3 Key Usage: | ||
| 94 | Certificate Sign, CRL Sign | ||
| 95 | X509v3 Subject Alternative Name: | ||
| 96 | email:email@1.address, email:email@2.address | ||
| 97 | |||
| 98 | CONFIGURATION FILES. | ||
| 99 | |||
| 100 | The OpenSSL utilities 'ca' and 'req' can now have extension sections listing | ||
| 101 | which certificate extensions to include. In each case a line: | ||
| 102 | |||
| 103 | x509_extensions = extension_section | ||
| 104 | |||
| 105 | indicates which section contains the extensions. In the case of 'req' the | ||
| 106 | extension section is used when the -x509 option is present to create a | ||
| 107 | self signed root certificate. | ||
| 108 | |||
| 109 | The 'x509' utility also supports extensions when it signs a certificate. | ||
| 110 | The -extfile option is used to set the configuration file containing the | ||
| 111 | extensions. In this case a line with: | ||
| 112 | |||
| 113 | extensions = extension_section | ||
| 114 | |||
| 115 | in the nameless (default) section is used. If no such line is included then | ||
| 116 | it uses the default section. | ||
| 117 | |||
| 118 | You can also add extensions to CRLs: a line | ||
| 119 | |||
| 120 | crl_extensions = crl_extension_section | ||
| 121 | |||
| 122 | will include extensions when the -gencrl option is used with the 'ca' utility. | ||
| 123 | You can add any extension to a CRL but of the supported extensions only | ||
| 124 | issuerAltName and authorityKeyIdentifier make any real sense. Note: these are | ||
| 125 | CRL extensions NOT CRL *entry* extensions which cannot currently be generated. | ||
| 126 | CRL entry extensions can be displayed. | ||
| 127 | |||
| 128 | NB. At this time Netscape Communicator rejects V2 CRLs: to get an old V1 CRL | ||
| 129 | you should not include a crl_extensions line in the configuration file. | ||
| 130 | |||
| 131 | As with all configuration files you can use the inbuilt environment expansion | ||
| 132 | to allow the values to be passed in the environment. Therefore if you have | ||
| 133 | several extension sections used for different purposes you can have a line: | ||
| 134 | |||
| 135 | x509_extensions = $ENV::ENV_EXT | ||
| 136 | |||
| 137 | and set the ENV_EXT environment variable before calling the relevant utility. | ||
| 138 | |||
| 139 | EXTENSION SYNTAX. | ||
| 140 | |||
| 141 | Extensions have the basic form: | ||
| 142 | |||
| 143 | extension_name=[critical,] extension_options | ||
| 144 | |||
| 145 | the use of the critical option makes the extension critical. Extreme caution | ||
| 146 | should be made when using the critical flag. If an extension is marked | ||
| 147 | as critical then any client that does not understand the extension should | ||
| 148 | reject it as invalid. Some broken software will reject certificates which | ||
| 149 | have *any* critical extensions (these violates PKIX but we have to live | ||
| 150 | with it). | ||
| 151 | |||
| 152 | There are three main types of extension: string extensions, multi-valued | ||
| 153 | extensions, and raw extensions. | ||
| 154 | |||
| 155 | String extensions simply have a string which contains either the value itself | ||
| 156 | or how it is obtained. | ||
| 157 | |||
| 158 | For example: | ||
| 159 | |||
| 160 | nsComment="This is a Comment" | ||
| 161 | |||
| 162 | Multi-valued extensions have a short form and a long form. The short form | ||
| 163 | is a list of names and values: | ||
| 164 | |||
| 165 | basicConstraints=critical,CA:true,pathlen:1 | ||
| 166 | |||
| 167 | The long form allows the values to be placed in a separate section: | ||
| 168 | |||
| 169 | basicConstraints=critical,@bs_section | ||
| 170 | |||
| 171 | [bs_section] | ||
| 172 | |||
| 173 | CA=true | ||
| 174 | pathlen=1 | ||
| 175 | |||
| 176 | Both forms are equivalent. However it should be noted that in some cases the | ||
| 177 | same name can appear multiple times, for example, | ||
| 178 | |||
| 179 | subjectAltName=email:steve@here,email:steve@there | ||
| 180 | |||
| 181 | in this case an equivalent long form is: | ||
| 182 | |||
| 183 | subjectAltName=@alt_section | ||
| 184 | |||
| 185 | [alt_section] | ||
| 186 | |||
| 187 | email.1=steve@here | ||
| 188 | email.2=steve@there | ||
| 189 | |||
| 190 | This is because the configuration file code cannot handle the same name | ||
| 191 | occurring twice in the same extension. | ||
| 192 | |||
| 193 | The syntax of raw extensions is governed by the extension code: it can | ||
| 194 | for example contain data in multiple sections. The correct syntax to | ||
| 195 | use is defined by the extension code itself: check out the certificate | ||
| 196 | policies extension for an example. | ||
| 197 | |||
| 198 | In addition it is also possible to use the word DER to include arbitrary | ||
| 199 | data in any extension. | ||
| 200 | |||
| 201 | 1.2.3.4=critical,DER:01:02:03:04 | ||
| 202 | 1.2.3.4=DER:01020304 | ||
| 203 | |||
| 204 | The value following DER is a hex dump of the DER encoding of the extension | ||
| 205 | Any extension can be placed in this form to override the default behaviour. | ||
| 206 | For example: | ||
| 207 | |||
| 208 | basicConstraints=critical,DER:00:01:02:03 | ||
| 209 | |||
| 210 | WARNING: DER should be used with caution. It is possible to create totally | ||
| 211 | invalid extensions unless care is taken. | ||
| 212 | |||
| 213 | CURRENTLY SUPPORTED EXTENSIONS. | ||
| 214 | |||
| 215 | If you aren't sure about extensions then they can be largely ignored: its only | ||
| 216 | when you want to do things like restrict certificate usage when you need to | ||
| 217 | worry about them. | ||
| 218 | |||
| 219 | The only extension that a beginner might want to look at is Basic Constraints. | ||
| 220 | If in addition you want to try Netscape object signing the you should also | ||
| 221 | look at Netscape Certificate Type. | ||
| 222 | |||
| 223 | Literal String extensions. | ||
| 224 | |||
| 225 | In each case the 'value' of the extension is placed directly in the | ||
| 226 | extension. Currently supported extensions in this category are: nsBaseUrl, | ||
| 227 | nsRevocationUrl, nsCaRevocationUrl, nsRenewalUrl, nsCaPolicyUrl, | ||
| 228 | nsSslServerName and nsComment. | ||
| 229 | |||
| 230 | For example: | ||
| 231 | |||
| 232 | nsComment="This is a test comment" | ||
| 233 | |||
| 234 | Bit Strings. | ||
| 235 | |||
| 236 | Bit string extensions just consist of a list of supported bits, currently | ||
| 237 | two extensions are in this category: PKIX keyUsage and the Netscape specific | ||
| 238 | nsCertType. | ||
| 239 | |||
| 240 | nsCertType (netscape certificate type) takes the flags: client, server, email, | ||
| 241 | objsign, reserved, sslCA, emailCA, objCA. | ||
| 242 | |||
| 243 | keyUsage (PKIX key usage) takes the flags: digitalSignature, nonRepudiation, | ||
| 244 | keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign, | ||
| 245 | encipherOnly, decipherOnly. | ||
| 246 | |||
| 247 | For example: | ||
| 248 | |||
| 249 | nsCertType=server | ||
| 250 | |||
| 251 | keyUsage=digitalSignature, nonRepudiation | ||
| 252 | |||
| 253 | Hints on Netscape Certificate Type. | ||
| 254 | |||
| 255 | Other than Basic Constraints this is the only extension a beginner might | ||
| 256 | want to use, if you want to try Netscape object signing, otherwise it can | ||
| 257 | be ignored. | ||
| 258 | |||
| 259 | If you want a certificate that can be used just for object signing then: | ||
| 260 | |||
| 261 | nsCertType=objsign | ||
| 262 | |||
| 263 | will do the job. If you want to use it as a normal end user and server | ||
| 264 | certificate as well then | ||
| 265 | |||
| 266 | nsCertType=objsign,email,server | ||
| 267 | |||
| 268 | is more appropriate. You cannot use a self signed certificate for object | ||
| 269 | signing (well Netscape signtool can but it cheats!) so you need to create | ||
| 270 | a CA certificate and sign an end user certificate with it. | ||
| 271 | |||
| 272 | Side note: If you want to conform to the Netscape specifications then you | ||
| 273 | should really also set: | ||
| 274 | |||
| 275 | nsCertType=objCA | ||
| 276 | |||
| 277 | in the *CA* certificate for just an object signing CA and | ||
| 278 | |||
| 279 | nsCertType=objCA,emailCA,sslCA | ||
| 280 | |||
| 281 | for everything. Current Netscape software doesn't enforce this so it can | ||
| 282 | be omitted. | ||
| 283 | |||
| 284 | Basic Constraints. | ||
| 285 | |||
| 286 | This is generally the only extension you need to worry about for simple | ||
| 287 | applications. If you want your certificate to be usable as a CA certificate | ||
| 288 | (in addition to an end user certificate) then you set this to: | ||
| 289 | |||
| 290 | basicConstraints=CA:TRUE | ||
| 291 | |||
| 292 | if you want to be certain the certificate cannot be used as a CA then do: | ||
| 293 | |||
| 294 | basicConstraints=CA:FALSE | ||
| 295 | |||
| 296 | The rest of this section describes more advanced usage. | ||
| 297 | |||
| 298 | Basic constraints is a multi-valued extension that supports a CA and an | ||
| 299 | optional pathlen option. The CA option takes the values true and false and | ||
| 300 | pathlen takes an integer. Note if the CA option is false the pathlen option | ||
| 301 | should be omitted. | ||
| 302 | |||
| 303 | The pathlen parameter indicates the maximum number of CAs that can appear | ||
| 304 | below this one in a chain. So if you have a CA with a pathlen of zero it can | ||
| 305 | only be used to sign end user certificates and not further CAs. This all | ||
| 306 | assumes that the software correctly interprets this extension of course. | ||
| 307 | |||
| 308 | Examples: | ||
| 309 | |||
| 310 | basicConstraints=CA:TRUE | ||
| 311 | basicConstraints=critical,CA:TRUE, pathlen:0 | ||
| 312 | |||
| 313 | NOTE: for a CA to be considered valid it must have the CA option set to | ||
| 314 | TRUE. An end user certificate MUST NOT have the CA value set to true. | ||
| 315 | According to PKIX recommendations it should exclude the extension entirely, | ||
| 316 | however some software may require CA set to FALSE for end entity certificates. | ||
| 317 | |||
| 318 | Subject Key Identifier. | ||
| 319 | |||
| 320 | This is really a string extension and can take two possible values. Either | ||
| 321 | a hex string giving details of the extension value to include or the word | ||
| 322 | 'hash' which then automatically follow PKIX guidelines in selecting and | ||
| 323 | appropriate key identifier. The use of the hex string is strongly discouraged. | ||
| 324 | |||
| 325 | Example: subjectKeyIdentifier=hash | ||
| 326 | |||
| 327 | Authority Key Identifier. | ||
| 328 | |||
| 329 | The authority key identifier extension permits two options. keyid and issuer: | ||
| 330 | both can take the optional value "always". | ||
| 331 | |||
| 332 | If the keyid option is present an attempt is made to copy the subject key | ||
| 333 | identifier from the parent certificate. If the value "always" is present | ||
| 334 | then an error is returned if the option fails. | ||
| 335 | |||
| 336 | The issuer option copies the issuer and serial number from the issuer | ||
| 337 | certificate. Normally this will only be done if the keyid option fails or | ||
| 338 | is not included: the "always" flag will always include the value. | ||
| 339 | |||
| 340 | Subject Alternative Name. | ||
| 341 | |||
| 342 | The subject alternative name extension allows various literal values to be | ||
| 343 | included in the configuration file. These include "email" (an email address) | ||
| 344 | "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a | ||
| 345 | registered ID: OBJECT IDENTIFIER) and IP (and IP address). | ||
| 346 | |||
| 347 | Also the email option include a special 'copy' value. This will automatically | ||
| 348 | include and email addresses contained in the certificate subject name in | ||
| 349 | the extension. | ||
| 350 | |||
| 351 | Examples: | ||
| 352 | |||
| 353 | subjectAltName=email:copy,email:my@other.address,URL:http://my.url.here/ | ||
| 354 | subjectAltName=email:my@other.address,RID:1.2.3.4 | ||
| 355 | |||
| 356 | Issuer Alternative Name. | ||
| 357 | |||
| 358 | The issuer alternative name option supports all the literal options of | ||
| 359 | subject alternative name. It does *not* support the email:copy option because | ||
| 360 | that would not make sense. It does support an additional issuer:copy option | ||
| 361 | that will copy all the subject alternative name values from the issuer | ||
| 362 | certificate (if possible). | ||
| 363 | |||
| 364 | CRL distribution points. | ||
| 365 | |||
| 366 | This is a multi-valued extension that supports all the literal options of | ||
| 367 | subject alternative name. Of the few software packages that currently interpret | ||
| 368 | this extension most only interpret the URI option. | ||
| 369 | |||
| 370 | Currently each option will set a new DistributionPoint with the fullName | ||
| 371 | field set to the given value. | ||
| 372 | |||
| 373 | Other fields like cRLissuer and reasons cannot currently be set or displayed: | ||
| 374 | at this time no examples were available that used these fields. | ||
| 375 | |||
| 376 | If you see this extension with <UNSUPPORTED> when you attempt to print it out | ||
| 377 | or it doesn't appear to display correctly then let me know, including the | ||
| 378 | certificate (mail me at steve@openssl.org) . | ||
| 379 | |||
| 380 | Examples: | ||
| 381 | |||
| 382 | crlDistributionPoints=URI:http://www.myhost.com/myca.crl | ||
| 383 | crlDistributionPoints=URI:http://www.my.com/my.crl,URI:http://www.oth.com/my.crl | ||
| 384 | |||
| 385 | Certificate Policies. | ||
| 386 | |||
| 387 | This is a RAW extension. It attempts to display the contents of this extension: | ||
| 388 | unfortunately this extension is often improperly encoded. | ||
| 389 | |||
| 390 | The certificate policies extension will rarely be used in practice: few | ||
| 391 | software packages interpret it correctly or at all. IE5 does partially | ||
| 392 | support this extension: but it needs the 'ia5org' option because it will | ||
| 393 | only correctly support a broken encoding. Of the options below only the | ||
| 394 | policy OID, explicitText and CPS options are displayed with IE5. | ||
| 395 | |||
| 396 | All the fields of this extension can be set by using the appropriate syntax. | ||
| 397 | |||
| 398 | If you follow the PKIX recommendations of not including any qualifiers and just | ||
| 399 | using only one OID then you just include the value of that OID. Multiple OIDs | ||
| 400 | can be set separated by commas, for example: | ||
| 401 | |||
| 402 | certificatePolicies= 1.2.4.5, 1.1.3.4 | ||
| 403 | |||
| 404 | If you wish to include qualifiers then the policy OID and qualifiers need to | ||
| 405 | be specified in a separate section: this is done by using the @section syntax | ||
| 406 | instead of a literal OID value. | ||
| 407 | |||
| 408 | The section referred to must include the policy OID using the name | ||
| 409 | policyIdentifier, cPSuri qualifiers can be included using the syntax: | ||
| 410 | |||
| 411 | CPS.nnn=value | ||
| 412 | |||
| 413 | userNotice qualifiers can be set using the syntax: | ||
| 414 | |||
| 415 | userNotice.nnn=@notice | ||
| 416 | |||
| 417 | The value of the userNotice qualifier is specified in the relevant section. | ||
| 418 | This section can include explicitText, organization and noticeNumbers | ||
| 419 | options. explicitText and organization are text strings, noticeNumbers is a | ||
| 420 | comma separated list of numbers. The organization and noticeNumbers options | ||
| 421 | (if included) must BOTH be present. If you use the userNotice option with IE5 | ||
| 422 | then you need the 'ia5org' option at the top level to modify the encoding: | ||
| 423 | otherwise it will not be interpreted properly. | ||
| 424 | |||
| 425 | Example: | ||
| 426 | |||
| 427 | certificatePolicies=ia5org,1.2.3.4,1.5.6.7.8,@polsect | ||
| 428 | |||
| 429 | [polsect] | ||
| 430 | |||
| 431 | policyIdentifier = 1.3.5.8 | ||
| 432 | CPS.1="http://my.host.name/" | ||
| 433 | CPS.2="http://my.your.name/" | ||
| 434 | userNotice.1=@notice | ||
| 435 | |||
| 436 | [notice] | ||
| 437 | |||
| 438 | explicitText="Explicit Text Here" | ||
| 439 | organization="Organisation Name" | ||
| 440 | noticeNumbers=1,2,3,4 | ||
| 441 | |||
| 442 | TECHNICAL NOTE: the ia5org option changes the type of the 'organization' field, | ||
| 443 | according to PKIX it should be of type DisplayText but Verisign uses an | ||
| 444 | IA5STRING and IE5 needs this too. | ||
| 445 | |||
| 446 | Display only extensions. | ||
| 447 | |||
| 448 | Some extensions are only partially supported and currently are only displayed | ||
| 449 | but cannot be set. These include private key usage period, CRL number, and | ||
| 450 | CRL reason. | ||
| 451 | |||
| 452 | ============================================================================== | ||
| 453 | X509V3 Extension code: programmers guide | ||
| 454 | ============================================================================== | ||
| 455 | |||
| 456 | The purpose of the extension code is twofold. It allows an extension to be | ||
| 457 | created from a string or structure describing its contents and it prints out an | ||
| 458 | extension in a human or machine readable form. | ||
| 459 | |||
| 460 | 1. Initialisation and cleanup. | ||
| 461 | |||
| 462 | X509V3_add_standard_extensions(); | ||
| 463 | |||
| 464 | This function should be called before any other extension code. It adds support | ||
| 465 | for some common PKIX and Netscape extensions. Additional custom extensions can | ||
| 466 | be added as well (see later). | ||
| 467 | |||
| 468 | void X509V3_EXT_cleanup(void); | ||
| 469 | |||
| 470 | This function should be called last to cleanup the extension code. After this | ||
| 471 | call no other extension calls should be made. | ||
| 472 | |||
| 473 | 2. Printing and parsing extensions. | ||
| 474 | |||
| 475 | The simplest way to print out extensions is via the standard X509 printing | ||
| 476 | routines: if you use the standard X509_print() function, the supported | ||
| 477 | extensions will be printed out automatically. | ||
| 478 | |||
| 479 | The following functions allow finer control over extension display: | ||
| 480 | |||
| 481 | int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, int flag, int indent); | ||
| 482 | int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); | ||
| 483 | |||
| 484 | These two functions print out an individual extension to a BIO or FILE pointer. | ||
| 485 | Currently the flag argument is unused and should be set to 0. The 'indent' | ||
| 486 | argument is the number of spaces to indent each line. | ||
| 487 | |||
| 488 | void *X509V3_EXT_d2i(X509_EXTENSION *ext); | ||
| 489 | |||
| 490 | This function parses an extension and returns its internal structure. The | ||
| 491 | precise structure you get back depends on the extension being parsed. If the | ||
| 492 | extension if basicConstraints you will get back a pointer to a | ||
| 493 | BASIC_CONSTRAINTS structure. Check out the source in crypto/x509v3 for more | ||
| 494 | details about the structures returned. The returned structure should be freed | ||
| 495 | after use using the relevant free function, BASIC_CONSTRAINTS_free() for | ||
| 496 | example. | ||
| 497 | |||
| 498 | 3. Generating extensions. | ||
| 499 | |||
| 500 | An extension will typically be generated from a configuration file, or some | ||
| 501 | other kind of configuration database. | ||
| 502 | |||
| 503 | int X509V3_EXT_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, | ||
| 504 | X509 *cert); | ||
| 505 | int X509V3_EXT_CRL_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, | ||
| 506 | X509_CRL *crl); | ||
| 507 | |||
| 508 | These functions add all the extensions in the given section to the given | ||
| 509 | certificate or CRL. They will normally be called just before the certificate | ||
| 510 | or CRL is due to be signed. Both return 0 on error on non zero for success. | ||
| 511 | |||
| 512 | In each case 'conf' is the LHASH pointer of the configuration file to use | ||
| 513 | and 'section' is the section containing the extension details. | ||
| 514 | |||
| 515 | See the 'context functions' section for a description of the ctx paramater. | ||
| 516 | |||
| 517 | |||
| 518 | X509_EXTENSION *X509V3_EXT_conf(LHASH *conf, X509V3_CTX *ctx, char *name, | ||
| 519 | char *value); | ||
| 520 | |||
| 521 | This function returns an extension based on a name and value pair, if the | ||
| 522 | pair will not need to access other sections in a config file (or there is no | ||
| 523 | config file) then the 'conf' parameter can be set to NULL. | ||
| 524 | |||
| 525 | X509_EXTENSION *X509V3_EXT_conf_nid(char *conf, X509V3_CTX *ctx, int nid, | ||
| 526 | char *value); | ||
| 527 | |||
| 528 | This function creates an extension in the same way as X509V3_EXT_conf() but | ||
| 529 | takes the NID of the extension rather than its name. | ||
| 530 | |||
| 531 | For example to produce basicConstraints with the CA flag and a path length of | ||
| 532 | 10: | ||
| 533 | |||
| 534 | x = X509V3_EXT_conf_nid(NULL, NULL, NID_basicConstraints, "CA:TRUE,pathlen:10"); | ||
| 535 | |||
| 536 | |||
| 537 | X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); | ||
| 538 | |||
| 539 | This function sets up an extension from its internal structure. The ext_nid | ||
| 540 | parameter is the NID of the extension and 'crit' is the critical flag. | ||
| 541 | |||
| 542 | 4. Context functions. | ||
| 543 | |||
| 544 | The following functions set and manipulate an extension context structure. | ||
| 545 | The purpose of the extension context is to allow the extension code to | ||
| 546 | access various structures relating to the "environment" of the certificate: | ||
| 547 | for example the issuers certificate or the certificate request. | ||
| 548 | |||
| 549 | void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, | ||
| 550 | X509_REQ *req, X509_CRL *crl, int flags); | ||
| 551 | |||
| 552 | This function sets up an X509V3_CTX structure with details of the certificate | ||
| 553 | environment: specifically the issuers certificate, the subject certificate, | ||
| 554 | the certificate request and the CRL: if these are not relevant or not | ||
| 555 | available then they can be set to NULL. The 'flags' parameter should be set | ||
| 556 | to zero. | ||
| 557 | |||
| 558 | X509V3_set_ctx_test(ctx) | ||
| 559 | |||
| 560 | This macro is used to set the 'ctx' structure to a 'test' value: this is to | ||
| 561 | allow the syntax of an extension (or configuration file) to be tested. | ||
| 562 | |||
| 563 | X509V3_set_ctx_nodb(ctx) | ||
| 564 | |||
| 565 | This macro is used when no configuration database is present. | ||
| 566 | |||
| 567 | void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH *lhash); | ||
| 568 | |||
| 569 | This function is used to set the configuration database when it is an LHASH | ||
| 570 | structure: typically a configuration file. | ||
| 571 | |||
| 572 | The following functions are used to access a configuration database: they | ||
| 573 | should only be used in RAW extensions. | ||
| 574 | |||
| 575 | char * X509V3_get_string(X509V3_CTX *ctx, char *name, char *section); | ||
| 576 | |||
| 577 | This function returns the value of the parameter "name" in "section", or NULL | ||
| 578 | if there has been an error. | ||
| 579 | |||
| 580 | void X509V3_string_free(X509V3_CTX *ctx, char *str); | ||
| 581 | |||
| 582 | This function frees up the string returned by the above function. | ||
| 583 | |||
| 584 | STACK_OF(CONF_VALUE) * X509V3_get_section(X509V3_CTX *ctx, char *section); | ||
| 585 | |||
| 586 | This function returns a whole section as a STACK_OF(CONF_VALUE) . | ||
| 587 | |||
| 588 | void X509V3_section_free( X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); | ||
| 589 | |||
| 590 | This function frees up the STACK returned by the above function. | ||
| 591 | |||
| 592 | Note: it is possible to use the extension code with a custom configuration | ||
| 593 | database. To do this the "db_meth" element of the X509V3_CTX structure should | ||
| 594 | be set to an X509V3_CTX_METHOD structure. This structure contains the following | ||
| 595 | function pointers: | ||
| 596 | |||
| 597 | char * (*get_string)(void *db, char *section, char *value); | ||
| 598 | STACK_OF(CONF_VALUE) * (*get_section)(void *db, char *section); | ||
| 599 | void (*free_string)(void *db, char * string); | ||
| 600 | void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section); | ||
| 601 | |||
| 602 | these will be called and passed the 'db' element in the X509V3_CTX structure | ||
| 603 | to access the database. If a given function is not implemented or not required | ||
| 604 | it can be set to NULL. | ||
| 605 | |||
| 606 | 5. String helper functions. | ||
| 607 | |||
| 608 | There are several "i2s" and "s2i" functions that convert structures to and | ||
| 609 | from ASCII strings. In all the "i2s" cases the returned string should be | ||
| 610 | freed using Free() after use. Since some of these are part of other extension | ||
| 611 | code they may take a 'method' parameter. Unless otherwise stated it can be | ||
| 612 | safely set to NULL. | ||
| 613 | |||
| 614 | char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *oct); | ||
| 615 | |||
| 616 | This returns a hex string from an ASN1_OCTET_STRING. | ||
| 617 | |||
| 618 | char * i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint); | ||
| 619 | char * i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint); | ||
| 620 | |||
| 621 | These return a string decimal representations of an ASN1_INTEGER and an | ||
| 622 | ASN1_ENUMERATED type, respectively. | ||
| 623 | |||
| 624 | ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, | ||
| 625 | X509V3_CTX *ctx, char *str); | ||
| 626 | |||
| 627 | This converts an ASCII hex string to an ASN1_OCTET_STRING. | ||
| 628 | |||
| 629 | ASN1_INTEGER * s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value); | ||
| 630 | |||
| 631 | This converts a decimal ASCII string into an ASN1_INTEGER. | ||
| 632 | |||
| 633 | 6. Multi valued extension helper functions. | ||
| 634 | |||
| 635 | The following functions can be used to manipulate STACKs of CONF_VALUE | ||
| 636 | structures, as used by multi valued extensions. | ||
| 637 | |||
| 638 | int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool); | ||
| 639 | |||
| 640 | This function expects a boolean value in 'value' and sets 'asn1_bool' to | ||
| 641 | it. That is it sets it to 0 for FALSE or 0xff for TRUE. The following | ||
| 642 | strings are acceptable: "TRUE", "true", "Y", "y", "YES", "yes", "FALSE" | ||
| 643 | "false", "N", "n", "NO" or "no". | ||
| 644 | |||
| 645 | int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint); | ||
| 646 | |||
| 647 | This accepts a decimal integer of arbitrary length and sets an ASN1_INTEGER. | ||
| 648 | |||
| 649 | int X509V3_add_value(const char *name, const char *value, | ||
| 650 | STACK_OF(CONF_VALUE) **extlist); | ||
| 651 | |||
| 652 | This simply adds a string name and value pair. | ||
| 653 | |||
| 654 | int X509V3_add_value_uchar(const char *name, const unsigned char *value, | ||
| 655 | STACK_OF(CONF_VALUE) **extlist); | ||
| 656 | |||
| 657 | The same as above but for an unsigned character value. | ||
| 658 | |||
| 659 | int X509V3_add_value_bool(const char *name, int asn1_bool, | ||
| 660 | STACK_OF(CONF_VALUE) **extlist); | ||
| 661 | |||
| 662 | This adds either "TRUE" or "FALSE" depending on the value of 'ans1_bool' | ||
| 663 | |||
| 664 | int X509V3_add_value_bool_nf(char *name, int asn1_bool, | ||
| 665 | STACK_OF(CONF_VALUE) **extlist); | ||
| 666 | |||
| 667 | This is the same as above except it adds nothing if asn1_bool is FALSE. | ||
| 668 | |||
| 669 | int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint, | ||
| 670 | STACK_OF(CONF_VALUE) **extlist); | ||
| 671 | |||
| 672 | This function adds the value of the ASN1_INTEGER in decimal form. | ||
| 673 | |||
| 674 | 7. Other helper functions. | ||
| 675 | |||
| 676 | <to be added> | ||
| 677 | |||
| 678 | ADDING CUSTOM EXTENSIONS. | ||
| 679 | |||
| 680 | Currently there are three types of supported extensions. | ||
| 681 | |||
| 682 | String extensions are simple strings where the value is placed directly in the | ||
| 683 | extensions, and the string returned is printed out. | ||
| 684 | |||
| 685 | Multi value extensions are passed a STACK_OF(CONF_VALUE) name and value pairs | ||
| 686 | or return a STACK_OF(CONF_VALUE). | ||
| 687 | |||
| 688 | Raw extensions are just passed a BIO or a value and it is the extensions | ||
| 689 | responsiblity to handle all the necessary printing. | ||
| 690 | |||
| 691 | There are two ways to add an extension. One is simply as an alias to an already | ||
| 692 | existing extension. An alias is an extension that is identical in ASN1 structure | ||
| 693 | to an existing extension but has a different OBJECT IDENTIFIER. This can be | ||
| 694 | done by calling: | ||
| 695 | |||
| 696 | int X509V3_EXT_add_alias(int nid_to, int nid_from); | ||
| 697 | |||
| 698 | 'nid_to' is the new extension NID and 'nid_from' is the already existing | ||
| 699 | extension NID. | ||
| 700 | |||
| 701 | Alternatively an extension can be written from scratch. This involves writing | ||
| 702 | the ASN1 code to encode and decode the extension and functions to print out and | ||
| 703 | generate the extension from strings. The relevant functions are then placed in | ||
| 704 | a X509V3_EXT_METHOD structure and int X509V3_EXT_add(X509V3_EXT_METHOD *ext); | ||
| 705 | called. | ||
| 706 | |||
| 707 | The X509V3_EXT_METHOD structure is described below. | ||
| 708 | |||
| 709 | strut { | ||
| 710 | int ext_nid; | ||
| 711 | int ext_flags; | ||
| 712 | X509V3_EXT_NEW ext_new; | ||
| 713 | X509V3_EXT_FREE ext_free; | ||
| 714 | X509V3_EXT_D2I d2i; | ||
| 715 | X509V3_EXT_I2D i2d; | ||
| 716 | X509V3_EXT_I2S i2s; | ||
| 717 | X509V3_EXT_S2I s2i; | ||
| 718 | X509V3_EXT_I2V i2v; | ||
| 719 | X509V3_EXT_V2I v2i; | ||
| 720 | X509V3_EXT_R2I r2i; | ||
| 721 | X509V3_EXT_I2R i2r; | ||
| 722 | |||
| 723 | void *usr_data; | ||
| 724 | }; | ||
| 725 | |||
| 726 | The elements have the following meanings. | ||
| 727 | |||
| 728 | ext_nid is the NID of the object identifier of the extension. | ||
| 729 | |||
| 730 | ext_flags is set of flags. Currently the only external flag is | ||
| 731 | X509V3_EXT_MULTILINE which means a multi valued extensions | ||
| 732 | should be printed on separate lines. | ||
| 733 | |||
| 734 | usr_data is an extension specific pointer to any relevant data. This | ||
| 735 | allows extensions to share identical code but have different | ||
| 736 | uses. An example of this is the bit string extension which uses | ||
| 737 | usr_data to contain a list of the bit names. | ||
| 738 | |||
| 739 | All the remaining elements are function pointers. | ||
| 740 | |||
| 741 | ext_new is a pointer to a function that allocates memory for the | ||
| 742 | extension ASN1 structure: for example ASN1_OBJECT_new(). | ||
| 743 | |||
| 744 | ext_free is a pointer to a function that free up memory of the extension | ||
| 745 | ASN1 structure: for example ASN1_OBJECT_free(). | ||
| 746 | |||
| 747 | d2i is the standard ASN1 function that converts a DER buffer into | ||
| 748 | the internal ASN1 structure: for example d2i_ASN1_IA5STRING(). | ||
| 749 | |||
| 750 | i2d is the standard ASN1 function that converts the internal | ||
| 751 | structure into the DER representation: for example | ||
| 752 | i2d_ASN1_IA5STRING(). | ||
| 753 | |||
| 754 | The remaining functions are depend on the type of extension. One i2X and | ||
| 755 | one X2i should be set and the rest set to NULL. The types set do not need | ||
| 756 | to match up, for example the extension could be set using the multi valued | ||
| 757 | v2i function and printed out using the raw i2r. | ||
| 758 | |||
| 759 | All functions have the X509V3_EXT_METHOD passed to them in the 'method' | ||
| 760 | parameter and an X509V3_CTX structure. Extension code can then access the | ||
| 761 | parent structure via the 'method' parameter to for example make use of the value | ||
| 762 | of usr_data. If the code needs to use detail relating to the request it can | ||
| 763 | use the 'ctx' parameter. | ||
| 764 | |||
| 765 | A note should be given here about the 'flags' member of the 'ctx' parameter. | ||
| 766 | If it has the value CTX_TEST then the configuration syntax is being checked | ||
| 767 | and no actual certificate or CRL exists. Therefore any attempt in the config | ||
| 768 | file to access such information should silently succeed. If the syntax is OK | ||
| 769 | then it should simply return a (possibly bogus) extension, otherwise it | ||
| 770 | should return NULL. | ||
| 771 | |||
| 772 | char *i2s(struct v3_ext_method *method, void *ext); | ||
| 773 | |||
| 774 | This function takes the internal structure in the ext parameter and returns | ||
| 775 | a Malloc'ed string representing its value. | ||
| 776 | |||
| 777 | void * s2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, char *str); | ||
| 778 | |||
| 779 | This function takes the string representation in the ext parameter and returns | ||
| 780 | an allocated internal structure: ext_free() will be used on this internal | ||
| 781 | structure after use. | ||
| 782 | |||
| 783 | i2v and v2i handle a STACK_OF(CONF_VALUE): | ||
| 784 | |||
| 785 | typedef struct | ||
| 786 | { | ||
| 787 | char *section; | ||
| 788 | char *name; | ||
| 789 | char *value; | ||
| 790 | } CONF_VALUE; | ||
| 791 | |||
| 792 | Only the name and value members are currently used. | ||
| 793 | |||
| 794 | STACK_OF(CONF_VALUE) * i2v(struct v3_ext_method *method, void *ext); | ||
| 795 | |||
| 796 | This function is passed the internal structure in the ext parameter and | ||
| 797 | returns a STACK of CONF_VALUE structures. The values of name, value, | ||
| 798 | section and the structure itself will be freed up with Free after use. | ||
| 799 | Several helper functions are available to add values to this STACK. | ||
| 800 | |||
| 801 | void * v2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, | ||
| 802 | STACK_OF(CONF_VALUE) *values); | ||
| 803 | |||
| 804 | This function takes a STACK_OF(CONF_VALUE) structures and should set the | ||
| 805 | values of the external structure. This typically uses the name element to | ||
| 806 | determine which structure element to set and the value element to determine | ||
| 807 | what to set it to. Several helper functions are available for this | ||
| 808 | purpose (see above). | ||
| 809 | |||
| 810 | int i2r(struct v3_ext_method *method, void *ext, BIO *out, int indent); | ||
| 811 | |||
| 812 | This function is passed the internal extension structure in the ext parameter | ||
| 813 | and sends out a human readable version of the extension to out. The 'indent' | ||
| 814 | paremeter should be noted to determine the necessary amount of indentation | ||
| 815 | needed on the output. | ||
| 816 | |||
| 817 | void * r2i(struct v3_ext_method *method, struct v3_ext_ctx *ctx, char *str); | ||
| 818 | |||
| 819 | This is just passed the string representation of the extension. It is intended | ||
| 820 | to be used for more elaborate extensions where the standard single and multi | ||
| 821 | valued options are insufficient. They can use the 'ctx' parameter to parse the | ||
| 822 | configuration database themselves. See the context functions section for details | ||
| 823 | of how to do this. | ||
| 824 | |||
| 825 | Note: although this type takes the same parameters as the "r2s" function there | ||
| 826 | is a subtle difference. Whereas an "r2i" function can access a configuration | ||
| 827 | database an "s2i" function MUST NOT. This is so the internal code can safely | ||
| 828 | assume that an "s2i" function will work without a configuration database. | ||
| 829 | |||
| 830 | ============================================================================== | ||
| 831 | PKCS#12 Library | ||
| 832 | ============================================================================== | ||
| 833 | |||
| 834 | This section describes the internal PKCS#12 support. There are very few | ||
| 835 | differences between the old external library and the new internal code at | ||
| 836 | present. This may well change because the external library will not be updated | ||
| 837 | much in future. | ||
| 838 | |||
| 839 | This version now includes a couple of high level PKCS#12 functions which | ||
| 840 | generally "do the right thing" and should make it much easier to handle PKCS#12 | ||
| 841 | structures. | ||
| 842 | |||
| 843 | HIGH LEVEL FUNCTIONS. | ||
| 844 | |||
| 845 | For most applications you only need concern yourself with the high level | ||
| 846 | functions. They can parse and generate simple PKCS#12 files as produced by | ||
| 847 | Netscape and MSIE or indeed any compliant PKCS#12 file containing a single | ||
| 848 | private key and certificate pair. | ||
| 849 | |||
| 850 | 1. Initialisation and cleanup. | ||
| 851 | |||
| 852 | No special initialisation is needed for the internal PKCS#12 library: the | ||
| 853 | standard SSLeay_add_all_algorithms() is sufficient. If you do not wish to | ||
| 854 | add all algorithms (you should at least add SHA1 though) then you can manually | ||
| 855 | initialise the PKCS#12 library with: | ||
| 856 | |||
| 857 | PKCS12_PBE_add(); | ||
| 858 | |||
| 859 | The memory allocated by the PKCS#12 library is freed up when EVP_cleanup() is | ||
| 860 | called or it can be directly freed with: | ||
| 861 | |||
| 862 | EVP_PBE_cleanup(); | ||
| 863 | |||
| 864 | after this call (or EVP_cleanup() ) no more PKCS#12 library functions should | ||
| 865 | be called. | ||
| 866 | |||
| 867 | 2. I/O functions. | ||
| 868 | |||
| 869 | i2d_PKCS12_bio(bp, p12) | ||
| 870 | |||
| 871 | This writes out a PKCS12 structure to a BIO. | ||
| 872 | |||
| 873 | i2d_PKCS12_fp(fp, p12) | ||
| 874 | |||
| 875 | This is the same but for a FILE pointer. | ||
| 876 | |||
| 877 | d2i_PKCS12_bio(bp, p12) | ||
| 878 | |||
| 879 | This reads in a PKCS12 structure from a BIO. | ||
| 880 | |||
| 881 | d2i_PKCS12_fp(fp, p12) | ||
| 882 | |||
| 883 | This is the same but for a FILE pointer. | ||
| 884 | |||
| 885 | 3. Parsing and creation functions. | ||
| 886 | |||
| 887 | 3.1 Parsing with PKCS12_parse(). | ||
| 888 | |||
| 889 | int PKCS12_parse(PKCS12 *p12, char *pass, EVP_PKEY **pkey, X509 **cert, | ||
| 890 | STACK **ca); | ||
| 891 | |||
| 892 | This function takes a PKCS12 structure and a password (ASCII, null terminated) | ||
| 893 | and returns the private key, the corresponding certificate and any CA | ||
| 894 | certificates. If any of these is not required it can be passed as a NULL. | ||
| 895 | The 'ca' parameter should be either NULL, a pointer to NULL or a valid STACK | ||
| 896 | structure. Typically to read in a PKCS#12 file you might do: | ||
| 897 | |||
| 898 | p12 = d2i_PKCS12_fp(fp, NULL); | ||
| 899 | PKCS12_parse(p12, password, &pkey, &cert, NULL); /* CAs not wanted */ | ||
| 900 | PKCS12_free(p12); | ||
| 901 | |||
| 902 | 3.2 PKCS#12 creation with PKCS12_create(). | ||
| 903 | |||
| 904 | PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, | ||
| 905 | STACK *ca, int nid_key, int nid_cert, int iter, | ||
| 906 | int mac_iter, int keytype); | ||
| 907 | |||
| 908 | This function will create a PKCS12 structure from a given password, name, | ||
| 909 | private key, certificate and optional STACK of CA certificates. The remaining | ||
| 910 | 5 parameters can be set to 0 and sensible defaults will be used. | ||
| 911 | |||
| 912 | The parameters nid_key and nid_cert are the key and certificate encryption | ||
| 913 | algorithms, iter is the encryption iteration count, mac_iter is the MAC | ||
| 914 | iteration count and keytype is the type of private key. If you really want | ||
| 915 | to know what these last 5 parameters do then read the low level section. | ||
| 916 | |||
| 917 | Typically to create a PKCS#12 file the following could be used: | ||
| 918 | |||
| 919 | p12 = PKCS12_create(pass, "My Certificate", pkey, cert, NULL, 0,0,0,0,0); | ||
| 920 | i2d_PKCS12_fp(fp, p12); | ||
| 921 | PKCS12_free(p12); | ||
| 922 | |||
| 923 | LOW LEVEL FUNCTIONS. | ||
| 924 | |||
| 925 | In some cases the high level functions do not provide the necessary | ||
| 926 | functionality. For example if you want to generate or parse more complex | ||
| 927 | PKCS#12 files. The sample pkcs12 application uses the low level functions | ||
| 928 | to display details about the internal structure of a PKCS#12 file. | ||
| 929 | |||
| 930 | Introduction. | ||
| 931 | |||
| 932 | This is a brief description of how a PKCS#12 file is represented internally: | ||
| 933 | some knowledge of PKCS#12 is assumed. | ||
| 934 | |||
| 935 | A PKCS#12 object contains several levels. | ||
| 936 | |||
| 937 | At the lowest level is a PKCS12_SAFEBAG. This can contain a certificate, a | ||
| 938 | CRL, a private key, encrypted or unencrypted, a set of safebags (so the | ||
| 939 | structure can be nested) or other secrets (not documented at present). | ||
| 940 | A safebag can optionally have attributes, currently these are: a unicode | ||
| 941 | friendlyName (a Unicode string) or a localKeyID (a string of bytes). | ||
| 942 | |||
| 943 | At the next level is an authSafe which is a set of safebags collected into | ||
| 944 | a PKCS#7 ContentInfo. This can be just plain data, or encrypted itself. | ||
| 945 | |||
| 946 | At the top level is the PKCS12 structure itself which contains a set of | ||
| 947 | authSafes in an embedded PKCS#7 Contentinfo of type data. In addition it | ||
| 948 | contains a MAC which is a kind of password protected digest to preserve | ||
| 949 | integrity (so any unencrypted stuff below can't be tampered with). | ||
| 950 | |||
| 951 | The reason for these levels is so various objects can be encrypted in various | ||
| 952 | ways. For example you might want to encrypt a set of private keys with | ||
| 953 | triple-DES and then include the related certificates either unencrypted or | ||
| 954 | with lower encryption. Yes it's the dreaded crypto laws at work again which | ||
| 955 | allow strong encryption on private keys and only weak encryption on other | ||
| 956 | stuff. | ||
| 957 | |||
| 958 | To build one of these things you turn all certificates and keys into safebags | ||
| 959 | (with optional attributes). You collect the safebags into (one or more) STACKS | ||
| 960 | and convert these into authsafes (encrypted or unencrypted). The authsafes | ||
| 961 | are collected into a STACK and added to a PKCS12 structure. Finally a MAC | ||
| 962 | inserted. | ||
| 963 | |||
| 964 | Pulling one apart is basically the reverse process. The MAC is verified against | ||
| 965 | the given password. The authsafes are extracted and each authsafe split into | ||
| 966 | a set of safebags (possibly involving decryption). Finally the safebags are | ||
| 967 | decomposed into the original keys and certificates and the attributes used to | ||
| 968 | match up private key and certificate pairs. | ||
| 969 | |||
| 970 | Anyway here are the functions that do the dirty work. | ||
| 971 | |||
| 972 | 1. Construction functions. | ||
| 973 | |||
| 974 | 1.1 Safebag functions. | ||
| 975 | |||
| 976 | M_PKCS12_x5092certbag(x509) | ||
| 977 | |||
| 978 | This macro takes an X509 structure and returns a certificate bag. The | ||
| 979 | X509 structure can be freed up after calling this function. | ||
| 980 | |||
| 981 | M_PKCS12_x509crl2certbag(crl) | ||
| 982 | |||
| 983 | As above but for a CRL. | ||
| 984 | |||
| 985 | PKCS8_PRIV_KEY_INFO *PKEY2PKCS8(EVP_PKEY *pkey) | ||
| 986 | |||
| 987 | Take a private key and convert it into a PKCS#8 PrivateKeyInfo structure. | ||
| 988 | Works for both RSA and DSA private keys. NB since the PKCS#8 PrivateKeyInfo | ||
| 989 | structure contains a private key data in plain text form it should be free'd | ||
| 990 | up as soon as it has been encrypted for security reasons (freeing up the | ||
| 991 | structure zeros out the sensitive data). This can be done with | ||
| 992 | PKCS8_PRIV_KEY_INFO_free(). | ||
| 993 | |||
| 994 | PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage) | ||
| 995 | |||
| 996 | This sets the key type when a key is imported into MSIE or Outlook 98. Two | ||
| 997 | values are currently supported: KEY_EX and KEY_SIG. KEY_EX is an exchange type | ||
| 998 | key that can also be used for signing but its size is limited in the export | ||
| 999 | versions of MS software to 512 bits, it is also the default. KEY_SIG is a | ||
| 1000 | signing only key but the keysize is unlimited (well 16K is supposed to work). | ||
| 1001 | If you are using the domestic version of MSIE then you can ignore this because | ||
| 1002 | KEY_EX is not limited and can be used for both. | ||
| 1003 | |||
| 1004 | PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8) | ||
| 1005 | |||
| 1006 | Convert a PKCS8 private key structure into a keybag. This routine embeds the | ||
| 1007 | p8 structure in the keybag so p8 should not be freed up or used after it is | ||
| 1008 | called. The p8 structure will be freed up when the safebag is freed. | ||
| 1009 | |||
| 1010 | PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8) | ||
| 1011 | |||
| 1012 | Convert a PKCS#8 structure into a shrouded key bag (encrypted). p8 is not | ||
| 1013 | embedded and can be freed up after use. | ||
| 1014 | |||
| 1015 | int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen) | ||
| 1016 | int PKCS12_add_friendlyname(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen) | ||
| 1017 | |||
| 1018 | Add a local key id or a friendlyname to a safebag. | ||
| 1019 | |||
| 1020 | 1.2 Authsafe functions. | ||
| 1021 | |||
| 1022 | PKCS7 *PKCS12_pack_p7data(STACK *sk) | ||
| 1023 | Take a stack of safebags and convert them into an unencrypted authsafe. The | ||
| 1024 | stack of safebags can be freed up after calling this function. | ||
| 1025 | |||
| 1026 | PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int iter, STACK *bags); | ||
| 1027 | |||
| 1028 | As above but encrypted. | ||
| 1029 | |||
| 1030 | 1.3 PKCS12 functions. | ||
| 1031 | |||
| 1032 | PKCS12 *PKCS12_init(int mode) | ||
| 1033 | |||
| 1034 | Initialise a PKCS12 structure (currently mode should be NID_pkcs7_data). | ||
| 1035 | |||
| 1036 | M_PKCS12_pack_authsafes(p12, safes) | ||
| 1037 | |||
| 1038 | This macro takes a STACK of authsafes and adds them to a PKCS#12 structure. | ||
| 1039 | |||
| 1040 | int PKCS12_set_mac(PKCS12 *p12, unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int iter, EVP_MD *md_type); | ||
| 1041 | |||
| 1042 | Add a MAC to a PKCS12 structure. If EVP_MD is NULL use SHA-1, the spec suggests | ||
| 1043 | that SHA-1 should be used. | ||
| 1044 | |||
| 1045 | 2. Extraction Functions. | ||
| 1046 | |||
| 1047 | 2.1 Safebags. | ||
| 1048 | |||
| 1049 | M_PKCS12_bag_type(bag) | ||
| 1050 | |||
| 1051 | Return the type of "bag". Returns one of the following | ||
| 1052 | |||
| 1053 | NID_keyBag | ||
| 1054 | NID_pkcs8ShroudedKeyBag 7 | ||
| 1055 | NID_certBag 8 | ||
| 1056 | NID_crlBag 9 | ||
| 1057 | NID_secretBag 10 | ||
| 1058 | NID_safeContentsBag 11 | ||
| 1059 | |||
| 1060 | M_PKCS12_cert_bag_type(bag) | ||
| 1061 | |||
| 1062 | Returns type of certificate bag, following are understood. | ||
| 1063 | |||
| 1064 | NID_x509Certificate 14 | ||
| 1065 | NID_sdsiCertificate 15 | ||
| 1066 | |||
| 1067 | M_PKCS12_crl_bag_type(bag) | ||
| 1068 | |||
| 1069 | Returns crl bag type, currently only NID_crlBag is recognised. | ||
| 1070 | |||
| 1071 | M_PKCS12_certbag2x509(bag) | ||
| 1072 | |||
| 1073 | This macro extracts an X509 certificate from a certificate bag. | ||
| 1074 | |||
| 1075 | M_PKCS12_certbag2x509crl(bag) | ||
| 1076 | |||
| 1077 | As above but for a CRL. | ||
| 1078 | |||
| 1079 | EVP_PKEY * PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8) | ||
| 1080 | |||
| 1081 | Extract a private key from a PKCS8 private key info structure. | ||
| 1082 | |||
| 1083 | M_PKCS12_decrypt_skey(bag, pass, passlen) | ||
| 1084 | |||
| 1085 | Decrypt a shrouded key bag and return a PKCS8 private key info structure. | ||
| 1086 | Works with both RSA and DSA keys | ||
| 1087 | |||
| 1088 | char *PKCS12_get_friendlyname(bag) | ||
| 1089 | |||
| 1090 | Returns the friendlyName of a bag if present or NULL if none. The returned | ||
| 1091 | string is a null terminated ASCII string allocated with Malloc(). It should | ||
| 1092 | thus be freed up with Free() after use. | ||
| 1093 | |||
| 1094 | 2.2 AuthSafe functions. | ||
| 1095 | |||
| 1096 | M_PKCS12_unpack_p7data(p7) | ||
| 1097 | |||
| 1098 | Extract a STACK of safe bags from a PKCS#7 data ContentInfo. | ||
| 1099 | |||
| 1100 | #define M_PKCS12_unpack_p7encdata(p7, pass, passlen) | ||
| 1101 | |||
| 1102 | As above but for an encrypted content info. | ||
| 1103 | |||
| 1104 | 2.3 PKCS12 functions. | ||
| 1105 | |||
| 1106 | M_PKCS12_unpack_authsafes(p12) | ||
| 1107 | |||
| 1108 | Extract a STACK of authsafes from a PKCS12 structure. | ||
| 1109 | |||
| 1110 | M_PKCS12_mac_present(p12) | ||
| 1111 | |||
| 1112 | Check to see if a MAC is present. | ||
| 1113 | |||
| 1114 | int PKCS12_verify_mac(PKCS12 *p12, unsigned char *pass, int passlen) | ||
| 1115 | |||
| 1116 | Verify a MAC on a PKCS12 structure. Returns an error if MAC not present. | ||
| 1117 | |||
| 1118 | |||
| 1119 | Notes. | ||
| 1120 | |||
| 1121 | 1. All the function return 0 or NULL on error. | ||
| 1122 | 2. Encryption based functions take a common set of parameters. These are | ||
| 1123 | described below. | ||
| 1124 | |||
| 1125 | pass, passlen | ||
| 1126 | ASCII password and length. The password on the MAC is called the "integrity | ||
| 1127 | password" the encryption password is called the "privacy password" in the | ||
| 1128 | PKCS#12 documentation. The passwords do not have to be the same. If -1 is | ||
| 1129 | passed for the length it is worked out by the function itself (currently | ||
| 1130 | this is sometimes done whatever is passed as the length but that may change). | ||
| 1131 | |||
| 1132 | salt, saltlen | ||
| 1133 | A 'salt' if salt is NULL a random salt is used. If saltlen is also zero a | ||
| 1134 | default length is used. | ||
| 1135 | |||
| 1136 | iter | ||
| 1137 | Iteration count. This is a measure of how many times an internal function is | ||
| 1138 | called to encrypt the data. The larger this value is the longer it takes, it | ||
| 1139 | makes dictionary attacks on passwords harder. NOTE: Some implementations do | ||
| 1140 | not support an iteration count on the MAC. If the password for the MAC and | ||
| 1141 | encryption is the same then there is no point in having a high iteration | ||
| 1142 | count for encryption if the MAC has no count. The MAC could be attacked | ||
| 1143 | and the password used for the main decryption. | ||
| 1144 | |||
| 1145 | pbe_nid | ||
| 1146 | This is the NID of the password based encryption method used. The following are | ||
| 1147 | supported. | ||
| 1148 | NID_pbe_WithSHA1And128BitRC4 | ||
| 1149 | NID_pbe_WithSHA1And40BitRC4 | ||
| 1150 | NID_pbe_WithSHA1And3_Key_TripleDES_CBC | ||
| 1151 | NID_pbe_WithSHA1And2_Key_TripleDES_CBC | ||
| 1152 | NID_pbe_WithSHA1And128BitRC2_CBC | ||
| 1153 | NID_pbe_WithSHA1And40BitRC2_CBC | ||
| 1154 | |||
| 1155 | Which you use depends on the implementation you are exporting to. "Export | ||
| 1156 | grade" (i.e. cryptographically challenged) products cannot support all | ||
| 1157 | algorithms. Typically you may be able to use any encryption on shrouded key | ||
| 1158 | bags but they must then be placed in an unencrypted authsafe. Other authsafes | ||
| 1159 | may only support 40bit encryption. Of course if you are using SSLeay | ||
| 1160 | throughout you can strongly encrypt everything and have high iteration counts | ||
| 1161 | on everything. | ||
| 1162 | |||
| 1163 | 3. For decryption routines only the password and length are needed. | ||
| 1164 | |||
| 1165 | 4. Unlike the external version the nid's of objects are the values of the | ||
| 1166 | constants: that is NID_certBag is the real nid, therefore there is no | ||
| 1167 | PKCS12_obj_offset() function. Note the object constants are not the same as | ||
| 1168 | those of the external version. If you use these constants then you will need | ||
| 1169 | to recompile your code. | ||
| 1170 | |||
| 1171 | 5. With the exception of PKCS12_MAKE_KEYBAG(), after calling any function or | ||
| 1172 | macro of the form PKCS12_MAKE_SOMETHING(other) the "other" structure can be | ||
| 1173 | reused or freed up safely. | ||
| 1174 | |||
diff --git a/src/lib/libssl/doc/standards.txt b/src/lib/libssl/doc/standards.txt new file mode 100644 index 0000000000..61ccc5d7e0 --- /dev/null +++ b/src/lib/libssl/doc/standards.txt | |||
| @@ -0,0 +1,121 @@ | |||
| 1 | Standards related to OpenSSL | ||
| 2 | ============================ | ||
| 3 | |||
| 4 | [Please, this is currently a draft. I made a first try at finding | ||
| 5 | documents that describe parts of what OpenSSL implements. There are | ||
| 6 | big gaps, and I've most certainly done something wrong. Please | ||
| 7 | correct whatever is... Also, this note should be removed when this | ||
| 8 | file is reaching a somewhat correct state. -- Richard Levitte] | ||
| 9 | |||
| 10 | |||
| 11 | All pointers in here will be either URL's or blobs of text borrowed | ||
| 12 | from miscellaneous indexes, like rfc-index.txt (index of RFCs), | ||
| 13 | 1id-index.txt (index of Internet drafts) and the like. | ||
| 14 | |||
| 15 | To find the latest possible RFCs, it's recommended to either browse | ||
| 16 | ftp://ftp.isi.edu/in-notes/ or go to http://www.rfc-editor.org/ and | ||
| 17 | use the search mechanism found there. | ||
| 18 | To find the latest possible Internet drafts, it's recommended to | ||
| 19 | browse ftp://ftp.isi.edu/internet-drafts/. | ||
| 20 | To find the latest possible PKCS, it's recommended to browse | ||
| 21 | http://www.rsasecurity.com/rsalabs/pkcs/. | ||
| 22 | |||
| 23 | |||
| 24 | Implemented: | ||
| 25 | ------------ | ||
| 26 | |||
| 27 | These are documents that describe things that are implemented in OpenSSL. | ||
| 28 | |||
| 29 | 1319 The MD2 Message-Digest Algorithm. B. Kaliski. April 1992. | ||
| 30 | (Format: TXT=25661 bytes) (Status: INFORMATIONAL) | ||
| 31 | |||
| 32 | 1320 The MD4 Message-Digest Algorithm. R. Rivest. April 1992. (Format: | ||
| 33 | TXT=32407 bytes) (Status: INFORMATIONAL) | ||
| 34 | |||
| 35 | 1321 The MD5 Message-Digest Algorithm. R. Rivest. April 1992. (Format: | ||
| 36 | TXT=35222 bytes) (Status: INFORMATIONAL) | ||
| 37 | |||
| 38 | 2246 The TLS Protocol Version 1.0. T. Dierks, C. Allen. January 1999. | ||
| 39 | (Format: TXT=170401 bytes) (Status: PROPOSED STANDARD) | ||
| 40 | |||
| 41 | 2268 A Description of the RC2(r) Encryption Algorithm. R. Rivest. | ||
| 42 | January 1998. (Format: TXT=19048 bytes) (Status: INFORMATIONAL) | ||
| 43 | |||
| 44 | 2314 PKCS 10: Certification Request Syntax Version 1.5. B. Kaliski. | ||
| 45 | March 1998. (Format: TXT=15814 bytes) (Status: INFORMATIONAL) | ||
| 46 | |||
| 47 | 2315 PKCS 7: Cryptographic Message Syntax Version 1.5. B. Kaliski. | ||
| 48 | March 1998. (Format: TXT=69679 bytes) (Status: INFORMATIONAL) | ||
| 49 | |||
| 50 | 2437 PKCS #1: RSA Cryptography Specifications Version 2.0. B. Kaliski, | ||
| 51 | J. Staddon. October 1998. (Format: TXT=73529 bytes) (Obsoletes | ||
| 52 | RFC2313) (Status: INFORMATIONAL) | ||
| 53 | |||
| 54 | 2459 Internet X.509 Public Key Infrastructure Certificate and CRL | ||
| 55 | Profile. R. Housley, W. Ford, W. Polk, D. Solo. January 1999. | ||
| 56 | (Format: TXT=278438 bytes) (Status: PROPOSED STANDARD) | ||
| 57 | |||
| 58 | PKCS#8: Private-Key Information Syntax Standard | ||
| 59 | |||
| 60 | PKCS#12: Personal Information Exchange Syntax Standard, version 1.0. | ||
| 61 | |||
| 62 | |||
| 63 | Related: | ||
| 64 | -------- | ||
| 65 | |||
| 66 | These are documents that are close to OpenSSL, for example the | ||
| 67 | STARTTLS documents. | ||
| 68 | |||
| 69 | 1421 Privacy Enhancement for Internet Electronic Mail: Part I: Message | ||
| 70 | Encryption and Authentication Procedures. J. Linn. February 1993. | ||
| 71 | (Format: TXT=103894 bytes) (Obsoletes RFC1113) (Status: PROPOSED | ||
| 72 | STANDARD) | ||
| 73 | |||
| 74 | 1422 Privacy Enhancement for Internet Electronic Mail: Part II: | ||
| 75 | Certificate-Based Key Management. S. Kent. February 1993. (Format: | ||
| 76 | TXT=86085 bytes) (Obsoletes RFC1114) (Status: PROPOSED STANDARD) | ||
| 77 | |||
| 78 | 1423 Privacy Enhancement for Internet Electronic Mail: Part III: | ||
| 79 | Algorithms, Modes, and Identifiers. D. Balenson. February 1993. | ||
| 80 | (Format: TXT=33277 bytes) (Obsoletes RFC1115) (Status: PROPOSED | ||
| 81 | STANDARD) | ||
| 82 | |||
| 83 | 1424 Privacy Enhancement for Internet Electronic Mail: Part IV: Key | ||
| 84 | Certification and Related Services. B. Kaliski. February 1993. | ||
| 85 | (Format: TXT=17537 bytes) (Status: PROPOSED STANDARD) | ||
| 86 | |||
| 87 | 2487 SMTP Service Extension for Secure SMTP over TLS. P. Hoffman. | ||
| 88 | January 1999. (Format: TXT=15120 bytes) (Status: PROPOSED STANDARD) | ||
| 89 | |||
| 90 | 2585 Internet X.509 Public Key Infrastructure Operational Protocols: | ||
| 91 | FTP and HTTP. R. Housley, P. Hoffman. May 1999. (Format: TXT=14813 | ||
| 92 | bytes) (Status: PROPOSED STANDARD) | ||
| 93 | |||
| 94 | 2595 Using TLS with IMAP, POP3 and ACAP. C. Newman. June 1999. | ||
| 95 | (Format: TXT=32440 bytes) (Status: PROPOSED STANDARD) | ||
| 96 | |||
| 97 | 2712 Addition of Kerberos Cipher Suites to Transport Layer Security | ||
| 98 | (TLS). A. Medvinsky, M. Hur. October 1999. (Format: TXT=13763 bytes) | ||
| 99 | (Status: PROPOSED STANDARD) | ||
| 100 | |||
| 101 | 2817 Upgrading to TLS Within HTTP/1.1. R. Khare, S. Lawrence. May | ||
| 102 | 2000. (Format: TXT=27598 bytes) (Updates RFC2616) (Status: PROPOSED | ||
| 103 | STANDARD) | ||
| 104 | |||
| 105 | 2818 HTTP Over TLS. E. Rescorla. May 2000. (Format: TXT=15170 bytes) | ||
| 106 | (Status: INFORMATIONAL) | ||
| 107 | |||
| 108 | "Securing FTP with TLS", 01/27/2000, <draft-murray-auth-ftp-ssl-05.txt> | ||
| 109 | |||
| 110 | |||
| 111 | To be implemented: | ||
| 112 | ------------------ | ||
| 113 | |||
| 114 | These are documents that describe things that are planed to be | ||
| 115 | implemented in the hopefully short future. | ||
| 116 | |||
| 117 | 2560 X.509 Internet Public Key Infrastructure Online Certificate | ||
| 118 | Status Protocol - OCSP. M. Myers, R. Ankney, A. Malpani, S. Galperin, | ||
| 119 | C. Adams. June 1999. (Format: TXT=43243 bytes) (Status: PROPOSED | ||
| 120 | STANDARD) | ||
| 121 | |||
diff --git a/src/lib/libssl/test/VMSca-response.1 b/src/lib/libssl/test/VMSca-response.1 new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/lib/libssl/test/VMSca-response.1 | |||
| @@ -0,0 +1 @@ | |||
diff --git a/src/lib/libssl/test/VMSca-response.2 b/src/lib/libssl/test/VMSca-response.2 new file mode 100644 index 0000000000..9b48ee4cf9 --- /dev/null +++ b/src/lib/libssl/test/VMSca-response.2 | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | y | ||
| 2 | y | ||
diff --git a/src/lib/libssl/test/bctest b/src/lib/libssl/test/bctest new file mode 100644 index 0000000000..bdb3218f7a --- /dev/null +++ b/src/lib/libssl/test/bctest | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | # This script is used by test/Makefile.ssl to check whether a sane 'bc' | ||
| 4 | # is installed. | ||
| 5 | # ('make test_bn' should not try to run 'bc' if it does not exist or if | ||
| 6 | # it is a broken 'bc' version that is known to cause trouble.) | ||
| 7 | # | ||
| 8 | # If 'bc' works, we also test if it knows the 'print' command. | ||
| 9 | # | ||
| 10 | # In any case, output an appropriate command line for running (or not | ||
| 11 | # running) bc. | ||
| 12 | |||
| 13 | |||
| 14 | IFS=: | ||
| 15 | try_without_dir=true | ||
| 16 | # First we try "bc", then "$dir/bc" for each item in $PATH. | ||
| 17 | for dir in dummy:$PATH; do | ||
| 18 | if [ "$try_without_dir" = true ]; then | ||
| 19 | # first iteration | ||
| 20 | bc=bc | ||
| 21 | try_without_dir=false | ||
| 22 | else | ||
| 23 | # second and later iterations | ||
| 24 | bc="$dir/bc" | ||
| 25 | if [ ! -f "$bc" ]; then # '-x' is not available on Ultrix | ||
| 26 | bc='' | ||
| 27 | fi | ||
| 28 | fi | ||
| 29 | |||
| 30 | if [ ! "$bc" = '' ]; then | ||
| 31 | failure=none | ||
| 32 | |||
| 33 | |||
| 34 | # Test for SunOS 5.[78] bc bug | ||
| 35 | "$bc" >tmp.bctest <<\EOF | ||
| 36 | obase=16 | ||
| 37 | ibase=16 | ||
| 38 | a=AD88C418F31B3FC712D0425001D522B3AE9134FF3A98C13C1FCC1682211195406C1A6C66C6A\ | ||
| 39 | CEEC1A0EC16950233F77F1C2F2363D56DD71A36C57E0B2511FC4BA8F22D261FE2E9356D99AF57\ | ||
| 40 | 10F3817C0E05BF79C423C3F66FDF321BE8D3F18F625D91B670931C1EF25F28E489BDA1C5422D1\ | ||
| 41 | C3F6F7A1AD21585746ECC4F10A14A778AF56F08898E965E9909E965E0CB6F85B514150C644759\ | ||
| 42 | 3BE731877B16EA07B552088FF2EA728AC5E0FF3A23EB939304519AB8B60F2C33D6BA0945B66F0\ | ||
| 43 | 4FC3CADF855448B24A9D7640BCF473E | ||
| 44 | b=DCE91E7D120B983EA9A104B5A96D634DD644C37657B1C7860B45E6838999B3DCE5A555583C6\ | ||
| 45 | 9209E41F413422954175A06E67FFEF6746DD652F0F48AEFECC3D8CAC13523BDAAD3F5AF4212BD\ | ||
| 46 | 8B3CD64126E1A82E190228020C05B91C8B141F1110086FC2A4C6ED631EBA129D04BB9A19FC53D\ | ||
| 47 | 3ED0E2017D60A68775B75481449 | ||
| 48 | (a/b)*b + (a%b) - a | ||
| 49 | EOF | ||
| 50 | if [ 0 != "`cat tmp.bctest`" ]; then | ||
| 51 | failure=SunOStest | ||
| 52 | fi | ||
| 53 | |||
| 54 | |||
| 55 | if [ "$failure" = none ]; then | ||
| 56 | # Test for SCO bc bug. | ||
| 57 | "$bc" >tmp.bctest <<\EOF | ||
| 58 | obase=16 | ||
| 59 | ibase=16 | ||
| 60 | -FFDD63BA1A4648F0D804F8A1C66C53F0D2110590E8A3907EC73B4AEC6F15AC177F176F2274D2\ | ||
| 61 | 9DC8022EA0D7DD3ABE9746D2D46DD3EA5B5F6F69DF12877E0AC5E7F5ADFACEE54573F5D256A06\ | ||
| 62 | 11B5D2BC24947724E22AE4EC3FB0C39D9B4694A01AFE5E43B4D99FB9812A0E4A5773D8B254117\ | ||
| 63 | 1239157EC6E3D8D50199 * -FFDD63BA1A4648F0D804F8A1C66C53F0D2110590E8A3907EC73B4\ | ||
| 64 | AEC6F15AC177F176F2274D29DC8022EA0D7DD3ABE9746D2D46DD3EA5B5F6F69DF12877E0AC5E7\ | ||
| 65 | F5ADFACEE54573F5D256A0611B5D2BC24947724E22AE4EC3FB0C39D9B4694A01AFE5E43B4D99F\ | ||
| 66 | B9812A0E4A5773D8B2541171239157EC6E3D8D50199 - FFBACC221682DA464B6D7F123482522\ | ||
| 67 | 02EDAEDCA38C3B69E9B7BBCD6165A9CD8716C4903417F23C09A85B851961F92C217258CEEB866\ | ||
| 68 | 85EFCC5DD131853A02C07A873B8E2AF2E40C6D5ED598CD0E8F35AD49F3C3A17FDB7653E4E2DC4\ | ||
| 69 | A8D23CC34686EE4AD01F7407A7CD74429AC6D36DBF0CB6A3E302D0E5BDFCD048A3B90C1BE5AA8\ | ||
| 70 | E16C3D5884F9136B43FF7BB443764153D4AEC176C681B078F4CC53D6EB6AB76285537DDEE7C18\ | ||
| 71 | 8C72441B52EDBDDBC77E02D34E513F2AABF92F44109CAFE8242BD0ECBAC5604A94B02EA44D43C\ | ||
| 72 | 04E9476E6FBC48043916BFA1485C6093603600273C9C33F13114D78064AE42F3DC466C7DA543D\ | ||
| 73 | 89C8D71 | ||
| 74 | AD534AFBED2FA39EE9F40E20FCF9E2C861024DB98DDCBA1CD118C49CA55EEBC20D6BA51B2271C\ | ||
| 75 | 928B693D6A73F67FEB1B4571448588B46194617D25D910C6A9A130CC963155CF34079CB218A44\ | ||
| 76 | 8A1F57E276D92A33386DDCA3D241DB78C8974ABD71DD05B0FA555709C9910D745185E6FE108E3\ | ||
| 77 | 37F1907D0C56F8BFBF52B9704 % -E557905B56B13441574CAFCE2BD257A750B1A8B2C88D0E36\ | ||
| 78 | E18EF7C38DAC80D3948E17ED63AFF3B3467866E3B89D09A81B3D16B52F6A3C7134D3C6F5123E9\ | ||
| 79 | F617E3145BBFBE9AFD0D6E437EA4FF6F04BC67C4F1458B4F0F47B64 - 1C2BBBB19B74E86FD32\ | ||
| 80 | 9E8DB6A8C3B1B9986D57ED5419C2E855F7D5469E35E76334BB42F4C43E3F3A31B9697C171DAC4\ | ||
| 81 | D97935A7E1A14AD209D6CF811F55C6DB83AA9E6DFECFCD6669DED7171EE22A40C6181615CAF3F\ | ||
| 82 | 5296964 | ||
| 83 | EOF | ||
| 84 | if [ "0 | ||
| 85 | 0" != "`cat tmp.bctest`" ]; then | ||
| 86 | failure=SCOtest | ||
| 87 | fi | ||
| 88 | fi | ||
| 89 | |||
| 90 | |||
| 91 | if [ "$failure" = none ]; then | ||
| 92 | # bc works; now check if it knows the 'print' command. | ||
| 93 | if [ "OK" = "`echo 'print \"OK\"' | $bc 2>/dev/null`" ] | ||
| 94 | then | ||
| 95 | echo "$bc" | ||
| 96 | else | ||
| 97 | echo "sed 's/print.*//' | $bc" | ||
| 98 | fi | ||
| 99 | exit 0 | ||
| 100 | fi | ||
| 101 | |||
| 102 | echo "$bc does not work properly ('$failure' failed). Looking for another bc ..." >&2 | ||
| 103 | fi | ||
| 104 | done | ||
| 105 | |||
| 106 | echo "No working bc found. Consider installing GNU bc." >&2 | ||
| 107 | if [ "$1" = ignore ]; then | ||
| 108 | echo "cat >/dev/null" | ||
| 109 | exit 0 | ||
| 110 | fi | ||
| 111 | exit 1 | ||
