UNPKG

f5stegojs

Version:

JPEG steganography for browser and node. F5 algo in pure javascript.

2 lines 4.7 kB
/*! f5stegojs v0.1.2 | MIT license | https://github.com/desudesutalk/f5stegojs#readme */ function f5extract(a,b){"use strict";function c(a){var b,c;for(b=1;b<a.length;b++)c=l[b]%(b+1),c!=b&&(j=a[b],a[b]=a[c],a[c]=j);return new Uint8Array(k,4*a.length)}function d(a){for(var b,d=-1,e=0,f=a.length-1,g=c(a),h=0,i=0,j=new Uint8Array(a.length/8|0),k=0,l=0,m=0,n=0,o=0;m<4;)d++,0!==a[d]&&(e=1&a[d],a[d]<0&&(e=1-e),i|=e<<m,m++);if(i=(i^15&g[h++])+1,b=(1<<i)-1,m=0,1==i)for(;d<f;)d++,0!==a[d]&&(e=1&a[d],a[d]<0&&(e=1-e),k|=e<<m,m++,8==m&&(j[l++]=k^g[h++],k=0,m=0));else for(;d<f;)if(d++,0!==a[d]&&(e=1&a[d],a[d]<0&&(e=1-e),o^=e*++n,n==b))for(k|=o<<m,m+=i,n=0,o=0;m>=8;)j[l++]=255&k^g[h++],m-=8,k>>=8;for(;m>0;)j[l++]=255&k^g[h++],m-=8,k>>=8;var p=2,q=j[0];return 128&j[1]?(p++,q+=((127&j[1])<<8)+(j[2]<<15)):q+=j[1]<<8,j.subarray(p,p+q)}function e(a,b){for(var c=0,d=0,e=new Uint16Array(65536),f=0;f<16;f++){for(var g=0;g<a[f];g++){for(var h=c<<15-f,i=c+1<<15-f;h<i;h++)e[h]=b[d]+(f+1<<8);d++,c++}c*=2}return e}function f(a,b,c,d,e,f,g,h,i){function j(c){for(;u<16;)t=(t<<8)+(0|a[b]),u+=8,255==a[b]&&b++,b++;if(c=c[t>>>u-16&65535],!c)throw"invalid huffman sequence";return u-=c>>>8,255&c}function k(c){for(;u<c;)t=(t<<8)+a[b++],255==(255&t)&&b++,u+=8;var d=t>>u-c&(1<<c)-1;return u-=c,d<1<<c-1&&(d+=(-1<<c)+1),d}function l(c){for(;u<c;)t=(t<<8)+a[b++],255==(255&t)&&b++,u+=8;var d=t>>>u-c&(1<<c)-1;return u-=c,d}function m(){return u||(t=a[b++],255==t&&b++,u=8),t>>>--u&1}function n(a,b){var c=j(a.a),d=0;0!==c&&(d=k(c)),a.b+=d;for(var e,f,g=1;g<64;)if(e=j(a.c),f=e>>4,e&=15,0!==e)g+=f,a.d[b+g]=k(e),g++;else{if(f<15)break;g+=16}}function o(a){var b=0,c=j(a.a);0!==c&&(b=k(c)),a.b+=b<<i}function p(a,b){if(v>0)return void v--;for(var c,d,e=f;e<=g;)if(c=j(a.c),d=c>>4,c&=15,0!==c)e+=d,a.d[b+e]=k(c)*w,e++;else{if(15!=d){v=(1<<d)-1,d&&(v+=l(d));break}e+=16}}function q(a,b){var c,d,e=f;if(!v)for(;e<=g;){if(d=j(a.c),c=d>>4,d&=15){if(1!=d)throw"bad jpeg";d=m()?w:x}else if(15!=c){v=1<<c,c&&(v+=l(c));break}for(;e<=g;){if(a.d[b+e])a.d[b+e]+=m()*(a.d[b+e]>=0?w:x);else if(--c<0)break;e++}d&&(a.d[b+e]=d),e++}if(v){for(;e<=g;)a.d[b+e]&&(a.d[b+e]+=m()*(a.d[b+e]>=0?w:x)),e++;v--}}var r,s=b,t=0,u=0,v=0,w=1<<i,x=-1<<i;r=c.e?0===f?0===h?o:m:0===h?p:q:n;var y,z,A,B,C,D,E,F,G,H;if(1==d.length)for(E=d[0].f,F=d[0].g,z=F*E,e||(e=z),D=e,d[0].b=0,v=0,H=0;H<F;H++)for(G=0;G<E;G++){if(!D){if(D=e,d[0].b=0,v=0,b-=u/8|0,255==a[b-1]&&b--,u=0,y=a[b]<<8|a[b+1],!(y>=65488&&y<=65495)){if(y<=65280)throw"bad jpeg";break}b+=2}for(D--,A=0;A<d.length;A++)r(d[A],64*(H*d[A].h+G))}else{for(E=c.i,F=c.j,z=F*E,e||(e=z),D=e,A=0;A<d.length;A++)d[A].b=0;for(v=0,H=0;H<F;H++)for(G=0;G<E;G++){if(!D){for(D=e,A=0;A<d.length;A++)d[A].b=0;if(v=0,b-=u/8|0,255==a[b-1]&&b--,u=0,y=a[b]<<8|a[b+1],!(y>=65488&&y<=65495)){if(y<=65280)throw"bad jpeg";break}b+=2}for(D--,A=0;A<d.length;A++)for(B=0;B<d[A].k;B++)for(C=0;C<d[A].l;C++)r(d[A],64*((H*d[A].k+B)*d[A].h+G*d[A].l+C))}}return b-=u/8|0,255==a[b-1]&&b--,b-s}function g(a){function c(){var b=a[n]<<8|a[n+1];return n+=2,b}for(var g,j,k,l,m,n=0,o=[],p=[];;){if(n>=a.length)throw"unexpected EOF";if(j=a[n++],k=a[n++],255==j){if((k>=224&&k<240||254==k||219==k)&&(n+=c()),k>=192&&k<=194){if(g)throw"Only single frame JPEGs supported";if(g={},c(),n++,g.e=194===k,g.m=c(),g.n=c(),g.o=[],g.p={},g.m*g.n>b)throw"Image is too big.";var q,r=a[n++],s=0,t=0;for(h=0;h<r;h++){q=a[n];var u=a[n+1]>>4,v=15&a[n+1];s<u&&(s=u),t<v&&(t=v),g.p[q]=g.o.push({q:q,l:u,k:v})-1,n+=3}g.r=s,g.s=t;var w=Math.ceil(g.n/8/s),x=Math.ceil(g.m/8/t);for(h=0;h<g.o.length;h++){m=g.o[h];var y=Math.ceil(Math.ceil(g.n/8)*m.l/s),z=Math.ceil(Math.ceil(g.m/8)*m.k/t),A=w*m.l,B=x*m.k;m.d=new Int16Array(64*B*A),m.f=y,m.g=z,m.h=A,m.t=B}g.i=w,g.j=x}if(196==k){var C=c();for(h=2;h<C;){var D=a[n++],E=new Uint8Array(16),F=0;for(i=0;i<16;i++,n++)F+=E[i]=a[n];var G=new Uint8Array(F);for(i=0;i<F;i++,n++)G[i]=a[n];h+=17+F,(D>>4===0?p:o)[15&D]=e(E,G)}}if(221==k&&(l=c()),218==k){if(!g)throw"bad jpeg";c();var H=a[n++],I=[];for(h=0;h<H;h++){var J=g.p[a[n++]];m=g.o[J];var K=a[n++];m.a=p[K>>4],m.c=o[15&K],I.push(m)}var L=a[n++],M=a[n++],N=a[n++];n+=f(a,n,g,I,l,L,M,N>>4,15&N)}if(217==k)break}else{for(255==a[n-3]&&a[n-2]>=192&&a[n-2]<=254&&(n-=3);255!=a[n]&&n<a.length;)n++;if(255!=a[n])throw"bad jpeg "}}if(!g)throw"bad jpeg";if(m=g.o[0],1!=m.q)for(h=0;h<g.o.length;h++)if(1==g.o[h].q){m=g.o[h];break}return d(m.d)}b=b||16777216;var h,i,j,k=new ArrayBuffer(4.125*b),l=new Uint32Array(k),m=0,n=new Uint8Array(256),o=new Uint8Array(k);for(h=0,i=0,j=0,h=0;h<256;++h)n[h]=h;for(h=0;h<256;++h)i=i+n[h]+a[h%a.length]&255,j=n[h],n[h]=n[i],n[i]=j;for(h=0,i=0,m=0;m<4.125*b;++m)h=h+1&255,i=i+n[h]&255,j=n[h],n[h]=n[i],n[i]=j,o[m]=n[j+n[h]&255];return g}