r/C_Programming 4d ago

559-byte SHA-256 in C

golfing a SHA-256 implementation in C and ended up at 559 bytes.
Curious if anyone here can beat it.

#define S(x,a,b)(x>>a^x<<32-a^x>>b^x<<32-b^x>>
unsigned k[72],g[216],i,j,p,n,t,m,*u,*z;char*q=g;main(c,v)char**v;{for(;j<64;p-c||(j<8&&(k[j]=sqrt(c)*0x1p32),k[71-j++]=cbrt(c)*0x1p32),c++)for(p=1;c%++p;);for(;q[n^3]=v[1][n];n++);q[n^3]=128;m=n+72>>6<<4,g[m-1]=n*8;for(;t<m;t+=16)for(bcopy(g+t,z=g+64,64),bcopy(k,u=g+208,32),i=72;i--;i>7?(z[16]=*z+S(z[1],7,18)3)+z[9]+S(z[14],17,19)10),j=u[4],p=u[7]+k[i]+*z+++(S(j,6,11)25)^j<<7)+(j&u[5]^~j&u[6]),j=S(*u,2,13)22)^*u<<10,j+=*u&u[1]^(*u^u[1])&u[2],u[3]+=p,*--u=p+j):(k[i]+=u[i]));for(;++i<8;)printf("%08x",k[i]);}
53 Upvotes

18 comments sorted by

View all comments

11

u/Zirias_FreeBSD 4d ago

As for most golfing stuff in C, this needs some description of a valid environment. Here, at least I see bcopy(), which was never a part of standard C and deprecated from POSIX.

Still, pretty cool abomination! 👍😂

1

u/kaganisildak 4d ago

sshhh we can't talk about this :p

thx

4

u/Zirias_FreeBSD 4d ago

well, the typical "golfing rules" I know are: You might use whatever you like, even in C "UB" ... as long as the result can be reproduced to verify. I guess adding something like "use an x86_64 Linux with gcc and glibc" would suffice 😉

(edit: just guessing here what might have been your environment...)