Handle case where input >256GiB
This commit is contained in:
parent
5c5ff31d0e
commit
a81707896b
3 changed files with 6 additions and 4 deletions
|
@ -5,6 +5,7 @@ add=lambda x,y:x+y&0xffffffff
|
|||
rotl=lambda x,n:x<<n&0xffffffff|x>>32-n
|
||||
def qr(a,b,c,d):a=add(a,b);d^=a;d=rotl(d,16);c=add(c,d);b^=c;b=rotl(b,12);a=add(a,b);d^=a;d=rotl(d,8);c=add(c,d);b^=c;b=rotl(b,7);return a,b,c,d
|
||||
def ccb(k,c,n,f):
|
||||
if c>=1<<32: raise ValueError
|
||||
s=[0x61707865,0x3320646e,0x79622d32,0x6b206574,u(k[:4]),u(k[4:8]),u(k[8:12]),u(k[12:16]),u(k[16:20]),u(k[20:24]),u(k[24:28]),u(k[28:]),c,u(n[:4]),u(n[4:8]),u(n[8:])]
|
||||
o=s[:]
|
||||
if f:o=[0]*16
|
||||
|
|
BIN
foo.sec
BIN
foo.sec
Binary file not shown.
|
@ -2,12 +2,14 @@
|
|||
import os
|
||||
import secrets
|
||||
import sys
|
||||
def pe(s):print(s,file=sys.stderr);sys.exit(1)
|
||||
q=lambda b:sum(b[i]<<(i*8)for i in range(len(b)))
|
||||
w=lambda n,l:bytes(n>>i&255 for i in range(0,l,8))
|
||||
add=lambda x,y:x+y&0xffffffff
|
||||
rl=lambda x,n:x<<n&0xffffffff|x>>32-n
|
||||
def qr(a,b,c,d):a=add(a,b);d^=a;d=rl(d,16);c=add(c,d);b^=c;b=rl(b,12);a=add(a,b);d^=a;d=rl(d,8);c=add(c,d);b^=c;b=rl(b,7);return a,b,c,d
|
||||
def ccb(k,c,n,f):
|
||||
if c>=1<<32:pe('Error: input too big')
|
||||
s=[0x61707865,857760878,0x79622d32,0x6b206574,q(k[:4]),q(k[4:8]),q(k[8:12]),q(k[12:16]),q(k[16:20]),q(k[20:24]),q(k[24:28]),q(k[28:]),c,q(n[:4]),q(n[4:8]),q(n[8:])];o=s[:]
|
||||
if f:o=[0]*16
|
||||
def x(a,b,c,d):s[a],s[b],s[c],s[d]=qr(s[a],s[b],s[c],s[d])
|
||||
|
@ -26,14 +28,13 @@ def x(k,u):
|
|||
k=bytearray(k);k[0]&=248;k[31]&=127;k[31]|=64;k=q(k);u=q(u[:-1]+bytes([u[-1]&127]));x=u;y=1;z=0;w=u;v=1;s=0
|
||||
for t in range(254,-1,-1):kt=(k>>t)&1;s^=kt;y,w=cs(s,y,w);z,v=cs(s,z,v);s=kt;A=(y+z)%p;AA=pow(A,2,p);B=(y-z)%p;BB=pow(B,2,p);E=(AA-BB)%p;C=(w+v)%p;D=(w-v)%p;DA=(D*A)%p;CB=(C*B)%p;w=pow((DA+CB)%p,2,p);v=(x*pow((DA-CB)%p,2,p))%p;y=(AA*BB)%p;z=(E*((AA+(121665*E)%p)%p)%p)%p
|
||||
y,w=cs(s,y,w);z,v=cs(s,z,v);u=(y*pow(z,p-2,p))%p;return bytes(u>>i&255 for i in range(0,255,8))
|
||||
pubkey=lambda sk:x(sk,b'\x09'+b'\x00'*31)
|
||||
def ecdh(pk,sk):
|
||||
k=x(sk,pk);o=0
|
||||
for i in k:o|=i
|
||||
if o==0:raise ValueError
|
||||
else:return k
|
||||
def kg():sk=os.urandom(32);pk=pubkey(sk);return sk,pk
|
||||
def us():print('Usage: qrcrypt.py -G|-E|-D seckeyfile/pubkey',file=sys.stderr);sys.exit(1)
|
||||
def kg():sk=os.urandom(32);pk=x(sk,b'\x09'+b'\x00'*31);return sk,pk
|
||||
def us():pe('Usage: qrcrypt.py -G|-E|-D seckeyfile/pubkey')
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv)!=3:us()
|
||||
if sys.argv[1]=='-G':
|
||||
|
@ -45,6 +46,6 @@ if __name__ == '__main__':
|
|||
elif sys.argv[1] == '-D':
|
||||
with open(sys.argv[2],'rb')as f:sk=f.read()
|
||||
e=sys.stdin.buffer.read();epk=e[:32];n=e[32:56];rss=ecdh(epk,sk);k=hcc20(rss,b'\x00'*24);k=hcc20(k, n[:16]);n=b'\x00'*4+n[16:];c=e[56:-16]
|
||||
if not secrets.compare_digest(e[-16:],tag(k,n,c)):print('Error: auth fail',file=sys.stderr);sys.exit(1)
|
||||
if not secrets.compare_digest(e[-16:],tag(k,n,c)):pe('Error: auth fail',file=sys.stderr)
|
||||
else:sys.stdout.buffer.write(bytes(cc20(k,n,c)))
|
||||
else:us()
|
||||
|
|
Loading…
Reference in a new issue