sha512-ppc.pl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. #!/usr/bin/env perl
  2. # ====================================================================
  3. # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
  4. # project. The module is, however, dual licensed under OpenSSL and
  5. # CRYPTOGAMS licenses depending on where you obtain it. For further
  6. # details see http://www.openssl.org/~appro/cryptogams/.
  7. # ====================================================================
  8. # I let hardware handle unaligned input, except on page boundaries
  9. # (see below for details). Otherwise straightforward implementation
  10. # with X vector in register bank. The module is big-endian [which is
  11. # not big deal as there're no little-endian targets left around].
  12. # sha256 | sha512
  13. # -m64 -m32 | -m64 -m32
  14. # --------------------------------------+-----------------------
  15. # PPC970,gcc-4.0.0 +50% +38% | +40% +410%(*)
  16. # Power6,xlc-7 +150% +90% | +100% +430%(*)
  17. #
  18. # (*) 64-bit code in 32-bit application context, which actually is
  19. # on TODO list. It should be noted that for safe deployment in
  20. # 32-bit *mutli-threaded* context asyncronous signals should be
  21. # blocked upon entry to SHA512 block routine. This is because
  22. # 32-bit signaling procedure invalidates upper halves of GPRs.
  23. # Context switch procedure preserves them, but not signaling:-(
  24. # Second version is true multi-thread safe. Trouble with the original
  25. # version was that it was using thread local storage pointer register.
  26. # Well, it scrupulously preserved it, but the problem would arise the
  27. # moment asynchronous signal was delivered and signal handler would
  28. # dereference the TLS pointer. While it's never the case in openssl
  29. # application or test suite, we have to respect this scenario and not
  30. # use TLS pointer register. Alternative would be to require caller to
  31. # block signals prior calling this routine. For the record, in 32-bit
  32. # context R2 serves as TLS pointer, while in 64-bit context - R13.
  33. $flavour=shift;
  34. $output =shift;
  35. if ($flavour =~ /64/) {
  36. $SIZE_T=8;
  37. $LRSAVE=2*$SIZE_T;
  38. $STU="stdu";
  39. $UCMP="cmpld";
  40. $SHL="sldi";
  41. $POP="ld";
  42. $PUSH="std";
  43. } elsif ($flavour =~ /32/) {
  44. $SIZE_T=4;
  45. $LRSAVE=$SIZE_T;
  46. $STU="stwu";
  47. $UCMP="cmplw";
  48. $SHL="slwi";
  49. $POP="lwz";
  50. $PUSH="stw";
  51. } else { die "nonsense $flavour"; }
  52. $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
  53. ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
  54. ( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or
  55. die "can't locate ppc-xlate.pl";
  56. open STDOUT,"| $^X $xlate $flavour $output" || die "can't call $xlate: $!";
  57. if ($output =~ /512/) {
  58. $func="sha512_block_ppc";
  59. $SZ=8;
  60. @Sigma0=(28,34,39);
  61. @Sigma1=(14,18,41);
  62. @sigma0=(1, 8, 7);
  63. @sigma1=(19,61, 6);
  64. $rounds=80;
  65. $LD="ld";
  66. $ST="std";
  67. $ROR="rotrdi";
  68. $SHR="srdi";
  69. } else {
  70. $func="sha256_block_ppc";
  71. $SZ=4;
  72. @Sigma0=( 2,13,22);
  73. @Sigma1=( 6,11,25);
  74. @sigma0=( 7,18, 3);
  75. @sigma1=(17,19,10);
  76. $rounds=64;
  77. $LD="lwz";
  78. $ST="stw";
  79. $ROR="rotrwi";
  80. $SHR="srwi";
  81. }
  82. $FRAME=32*$SIZE_T+16*$SZ;
  83. $LOCALS=6*$SIZE_T;
  84. $sp ="r1";
  85. $toc="r2";
  86. $ctx="r3"; # zapped by $a0
  87. $inp="r4"; # zapped by $a1
  88. $num="r5"; # zapped by $t0
  89. $T ="r0";
  90. $a0 ="r3";
  91. $a1 ="r4";
  92. $t0 ="r5";
  93. $t1 ="r6";
  94. $Tbl="r7";
  95. $A ="r8";
  96. $B ="r9";
  97. $C ="r10";
  98. $D ="r11";
  99. $E ="r12";
  100. $F ="r13"; $F="r2" if ($SIZE_T==8);# reassigned to exempt TLS pointer
  101. $G ="r14";
  102. $H ="r15";
  103. @V=($A,$B,$C,$D,$E,$F,$G,$H);
  104. @X=("r16","r17","r18","r19","r20","r21","r22","r23",
  105. "r24","r25","r26","r27","r28","r29","r30","r31");
  106. $inp="r31"; # reassigned $inp! aliases with @X[15]
  107. sub ROUND_00_15 {
  108. my ($i,$a,$b,$c,$d,$e,$f,$g,$h)=@_;
  109. $code.=<<___;
  110. $LD $T,`$i*$SZ`($Tbl)
  111. $ROR $a0,$e,$Sigma1[0]
  112. $ROR $a1,$e,$Sigma1[1]
  113. and $t0,$f,$e
  114. andc $t1,$g,$e
  115. add $T,$T,$h
  116. xor $a0,$a0,$a1
  117. $ROR $a1,$a1,`$Sigma1[2]-$Sigma1[1]`
  118. or $t0,$t0,$t1 ; Ch(e,f,g)
  119. add $T,$T,@X[$i]
  120. xor $a0,$a0,$a1 ; Sigma1(e)
  121. add $T,$T,$t0
  122. add $T,$T,$a0
  123. $ROR $a0,$a,$Sigma0[0]
  124. $ROR $a1,$a,$Sigma0[1]
  125. and $t0,$a,$b
  126. and $t1,$a,$c
  127. xor $a0,$a0,$a1
  128. $ROR $a1,$a1,`$Sigma0[2]-$Sigma0[1]`
  129. xor $t0,$t0,$t1
  130. and $t1,$b,$c
  131. xor $a0,$a0,$a1 ; Sigma0(a)
  132. add $d,$d,$T
  133. xor $t0,$t0,$t1 ; Maj(a,b,c)
  134. add $h,$T,$a0
  135. add $h,$h,$t0
  136. ___
  137. }
  138. sub ROUND_16_xx {
  139. my ($i,$a,$b,$c,$d,$e,$f,$g,$h)=@_;
  140. $i-=16;
  141. $code.=<<___;
  142. $ROR $a0,@X[($i+1)%16],$sigma0[0]
  143. $ROR $a1,@X[($i+1)%16],$sigma0[1]
  144. $ROR $t0,@X[($i+14)%16],$sigma1[0]
  145. $ROR $t1,@X[($i+14)%16],$sigma1[1]
  146. xor $a0,$a0,$a1
  147. $SHR $a1,@X[($i+1)%16],$sigma0[2]
  148. xor $t0,$t0,$t1
  149. $SHR $t1,@X[($i+14)%16],$sigma1[2]
  150. add @X[$i],@X[$i],@X[($i+9)%16]
  151. xor $a0,$a0,$a1 ; sigma0(X[(i+1)&0x0f])
  152. xor $t0,$t0,$t1 ; sigma1(X[(i+14)&0x0f])
  153. add @X[$i],@X[$i],$a0
  154. add @X[$i],@X[$i],$t0
  155. ___
  156. &ROUND_00_15($i,$a,$b,$c,$d,$e,$f,$g,$h);
  157. }
  158. $code=<<___;
  159. .machine "any"
  160. .text
  161. .globl $func
  162. .align 6
  163. $func:
  164. $STU $sp,-$FRAME($sp)
  165. mflr r0
  166. $SHL $num,$num,`log(16*$SZ)/log(2)`
  167. $PUSH $ctx,`$FRAME-$SIZE_T*22`($sp)
  168. $PUSH $toc,`$FRAME-$SIZE_T*20`($sp)
  169. $PUSH r13,`$FRAME-$SIZE_T*19`($sp)
  170. $PUSH r14,`$FRAME-$SIZE_T*18`($sp)
  171. $PUSH r15,`$FRAME-$SIZE_T*17`($sp)
  172. $PUSH r16,`$FRAME-$SIZE_T*16`($sp)
  173. $PUSH r17,`$FRAME-$SIZE_T*15`($sp)
  174. $PUSH r18,`$FRAME-$SIZE_T*14`($sp)
  175. $PUSH r19,`$FRAME-$SIZE_T*13`($sp)
  176. $PUSH r20,`$FRAME-$SIZE_T*12`($sp)
  177. $PUSH r21,`$FRAME-$SIZE_T*11`($sp)
  178. $PUSH r22,`$FRAME-$SIZE_T*10`($sp)
  179. $PUSH r23,`$FRAME-$SIZE_T*9`($sp)
  180. $PUSH r24,`$FRAME-$SIZE_T*8`($sp)
  181. $PUSH r25,`$FRAME-$SIZE_T*7`($sp)
  182. $PUSH r26,`$FRAME-$SIZE_T*6`($sp)
  183. $PUSH r27,`$FRAME-$SIZE_T*5`($sp)
  184. $PUSH r28,`$FRAME-$SIZE_T*4`($sp)
  185. $PUSH r29,`$FRAME-$SIZE_T*3`($sp)
  186. $PUSH r30,`$FRAME-$SIZE_T*2`($sp)
  187. $PUSH r31,`$FRAME-$SIZE_T*1`($sp)
  188. $PUSH r0,`$FRAME+$LRSAVE`($sp)
  189. $LD $A,`0*$SZ`($ctx)
  190. mr $inp,r4 ; incarnate $inp
  191. $LD $B,`1*$SZ`($ctx)
  192. $LD $C,`2*$SZ`($ctx)
  193. $LD $D,`3*$SZ`($ctx)
  194. $LD $E,`4*$SZ`($ctx)
  195. $LD $F,`5*$SZ`($ctx)
  196. $LD $G,`6*$SZ`($ctx)
  197. $LD $H,`7*$SZ`($ctx)
  198. bl LPICmeup
  199. LPICedup:
  200. andi. r0,$inp,3
  201. bne Lunaligned
  202. Laligned:
  203. add $num,$inp,$num
  204. $PUSH $num,`$FRAME-$SIZE_T*24`($sp) ; end pointer
  205. $PUSH $inp,`$FRAME-$SIZE_T*23`($sp) ; inp pointer
  206. bl Lsha2_block_private
  207. b Ldone
  208. ; PowerPC specification allows an implementation to be ill-behaved
  209. ; upon unaligned access which crosses page boundary. "Better safe
  210. ; than sorry" principle makes me treat it specially. But I don't
  211. ; look for particular offending word, but rather for the input
  212. ; block which crosses the boundary. Once found that block is aligned
  213. ; and hashed separately...
  214. .align 4
  215. Lunaligned:
  216. subfic $t1,$inp,4096
  217. andi. $t1,$t1,`4096-16*$SZ` ; distance to closest page boundary
  218. beq Lcross_page
  219. $UCMP $num,$t1
  220. ble Laligned ; didn't cross the page boundary
  221. subfc $num,$t1,$num
  222. add $t1,$inp,$t1
  223. $PUSH $num,`$FRAME-$SIZE_T*25`($sp) ; save real remaining num
  224. $PUSH $t1,`$FRAME-$SIZE_T*24`($sp) ; intermediate end pointer
  225. $PUSH $inp,`$FRAME-$SIZE_T*23`($sp) ; inp pointer
  226. bl Lsha2_block_private
  227. ; $inp equals to the intermediate end pointer here
  228. $POP $num,`$FRAME-$SIZE_T*25`($sp) ; restore real remaining num
  229. Lcross_page:
  230. li $t1,`16*$SZ/4`
  231. mtctr $t1
  232. addi r20,$sp,$LOCALS ; aligned spot below the frame
  233. Lmemcpy:
  234. lbz r16,0($inp)
  235. lbz r17,1($inp)
  236. lbz r18,2($inp)
  237. lbz r19,3($inp)
  238. addi $inp,$inp,4
  239. stb r16,0(r20)
  240. stb r17,1(r20)
  241. stb r18,2(r20)
  242. stb r19,3(r20)
  243. addi r20,r20,4
  244. bdnz Lmemcpy
  245. $PUSH $inp,`$FRAME-$SIZE_T*26`($sp) ; save real inp
  246. addi $t1,$sp,`$LOCALS+16*$SZ` ; fictitious end pointer
  247. addi $inp,$sp,$LOCALS ; fictitious inp pointer
  248. $PUSH $num,`$FRAME-$SIZE_T*25`($sp) ; save real num
  249. $PUSH $t1,`$FRAME-$SIZE_T*24`($sp) ; end pointer
  250. $PUSH $inp,`$FRAME-$SIZE_T*23`($sp) ; inp pointer
  251. bl Lsha2_block_private
  252. $POP $inp,`$FRAME-$SIZE_T*26`($sp) ; restore real inp
  253. $POP $num,`$FRAME-$SIZE_T*25`($sp) ; restore real num
  254. addic. $num,$num,`-16*$SZ` ; num--
  255. bne Lunaligned
  256. Ldone:
  257. $POP r0,`$FRAME+$LRSAVE`($sp)
  258. $POP $toc,`$FRAME-$SIZE_T*20`($sp)
  259. $POP r13,`$FRAME-$SIZE_T*19`($sp)
  260. $POP r14,`$FRAME-$SIZE_T*18`($sp)
  261. $POP r15,`$FRAME-$SIZE_T*17`($sp)
  262. $POP r16,`$FRAME-$SIZE_T*16`($sp)
  263. $POP r17,`$FRAME-$SIZE_T*15`($sp)
  264. $POP r18,`$FRAME-$SIZE_T*14`($sp)
  265. $POP r19,`$FRAME-$SIZE_T*13`($sp)
  266. $POP r20,`$FRAME-$SIZE_T*12`($sp)
  267. $POP r21,`$FRAME-$SIZE_T*11`($sp)
  268. $POP r22,`$FRAME-$SIZE_T*10`($sp)
  269. $POP r23,`$FRAME-$SIZE_T*9`($sp)
  270. $POP r24,`$FRAME-$SIZE_T*8`($sp)
  271. $POP r25,`$FRAME-$SIZE_T*7`($sp)
  272. $POP r26,`$FRAME-$SIZE_T*6`($sp)
  273. $POP r27,`$FRAME-$SIZE_T*5`($sp)
  274. $POP r28,`$FRAME-$SIZE_T*4`($sp)
  275. $POP r29,`$FRAME-$SIZE_T*3`($sp)
  276. $POP r30,`$FRAME-$SIZE_T*2`($sp)
  277. $POP r31,`$FRAME-$SIZE_T*1`($sp)
  278. mtlr r0
  279. addi $sp,$sp,$FRAME
  280. blr
  281. .long 0
  282. .byte 0,12,4,1,0x80,18,3,0
  283. .long 0
  284. .align 4
  285. Lsha2_block_private:
  286. ___
  287. for($i=0;$i<16;$i++) {
  288. $code.=<<___ if ($SZ==4);
  289. lwz @X[$i],`$i*$SZ`($inp)
  290. ___
  291. # 64-bit loads are split to 2x32-bit ones, as CPU can't handle
  292. # unaligned 64-bit loads, only 32-bit ones...
  293. $code.=<<___ if ($SZ==8);
  294. lwz $t0,`$i*$SZ`($inp)
  295. lwz @X[$i],`$i*$SZ+4`($inp)
  296. insrdi @X[$i],$t0,32,0
  297. ___
  298. &ROUND_00_15($i,@V);
  299. unshift(@V,pop(@V));
  300. }
  301. $code.=<<___;
  302. li $T,`$rounds/16-1`
  303. mtctr $T
  304. .align 4
  305. Lrounds:
  306. addi $Tbl,$Tbl,`16*$SZ`
  307. ___
  308. for(;$i<32;$i++) {
  309. &ROUND_16_xx($i,@V);
  310. unshift(@V,pop(@V));
  311. }
  312. $code.=<<___;
  313. bdnz Lrounds
  314. $POP $ctx,`$FRAME-$SIZE_T*22`($sp)
  315. $POP $inp,`$FRAME-$SIZE_T*23`($sp) ; inp pointer
  316. $POP $num,`$FRAME-$SIZE_T*24`($sp) ; end pointer
  317. subi $Tbl,$Tbl,`($rounds-16)*$SZ` ; rewind Tbl
  318. $LD r16,`0*$SZ`($ctx)
  319. $LD r17,`1*$SZ`($ctx)
  320. $LD r18,`2*$SZ`($ctx)
  321. $LD r19,`3*$SZ`($ctx)
  322. $LD r20,`4*$SZ`($ctx)
  323. $LD r21,`5*$SZ`($ctx)
  324. $LD r22,`6*$SZ`($ctx)
  325. addi $inp,$inp,`16*$SZ` ; advance inp
  326. $LD r23,`7*$SZ`($ctx)
  327. add $A,$A,r16
  328. add $B,$B,r17
  329. $PUSH $inp,`$FRAME-$SIZE_T*23`($sp)
  330. add $C,$C,r18
  331. $ST $A,`0*$SZ`($ctx)
  332. add $D,$D,r19
  333. $ST $B,`1*$SZ`($ctx)
  334. add $E,$E,r20
  335. $ST $C,`2*$SZ`($ctx)
  336. add $F,$F,r21
  337. $ST $D,`3*$SZ`($ctx)
  338. add $G,$G,r22
  339. $ST $E,`4*$SZ`($ctx)
  340. add $H,$H,r23
  341. $ST $F,`5*$SZ`($ctx)
  342. $ST $G,`6*$SZ`($ctx)
  343. $UCMP $inp,$num
  344. $ST $H,`7*$SZ`($ctx)
  345. bne Lsha2_block_private
  346. blr
  347. .long 0
  348. .byte 0,12,0x14,0,0,0,0,0
  349. ___
  350. # Ugly hack here, because PPC assembler syntax seem to vary too
  351. # much from platforms to platform...
  352. $code.=<<___;
  353. .align 6
  354. LPICmeup:
  355. mflr r0
  356. bcl 20,31,\$+4
  357. mflr $Tbl ; vvvvvv "distance" between . and 1st data entry
  358. addi $Tbl,$Tbl,`64-8`
  359. mtlr r0
  360. blr
  361. .long 0
  362. .byte 0,12,0x14,0,0,0,0,0
  363. .space `64-9*4`
  364. ___
  365. $code.=<<___ if ($SZ==8);
  366. .long 0x428a2f98,0xd728ae22,0x71374491,0x23ef65cd
  367. .long 0xb5c0fbcf,0xec4d3b2f,0xe9b5dba5,0x8189dbbc
  368. .long 0x3956c25b,0xf348b538,0x59f111f1,0xb605d019
  369. .long 0x923f82a4,0xaf194f9b,0xab1c5ed5,0xda6d8118
  370. .long 0xd807aa98,0xa3030242,0x12835b01,0x45706fbe
  371. .long 0x243185be,0x4ee4b28c,0x550c7dc3,0xd5ffb4e2
  372. .long 0x72be5d74,0xf27b896f,0x80deb1fe,0x3b1696b1
  373. .long 0x9bdc06a7,0x25c71235,0xc19bf174,0xcf692694
  374. .long 0xe49b69c1,0x9ef14ad2,0xefbe4786,0x384f25e3
  375. .long 0x0fc19dc6,0x8b8cd5b5,0x240ca1cc,0x77ac9c65
  376. .long 0x2de92c6f,0x592b0275,0x4a7484aa,0x6ea6e483
  377. .long 0x5cb0a9dc,0xbd41fbd4,0x76f988da,0x831153b5
  378. .long 0x983e5152,0xee66dfab,0xa831c66d,0x2db43210
  379. .long 0xb00327c8,0x98fb213f,0xbf597fc7,0xbeef0ee4
  380. .long 0xc6e00bf3,0x3da88fc2,0xd5a79147,0x930aa725
  381. .long 0x06ca6351,0xe003826f,0x14292967,0x0a0e6e70
  382. .long 0x27b70a85,0x46d22ffc,0x2e1b2138,0x5c26c926
  383. .long 0x4d2c6dfc,0x5ac42aed,0x53380d13,0x9d95b3df
  384. .long 0x650a7354,0x8baf63de,0x766a0abb,0x3c77b2a8
  385. .long 0x81c2c92e,0x47edaee6,0x92722c85,0x1482353b
  386. .long 0xa2bfe8a1,0x4cf10364,0xa81a664b,0xbc423001
  387. .long 0xc24b8b70,0xd0f89791,0xc76c51a3,0x0654be30
  388. .long 0xd192e819,0xd6ef5218,0xd6990624,0x5565a910
  389. .long 0xf40e3585,0x5771202a,0x106aa070,0x32bbd1b8
  390. .long 0x19a4c116,0xb8d2d0c8,0x1e376c08,0x5141ab53
  391. .long 0x2748774c,0xdf8eeb99,0x34b0bcb5,0xe19b48a8
  392. .long 0x391c0cb3,0xc5c95a63,0x4ed8aa4a,0xe3418acb
  393. .long 0x5b9cca4f,0x7763e373,0x682e6ff3,0xd6b2b8a3
  394. .long 0x748f82ee,0x5defb2fc,0x78a5636f,0x43172f60
  395. .long 0x84c87814,0xa1f0ab72,0x8cc70208,0x1a6439ec
  396. .long 0x90befffa,0x23631e28,0xa4506ceb,0xde82bde9
  397. .long 0xbef9a3f7,0xb2c67915,0xc67178f2,0xe372532b
  398. .long 0xca273ece,0xea26619c,0xd186b8c7,0x21c0c207
  399. .long 0xeada7dd6,0xcde0eb1e,0xf57d4f7f,0xee6ed178
  400. .long 0x06f067aa,0x72176fba,0x0a637dc5,0xa2c898a6
  401. .long 0x113f9804,0xbef90dae,0x1b710b35,0x131c471b
  402. .long 0x28db77f5,0x23047d84,0x32caab7b,0x40c72493
  403. .long 0x3c9ebe0a,0x15c9bebc,0x431d67c4,0x9c100d4c
  404. .long 0x4cc5d4be,0xcb3e42b6,0x597f299c,0xfc657e2a
  405. .long 0x5fcb6fab,0x3ad6faec,0x6c44198c,0x4a475817
  406. ___
  407. $code.=<<___ if ($SZ==4);
  408. .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
  409. .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
  410. .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
  411. .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
  412. .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
  413. .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
  414. .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
  415. .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
  416. .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
  417. .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
  418. .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
  419. .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
  420. .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
  421. .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
  422. .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
  423. .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
  424. ___
  425. $code =~ s/\`([^\`]*)\`/eval $1/gem;
  426. print $code;
  427. close STDOUT;