Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Path: blob/master/external/source/exploits/CVE-2017-13861/sha1.c
Views: 11780
1/* from valgrind tests */23/* ================ sha1.c ================ */4/*5SHA-1 in C6By Steve Reid <[email protected]>7100% Public Domain89Test Vectors (from FIPS PUB 180-1)10"abc"11A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D12"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"1384983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F114A million repetitions of "a"1534AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F16*/1718/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */19/* #define SHA1HANDSOFF * Copies data before messing with it. */2021#define SHA1HANDSOFF2223#include <stdio.h>24#include <string.h>25#include <sys/types.h> /* for u_int*_t */26#if defined(__sun)27#include "solarisfixes.h"28#endif29#include "sha1.h"3031#ifndef BYTE_ORDER32#if (BSD >= 199103)33# include <machine/endian.h>34#else35#if defined(linux) || defined(__linux__)36# include <endian.h>37#else38#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */39#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */40#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/4142#if defined(vax) || defined(ns32000) || defined(sun386) || defined(__i386__) || \43defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \44defined(__alpha__) || defined(__alpha)45#define BYTE_ORDER LITTLE_ENDIAN46#endif4748#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \49defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \50defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\51defined(apollo) || defined(__convex__) || defined(_CRAY) || \52defined(__hppa) || defined(__hp9000) || \53defined(__hp9000s300) || defined(__hp9000s700) || \54defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc)55#define BYTE_ORDER BIG_ENDIAN56#endif57#endif /* linux */58#endif /* BSD */59#endif /* BYTE_ORDER */6061#if defined(__BYTE_ORDER) && !defined(BYTE_ORDER)62#if (__BYTE_ORDER == __LITTLE_ENDIAN)63#define BYTE_ORDER LITTLE_ENDIAN64#else65#define BYTE_ORDER BIG_ENDIAN66#endif67#endif6869#if !defined(BYTE_ORDER) || \70(BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \71BYTE_ORDER != PDP_ENDIAN)72/* you must determine what the correct bit order is for73* your compiler - the next line is an intentional error74* which will force your compiles to bomb until you fix75* the above macros.76*/77#error "Undefined or invalid BYTE_ORDER"78#endif7980#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))8182/* blk0() and blk() perform the initial expand. */83/* I got the idea of expanding during the round function from SSLeay */84#if BYTE_ORDER == LITTLE_ENDIAN85#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \86|(rol(block->l[i],8)&0x00FF00FF))87#elif BYTE_ORDER == BIG_ENDIAN88#define blk0(i) block->l[i]89#else90#error "Endianness not defined!"91#endif92#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \93^block->l[(i+2)&15]^block->l[i&15],1))9495/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */96#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);97#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);98#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);99#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);100#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);101102103/* Hash a single 512-bit block. This is the core of the algorithm. */104105void SHA1Transform(u_int32_t state[5], const unsigned char buffer[64])106{107u_int32_t a, b, c, d, e;108typedef union {109unsigned char c[64];110u_int32_t l[16];111} CHAR64LONG16;112#ifdef SHA1HANDSOFF113CHAR64LONG16 block[1]; /* use array to appear as a pointer */114memcpy(block, buffer, 64);115#else116/* The following had better never be used because it causes the117* pointer-to-const buffer to be cast into a pointer to non-const.118* And the result is written through. I threw a "const" in, hoping119* this will cause a diagnostic.120*/121CHAR64LONG16* block = (const CHAR64LONG16*)buffer;122#endif123/* Copy context->state[] to working vars */124a = state[0];125b = state[1];126c = state[2];127d = state[3];128e = state[4];129/* 4 rounds of 20 operations each. Loop unrolled. */130R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);131R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);132R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);133R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);134R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);135R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);136R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);137R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);138R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);139R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);140R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);141R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);142R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);143R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);144R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);145R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);146R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);147R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);148R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);149R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);150/* Add the working vars back into context.state[] */151state[0] += a;152state[1] += b;153state[2] += c;154state[3] += d;155state[4] += e;156/* Wipe variables */157a = b = c = d = e = 0;158#ifdef SHA1HANDSOFF159memset(block, '\0', sizeof(block));160#endif161}162163164/* SHA1Init - Initialize new context */165166void SHA1Init(SHA1_CTX* context)167{168/* SHA1 initialization constants */169context->state[0] = 0x67452301;170context->state[1] = 0xEFCDAB89;171context->state[2] = 0x98BADCFE;172context->state[3] = 0x10325476;173context->state[4] = 0xC3D2E1F0;174context->count[0] = context->count[1] = 0;175}176177178/* Run your data through this. */179180void SHA1Update(SHA1_CTX* context, const unsigned char* data, u_int32_t len)181{182u_int32_t i;183u_int32_t j;184185j = context->count[0];186if ((context->count[0] += len << 3) < j)187context->count[1]++;188context->count[1] += (len>>29);189j = (j >> 3) & 63;190if ((j + len) > 63) {191memcpy(&context->buffer[j], data, (i = 64-j));192SHA1Transform(context->state, context->buffer);193for ( ; i + 63 < len; i += 64) {194SHA1Transform(context->state, &data[i]);195}196j = 0;197}198else i = 0;199memcpy(&context->buffer[j], &data[i], len - i);200}201202203/* Add padding and return the message digest. */204205void SHA1Final(unsigned char digest[20], SHA1_CTX* context)206{207unsigned i;208unsigned char finalcount[8];209unsigned char c;210211#if 0 /* untested "improvement" by DHR */212/* Convert context->count to a sequence of bytes213* in finalcount. Second element first, but214* big-endian order within element.215* But we do it all backwards.216*/217unsigned char *fcp = &finalcount[8];218219for (i = 0; i < 2; i++)220{221u_int32_t t = context->count[i];222int j;223224for (j = 0; j < 4; t >>= 8, j++)225*--fcp = (unsigned char) t226}227#else228for (i = 0; i < 8; i++) {229finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]230>> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */231}232#endif233c = 0200;234SHA1Update(context, &c, 1);235while ((context->count[0] & 504) != 448) {236c = 0000;237SHA1Update(context, &c, 1);238}239SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */240for (i = 0; i < 20; i++) {241digest[i] = (unsigned char)242((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);243}244/* Wipe variables */245memset(context, '\0', sizeof(*context));246memset(&finalcount, '\0', sizeof(finalcount));247}248/* ================ end of sha1.c ================ */249250#if 0251#define BUFSIZE 4096252253int254main(int argc, char **argv)255{256SHA1_CTX ctx;257unsigned char hash[20], buf[BUFSIZE];258int i;259260for(i=0;i<BUFSIZE;i++)261buf[i] = i;262263SHA1Init(&ctx);264for(i=0;i<1000;i++)265SHA1Update(&ctx, buf, BUFSIZE);266SHA1Final(hash, &ctx);267268printf("SHA1=");269for(i=0;i<20;i++)270printf("%02x", hash[i]);271printf("\n");272return 0;273}274275#endif276277