zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

CommonDigest.h (11970B) - Raw


      1 /*
      2  * Copyright (c) 2004 Apple Computer, Inc. All Rights Reserved.
      3  *
      4  * @APPLE_LICENSE_HEADER_START@
      5  *
      6  * This file contains Original Code and/or Modifications of Original Code
      7  * as defined in and that are subject to the Apple Public Source License
      8  * Version 2.0 (the 'License'). You may not use this file except in
      9  * compliance with the License. Please obtain a copy of the License at
     10  * http://www.opensource.apple.com/apsl/ and read it before using this
     11  * file.
     12  *
     13  * The Original Code and all software distributed under the License are
     14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
     15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
     16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
     18  * Please see the License for the specific language governing rights and
     19  * limitations under the License.
     20  *
     21  * @APPLE_LICENSE_HEADER_END@
     22  */
     23 
     24 /*
     25  * CommonDigest.h - common digest routines: MD2, MD4, MD5, SHA1.
     26  */
     27 
     28 #ifndef _CC_COMMON_DIGEST_H_
     29 #define _CC_COMMON_DIGEST_H_
     30 
     31 #include <stdint.h>
     32 
     33 #if defined(_MSC_VER)
     34 #include <availability.h>
     35 #else
     36 #include <os/availability.h>
     37 #endif
     38 
     39 
     40 #ifdef __cplusplus
     41 extern "C" {
     42 #endif
     43 
     44 #define CC_DIGEST_DEPRECATION_WARNING                                                                                          \
     45     "This function is cryptographically broken and should not be used in security contexts. Clients should migrate to SHA256 (or stronger)."
     46 
     47 /*
     48  * For compatibility with legacy implementations, the *Init(), *Update(),
     49  * and *Final() functions declared here *always* return a value of 1 (one).
     50  * This corresponds to "success" in the similar openssl implementations.
     51  * There are no errors of any kind which can be, or are, reported here,
     52  * so you can safely ignore the return values of all of these functions
     53  * if you are implementing new code.
     54  *
     55  * The one-shot functions (CC_MD2(), CC_SHA1(), etc.) perform digest
     56  * calculation and place the result in the caller-supplied buffer
     57  * indicated by the md parameter. They return the md parameter.
     58  * Unlike the opensssl counterparts, these one-shot functions require
     59  * a non-NULL md pointer. Passing in NULL for the md parameter
     60  * results in a NULL return and no digest calculation.
     61  */
     62 
     63 typedef uint32_t CC_LONG;       /* 32 bit unsigned integer */
     64 typedef uint64_t CC_LONG64;     /* 64 bit unsigned integer */
     65 
     66 /*** MD2 ***/
     67 
     68 #define CC_MD2_DIGEST_LENGTH    16          /* digest length in bytes */
     69 #define CC_MD2_BLOCK_BYTES      64          /* block size in bytes */
     70 #define CC_MD2_BLOCK_LONG       (CC_MD2_BLOCK_BYTES / sizeof(CC_LONG))
     71 
     72 typedef struct CC_MD2state_st
     73 {
     74     int num;
     75     unsigned char data[CC_MD2_DIGEST_LENGTH];
     76     CC_LONG cksm[CC_MD2_BLOCK_LONG];
     77     CC_LONG state[CC_MD2_BLOCK_LONG];
     78 } CC_MD2_CTX;
     79 
     80 extern int CC_MD2_Init(CC_MD2_CTX *c)
     81 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
     82 
     83 extern int CC_MD2_Update(CC_MD2_CTX *c, const void *data, CC_LONG len)
     84 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
     85 
     86 extern int CC_MD2_Final(unsigned char *md, CC_MD2_CTX *c)
     87 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
     88 
     89 extern unsigned char *CC_MD2(const void *data, CC_LONG len, unsigned char *md)
     90 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
     91 
     92 /*** MD4 ***/
     93 
     94 #define CC_MD4_DIGEST_LENGTH    16          /* digest length in bytes */
     95 #define CC_MD4_BLOCK_BYTES      64          /* block size in bytes */
     96 #define CC_MD4_BLOCK_LONG       (CC_MD4_BLOCK_BYTES / sizeof(CC_LONG))
     97 
     98 typedef struct CC_MD4state_st
     99 {
    100     CC_LONG A,B,C,D;
    101     CC_LONG Nl,Nh;
    102     CC_LONG data[CC_MD4_BLOCK_LONG];
    103     uint32_t num;
    104 } CC_MD4_CTX;
    105 
    106 extern int CC_MD4_Init(CC_MD4_CTX *c)
    107 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    108 
    109 extern int CC_MD4_Update(CC_MD4_CTX *c, const void *data, CC_LONG len)
    110 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    111 
    112 extern int CC_MD4_Final(unsigned char *md, CC_MD4_CTX *c)
    113 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    114 
    115 extern unsigned char *CC_MD4(const void *data, CC_LONG len, unsigned char *md)
    116 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    117 
    118 
    119 /*** MD5 ***/
    120 
    121 #define CC_MD5_DIGEST_LENGTH    16          /* digest length in bytes */
    122 #define CC_MD5_BLOCK_BYTES      64          /* block size in bytes */
    123 #define CC_MD5_BLOCK_LONG       (CC_MD5_BLOCK_BYTES / sizeof(CC_LONG))
    124 
    125 typedef struct CC_MD5state_st
    126 {
    127     CC_LONG A,B,C,D;
    128     CC_LONG Nl,Nh;
    129     CC_LONG data[CC_MD5_BLOCK_LONG];
    130     int num;
    131 } CC_MD5_CTX;
    132 
    133 extern int CC_MD5_Init(CC_MD5_CTX *c)
    134 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    135     
    136 extern int CC_MD5_Update(CC_MD5_CTX *c, const void *data, CC_LONG len)
    137 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    138     
    139 extern int CC_MD5_Final(unsigned char *md, CC_MD5_CTX *c)
    140 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    141 
    142 extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)
    143 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    144 
    145 /*** SHA1 ***/
    146 
    147 #define CC_SHA1_DIGEST_LENGTH   20          /* digest length in bytes */
    148 #define CC_SHA1_BLOCK_BYTES     64          /* block size in bytes */
    149 #define CC_SHA1_BLOCK_LONG      (CC_SHA1_BLOCK_BYTES / sizeof(CC_LONG))
    150 
    151 typedef struct CC_SHA1state_st
    152 {
    153     CC_LONG h0,h1,h2,h3,h4;
    154     CC_LONG Nl,Nh;
    155     CC_LONG data[CC_SHA1_BLOCK_LONG];
    156     int num;
    157 } CC_SHA1_CTX;
    158 
    159 extern int CC_SHA1_Init(CC_SHA1_CTX *c);
    160 
    161 extern int CC_SHA1_Update(CC_SHA1_CTX *c, const void *data, CC_LONG len);
    162 
    163 extern int CC_SHA1_Final(unsigned char *md, CC_SHA1_CTX *c);
    164 
    165 extern unsigned char *CC_SHA1(const void *data, CC_LONG len, unsigned char *md);
    166 
    167 /*** SHA224 ***/
    168 #define CC_SHA224_DIGEST_LENGTH     28          /* digest length in bytes */
    169 #define CC_SHA224_BLOCK_BYTES       64          /* block size in bytes */
    170 
    171 /* same context struct is used for SHA224 and SHA256 */
    172 typedef struct CC_SHA256state_st
    173 {   CC_LONG count[2];
    174     CC_LONG hash[8];
    175     CC_LONG wbuf[16];
    176 } CC_SHA256_CTX;
    177 
    178 extern int CC_SHA224_Init(CC_SHA256_CTX *c)
    179 API_AVAILABLE(macos(10.4), ios(2.0));
    180 
    181 extern int CC_SHA224_Update(CC_SHA256_CTX *c, const void *data, CC_LONG len)
    182 API_AVAILABLE(macos(10.4), ios(2.0));
    183 
    184 extern int CC_SHA224_Final(unsigned char *md, CC_SHA256_CTX *c)
    185 API_AVAILABLE(macos(10.4), ios(2.0));
    186 
    187 extern unsigned char *CC_SHA224(const void *data, CC_LONG len, unsigned char *md)
    188 API_AVAILABLE(macos(10.4), ios(2.0));
    189 
    190 
    191 /*** SHA256 ***/
    192 
    193 #define CC_SHA256_DIGEST_LENGTH     32          /* digest length in bytes */
    194 #define CC_SHA256_BLOCK_BYTES       64          /* block size in bytes */
    195 
    196 extern int CC_SHA256_Init(CC_SHA256_CTX *c)
    197 API_AVAILABLE(macos(10.4), ios(2.0));
    198 
    199 extern int CC_SHA256_Update(CC_SHA256_CTX *c, const void *data, CC_LONG len)
    200 API_AVAILABLE(macos(10.4), ios(2.0));
    201 
    202 extern int CC_SHA256_Final(unsigned char *md, CC_SHA256_CTX *c)
    203 API_AVAILABLE(macos(10.4), ios(2.0));
    204 
    205 extern unsigned char *CC_SHA256(const void *data, CC_LONG len, unsigned char *md)
    206 API_AVAILABLE(macos(10.4), ios(2.0));
    207 
    208 
    209 /*** SHA384 ***/
    210 
    211 #define CC_SHA384_DIGEST_LENGTH     48          /* digest length in bytes */
    212 #define CC_SHA384_BLOCK_BYTES      128          /* block size in bytes */
    213 
    214 /* same context struct is used for SHA384 and SHA512 */
    215 typedef struct CC_SHA512state_st
    216 {   CC_LONG64 count[2];
    217     CC_LONG64 hash[8];
    218     CC_LONG64 wbuf[16];
    219 } CC_SHA512_CTX;
    220 
    221 extern int CC_SHA384_Init(CC_SHA512_CTX *c)
    222 API_AVAILABLE(macos(10.4), ios(2.0));
    223 
    224 extern int CC_SHA384_Update(CC_SHA512_CTX *c, const void *data, CC_LONG len)
    225 API_AVAILABLE(macos(10.4), ios(2.0));
    226 
    227 extern int CC_SHA384_Final(unsigned char *md, CC_SHA512_CTX *c)
    228 API_AVAILABLE(macos(10.4), ios(2.0));
    229 
    230 extern unsigned char *CC_SHA384(const void *data, CC_LONG len, unsigned char *md)
    231 API_AVAILABLE(macos(10.4), ios(2.0));
    232 
    233 
    234 /*** SHA512 ***/
    235 
    236 #define CC_SHA512_DIGEST_LENGTH     64          /* digest length in bytes */
    237 #define CC_SHA512_BLOCK_BYTES      128          /* block size in bytes */
    238 
    239 extern int CC_SHA512_Init(CC_SHA512_CTX *c)
    240 API_AVAILABLE(macos(10.4), ios(2.0));
    241 
    242 extern int CC_SHA512_Update(CC_SHA512_CTX *c, const void *data, CC_LONG len)
    243 API_AVAILABLE(macos(10.4), ios(2.0));
    244 
    245 extern int CC_SHA512_Final(unsigned char *md, CC_SHA512_CTX *c)
    246 API_AVAILABLE(macos(10.4), ios(2.0));
    247 
    248 extern unsigned char *CC_SHA512(const void *data, CC_LONG len, unsigned char *md)
    249 API_AVAILABLE(macos(10.4), ios(2.0));
    250 
    251 /*
    252  * To use the above digest functions with existing code which uses
    253  * the corresponding openssl functions, #define the symbol
    254  * COMMON_DIGEST_FOR_OPENSSL in your client code (BEFORE including
    255  * this file), and simply link against libSystem (or System.framework)
    256  * instead of libcrypto.
    257  *
    258  * You can *NOT* mix and match functions operating on a given data
    259  * type from the two implementations; i.e., if you do a CC_MD5_Init()
    260  * on a CC_MD5_CTX object, do not assume that you can do an openssl-style
    261  * MD5_Update() on that same context.
    262  */
    263 
    264 #ifdef  COMMON_DIGEST_FOR_OPENSSL
    265 
    266 #define MD2_DIGEST_LENGTH           CC_MD2_DIGEST_LENGTH
    267 #define MD2_CTX                     CC_MD2_CTX
    268 #define MD2_Init                    CC_MD2_Init
    269 #define MD2_Update                  CC_MD2_Update
    270 #define MD2_Final                   CC_MD2_Final
    271 
    272 #define MD4_DIGEST_LENGTH           CC_MD4_DIGEST_LENGTH
    273 #define MD4_CTX                     CC_MD4_CTX
    274 #define MD4_Init                    CC_MD4_Init
    275 #define MD4_Update                  CC_MD4_Update
    276 #define MD4_Final                   CC_MD4_Final
    277 
    278 #define MD5_DIGEST_LENGTH           CC_MD5_DIGEST_LENGTH
    279 #define MD5_CTX                     CC_MD5_CTX
    280 #define MD5_Init                    CC_MD5_Init
    281 #define MD5_Update                  CC_MD5_Update
    282 #define MD5_Final                   CC_MD5_Final
    283 
    284 #define SHA_DIGEST_LENGTH           CC_SHA1_DIGEST_LENGTH
    285 #define SHA_CTX                     CC_SHA1_CTX
    286 #define SHA1_Init                   CC_SHA1_Init
    287 #define SHA1_Update                 CC_SHA1_Update
    288 #define SHA1_Final                  CC_SHA1_Final
    289 
    290 #define SHA224_DIGEST_LENGTH        CC_SHA224_DIGEST_LENGTH
    291 #define SHA256_CTX                  CC_SHA256_CTX
    292 #define SHA224_Init                 CC_SHA224_Init
    293 #define SHA224_Update               CC_SHA224_Update
    294 #define SHA224_Final                CC_SHA224_Final
    295 
    296 #define SHA256_DIGEST_LENGTH        CC_SHA256_DIGEST_LENGTH
    297 #define SHA256_Init                 CC_SHA256_Init
    298 #define SHA256_Update               CC_SHA256_Update
    299 #define SHA256_Final                CC_SHA256_Final
    300 
    301 #define SHA384_DIGEST_LENGTH        CC_SHA384_DIGEST_LENGTH
    302 #define SHA512_CTX                  CC_SHA512_CTX
    303 #define SHA384_Init                 CC_SHA384_Init
    304 #define SHA384_Update               CC_SHA384_Update
    305 #define SHA384_Final                CC_SHA384_Final
    306 
    307 #define SHA512_DIGEST_LENGTH        CC_SHA512_DIGEST_LENGTH
    308 #define SHA512_Init                 CC_SHA512_Init
    309 #define SHA512_Update               CC_SHA512_Update
    310 #define SHA512_Final                CC_SHA512_Final
    311 
    312 
    313 #endif  /* COMMON_DIGEST_FOR_OPENSSL */
    314 
    315 /*
    316  * In a manner similar to that described above for openssl
    317  * compatibility, these macros can be used to provide compatiblity
    318  * with legacy implementations of MD5 using the interface defined
    319  * in RFC 1321.
    320  */
    321 
    322 #ifdef  COMMON_DIGEST_FOR_RFC_1321
    323 
    324 #define MD5_CTX                     CC_MD5_CTX
    325 #define MD5Init                     CC_MD5_Init
    326 #define MD5Update                   CC_MD5_Update
    327 
    328 void MD5Final (unsigned char [16], MD5_CTX *)
    329 API_DEPRECATED(CC_DIGEST_DEPRECATION_WARNING, macos(10.4, 10.15), ios(2.0, 13.0));
    330 
    331 #endif  /* COMMON_DIGEST_FOR_RFC_1321 */
    332 
    333 #ifdef __cplusplus
    334 }
    335 #endif
    336 
    337 #endif  /* _CC_COMMON_DIGEST_H_ */