1 # Generated by tools/generators/blake2s_gen.py; do not edit. 2 # BLAKE2s compression function F (RFC 7693 section 3.2). One round is fully 3 # unrolled (eight G steps, constant rotations); each round index selects the 4 # SIGMA-permuted message words by a branch, never by a run-time table. 5 import Base 6 import ./types.bend as T 7 8 def round(v: T.Vector,x0: U32,x1: U32,x2: U32,x3: U32,x4: U32,x5: U32,x6: U32,x7: U32,x8: U32,x9: U32,x10: U32,x11: U32,x12: U32,x13: U32,x14: U32,x15: U32) -> T.Vector: 9 match v: 10 case T.V{+a0,+a1,+a2,+a3,+a4,+a5,+a6,+a7,+a8,+a9,+a10,+a11,+a12,+a13,+a14,+a15}: 11 +g0a1 = U32.add(U32.add(a0,a4),x0) 12 +g0d1x = U32.xor(a12,g0a1) 13 +g0d1 = U32.or(U32.shrn(g0d1x,16n),U32.shln(g0d1x,16n)) 14 +g0c1 = U32.add(a8,g0d1) 15 +g0b1x = U32.xor(a4,g0c1) 16 +g0b1 = U32.or(U32.shrn(g0b1x,12n),U32.shln(g0b1x,20n)) 17 +g0a2 = U32.add(U32.add(g0a1,g0b1),x1) 18 +g0d2x = U32.xor(g0d1,g0a2) 19 +g0d2 = U32.or(U32.shrn(g0d2x,8n),U32.shln(g0d2x,24n)) 20 +g0c2 = U32.add(g0c1,g0d2) 21 +g0b2x = U32.xor(g0b1,g0c2) 22 +g0b2 = U32.or(U32.shrn(g0b2x,7n),U32.shln(g0b2x,25n)) 23 +g1a1 = U32.add(U32.add(a1,a5),x2) 24 +g1d1x = U32.xor(a13,g1a1) 25 +g1d1 = U32.or(U32.shrn(g1d1x,16n),U32.shln(g1d1x,16n)) 26 +g1c1 = U32.add(a9,g1d1) 27 +g1b1x = U32.xor(a5,g1c1) 28 +g1b1 = U32.or(U32.shrn(g1b1x,12n),U32.shln(g1b1x,20n)) 29 +g1a2 = U32.add(U32.add(g1a1,g1b1),x3) 30 +g1d2x = U32.xor(g1d1,g1a2) 31 +g1d2 = U32.or(U32.shrn(g1d2x,8n),U32.shln(g1d2x,24n)) 32 +g1c2 = U32.add(g1c1,g1d2) 33 +g1b2x = U32.xor(g1b1,g1c2) 34 +g1b2 = U32.or(U32.shrn(g1b2x,7n),U32.shln(g1b2x,25n)) 35 +g2a1 = U32.add(U32.add(a2,a6),x4) 36 +g2d1x = U32.xor(a14,g2a1) 37 +g2d1 = U32.or(U32.shrn(g2d1x,16n),U32.shln(g2d1x,16n)) 38 +g2c1 = U32.add(a10,g2d1) 39 +g2b1x = U32.xor(a6,g2c1) 40 +g2b1 = U32.or(U32.shrn(g2b1x,12n),U32.shln(g2b1x,20n)) 41 +g2a2 = U32.add(U32.add(g2a1,g2b1),x5) 42 +g2d2x = U32.xor(g2d1,g2a2) 43 +g2d2 = U32.or(U32.shrn(g2d2x,8n),U32.shln(g2d2x,24n)) 44 +g2c2 = U32.add(g2c1,g2d2) 45 +g2b2x = U32.xor(g2b1,g2c2) 46 +g2b2 = U32.or(U32.shrn(g2b2x,7n),U32.shln(g2b2x,25n)) 47 +g3a1 = U32.add(U32.add(a3,a7),x6) 48 +g3d1x = U32.xor(a15,g3a1) 49 +g3d1 = U32.or(U32.shrn(g3d1x,16n),U32.shln(g3d1x,16n)) 50 +g3c1 = U32.add(a11,g3d1) 51 +g3b1x = U32.xor(a7,g3c1) 52 +g3b1 = U32.or(U32.shrn(g3b1x,12n),U32.shln(g3b1x,20n)) 53 +g3a2 = U32.add(U32.add(g3a1,g3b1),x7) 54 +g3d2x = U32.xor(g3d1,g3a2) 55 +g3d2 = U32.or(U32.shrn(g3d2x,8n),U32.shln(g3d2x,24n)) 56 +g3c2 = U32.add(g3c1,g3d2) 57 +g3b2x = U32.xor(g3b1,g3c2) 58 +g3b2 = U32.or(U32.shrn(g3b2x,7n),U32.shln(g3b2x,25n)) 59 +g4a1 = U32.add(U32.add(g0a2,g1b2),x8) 60 +g4d1x = U32.xor(g3d2,g4a1) 61 +g4d1 = U32.or(U32.shrn(g4d1x,16n),U32.shln(g4d1x,16n)) 62 +g4c1 = U32.add(g2c2,g4d1) 63 +g4b1x = U32.xor(g1b2,g4c1) 64 +g4b1 = U32.or(U32.shrn(g4b1x,12n),U32.shln(g4b1x,20n)) 65 +g4a2 = U32.add(U32.add(g4a1,g4b1),x9) 66 +g4d2x = U32.xor(g4d1,g4a2) 67 +g4d2 = U32.or(U32.shrn(g4d2x,8n),U32.shln(g4d2x,24n)) 68 +g4c2 = U32.add(g4c1,g4d2) 69 +g4b2x = U32.xor(g4b1,g4c2) 70 +g4b2 = U32.or(U32.shrn(g4b2x,7n),U32.shln(g4b2x,25n)) 71 +g5a1 = U32.add(U32.add(g1a2,g2b2),x10) 72 +g5d1x = U32.xor(g0d2,g5a1) 73 +g5d1 = U32.or(U32.shrn(g5d1x,16n),U32.shln(g5d1x,16n)) 74 +g5c1 = U32.add(g3c2,g5d1) 75 +g5b1x = U32.xor(g2b2,g5c1) 76 +g5b1 = U32.or(U32.shrn(g5b1x,12n),U32.shln(g5b1x,20n)) 77 +g5a2 = U32.add(U32.add(g5a1,g5b1),x11) 78 +g5d2x = U32.xor(g5d1,g5a2) 79 +g5d2 = U32.or(U32.shrn(g5d2x,8n),U32.shln(g5d2x,24n)) 80 +g5c2 = U32.add(g5c1,g5d2) 81 +g5b2x = U32.xor(g5b1,g5c2) 82 +g5b2 = U32.or(U32.shrn(g5b2x,7n),U32.shln(g5b2x,25n)) 83 +g6a1 = U32.add(U32.add(g2a2,g3b2),x12) 84 +g6d1x = U32.xor(g1d2,g6a1) 85 +g6d1 = U32.or(U32.shrn(g6d1x,16n),U32.shln(g6d1x,16n)) 86 +g6c1 = U32.add(g0c2,g6d1) 87 +g6b1x = U32.xor(g3b2,g6c1) 88 +g6b1 = U32.or(U32.shrn(g6b1x,12n),U32.shln(g6b1x,20n)) 89 +g6a2 = U32.add(U32.add(g6a1,g6b1),x13) 90 +g6d2x = U32.xor(g6d1,g6a2) 91 +g6d2 = U32.or(U32.shrn(g6d2x,8n),U32.shln(g6d2x,24n)) 92 +g6c2 = U32.add(g6c1,g6d2) 93 +g6b2x = U32.xor(g6b1,g6c2) 94 +g6b2 = U32.or(U32.shrn(g6b2x,7n),U32.shln(g6b2x,25n)) 95 +g7a1 = U32.add(U32.add(g3a2,g0b2),x14) 96 +g7d1x = U32.xor(g2d2,g7a1) 97 +g7d1 = U32.or(U32.shrn(g7d1x,16n),U32.shln(g7d1x,16n)) 98 +g7c1 = U32.add(g1c2,g7d1) 99 +g7b1x = U32.xor(g0b2,g7c1) 100 +g7b1 = U32.or(U32.shrn(g7b1x,12n),U32.shln(g7b1x,20n)) 101 +g7a2 = U32.add(U32.add(g7a1,g7b1),x15) 102 +g7d2x = U32.xor(g7d1,g7a2) 103 +g7d2 = U32.or(U32.shrn(g7d2x,8n),U32.shln(g7d2x,24n)) 104 +g7c2 = U32.add(g7c1,g7d2) 105 +g7b2x = U32.xor(g7b1,g7c2) 106 +g7b2 = U32.or(U32.shrn(g7b2x,7n),U32.shln(g7b2x,25n)) 107 T.V{g4a2,g5a2,g6a2,g7a2,g7b2,g4b2,g5b2,g6b2,g6c2,g7c2,g4c2,g5c2,g5d2,g6d2,g7d2,g4d2} 108 109 def flag(last: Bool) -> U32: 110 match last: 111 case True{}: 3766232660 112 case False{}: 528734635 113 114 def init(h: T.State,t0: U32,t1: U32,last: Bool) -> T.Vector: 115 match h: 116 case T.H{h0,h1,h2,h3,h4,h5,h6,h7}: 117 T.V{h0,h1,h2,h3,h4,h5,h6,h7,1779033703,3144134277,1013904242,2773480762,U32.xor(1359893119,t0),U32.xor(2600822924,t1),flag(last),1541459225} 118 119 def finish(h: T.State,v: T.Vector) -> T.State: 120 match h v: 121 case T.H{h0,h1,h2,h3,h4,h5,h6,h7} T.V{v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15}: 122 T.H{U32.xor(U32.xor(h0,v0),v8),U32.xor(U32.xor(h1,v1),v9),U32.xor(U32.xor(h2,v2),v10),U32.xor(U32.xor(h3,v3),v11),U32.xor(U32.xor(h4,v4),v12),U32.xor(U32.xor(h5,v5),v13),U32.xor(U32.xor(h6,v6),v14),U32.xor(U32.xor(h7,v7),v15)} 123 124 # F(h, m, t, f): ten rounds, round r reading the words in SIGMA[r] order. 125 def compress(+h: T.State,+m0: U32,+m1: U32,+m2: U32,+m3: U32,+m4: U32,+m5: U32,+m6: U32,+m7: U32,+m8: U32,+m9: U32,+m10: U32,+m11: U32,+m12: U32,+m13: U32,+m14: U32,+m15: U32,t0: U32,t1: U32,last: Bool) -> T.State: 126 finish(h,round(round(round(round(round(round(round(round(round(round(init(h,t0,t1,last),m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15),m14,m10,m4,m8,m9,m15,m13,m6,m1,m12,m0,m2,m11,m7,m5,m3),m11,m8,m12,m0,m5,m2,m15,m13,m10,m14,m3,m6,m7,m1,m9,m4),m7,m9,m3,m1,m13,m12,m11,m14,m2,m6,m5,m10,m4,m0,m15,m8),m9,m0,m5,m7,m2,m4,m10,m15,m14,m1,m11,m12,m6,m8,m3,m13),m2,m12,m6,m10,m0,m11,m8,m3,m4,m13,m7,m5,m15,m14,m1,m9),m12,m5,m1,m15,m14,m13,m4,m10,m0,m7,m6,m3,m9,m2,m8,m11),m13,m11,m7,m14,m12,m1,m3,m9,m5,m0,m15,m4,m8,m6,m2,m10),m6,m15,m14,m9,m11,m3,m0,m8,m12,m2,m13,m7,m1,m4,m10,m5),m10,m2,m8,m4,m7,m6,m1,m5,m15,m11,m9,m14,m3,m12,m13,m0))