1*7c2fbfb3SApril Chin /*********************************************************************** 2*7c2fbfb3SApril Chin * * 3*7c2fbfb3SApril Chin * This software is part of the ast package * 4*7c2fbfb3SApril Chin * Copyright (c) 1996-2008 AT&T Intellectual Property * 5*7c2fbfb3SApril Chin * and is licensed under the * 6*7c2fbfb3SApril Chin * Common Public License, Version 1.0 * 7*7c2fbfb3SApril Chin * by AT&T Intellectual Property * 8*7c2fbfb3SApril Chin * * 9*7c2fbfb3SApril Chin * A copy of the License is available at * 10*7c2fbfb3SApril Chin * http://www.opensource.org/licenses/cpl1.0.txt * 11*7c2fbfb3SApril Chin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12*7c2fbfb3SApril Chin * * 13*7c2fbfb3SApril Chin * Information and Software Systems Research * 14*7c2fbfb3SApril Chin * AT&T Research * 15*7c2fbfb3SApril Chin * Florham Park NJ * 16*7c2fbfb3SApril Chin * * 17*7c2fbfb3SApril Chin * Glenn Fowler <gsf@research.att.com> * 18*7c2fbfb3SApril Chin * * 19*7c2fbfb3SApril Chin ***********************************************************************/ 20*7c2fbfb3SApril Chin #pragma prototyped 21*7c2fbfb3SApril Chin 22*7c2fbfb3SApril Chin /* 23*7c2fbfb3SApril Chin * sum(3) wrapper for solaris -lmd message digest library 24*7c2fbfb3SApril Chin */ 25*7c2fbfb3SApril Chin 26*7c2fbfb3SApril Chin typedef void (*Lmd_init_f)(void*); 27*7c2fbfb3SApril Chin typedef void (*Lmd_update_f)(void*, const void*, size_t); 28*7c2fbfb3SApril Chin typedef void (*Lmd_final_f)(unsigned char*, void*); 29*7c2fbfb3SApril Chin 30*7c2fbfb3SApril Chin #define _SUM_LMD_ \ 31*7c2fbfb3SApril Chin _SUM_PUBLIC_ \ 32*7c2fbfb3SApril Chin _SUM_PRIVATE_ \ 33*7c2fbfb3SApril Chin Lmd_init_f initf; \ 34*7c2fbfb3SApril Chin Lmd_update_f updatef; \ 35*7c2fbfb3SApril Chin Lmd_final_f finalf; \ 36*7c2fbfb3SApril Chin unsigned int datasize; \ 37*7c2fbfb3SApril Chin unsigned char total[64]; \ 38*7c2fbfb3SApril Chin unsigned char data[64]; 39*7c2fbfb3SApril Chin 40*7c2fbfb3SApril Chin typedef struct Lmd_s 41*7c2fbfb3SApril Chin { 42*7c2fbfb3SApril Chin _SUM_LMD_ 43*7c2fbfb3SApril Chin struct 44*7c2fbfb3SApril Chin { 45*7c2fbfb3SApril Chin uintmax_t context; 46*7c2fbfb3SApril Chin } context; 47*7c2fbfb3SApril Chin } Lmd_t; 48*7c2fbfb3SApril Chin 49*7c2fbfb3SApril Chin static int 50*7c2fbfb3SApril Chin lmd_init(Sum_t* p) 51*7c2fbfb3SApril Chin { 52*7c2fbfb3SApril Chin Lmd_t* lmd = (Lmd_t*)p; 53*7c2fbfb3SApril Chin 54*7c2fbfb3SApril Chin (*lmd->initf)(&lmd->context); 55*7c2fbfb3SApril Chin return 0; 56*7c2fbfb3SApril Chin } 57*7c2fbfb3SApril Chin 58*7c2fbfb3SApril Chin static int 59*7c2fbfb3SApril Chin lmd_block(Sum_t* p, const void* s, size_t n) 60*7c2fbfb3SApril Chin { 61*7c2fbfb3SApril Chin Lmd_t* lmd = (Lmd_t*)p; 62*7c2fbfb3SApril Chin 63*7c2fbfb3SApril Chin (*lmd->updatef)(&lmd->context, s, n); 64*7c2fbfb3SApril Chin return 0; 65*7c2fbfb3SApril Chin } 66*7c2fbfb3SApril Chin 67*7c2fbfb3SApril Chin static int 68*7c2fbfb3SApril Chin lmd_done(Sum_t* p) 69*7c2fbfb3SApril Chin { 70*7c2fbfb3SApril Chin register Lmd_t* lmd = (Lmd_t*)p; 71*7c2fbfb3SApril Chin register int i; 72*7c2fbfb3SApril Chin 73*7c2fbfb3SApril Chin (*lmd->finalf)(lmd->data, &lmd->context); 74*7c2fbfb3SApril Chin for (i = 0; i < lmd->datasize; i++) 75*7c2fbfb3SApril Chin lmd->total[i] ^= lmd->data[i]; 76*7c2fbfb3SApril Chin return 0; 77*7c2fbfb3SApril Chin } 78*7c2fbfb3SApril Chin 79*7c2fbfb3SApril Chin static int 80*7c2fbfb3SApril Chin lmd_print(Sum_t* p, Sfio_t* sp, register int flags, size_t scale) 81*7c2fbfb3SApril Chin { 82*7c2fbfb3SApril Chin register Lmd_t* lmd = (Lmd_t*)p; 83*7c2fbfb3SApril Chin register unsigned char* d; 84*7c2fbfb3SApril Chin register int i; 85*7c2fbfb3SApril Chin 86*7c2fbfb3SApril Chin d = (flags & SUM_TOTAL) ? lmd->total : lmd->data; 87*7c2fbfb3SApril Chin for (i = 0; i < lmd->datasize; i++) 88*7c2fbfb3SApril Chin sfprintf(sp, "%02x", d[i]); 89*7c2fbfb3SApril Chin return 0; 90*7c2fbfb3SApril Chin } 91*7c2fbfb3SApril Chin 92*7c2fbfb3SApril Chin static int 93*7c2fbfb3SApril Chin lmd_data(Sum_t* p, Sumdata_t* data) 94*7c2fbfb3SApril Chin { 95*7c2fbfb3SApril Chin Lmd_t* lmd = (Lmd_t*)p; 96*7c2fbfb3SApril Chin 97*7c2fbfb3SApril Chin data->size = lmd->datasize; 98*7c2fbfb3SApril Chin data->num = 0; 99*7c2fbfb3SApril Chin data->buf = lmd->data; 100*7c2fbfb3SApril Chin return 0; 101*7c2fbfb3SApril Chin } 102*7c2fbfb3SApril Chin 103*7c2fbfb3SApril Chin #if _lib_MD4Init && _hdr_md4 104*7c2fbfb3SApril Chin 105*7c2fbfb3SApril Chin #include <md4.h> 106*7c2fbfb3SApril Chin 107*7c2fbfb3SApril Chin #define md4_description "RFC1320 MD4 message digest. Cryptographically weak. The block count is not printed." 108*7c2fbfb3SApril Chin #define md4_options "[+(version)?md4 (solaris -lmd) 2005-07-26]" 109*7c2fbfb3SApril Chin #define md4_match "md4|MD4" 110*7c2fbfb3SApril Chin #define md4_scale 0 111*7c2fbfb3SApril Chin #define md4_init lmd_init 112*7c2fbfb3SApril Chin #define md4_block lmd_block 113*7c2fbfb3SApril Chin #define md4_done lmd_done 114*7c2fbfb3SApril Chin #define md4_print lmd_print 115*7c2fbfb3SApril Chin #define md4_data lmd_data 116*7c2fbfb3SApril Chin 117*7c2fbfb3SApril Chin typedef struct Md4_s 118*7c2fbfb3SApril Chin { 119*7c2fbfb3SApril Chin _SUM_LMD_ 120*7c2fbfb3SApril Chin MD4_CTX context; 121*7c2fbfb3SApril Chin } Md4_t; 122*7c2fbfb3SApril Chin 123*7c2fbfb3SApril Chin static Sum_t* 124*7c2fbfb3SApril Chin md4_open(const Method_t* method, const char* name) 125*7c2fbfb3SApril Chin { 126*7c2fbfb3SApril Chin Md4_t* lmd; 127*7c2fbfb3SApril Chin 128*7c2fbfb3SApril Chin if (lmd = newof(0, Md4_t, 1, 0)) 129*7c2fbfb3SApril Chin { 130*7c2fbfb3SApril Chin lmd->method = (Method_t*)method; 131*7c2fbfb3SApril Chin lmd->name = name; 132*7c2fbfb3SApril Chin lmd->datasize = 16; 133*7c2fbfb3SApril Chin lmd->initf = (Lmd_init_f)MD4Init; 134*7c2fbfb3SApril Chin lmd->updatef = (Lmd_update_f)MD4Update; 135*7c2fbfb3SApril Chin lmd->finalf = (Lmd_final_f)MD4Final; 136*7c2fbfb3SApril Chin md4_init((Sum_t*)lmd); 137*7c2fbfb3SApril Chin } 138*7c2fbfb3SApril Chin return (Sum_t*)lmd; 139*7c2fbfb3SApril Chin } 140*7c2fbfb3SApril Chin 141*7c2fbfb3SApril Chin #endif 142*7c2fbfb3SApril Chin 143*7c2fbfb3SApril Chin #if _lib_MD5Init && _hdr_md5 144*7c2fbfb3SApril Chin 145*7c2fbfb3SApril Chin #include <md5.h> 146*7c2fbfb3SApril Chin 147*7c2fbfb3SApril Chin #define md5_description "RFC1321 MD5 message digest. Cryptographically weak. The block count is not printed." 148*7c2fbfb3SApril Chin #define md5_options "[+(version)?md5 (solaris -lmd) 2005-07-26]" 149*7c2fbfb3SApril Chin #define md5_match "md5|MD5" 150*7c2fbfb3SApril Chin #define md5_scale 0 151*7c2fbfb3SApril Chin #define md5_init lmd_init 152*7c2fbfb3SApril Chin #define md5_block lmd_block 153*7c2fbfb3SApril Chin #define md5_done lmd_done 154*7c2fbfb3SApril Chin #define md5_print lmd_print 155*7c2fbfb3SApril Chin #define md5_data lmd_data 156*7c2fbfb3SApril Chin 157*7c2fbfb3SApril Chin typedef struct Md5_s 158*7c2fbfb3SApril Chin { 159*7c2fbfb3SApril Chin _SUM_LMD_ 160*7c2fbfb3SApril Chin MD5_CTX context; 161*7c2fbfb3SApril Chin } Md5_t; 162*7c2fbfb3SApril Chin 163*7c2fbfb3SApril Chin static Sum_t* 164*7c2fbfb3SApril Chin md5_open(const Method_t* method, const char* name) 165*7c2fbfb3SApril Chin { 166*7c2fbfb3SApril Chin Md5_t* lmd; 167*7c2fbfb3SApril Chin 168*7c2fbfb3SApril Chin if (lmd = newof(0, Md5_t, 1, 0)) 169*7c2fbfb3SApril Chin { 170*7c2fbfb3SApril Chin lmd->method = (Method_t*)method; 171*7c2fbfb3SApril Chin lmd->name = name; 172*7c2fbfb3SApril Chin lmd->datasize = 16; 173*7c2fbfb3SApril Chin lmd->initf = (Lmd_init_f)MD5Init; 174*7c2fbfb3SApril Chin lmd->updatef = (Lmd_update_f)MD5Update; 175*7c2fbfb3SApril Chin lmd->finalf = (Lmd_final_f)MD5Final; 176*7c2fbfb3SApril Chin md5_init((Sum_t*)lmd); 177*7c2fbfb3SApril Chin } 178*7c2fbfb3SApril Chin return (Sum_t*)lmd; 179*7c2fbfb3SApril Chin } 180*7c2fbfb3SApril Chin 181*7c2fbfb3SApril Chin #endif 182*7c2fbfb3SApril Chin 183*7c2fbfb3SApril Chin #if _lib_SHA1Init && _hdr_sha1 184*7c2fbfb3SApril Chin 185*7c2fbfb3SApril Chin #include <sha1.h> 186*7c2fbfb3SApril Chin 187*7c2fbfb3SApril Chin #define sha1_description "RFC3174 / FIPS 180-1 SHA-1 secure hash algorithm 1. Cryptographically weak. The block count is not printed." 188*7c2fbfb3SApril Chin #define sha1_options "[+(version)?sha1 (solaris -lmd) 2005-07-26]" 189*7c2fbfb3SApril Chin #define sha1_match "sha1|SHA1|sha-1|SHA-1" 190*7c2fbfb3SApril Chin #define sha1_scale 0 191*7c2fbfb3SApril Chin #define sha1_init lmd_init 192*7c2fbfb3SApril Chin #define sha1_block lmd_block 193*7c2fbfb3SApril Chin #define sha1_done lmd_done 194*7c2fbfb3SApril Chin #define sha1_print lmd_print 195*7c2fbfb3SApril Chin #define sha1_data lmd_data 196*7c2fbfb3SApril Chin 197*7c2fbfb3SApril Chin typedef struct Sha1_s 198*7c2fbfb3SApril Chin { 199*7c2fbfb3SApril Chin _SUM_LMD_ 200*7c2fbfb3SApril Chin SHA1_CTX context; 201*7c2fbfb3SApril Chin unsigned char pad[1024]; /* XXX: who's bug is it? */ 202*7c2fbfb3SApril Chin } Sha1_t; 203*7c2fbfb3SApril Chin 204*7c2fbfb3SApril Chin static Sum_t* 205*7c2fbfb3SApril Chin sha1_open(const Method_t* method, const char* name) 206*7c2fbfb3SApril Chin { 207*7c2fbfb3SApril Chin Sha1_t* lmd; 208*7c2fbfb3SApril Chin 209*7c2fbfb3SApril Chin if (lmd = newof(0, Sha1_t, 1, 0)) 210*7c2fbfb3SApril Chin { 211*7c2fbfb3SApril Chin lmd->method = (Method_t*)method; 212*7c2fbfb3SApril Chin lmd->name = name; 213*7c2fbfb3SApril Chin lmd->datasize = 20; 214*7c2fbfb3SApril Chin lmd->initf = (Lmd_init_f)SHA1Init; 215*7c2fbfb3SApril Chin lmd->updatef = (Lmd_update_f)SHA1Update; 216*7c2fbfb3SApril Chin lmd->finalf = (Lmd_final_f)SHA1Final; 217*7c2fbfb3SApril Chin sha1_init((Sum_t*)lmd); 218*7c2fbfb3SApril Chin } 219*7c2fbfb3SApril Chin return (Sum_t*)lmd; 220*7c2fbfb3SApril Chin } 221*7c2fbfb3SApril Chin 222*7c2fbfb3SApril Chin #endif 223*7c2fbfb3SApril Chin 224*7c2fbfb3SApril Chin #if _lib_SHA2Init && _hdr_sha2 225*7c2fbfb3SApril Chin 226*7c2fbfb3SApril Chin #include <sha2.h> 227*7c2fbfb3SApril Chin 228*7c2fbfb3SApril Chin #define sha256_description "FIPS 180-2 SHA256 secure hash algorithm. The block count is not printed." 229*7c2fbfb3SApril Chin #define sha256_options "[+(version)?sha256 (solaris -lmd) 2005-07-26]" 230*7c2fbfb3SApril Chin #define sha256_match "sha256|sha-256|SHA256|SHA-256" 231*7c2fbfb3SApril Chin #define sha256_scale 0 232*7c2fbfb3SApril Chin #define sha256_init lmd_init 233*7c2fbfb3SApril Chin #define sha256_block lmd_block 234*7c2fbfb3SApril Chin #define sha256_done lmd_done 235*7c2fbfb3SApril Chin #define sha256_print lmd_print 236*7c2fbfb3SApril Chin #define sha256_data lmd_data 237*7c2fbfb3SApril Chin 238*7c2fbfb3SApril Chin typedef struct Sha256_s 239*7c2fbfb3SApril Chin { 240*7c2fbfb3SApril Chin _SUM_LMD_ 241*7c2fbfb3SApril Chin SHA256_CTX context; 242*7c2fbfb3SApril Chin } Sha256_t; 243*7c2fbfb3SApril Chin 244*7c2fbfb3SApril Chin static Sum_t* 245*7c2fbfb3SApril Chin sha256_open(const Method_t* method, const char* name) 246*7c2fbfb3SApril Chin { 247*7c2fbfb3SApril Chin Sha256_t* lmd; 248*7c2fbfb3SApril Chin 249*7c2fbfb3SApril Chin if (lmd = newof(0, Sha256_t, 1, 0)) 250*7c2fbfb3SApril Chin { 251*7c2fbfb3SApril Chin lmd->method = (Method_t*)method; 252*7c2fbfb3SApril Chin lmd->name = name; 253*7c2fbfb3SApril Chin lmd->datasize = 32; 254*7c2fbfb3SApril Chin lmd->initf = (Lmd_init_f)SHA256Init; 255*7c2fbfb3SApril Chin lmd->updatef = (Lmd_update_f)SHA256Update; 256*7c2fbfb3SApril Chin lmd->finalf = (Lmd_final_f)SHA256Final; 257*7c2fbfb3SApril Chin sha256_init((Sum_t*)lmd); 258*7c2fbfb3SApril Chin } 259*7c2fbfb3SApril Chin return (Sum_t*)lmd; 260*7c2fbfb3SApril Chin } 261*7c2fbfb3SApril Chin 262*7c2fbfb3SApril Chin #define sha384_description "FIPS 180-2 SHA384 secure hash algorithm. The block count is not printed." 263*7c2fbfb3SApril Chin #define sha384_options "[+(version)?sha384 (solaris -lmd) 2005-07-26]" 264*7c2fbfb3SApril Chin #define sha384_match "sha384|sha-384|SHA384|SHA-384" 265*7c2fbfb3SApril Chin #define sha384_scale 0 266*7c2fbfb3SApril Chin #define sha384_init lmd_init 267*7c2fbfb3SApril Chin #define sha384_block lmd_block 268*7c2fbfb3SApril Chin #define sha384_done lmd_done 269*7c2fbfb3SApril Chin #define sha384_print lmd_print 270*7c2fbfb3SApril Chin #define sha384_data lmd_data 271*7c2fbfb3SApril Chin 272*7c2fbfb3SApril Chin typedef struct Sha384_s 273*7c2fbfb3SApril Chin { 274*7c2fbfb3SApril Chin _SUM_LMD_ 275*7c2fbfb3SApril Chin SHA384_CTX context; 276*7c2fbfb3SApril Chin } Sha384_t; 277*7c2fbfb3SApril Chin 278*7c2fbfb3SApril Chin static Sum_t* 279*7c2fbfb3SApril Chin sha384_open(const Method_t* method, const char* name) 280*7c2fbfb3SApril Chin { 281*7c2fbfb3SApril Chin Sha384_t* lmd; 282*7c2fbfb3SApril Chin 283*7c2fbfb3SApril Chin if (lmd = newof(0, Sha384_t, 1, 0)) 284*7c2fbfb3SApril Chin { 285*7c2fbfb3SApril Chin lmd->method = (Method_t*)method; 286*7c2fbfb3SApril Chin lmd->name = name; 287*7c2fbfb3SApril Chin lmd->datasize = 48; 288*7c2fbfb3SApril Chin lmd->initf = (Lmd_init_f)SHA384Init; 289*7c2fbfb3SApril Chin lmd->updatef = (Lmd_update_f)SHA384Update; 290*7c2fbfb3SApril Chin lmd->finalf = (Lmd_final_f)SHA384Final; 291*7c2fbfb3SApril Chin sha384_init((Sum_t*)lmd); 292*7c2fbfb3SApril Chin } 293*7c2fbfb3SApril Chin return (Sum_t*)lmd; 294*7c2fbfb3SApril Chin } 295*7c2fbfb3SApril Chin 296*7c2fbfb3SApril Chin #define sha512_description "FIPS 180-2 SHA512 secure hash algorithm. The block count is not printed." 297*7c2fbfb3SApril Chin #define sha512_options "[+(version)?sha512 (solaris -lmd) 2005-07-26]" 298*7c2fbfb3SApril Chin #define sha512_match "sha512|sha-512|SHA512|SHA-512" 299*7c2fbfb3SApril Chin #define sha512_scale 0 300*7c2fbfb3SApril Chin #define sha512_init lmd_init 301*7c2fbfb3SApril Chin #define sha512_block lmd_block 302*7c2fbfb3SApril Chin #define sha512_done lmd_done 303*7c2fbfb3SApril Chin #define sha512_print lmd_print 304*7c2fbfb3SApril Chin #define sha512_data lmd_data 305*7c2fbfb3SApril Chin 306*7c2fbfb3SApril Chin typedef struct Sha512_s 307*7c2fbfb3SApril Chin { 308*7c2fbfb3SApril Chin _SUM_LMD_ 309*7c2fbfb3SApril Chin SHA512_CTX context; 310*7c2fbfb3SApril Chin } Sha512_t; 311*7c2fbfb3SApril Chin 312*7c2fbfb3SApril Chin static Sum_t* 313*7c2fbfb3SApril Chin sha512_open(const Method_t* method, const char* name) 314*7c2fbfb3SApril Chin { 315*7c2fbfb3SApril Chin Sha512_t* lmd; 316*7c2fbfb3SApril Chin 317*7c2fbfb3SApril Chin if (lmd = newof(0, Sha512_t, 1, 0)) 318*7c2fbfb3SApril Chin { 319*7c2fbfb3SApril Chin lmd->method = (Method_t*)method; 320*7c2fbfb3SApril Chin lmd->name = name; 321*7c2fbfb3SApril Chin lmd->datasize = 64; 322*7c2fbfb3SApril Chin lmd->initf = (Lmd_init_f)SHA512Init; 323*7c2fbfb3SApril Chin lmd->updatef = (Lmd_update_f)SHA512Update; 324*7c2fbfb3SApril Chin lmd->finalf = (Lmd_final_f)SHA512Final; 325*7c2fbfb3SApril Chin sha512_init((Sum_t*)lmd); 326*7c2fbfb3SApril Chin } 327*7c2fbfb3SApril Chin return (Sum_t*)lmd; 328*7c2fbfb3SApril Chin } 329*7c2fbfb3SApril Chin 330*7c2fbfb3SApril Chin #endif 331