Hex Artifact Content
Not logged in

Artifact 269e65449ebb2bd98846ca31e9c26f9e29f85868:


0000: 2f 2a 20 61 69 63 68 2e 63 20 2d 20 61 6e 20 69  /* aich.c - an i
0010: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0020: 20 45 4d 75 6c 65 20 41 49 43 48 20 41 6c 67 6f   EMule AICH Algo
0030: 72 69 74 68 6d 2e 0a 20 2a 20 44 65 73 63 72 69  rithm.. * Descri
0040: 70 74 69 6f 6e 3a 20 68 74 74 70 3a 2f 2f 77 77  ption: http://ww
0050: 77 2e 61 6d 75 6c 65 2e 6f 72 67 2f 77 69 6b 69  w.amule.org/wiki
0060: 2f 69 6e 64 65 78 2e 70 68 70 2f 41 49 43 48 2e  /index.php/AICH.
0070: 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  . *. * Copyright
0080: 3a 20 32 30 30 38 2d 32 30 31 32 20 41 6c 65 6b  : 2008-2012 Alek
0090: 73 65 79 20 4b 72 61 76 63 68 65 6e 6b 6f 20 3c  sey Kravchenko <
00a0: 72 68 61 73 68 2e 61 64 6d 69 6e 40 67 6d 61 69  rhash.admin@gmai
00b0: 6c 2e 63 6f 6d 3e 0a 20 2a 0a 20 2a 20 50 65 72  l.com>. *. * Per
00c0: 6d 69 73 73 69 6f 6e 20 69 73 20 68 65 72 65 62  mission is hereb
00d0: 79 20 67 72 61 6e 74 65 64 2c 20 20 66 72 65 65  y granted,  free
00e0: 20 6f 66 20 63 68 61 72 67 65 2c 20 20 74 6f 20   of charge,  to 
00f0: 61 6e 79 20 70 65 72 73 6f 6e 20 20 6f 62 74 61  any person  obta
0100: 69 6e 69 6e 67 20 61 0a 20 2a 20 63 6f 70 79 20  ining a. * copy 
0110: 6f 66 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  of this software
0120: 20 61 6e 64 20 61 73 73 6f 63 69 61 74 65 64 20   and associated 
0130: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69  documentation fi
0140: 6c 65 73 20 28 74 68 65 20 22 53 6f 66 74 77 61  les (the "Softwa
0150: 72 65 22 29 2c 0a 20 2a 20 74 6f 20 64 65 61 6c  re"),. * to deal
0160: 20 69 6e 20 74 68 65 20 53 6f 66 74 77 61 72 65   in the Software
0170: 20 77 69 74 68 6f 75 74 20 72 65 73 74 72 69 63   without restric
0180: 74 69 6f 6e 2c 20 20 69 6e 63 6c 75 64 69 6e 67  tion,  including
0190: 20 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 61 74   without limitat
01a0: 69 6f 6e 0a 20 2a 20 74 68 65 20 72 69 67 68 74  ion. * the right
01b0: 73 20 74 6f 20 20 75 73 65 2c 20 63 6f 70 79 2c  s to  use, copy,
01c0: 20 6d 6f 64 69 66 79 2c 20 20 6d 65 72 67 65 2c   modify,  merge,
01d0: 20 70 75 62 6c 69 73 68 2c 20 64 69 73 74 72 69   publish, distri
01e0: 62 75 74 65 2c 20 73 75 62 6c 69 63 65 6e 73 65  bute, sublicense
01f0: 2c 0a 20 2a 20 61 6e 64 2f 6f 72 20 73 65 6c 6c  ,. * and/or sell
0200: 20 63 6f 70 69 65 73 20 20 6f 66 20 20 74 68 65   copies  of  the
0210: 20 53 6f 66 74 77 61 72 65 2c 20 20 61 6e 64 20   Software,  and 
0220: 74 6f 20 70 65 72 6d 69 74 20 20 70 65 72 73 6f  to permit  perso
0230: 6e 73 20 20 74 6f 20 77 68 6f 6d 20 74 68 65 0a  ns  to whom the.
0240: 20 2a 20 53 6f 66 74 77 61 72 65 20 69 73 20 66   * Software is f
0250: 75 72 6e 69 73 68 65 64 20 74 6f 20 64 6f 20 73  urnished to do s
0260: 6f 2e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 70 72  o.. *. * This pr
0270: 6f 67 72 61 6d 20 20 69 73 20 20 64 69 73 74 72  ogram  is  distr
0280: 69 62 75 74 65 64 20 20 69 6e 20 20 74 68 65 20  ibuted  in  the 
0290: 20 68 6f 70 65 20 20 74 68 61 74 20 69 74 20 77   hope  that it w
02a0: 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 20 20  ill be useful,  
02b0: 62 75 74 0a 20 2a 20 57 49 54 48 4f 55 54 20 41  but. * WITHOUT A
02c0: 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74  NY WARRANTY; wit
02d0: 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d  hout even the im
02e0: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f  plied warranty o
02f0: 66 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  f MERCHANTABILIT
0300: 59 0a 20 2a 20 6f 72 20 46 49 54 4e 45 53 53 20  Y. * or FITNESS 
0310: 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52  FOR A PARTICULAR
0320: 20 50 55 52 50 4f 53 45 2e 20 20 55 73 65 20 74   PURPOSE.  Use t
0330: 68 69 73 20 70 72 6f 67 72 61 6d 20 20 61 74 20  his program  at 
0340: 20 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0a   your own risk!.
0350: 20 2a 0a 20 2a 20 54 68 65 20 41 49 43 48 20 41   *. * The AICH A
0360: 6c 67 6f 72 69 74 68 6d 3a 0a 20 2a 0a 20 2a 20  lgorithm:. *. * 
0370: 45 61 63 68 20 65 64 32 6b 20 63 68 75 6e 6b 20  Each ed2k chunk 
0380: 28 39 37 32 38 30 30 30 20 62 79 74 65 73 29 20  (9728000 bytes) 
0390: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
03a0: 35 33 20 70 61 72 74 73 20 28 35 32 78 20 31 38  53 parts (52x 18
03b0: 30 4b 42 20 61 6e 64 0a 20 2a 20 31 78 20 31 34  0KB and. * 1x 14
03c0: 30 4b 42 29 20 61 6e 64 20 65 61 63 68 20 6f 66  0KB) and each of
03d0: 20 74 68 65 73 65 20 70 61 72 74 73 20 61 72 65   these parts are
03e0: 20 68 61 73 68 65 64 20 75 73 69 6e 67 20 74 68   hashed using th
03f0: 65 20 53 48 41 31 20 61 6c 67 6f 72 69 74 68 6d  e SHA1 algorithm
0400: 2e 0a 20 2a 20 45 61 63 68 20 6f 66 20 74 68 65  .. * Each of the
0410: 73 65 20 68 61 73 68 65 73 20 69 73 20 63 61 6c  se hashes is cal
0420: 6c 65 64 20 61 20 42 6c 6f 63 6b 20 48 61 73 68  led a Block Hash
0430: 2e 20 42 79 20 63 6f 6d 62 69 6e 69 6e 67 20 70  . By combining p
0440: 61 69 72 73 20 6f 66 20 42 6c 6f 63 6b 0a 20 2a  airs of Block. *
0450: 20 48 61 73 68 65 73 20 28 69 2e 65 2e 20 65 61   Hashes (i.e. ea
0460: 63 68 20 70 61 72 74 20 77 69 74 68 20 74 68 65  ch part with the
0470: 20 70 61 72 74 20 6e 65 78 74 20 74 6f 20 69 74   part next to it
0480: 29 20 61 6c 67 6f 72 69 74 68 6d 20 77 69 6c 6c  ) algorithm will
0490: 20 67 65 74 20 61 20 77 68 6f 6c 65 0a 20 2a 20   get a whole. * 
04a0: 74 72 65 65 20 6f 66 20 68 61 73 68 65 73 20 28  tree of hashes (
04b0: 74 68 69 73 20 74 72 65 65 20 77 68 69 63 68 20  this tree which 
04c0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 61 20 68  is therefore a h
04d0: 61 73 68 73 65 74 20 6d 61 64 65 20 6f 66 20 61  ashset made of a
04e0: 6c 6c 20 6f 66 20 74 68 65 0a 20 2a 20 6f 74 68  ll of the. * oth
04f0: 65 72 20 42 6c 6f 63 6b 20 48 61 73 68 65 73 20  er Block Hashes 
0500: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 41 49  is called the AI
0510: 43 48 20 48 61 73 68 73 65 74 29 2e 20 45 61 63  CH Hashset). Eac
0520: 68 20 68 61 73 68 20 77 68 69 63 68 20 69 73 20  h hash which is 
0530: 6e 65 69 74 68 65 72 0a 20 2a 20 61 20 42 6c 6f  neither. * a Blo
0540: 63 6b 20 48 61 73 68 20 6e 6f 72 20 74 68 65 20  ck Hash nor the 
0550: 52 6f 6f 74 20 48 61 73 68 2c 20 69 73 20 61 20  Root Hash, is a 
0560: 56 65 72 69 66 79 69 6e 67 20 48 61 73 68 2e 20  Verifying Hash. 
0570: 54 68 65 20 68 61 73 68 20 61 74 20 74 68 65 20  The hash at the 
0580: 74 6f 70 0a 20 2a 20 6c 65 76 65 6c 20 69 73 20  top. * level is 
0590: 74 68 65 20 52 6f 6f 74 20 48 61 73 68 20 61 6e  the Root Hash an
05a0: 64 20 69 74 20 69 73 20 73 75 70 70 6f 73 65 64  d it is supposed
05b0: 20 74 6f 20 62 65 20 70 72 6f 76 69 64 65 64 20   to be provided 
05c0: 62 79 20 74 68 65 20 65 64 32 6b 20 6c 69 6e 6b  by the ed2k link
05d0: 0a 20 2a 20 77 68 65 6e 20 72 65 6c 65 61 73 69  . * when releasi
05e0: 6e 67 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ng.. */..#includ
05f0: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0600: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0610: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0620: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 62  t.h>.#include "b
0630: 79 74 65 5f 6f 72 64 65 72 2e 68 22 0a 23 69 6e  yte_order.h".#in
0640: 63 6c 75 64 65 20 22 61 6c 67 6f 72 69 74 68 6d  clude "algorithm
0650: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 61  s.h".#include "a
0660: 69 63 68 2e 68 22 0a 0a 23 64 65 66 69 6e 65 20  ich.h"..#define 
0670: 45 44 32 4b 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  ED2K_CHUNK_SIZE 
0680: 20 39 37 32 38 30 30 30 0a 23 64 65 66 69 6e 65   9728000.#define
0690: 20 46 55 4c 4c 5f 42 4c 4f 43 4b 5f 53 49 5a 45   FULL_BLOCK_SIZE
06a0: 20 20 31 38 34 33 32 30 0a 23 64 65 66 69 6e 65    184320.#define
06b0: 20 4c 41 53 54 5f 42 4c 4f 43 4b 5f 53 49 5a 45   LAST_BLOCK_SIZE
06c0: 20 20 31 34 33 33 36 30 0a 23 64 65 66 69 6e 65    143360.#define
06d0: 20 42 4c 4f 43 4b 53 5f 50 45 52 5f 43 48 55 4e   BLOCKS_PER_CHUN
06e0: 4b 20 35 33 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  K 53../*. * The 
06f0: 41 6c 67 6f 72 69 74 68 6d 20 63 6f 75 6c 64 20  Algorithm could 
0700: 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  be a little fast
0710: 65 72 20 69 66 20 69 74 20 6b 6e 6f 77 73 20 61  er if it knows a
0720: 0a 20 2a 20 68 61 73 68 65 64 20 6d 65 73 73 61  . * hashed messa
0730: 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 68 61  ge size beforeha
0740: 6e 64 2e 20 54 68 69 73 20 77 6f 75 6c 64 20 61  nd. This would a
0750: 6c 6c 6f 77 0a 20 2a 20 74 6f 20 62 75 69 6c 64  llow. * to build
0760: 20 62 61 6c 61 6e 63 65 64 20 74 72 65 65 20 77   balanced tree w
0770: 68 69 6c 65 20 68 61 73 68 69 6e 67 20 74 68 65  hile hashing the
0780: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20   message.. *. * 
0790: 42 75 74 20 74 68 69 73 20 41 49 43 48 20 69 6d  But this AICH im
07a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
07b0: 6b 73 20 77 69 74 68 20 75 6e 6b 6e 6f 77 6e 0a  ks with unknown.
07c0: 20 2a 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20   * message size 
07d0: 6c 69 6b 65 20 6f 74 68 65 72 20 77 65 6c 6c 2d  like other well-
07e0: 6b 6e 6f 77 6e 20 68 61 73 68 20 61 6c 67 6f 72  known hash algor
07f0: 69 74 68 6d 73 0a 20 2a 20 28 69 74 20 77 61 73  ithms. * (it was
0800: 20 66 75 6e 20 74 6f 20 77 72 69 74 65 20 61 20   fun to write a 
0810: 73 75 63 68 20 6f 6e 65 29 2e 0a 20 2a 20 53 6f  such one).. * So
0820: 2c 20 69 74 20 6a 75 73 74 20 73 74 6f 72 65 73  , it just stores
0830: 20 73 68 61 31 20 68 61 73 68 65 73 20 61 6e 64   sha1 hashes and
0840: 20 62 75 69 6c 64 73 20 62 61 6c 61 6e 63 65 64   builds balanced
0850: 20 74 72 65 65 0a 20 2a 20 6f 6e 6c 79 20 6f 6e   tree. * only on
0860: 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2c 20   the last step, 
0870: 77 68 65 6e 20 74 68 65 20 66 75 6c 6c 20 6d 65  when the full me
0880: 73 73 61 67 65 20 70 72 6f 63 65 73 73 65 64 0a  ssage processed.
0890: 20 2a 20 61 6e 64 20 69 74 73 20 73 69 7a 65 20   * and its size 
08a0: 69 73 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  is already known
08b0: 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 55 53  .. */..#ifdef US
08c0: 45 5f 4f 50 45 4e 53 53 4c 0a 23 64 65 66 69 6e  E_OPENSSL.#defin
08d0: 65 20 53 48 41 31 5f 49 4e 49 54 28 63 74 78 29  e SHA1_INIT(ctx)
08e0: 20 28 28 70 69 6e 69 74 5f 74 29 63 74 78 2d 3e   ((pinit_t)ctx->
08f0: 73 68 61 5f 69 6e 69 74 29 28 26 63 74 78 2d 3e  sha_init)(&ctx->
0900: 73 68 61 31 5f 63 6f 6e 74 65 78 74 29 0a 23 64  sha1_context).#d
0910: 65 66 69 6e 65 20 53 48 41 31 5f 55 50 44 41 54  efine SHA1_UPDAT
0920: 45 28 63 74 78 2c 20 6d 73 67 2c 20 73 69 7a 65  E(ctx, msg, size
0930: 29 20 28 28 70 75 70 64 61 74 65 5f 74 29 63 74  ) ((pupdate_t)ct
0940: 78 2d 3e 73 68 61 5f 75 70 64 61 74 65 29 28 26  x->sha_update)(&
0950: 63 74 78 2d 3e 73 68 61 31 5f 63 6f 6e 74 65 78  ctx->sha1_contex
0960: 74 2c 20 28 6d 73 67 29 2c 20 28 73 69 7a 65 29  t, (msg), (size)
0970: 29 0a 23 64 65 66 69 6e 65 20 53 48 41 31 5f 46  ).#define SHA1_F
0980: 49 4e 41 4c 28 63 74 78 2c 20 72 65 73 75 6c 74  INAL(ctx, result
0990: 29 20 28 28 70 66 69 6e 61 6c 5f 74 29 63 74 78  ) ((pfinal_t)ctx
09a0: 2d 3e 73 68 61 5f 66 69 6e 61 6c 29 28 26 63 74  ->sha_final)(&ct
09b0: 78 2d 3e 73 68 61 31 5f 63 6f 6e 74 65 78 74 2c  x->sha1_context,
09c0: 20 28 72 65 73 75 6c 74 29 29 0a 23 65 6c 73 65   (result)).#else
09d0: 0a 23 64 65 66 69 6e 65 20 53 48 41 31 5f 49 4e  .#define SHA1_IN
09e0: 49 54 28 63 74 78 29 20 72 68 61 73 68 5f 73 68  IT(ctx) rhash_sh
09f0: 61 31 5f 69 6e 69 74 28 26 63 74 78 2d 3e 73 68  a1_init(&ctx->sh
0a00: 61 31 5f 63 6f 6e 74 65 78 74 29 0a 23 64 65 66  a1_context).#def
0a10: 69 6e 65 20 53 48 41 31 5f 55 50 44 41 54 45 28  ine SHA1_UPDATE(
0a20: 63 74 78 2c 20 6d 73 67 2c 20 73 69 7a 65 29 20  ctx, msg, size) 
0a30: 72 68 61 73 68 5f 73 68 61 31 5f 75 70 64 61 74  rhash_sha1_updat
0a40: 65 28 26 63 74 78 2d 3e 73 68 61 31 5f 63 6f 6e  e(&ctx->sha1_con
0a50: 74 65 78 74 2c 20 28 6d 73 67 29 2c 20 28 73 69  text, (msg), (si
0a60: 7a 65 29 29 0a 23 64 65 66 69 6e 65 20 53 48 41  ze)).#define SHA
0a70: 31 5f 46 49 4e 41 4c 28 63 74 78 2c 20 72 65 73  1_FINAL(ctx, res
0a80: 75 6c 74 29 20 72 68 61 73 68 5f 73 68 61 31 5f  ult) rhash_sha1_
0a90: 66 69 6e 61 6c 28 26 63 74 78 2d 3e 73 68 61 31  final(&ctx->sha1
0aa0: 5f 63 6f 6e 74 65 78 74 2c 20 28 72 65 73 75 6c  _context, (resul
0ab0: 74 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 0a  t)).#endif../**.
0ac0: 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c   * Initialize al
0ad0: 67 6f 72 69 74 68 6d 20 63 6f 6e 74 65 78 74 20  gorithm context 
0ae0: 62 65 66 6f 72 65 20 63 61 6c 63 75 6c 61 69 6e  before calculain
0af0: 67 20 68 61 73 68 2e 0a 20 2a 0a 20 2a 20 40 70  g hash.. *. * @p
0b00: 61 72 61 6d 20 63 74 78 20 63 6f 6e 74 65 78 74  aram ctx context
0b10: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
0b20: 2a 2f 0a 76 6f 69 64 20 72 68 61 73 68 5f 61 69  */.void rhash_ai
0b30: 63 68 5f 69 6e 69 74 28 61 69 63 68 5f 63 74 78  ch_init(aich_ctx
0b40: 20 2a 63 74 78 29 0a 7b 0a 09 6d 65 6d 73 65 74   *ctx).{..memset
0b50: 28 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (ctx, 0, sizeof(
0b60: 61 69 63 68 5f 63 74 78 29 29 3b 0a 0a 23 69 66  aich_ctx));..#if
0b70: 64 65 66 20 55 53 45 5f 4f 50 45 4e 53 53 4c 0a  def USE_OPENSSL.
0b80: 09 7b 0a 09 09 72 68 61 73 68 5f 68 61 73 68 5f  .{...rhash_hash_
0b90: 69 6e 66 6f 20 2a 73 68 61 31 5f 69 6e 66 6f 20  info *sha1_info 
0ba0: 3d 20 26 72 68 61 73 68 5f 69 6e 66 6f 5f 74 61  = &rhash_info_ta
0bb0: 62 6c 65 5b 33 5d 3b 0a 09 09 61 73 73 65 72 74  ble[3];...assert
0bc0: 28 73 68 61 31 5f 69 6e 66 6f 2d 3e 69 6e 66 6f  (sha1_info->info
0bd0: 2d 3e 68 61 73 68 5f 69 64 20 3d 3d 20 52 48 41  ->hash_id == RHA
0be0: 53 48 5f 53 48 41 31 29 3b 0a 09 09 61 73 73 65  SH_SHA1);...asse
0bf0: 72 74 28 73 68 61 31 5f 69 6e 66 6f 2d 3e 63 6f  rt(sha1_info->co
0c00: 6e 74 65 78 74 5f 73 69 7a 65 20 3c 3d 20 28 73  ntext_size <= (s
0c10: 69 7a 65 6f 66 28 73 68 61 31 5f 63 74 78 29 20  izeof(sha1_ctx) 
0c20: 2b 20 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65  + sizeof(unsigne
0c30: 64 20 6c 6f 6e 67 29 29 29 3b 0a 09 09 63 74 78  d long)));...ctx
0c40: 2d 3e 73 68 61 5f 69 6e 69 74 20 3d 20 73 68 61  ->sha_init = sha
0c50: 31 5f 69 6e 66 6f 2d 3e 69 6e 69 74 3b 0a 09 09  1_info->init;...
0c60: 63 74 78 2d 3e 73 68 61 5f 75 70 64 61 74 65 20  ctx->sha_update 
0c70: 3d 20 73 68 61 31 5f 69 6e 66 6f 2d 3e 75 70 64  = sha1_info->upd
0c80: 61 74 65 3b 0a 09 09 63 74 78 2d 3e 73 68 61 5f  ate;...ctx->sha_
0c90: 66 69 6e 61 6c 20 3d 20 73 68 61 31 5f 69 6e 66  final = sha1_inf
0ca0: 6f 2d 3e 66 69 6e 61 6c 3b 0a 09 7d 0a 23 65 6e  o->final;..}.#en
0cb0: 64 69 66 0a 0a 09 53 48 41 31 5f 49 4e 49 54 28  dif...SHA1_INIT(
0cc0: 63 74 78 29 3b 0a 7d 0a 0a 2f 2a 20 64 65 66 69  ctx);.}../* defi
0cd0: 6e 65 20 6d 61 63 72 6f 73 73 65 73 20 74 6f 20  ne macrosses to 
0ce0: 61 63 63 65 73 73 20 63 68 75 6e 6b 20 74 61 62  access chunk tab
0cf0: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 54  le */.#define CT
0d00: 5f 42 49 54 53 20 38 0a 23 64 65 66 69 6e 65 20  _BITS 8.#define 
0d10: 43 54 5f 47 52 4f 55 50 5f 53 49 5a 45 20 28 31  CT_GROUP_SIZE (1
0d20: 20 3c 3c 20 43 54 5f 42 49 54 53 29 0a 74 79 70   << CT_BITS).typ
0d30: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0d40: 61 72 20 68 61 73 68 5f 70 61 69 72 5f 74 5b 32  ar hash_pair_t[2
0d50: 5d 5b 73 68 61 31 5f 68 61 73 68 5f 73 69 7a 65  ][sha1_hash_size
0d60: 5d 3b 0a 74 79 70 65 64 65 66 20 68 61 73 68 5f  ];.typedef hash_
0d70: 70 61 69 72 5f 74 20 68 61 73 68 5f 70 61 69 72  pair_t hash_pair
0d80: 73 5f 67 72 6f 75 70 5f 74 5b 43 54 5f 47 52 4f  s_group_t[CT_GRO
0d90: 55 50 5f 53 49 5a 45 5d 3b 0a 0a 23 64 65 66 69  UP_SIZE];..#defi
0da0: 6e 65 20 43 54 5f 49 4e 44 45 58 28 63 68 75 6e  ne CT_INDEX(chun
0db0: 6b 5f 6e 75 6d 29 20 28 28 63 68 75 6e 6b 5f 6e  k_num) ((chunk_n
0dc0: 75 6d 29 20 26 20 28 43 54 5f 47 52 4f 55 50 5f  um) & (CT_GROUP_
0dd0: 53 49 5a 45 20 2d 20 31 29 29 0a 23 64 65 66 69  SIZE - 1)).#defi
0de0: 6e 65 20 47 45 54 5f 48 41 53 48 5f 50 41 49 52  ne GET_HASH_PAIR
0df0: 28 63 74 78 2c 20 63 68 75 6e 6b 5f 6e 75 6d 29  (ctx, chunk_num)
0e00: 20 5c 0a 09 28 28 28 68 61 73 68 5f 70 61 69 72   \..(((hash_pair
0e10: 5f 74 2a 29 28 63 74 78 2d 3e 63 68 75 6e 6b 5f  _t*)(ctx->chunk_
0e20: 74 61 62 6c 65 5b 63 68 75 6e 6b 5f 6e 75 6d 20  table[chunk_num 
0e30: 3e 3e 20 43 54 5f 42 49 54 53 5d 29 29 5b 43 54  >> CT_BITS]))[CT
0e40: 5f 49 4e 44 45 58 28 63 68 75 6e 6b 5f 6e 75 6d  _INDEX(chunk_num
0e50: 29 5d 29 0a 0a 2f 2a 2a 0a 20 2a 20 52 65 73 69  )])../**. * Resi
0e60: 7a 65 20 74 68 65 20 74 61 62 6c 65 20 69 66 20  ze the table if 
0e70: 6e 65 65 64 65 64 20 74 6f 20 65 6e 73 75 72 65  needed to ensure
0e80: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 73 70 61   it contains spa
0e90: 63 65 20 66 6f 72 20 67 69 76 65 6e 20 63 68 75  ce for given chu
0ea0: 6e 6b 5f 6e 75 6d 2e 0a 20 2a 20 61 6e 64 20 61  nk_num.. * and a
0eb0: 6c 6c 6f 63 61 74 65 20 68 61 73 68 5f 70 61 69  llocate hash_pai
0ec0: 72 73 5f 67 72 6f 75 70 5f 74 20 65 6c 65 6d 65  rs_group_t eleme
0ed0: 6e 74 20 61 74 20 74 68 69 73 20 69 6e 64 65 78  nt at this index
0ee0: 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 61 6d 20 63  .. *. * @param c
0ef0: 74 78 20 61 6c 67 6f 72 69 74 68 6d 20 63 6f 6e  tx algorithm con
0f00: 74 65 78 74 0a 20 2a 20 40 70 61 72 61 6d 20 63  text. * @param c
0f10: 68 75 6e 6b 5f 6e 75 6d 20 74 68 65 20 6e 75 6d  hunk_num the num
0f20: 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 72 65  ber of chunks re
0f30: 71 75 69 72 65 64 0a 20 2a 2f 0a 73 74 61 74 69  quired. */.stati
0f40: 63 20 76 6f 69 64 20 72 68 61 73 68 5f 61 69 63  c void rhash_aic
0f50: 68 5f 63 68 75 6e 6b 5f 74 61 62 6c 65 5f 65 78  h_chunk_table_ex
0f60: 74 65 6e 64 28 61 69 63 68 5f 63 74 78 2a 20 63  tend(aich_ctx* c
0f70: 74 78 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 75  tx, unsigned chu
0f80: 6e 6b 5f 6e 75 6d 29 0a 7b 0a 09 75 6e 73 69 67  nk_num).{..unsig
0f90: 6e 65 64 20 69 6e 64 65 78 20 3d 20 28 63 68 75  ned index = (chu
0fa0: 6e 6b 5f 6e 75 6d 20 3e 3e 20 43 54 5f 42 49 54  nk_num >> CT_BIT
0fb0: 53 29 3b 0a 09 61 73 73 65 72 74 28 73 69 7a 65  S);..assert(size
0fc0: 6f 66 28 68 61 73 68 5f 70 61 69 72 5f 74 29 20  of(hash_pair_t) 
0fd0: 3d 3d 20 34 30 29 3b 0a 09 61 73 73 65 72 74 28  == 40);..assert(
0fe0: 73 69 7a 65 6f 66 28 68 61 73 68 5f 70 61 69 72  sizeof(hash_pair
0ff0: 73 5f 67 72 6f 75 70 5f 74 29 20 3d 3d 20 28 34  s_group_t) == (4
1000: 30 20 2a 20 43 54 5f 47 52 4f 55 50 5f 53 49 5a  0 * CT_GROUP_SIZ
1010: 45 29 29 3b 20 2f 2a 20 31 30 4b 69 42 20 2a 2f  E)); /* 10KiB */
1020: 0a 09 61 73 73 65 72 74 28 43 54 5f 47 52 4f 55  ..assert(CT_GROU
1030: 50 5f 53 49 5a 45 20 3d 3d 20 32 35 36 29 3b 0a  P_SIZE == 256);.
1040: 09 61 73 73 65 72 74 28 43 54 5f 49 4e 44 45 58  .assert(CT_INDEX
1050: 28 63 68 75 6e 6b 5f 6e 75 6d 29 20 3d 3d 20 30  (chunk_num) == 0
1060: 29 3b 0a 0a 09 2f 2a 20 63 68 65 63 6b 20 6d 61  );.../* check ma
1070: 69 6e 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 2a  in assumptions *
1080: 2f 0a 09 61 73 73 65 72 74 28 63 74 78 2d 3e 63  /..assert(ctx->c
1090: 68 75 6e 6b 5f 74 61 62 6c 65 20 3d 3d 20 30 20  hunk_table == 0 
10a0: 7c 7c 20 63 74 78 2d 3e 63 68 75 6e 6b 5f 74 61  || ctx->chunk_ta
10b0: 62 6c 65 5b 69 6e 64 65 78 20 2d 20 31 5d 20 21  ble[index - 1] !
10c0: 3d 20 30 29 3b 20 2f 2a 20 74 61 62 6c 65 20 69  = 0); /* table i
10d0: 73 20 65 6d 70 74 79 20 6f 72 20 66 75 6c 6c 20  s empty or full 
10e0: 2a 2f 0a 09 61 73 73 65 72 74 28 69 6e 64 65 78  */..assert(index
10f0: 20 3c 3d 20 63 74 78 2d 3e 61 6c 6c 6f 63 61 74   <= ctx->allocat
1100: 65 64 29 3b 0a 0a 09 2f 2a 20 63 68 65 63 6b 20  ed);.../* check 
1110: 69 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  if there is enou
1120: 67 68 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  gh space allocat
1130: 65 64 20 2a 2f 0a 09 69 66 20 28 69 6e 64 65 78  ed */..if (index
1140: 20 3e 3d 20 63 74 78 2d 3e 61 6c 6c 6f 63 61 74   >= ctx->allocat
1150: 65 64 29 20 7b 0a 09 09 2f 2a 20 72 65 73 69 7a  ed) {.../* resiz
1160: 65 20 74 68 65 20 74 61 62 6c 65 20 62 79 20 61  e the table by a
1170: 6c 6c 6f 63 61 74 69 6e 67 20 73 6f 6d 65 20 65  llocating some e
1180: 78 74 72 61 20 73 70 61 63 65 20 2a 2f 0a 09 09  xtra space */...
1190: 73 69 7a 65 5f 74 20 6e 65 77 5f 73 69 7a 65 20  size_t new_size 
11a0: 3d 20 28 63 74 78 2d 3e 61 6c 6c 6f 63 61 74 65  = (ctx->allocate
11b0: 64 20 3d 3d 20 30 20 3f 20 36 34 20 3a 20 63 74  d == 0 ? 64 : ct
11c0: 78 2d 3e 61 6c 6c 6f 63 61 74 65 64 20 2a 20 32  x->allocated * 2
11d0: 29 3b 0a 09 09 61 73 73 65 72 74 28 69 6e 64 65  );...assert(inde
11e0: 78 20 3d 3d 20 63 74 78 2d 3e 61 6c 6c 6f 63 61  x == ctx->alloca
11f0: 74 65 64 29 3b 0a 0a 09 09 2f 2a 20 72 65 2d 61  ted);..../* re-a
1200: 6c 6c 6f 63 61 74 65 20 74 68 65 20 63 68 75 6e  llocate the chun
1210: 6b 20 74 61 62 6c 65 20 74 6f 20 63 6f 6e 74 61  k table to conta
1220: 69 6e 20 6e 65 77 5f 73 69 7a 65 20 76 6f 69 64  in new_size void
1230: 2a 2d 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 09 09  *-pointers */...
1240: 63 74 78 2d 3e 63 68 75 6e 6b 5f 74 61 62 6c 65  ctx->chunk_table
1250: 20 3d 20 28 76 6f 69 64 2a 2a 29 72 65 61 6c 6c   = (void**)reall
1260: 6f 63 28 63 74 78 2d 3e 63 68 75 6e 6b 5f 74 61  oc(ctx->chunk_ta
1270: 62 6c 65 2c 20 6e 65 77 5f 73 69 7a 65 20 2a 20  ble, new_size * 
1280: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 3b 0a  sizeof(void*));.
1290: 09 09 69 66 20 28 63 74 78 2d 3e 63 68 75 6e 6b  ..if (ctx->chunk
12a0: 5f 74 61 62 6c 65 20 3d 3d 20 30 29 20 7b 0a 09  _table == 0) {..
12b0: 09 09 63 74 78 2d 3e 65 72 72 6f 72 20 3d 20 31  ..ctx->error = 1
12c0: 3b 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d  ;....return;...}
12d0: 0a 0a 09 09 6d 65 6d 73 65 74 28 63 74 78 2d 3e  ....memset(ctx->
12e0: 63 68 75 6e 6b 5f 74 61 62 6c 65 20 2b 20 63 74  chunk_table + ct
12f0: 78 2d 3e 61 6c 6c 6f 63 61 74 65 64 2c 20 30 2c  x->allocated, 0,
1300: 20 28 6e 65 77 5f 73 69 7a 65 20 2d 20 63 74 78   (new_size - ctx
1310: 2d 3e 61 6c 6c 6f 63 61 74 65 64 29 20 2a 20 73  ->allocated) * s
1320: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 3b 0a 09  izeof(void*));..
1330: 09 63 74 78 2d 3e 61 6c 6c 6f 63 61 74 65 64 20  .ctx->allocated 
1340: 3d 20 6e 65 77 5f 73 69 7a 65 3b 0a 09 7d 0a 0a  = new_size;..}..
1350: 09 2f 2a 20 61 64 64 20 6e 65 77 20 68 61 73 68  ./* add new hash
1360: 5f 70 61 69 72 73 5f 67 72 6f 75 70 5f 74 20 62  _pairs_group_t b
1370: 6c 6f 63 6b 20 74 6f 20 74 68 65 20 74 61 62 6c  lock to the tabl
1380: 65 20 2a 2f 0a 09 61 73 73 65 72 74 28 69 6e 64  e */..assert(ind
1390: 65 78 20 3c 20 63 74 78 2d 3e 61 6c 6c 6f 63 61  ex < ctx->alloca
13a0: 74 65 64 29 3b 0a 09 61 73 73 65 72 74 28 63 74  ted);..assert(ct
13b0: 78 2d 3e 63 68 75 6e 6b 5f 74 61 62 6c 65 20 21  x->chunk_table !
13c0: 3d 20 30 29 3b 0a 09 61 73 73 65 72 74 28 63 74  = 0);..assert(ct
13d0: 78 2d 3e 63 68 75 6e 6b 5f 74 61 62 6c 65 5b 69  x->chunk_table[i
13e0: 6e 64 65 78 5d 20 3d 3d 20 30 29 3b 0a 0a 09 63  ndex] == 0);...c
13f0: 74 78 2d 3e 63 68 75 6e 6b 5f 74 61 62 6c 65 5b  tx->chunk_table[
1400: 69 6e 64 65 78 5d 20 3d 20 6d 61 6c 6c 6f 63 28  index] = malloc(
1410: 73 69 7a 65 6f 66 28 68 61 73 68 5f 70 61 69 72  sizeof(hash_pair
1420: 73 5f 67 72 6f 75 70 5f 74 29 29 3b 0a 09 69 66  s_group_t));..if
1430: 20 28 63 74 78 2d 3e 63 68 75 6e 6b 5f 74 61 62   (ctx->chunk_tab
1440: 6c 65 5b 69 6e 64 65 78 5d 20 3d 3d 20 30 29 20  le[index] == 0) 
1450: 63 74 78 2d 3e 65 72 72 6f 72 20 3d 20 31 3b 0a  ctx->error = 1;.
1460: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 46 72 65 65 20 64  }../**. * Free d
1470: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1480: 61 74 65 64 20 6d 65 6d 6f 72 79 20 66 6f 72 20  ated memory for 
1490: 69 6e 74 65 72 6e 61 6c 20 73 74 72 75 63 74 75  internal structu
14a0: 72 65 73 0a 20 2a 20 75 73 65 64 20 62 79 20 68  res. * used by h
14b0: 61 73 68 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d  ashing algorithm
14c0: 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 61 6d 20 63  .. *. * @param c
14d0: 74 78 20 41 49 43 48 20 61 6c 67 6f 72 69 74 68  tx AICH algorith
14e0: 6d 20 63 6f 6e 74 65 78 74 20 74 6f 20 63 6c 65  m context to cle
14f0: 61 6e 75 70 0a 20 2a 2f 0a 76 6f 69 64 20 72 68  anup. */.void rh
1500: 61 73 68 5f 61 69 63 68 5f 63 6c 65 61 6e 75 70  ash_aich_cleanup
1510: 28 61 69 63 68 5f 63 74 78 2a 20 63 74 78 29 0a  (aich_ctx* ctx).
1520: 7b 0a 09 73 69 7a 65 5f 74 20 69 3b 0a 09 73 69  {..size_t i;..si
1530: 7a 65 5f 74 20 74 61 62 6c 65 5f 73 69 7a 65 20  ze_t table_size 
1540: 3d 20 28 63 74 78 2d 3e 63 68 75 6e 6b 73 5f 6e  = (ctx->chunks_n
1550: 75 6d 62 65 72 20 2b 20 43 54 5f 47 52 4f 55 50  umber + CT_GROUP
1560: 5f 53 49 5a 45 20 2d 20 31 29 20 2f 20 43 54 5f  _SIZE - 1) / CT_
1570: 47 52 4f 55 50 5f 53 49 5a 45 3b 0a 0a 09 69 66  GROUP_SIZE;...if
1580: 20 28 63 74 78 2d 3e 63 68 75 6e 6b 5f 74 61 62   (ctx->chunk_tab
1590: 6c 65 20 21 3d 20 30 29 20 7b 0a 09 09 61 73 73  le != 0) {...ass
15a0: 65 72 74 28 74 61 62 6c 65 5f 73 69 7a 65 20 3c  ert(table_size <
15b0: 3d 20 63 74 78 2d 3e 61 6c 6c 6f 63 61 74 65 64  = ctx->allocated
15c0: 29 3b 0a 09 09 61 73 73 65 72 74 28 74 61 62 6c  );...assert(tabl
15d0: 65 5f 73 69 7a 65 20 3d 3d 20 63 74 78 2d 3e 61  e_size == ctx->a
15e0: 6c 6c 6f 63 61 74 65 64 20 7c 7c 20 63 74 78 2d  llocated || ctx-
15f0: 3e 63 68 75 6e 6b 5f 74 61 62 6c 65 5b 74 61 62  >chunk_table[tab
1600: 6c 65 5f 73 69 7a 65 5d 20 3d 3d 20 30 29 3b 0a  le_size] == 0);.
1610: 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 20 69  ..for (i = 0;  i
1620: 20 3c 20 74 61 62 6c 65 5f 73 69 7a 65 3b 20 69   < table_size; i
1630: 2b 2b 29 20 66 72 65 65 28 63 74 78 2d 3e 63 68  ++) free(ctx->ch
1640: 75 6e 6b 5f 74 61 62 6c 65 5b 69 5d 29 3b 0a 09  unk_table[i]);..
1650: 09 66 72 65 65 28 63 74 78 2d 3e 63 68 75 6e 6b  .free(ctx->chunk
1660: 5f 74 61 62 6c 65 29 3b 0a 09 09 63 74 78 2d 3e  _table);...ctx->
1670: 63 68 75 6e 6b 5f 74 61 62 6c 65 20 3d 20 30 3b  chunk_table = 0;
1680: 0a 09 7d 0a 0a 09 66 72 65 65 28 63 74 78 2d 3e  ..}...free(ctx->
1690: 62 6c 6f 63 6b 5f 68 61 73 68 65 73 29 3b 0a 09  block_hashes);..
16a0: 63 74 78 2d 3e 62 6c 6f 63 6b 5f 68 61 73 68 65  ctx->block_hashe
16b0: 73 20 3d 20 30 3b 0a 7d 0a 0a 23 64 65 66 69 6e  s = 0;.}..#defin
16c0: 65 20 41 49 43 48 5f 48 41 53 48 5f 46 55 4c 4c  e AICH_HASH_FULL
16d0: 5f 54 52 45 45 20 30 0a 23 64 65 66 69 6e 65 20  _TREE 0.#define 
16e0: 41 49 43 48 5f 48 41 53 48 5f 4c 45 46 54 5f 42  AICH_HASH_LEFT_B
16f0: 52 41 4e 43 48 20 31 0a 23 64 65 66 69 6e 65 20  RANCH 1.#define 
1700: 41 49 43 48 5f 48 41 53 48 5f 52 49 47 48 54 5f  AICH_HASH_RIGHT_
1710: 42 52 41 4e 43 48 20 32 0a 0a 2f 2a 2a 0a 20 2a  BRANCH 2../**. *
1720: 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 20 41 49   Calculate an AI
1730: 43 48 20 74 72 65 65 20 68 61 73 68 2c 20 62 61  CH tree hash, ba
1740: 73 65 64 20 65 74 68 65 72 20 6f 6e 20 68 61 73  sed ether on has
1750: 68 65 73 20 6f 66 20 31 38 30 4b 42 20 70 61 72  hes of 180KB par
1760: 74 73 0a 20 2a 20 28 66 6f 72 20 61 6e 20 65 64  ts. * (for an ed
1770: 32 6b 20 63 68 75 6e 6b 29 20 6f 72 20 6f 6e 20  2k chunk) or on 
1780: 73 74 6f 72 65 64 20 65 64 32 6b 20 63 68 75 6e  stored ed2k chun
1790: 6b 73 20 28 66 6f 72 20 74 68 65 20 77 68 6f 6c  ks (for the whol
17a0: 65 20 74 72 65 65 20 68 61 73 68 29 2e 0a 20 2a  e tree hash).. *
17b0: 0a 20 2a 20 40 70 61 72 61 6d 20 63 74 78 20 61  . * @param ctx a
17c0: 6c 67 6f 72 69 74 68 6d 20 63 6f 6e 74 65 78 74  lgorithm context
17d0: 0a 20 2a 20 40 70 61 72 61 6d 20 72 65 73 75 6c  . * @param resul
17e0: 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 63  t pointer to rec
17f0: 65 69 76 65 20 63 61 6c 63 75 6c 61 74 65 64 20  eive calculated 
1800: 74 72 65 65 20 68 61 73 68 0a 20 2a 20 40 70 61  tree hash. * @pa
1810: 72 61 6d 20 74 79 70 65 20 74 68 65 20 74 79 70  ram type the typ
1820: 65 20 6f 66 20 68 61 73 68 20 74 6f 20 63 61 6c  e of hash to cal
1830: 63 75 6c 61 74 65 2c 20 63 61 6e 20 62 65 20 6f  culate, can be o
1840: 6e 65 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 0a  ne of constants.
1850: 20 2a 20 20 20 41 49 43 48 5f 48 41 53 48 5f 4c   *   AICH_HASH_L
1860: 45 46 54 5f 42 52 41 4e 43 48 2c 20 41 49 43 48  EFT_BRANCH, AICH
1870: 5f 48 41 53 48 5f 52 49 47 48 54 5f 42 52 41 4e  _HASH_RIGHT_BRAN
1880: 43 48 20 6f 72 20 41 49 43 48 5f 48 41 53 48 5f  CH or AICH_HASH_
1890: 46 55 4c 4c 5f 54 52 45 45 2e 0a 20 2a 2f 0a 73  FULL_TREE.. */.s
18a0: 74 61 74 69 63 20 76 6f 69 64 20 72 68 61 73 68  tatic void rhash
18b0: 5f 61 69 63 68 5f 68 61 73 68 5f 74 72 65 65 28  _aich_hash_tree(
18c0: 61 69 63 68 5f 63 74 78 20 2a 63 74 78 2c 20 75  aich_ctx *ctx, u
18d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 20 72 65  nsigned char* re
18e0: 73 75 6c 74 2c 20 69 6e 74 20 74 79 70 65 29 0a  sult, int type).
18f0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 64 65  {..unsigned inde
1900: 78 20 3d 20 30 3b 20 2f 2a 20 6c 65 61 66 20 69  x = 0; /* leaf i
1910: 6e 64 65 78 20 2a 2f 0a 09 75 6e 73 69 67 6e 65  ndex */..unsigne
1920: 64 20 62 6c 6f 63 6b 73 3b 0a 09 69 6e 74 20 20  d blocks;..int  
1930: 20 20 20 20 6c 65 76 65 6c 20 3d 20 30 3b 0a 09      level = 0;..
1940: 75 6e 73 69 67 6e 65 64 20 69 73 5f 6c 65 66 74  unsigned is_left
1950: 5f 62 72 61 6e 63 68 20 3d 20 28 74 79 70 65 20  _branch = (type 
1960: 3d 3d 20 41 49 43 48 5f 48 41 53 48 5f 52 49 47  == AICH_HASH_RIG
1970: 48 54 5f 42 52 41 4e 43 48 20 3f 20 30 78 30 20  HT_BRANCH ? 0x0 
1980: 3a 20 30 78 31 29 3b 0a 09 75 69 6e 74 36 34 5f  : 0x1);..uint64_
1990: 74 20 70 61 74 68 20 20 3d 20 69 73 5f 6c 65 66  t path  = is_lef
19a0: 74 5f 62 72 61 6e 63 68 3b 0a 09 75 6e 73 69 67  t_branch;..unsig
19b0: 6e 65 64 20 62 6c 6f 63 6b 73 5f 73 74 61 63 6b  ned blocks_stack
19c0: 5b 35 36 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  [56];..unsigned 
19d0: 63 68 61 72 20 73 68 61 31 5f 73 74 61 63 6b 5b  char sha1_stack[
19e0: 35 36 5d 5b 73 68 61 31 5f 68 61 73 68 5f 73 69  56][sha1_hash_si
19f0: 7a 65 5d 3b 0a 0a 09 69 66 20 28 63 74 78 2d 3e  ze];...if (ctx->
1a00: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 3b 0a 09  error) return;..
1a10: 61 73 73 65 72 74 28 63 74 78 2d 3e 69 6e 64 65  assert(ctx->inde
1a20: 78 20 3c 3d 20 45 44 32 4b 5f 43 48 55 4e 4b 5f  x <= ED2K_CHUNK_
1a30: 53 49 5a 45 29 3b 0a 09 61 73 73 65 72 74 28 74  SIZE);..assert(t
1a40: 79 70 65 20 3d 3d 20 41 49 43 48 5f 48 41 53 48  ype == AICH_HASH
1a50: 5f 46 55 4c 4c 5f 54 52 45 45 20 3f 20 63 74 78  _FULL_TREE ? ctx
1a60: 2d 3e 63 68 75 6e 6b 5f 74 61 62 6c 65 20 21 3d  ->chunk_table !=
1a70: 20 30 20 3a 20 63 74 78 2d 3e 62 6c 6f 63 6b 5f   0 : ctx->block_
1a80: 68 61 73 68 65 73 20 21 3d 20 30 29 3b 0a 0a 09  hashes != 0);...
1a90: 2f 2a 20 63 61 6c 63 75 6c 61 74 65 20 6e 75 6d  /* calculate num
1aa0: 62 65 72 20 6f 66 20 6c 65 61 66 73 20 69 6e 20  ber of leafs in 
1ab0: 74 68 65 20 74 72 65 65 20 2a 2f 0a 09 62 6c 6f  the tree */..blo
1ac0: 63 6b 73 5f 73 74 61 63 6b 5b 30 5d 20 3d 20 62  cks_stack[0] = b
1ad0: 6c 6f 63 6b 73 20 3d 20 28 75 6e 73 69 67 6e 65  locks = (unsigne
1ae0: 64 29 28 74 79 70 65 20 3d 3d 20 41 49 43 48 5f  d)(type == AICH_
1af0: 48 41 53 48 5f 46 55 4c 4c 5f 54 52 45 45 20 3f  HASH_FULL_TREE ?
1b00: 0a 09 09 63 74 78 2d 3e 63 68 75 6e 6b 73 5f 6e  ...ctx->chunks_n
1b10: 75 6d 62 65 72 20 3a 20 28 63 74 78 2d 3e 69 6e  umber : (ctx->in
1b20: 64 65 78 20 2b 20 46 55 4c 4c 5f 42 4c 4f 43 4b  dex + FULL_BLOCK
1b30: 5f 53 49 5a 45 20 2d 20 31 29 20 2f 20 46 55 4c  _SIZE - 1) / FUL
1b40: 4c 5f 42 4c 4f 43 4b 5f 53 49 5a 45 29 3b 0a 0a  L_BLOCK_SIZE);..
1b50: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 75  .while (1) {...u
1b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 68 61  nsigned char sha
1b70: 31 5f 6d 65 73 73 61 67 65 5b 73 68 61 31 5f 68  1_message[sha1_h
1b80: 61 73 68 5f 73 69 7a 65 5d 3b 0a 09 09 75 6e 73  ash_size];...uns
1b90: 69 67 6e 65 64 20 63 68 61 72 2a 20 6c 65 61 66  igned char* leaf
1ba0: 5f 68 61 73 68 3b 0a 0a 09 09 2f 2a 20 67 6f 20  _hash;..../* go 
1bb0: 69 6e 74 6f 20 74 68 65 20 6c 65 66 74 20 62 72  into the left br
1bc0: 61 6e 63 68 65 73 20 75 6e 74 69 6c 20 61 20 6c  anches until a l
1bd0: 65 61 66 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  eaf block is rea
1be0: 63 68 65 64 20 2a 2f 0a 09 09 77 68 69 6c 65 20  ched */...while 
1bf0: 28 62 6c 6f 63 6b 73 20 3e 20 31 29 20 7b 0a 09  (blocks > 1) {..
1c00: 09 09 2f 2a 20 73 74 65 70 20 64 6f 77 6e 20 69  ../* step down i
1c10: 6e 74 6f 20 74 68 65 20 6c 65 66 74 20 62 72 61  nto the left bra
1c20: 6e 63 68 20 2a 2f 0a 09 09 09 62 6c 6f 63 6b 73  nch */....blocks
1c30: 20 3d 20 28 62 6c 6f 63 6b 73 20 2b 20 28 28 75   = (blocks + ((u
1c40: 6e 73 69 67 6e 65 64 29 70 61 74 68 20 26 20 30  nsigned)path & 0
1c50: 78 31 29 29 20 2f 20 32 3b 0a 09 09 09 6c 65 76  x1)) / 2;....lev
1c60: 65 6c 2b 2b 3b 0a 09 09 09 61 73 73 65 72 74 28  el++;....assert(
1c70: 6c 65 76 65 6c 20 3c 20 35 36 29 3b 20 2f 2a 20  level < 56); /* 
1c80: 61 73 73 75 6d 70 74 69 6f 6e 20 66 69 6c 65 73  assumption files
1c90: 69 7a 65 20 3c 20 28 32 5e 35 36 20 2a 20 39 4d  ize < (2^56 * 9M
1ca0: 69 42 29 20 2a 2f 0a 09 09 09 62 6c 6f 63 6b 73  iB) */....blocks
1cb0: 5f 73 74 61 63 6b 5b 6c 65 76 65 6c 5d 20 3d 20  _stack[level] = 
1cc0: 62 6c 6f 63 6b 73 3b 0a 09 09 09 70 61 74 68 20  blocks;....path 
1cd0: 3d 20 28 70 61 74 68 20 3c 3c 20 31 29 20 7c 20  = (path << 1) | 
1ce0: 30 78 31 3b 20 2f 2a 20 6d 61 72 6b 20 62 72 61  0x1; /* mark bra
1cf0: 6e 63 68 20 61 73 20 6c 65 66 74 20 2a 2f 0a 09  nch as left */..
1d00: 09 7d 0a 0a 09 09 2f 2a 20 72 65 61 64 20 61 20  .}..../* read a 
1d10: 6c 65 61 66 20 68 61 73 68 20 2a 2f 0a 09 09 6c  leaf hash */...l
1d20: 65 61 66 5f 68 61 73 68 20 3d 20 26 28 63 74 78  eaf_hash = &(ctx
1d30: 2d 3e 62 6c 6f 63 6b 5f 68 61 73 68 65 73 5b 69  ->block_hashes[i
1d40: 6e 64 65 78 5d 5b 30 5d 29 3b 0a 0a 09 09 69 66  ndex][0]);....if
1d50: 20 28 74 79 70 65 20 3d 3d 20 41 49 43 48 5f 48   (type == AICH_H
1d60: 41 53 48 5f 46 55 4c 4c 5f 54 52 45 45 29 20 7b  ASH_FULL_TREE) {
1d70: 0a 09 09 09 69 73 5f 6c 65 66 74 5f 62 72 61 6e  ....is_left_bran
1d80: 63 68 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70  ch = (unsigned)p
1d90: 61 74 68 20 26 20 30 78 31 3b 0a 0a 09 09 09 6c  ath & 0x1;.....l
1da0: 65 61 66 5f 68 61 73 68 20 3d 20 47 45 54 5f 48  eaf_hash = GET_H
1db0: 41 53 48 5f 50 41 49 52 28 63 74 78 2c 20 69 6e  ASH_PAIR(ctx, in
1dc0: 64 65 78 29 5b 69 73 5f 6c 65 66 74 5f 62 72 61  dex)[is_left_bra
1dd0: 6e 63 68 5d 3b 0a 09 09 7d 0a 09 09 69 6e 64 65  nch];...}...inde
1de0: 78 2b 2b 3b 0a 0a 09 09 2f 2a 20 63 6c 69 6d 62  x++;..../* climb
1df0: 20 75 70 20 74 68 65 20 74 72 65 65 20 75 6e 74   up the tree unt
1e00: 69 6c 20 61 20 6c 65 66 74 20 62 72 61 6e 63 68  il a left branch
1e10: 20 69 73 20 72 65 61 63 68 65 64 20 2a 2f 0a 09   is reached */..
1e20: 09 66 6f 72 20 28 3b 20 6c 65 76 65 6c 20 3e 20  .for (; level > 
1e30: 30 20 26 26 20 28 70 61 74 68 20 26 20 30 78 30  0 && (path & 0x0
1e40: 31 29 20 3d 3d 20 30 3b 20 70 61 74 68 20 3e 3e  1) == 0; path >>
1e50: 3d 20 31 29 20 7b 0a 09 09 09 53 48 41 31 5f 49  = 1) {....SHA1_I
1e60: 4e 49 54 28 63 74 78 29 3b 0a 09 09 09 53 48 41  NIT(ctx);....SHA
1e70: 31 5f 55 50 44 41 54 45 28 63 74 78 2c 20 73 68  1_UPDATE(ctx, sh
1e80: 61 31 5f 73 74 61 63 6b 5b 6c 65 76 65 6c 5d 2c  a1_stack[level],
1e90: 20 73 68 61 31 5f 68 61 73 68 5f 73 69 7a 65 29   sha1_hash_size)
1ea0: 3b 0a 09 09 09 53 48 41 31 5f 55 50 44 41 54 45  ;....SHA1_UPDATE
1eb0: 28 63 74 78 2c 20 6c 65 61 66 5f 68 61 73 68 2c  (ctx, leaf_hash,
1ec0: 20 73 68 61 31 5f 68 61 73 68 5f 73 69 7a 65 29   sha1_hash_size)
1ed0: 3b 0a 09 09 09 53 48 41 31 5f 46 49 4e 41 4c 28  ;....SHA1_FINAL(
1ee0: 63 74 78 2c 20 73 68 61 31 5f 6d 65 73 73 61 67  ctx, sha1_messag
1ef0: 65 29 3b 0a 09 09 09 6c 65 61 66 5f 68 61 73 68  e);....leaf_hash
1f00: 20 3d 20 73 68 61 31 5f 6d 65 73 73 61 67 65 3b   = sha1_message;
1f10: 0a 09 09 09 6c 65 76 65 6c 2d 2d 3b 0a 09 09 7d  ....level--;...}
1f20: 0a 09 09 6d 65 6d 63 70 79 28 28 6c 65 76 65 6c  ...memcpy((level
1f30: 20 3e 20 30 20 3f 20 73 68 61 31 5f 73 74 61 63   > 0 ? sha1_stac
1f40: 6b 5b 6c 65 76 65 6c 5d 20 3a 20 72 65 73 75 6c  k[level] : resul
1f50: 74 29 2c 20 6c 65 61 66 5f 68 61 73 68 2c 20 32  t), leaf_hash, 2
1f60: 30 29 3b 0a 0a 09 09 69 66 20 28 6c 65 76 65 6c  0);....if (level
1f70: 20 3d 3d 20 30 29 20 62 72 65 61 6b 3b 0a 0a 09   == 0) break;...
1f80: 09 2f 2a 20 6a 75 6d 70 20 61 74 20 74 68 65 20  ./* jump at the 
1f90: 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 66 72  current level fr
1fa0: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1fb0: 20 62 72 61 6e 63 68 20 2a 2f 0a 09 09 70 61 74   branch */...pat
1fc0: 68 20 26 3d 20 7e 30 78 31 3b 20 2f 2a 20 6d 61  h &= ~0x1; /* ma
1fd0: 72 6b 20 62 72 61 6e 63 68 20 61 73 20 72 69 67  rk branch as rig
1fe0: 68 74 20 2a 2f 0a 09 09 69 73 5f 6c 65 66 74 5f  ht */...is_left_
1ff0: 62 72 61 6e 63 68 20 3d 20 28 28 75 6e 73 69 67  branch = ((unsig
2000: 6e 65 64 29 70 61 74 68 20 3e 3e 20 31 29 20 26  ned)path >> 1) &
2010: 20 31 3b 0a 0a 09 09 2f 2a 20 63 61 6c 63 75 6c   1;..../* calcul
2020: 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c  ate number of bl
2030: 6f 63 6b 73 20 61 74 20 72 69 67 68 74 20 62 72  ocks at right br
2040: 61 6e 63 68 20 6f 66 20 74 68 65 20 63 75 72 72  anch of the curr
2050: 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 09 09 62  ent level */...b
2060: 6c 6f 63 6b 73 5f 73 74 61 63 6b 5b 6c 65 76 65  locks_stack[leve
2070: 6c 5d 20 3d 0a 09 09 09 28 62 6c 6f 63 6b 73 5f  l] =....(blocks_
2080: 73 74 61 63 6b 5b 6c 65 76 65 6c 20 2d 20 31 5d  stack[level - 1]
2090: 20 2b 20 31 20 2d 20 69 73 5f 6c 65 66 74 5f 62   + 1 - is_left_b
20a0: 72 61 6e 63 68 29 20 2f 20 32 3b 0a 09 09 62 6c  ranch) / 2;...bl
20b0: 6f 63 6b 73 20 3d 20 62 6c 6f 63 6b 73 5f 73 74  ocks = blocks_st
20c0: 61 63 6b 5b 6c 65 76 65 6c 5d 3b 0a 09 7d 0a 7d  ack[level];..}.}
20d0: 0a 0a 23 64 65 66 69 6e 65 20 41 49 43 48 5f 50  ..#define AICH_P
20e0: 52 4f 43 45 53 53 5f 46 49 4e 41 4c 5f 42 4c 4f  ROCESS_FINAL_BLO
20f0: 43 4b 20 31 0a 23 64 65 66 69 6e 65 20 41 49 43  CK 1.#define AIC
2100: 48 5f 50 52 4f 43 45 53 53 5f 46 4c 55 53 48 5f  H_PROCESS_FLUSH_
2110: 42 4c 4f 43 4b 20 32 0a 0a 2f 2a 2a 0a 20 2a 20  BLOCK 2../**. * 
2120: 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 73 74  Calculate and st
2130: 6f 72 65 20 61 20 68 61 73 68 20 66 6f 72 20 61  ore a hash for a
2140: 20 31 38 30 4b 2f 31 34 30 4b 20 62 6c 6f 63 6b   180K/140K block
2150: 2e 0a 20 2a 20 41 6c 73 6f 2c 20 69 66 20 69 74  .. * Also, if it
2160: 20 69 73 20 74 68 65 20 6c 61 73 74 20 62 6c 6f   is the last blo
2170: 63 6b 20 6f 66 20 61 20 39 2e 32 4d 69 42 20 65  ck of a 9.2MiB e
2180: 64 32 6b 20 63 68 75 6e 6b 20 6f 72 20 6f 66 20  d2k chunk or of 
2190: 74 68 65 20 68 61 73 68 65 64 20 6d 65 73 73 61  the hashed messa
21a0: 67 65 2c 0a 20 2a 20 74 68 65 6e 20 61 6c 73 6f  ge,. * then also
21b0: 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 41   calculate the A
21c0: 49 43 48 20 74 72 65 65 2d 68 61 73 68 20 6f 66  ICH tree-hash of
21d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 64 32   the current ed2
21e0: 6b 20 63 68 75 6e 6b 2e 0a 20 2a 0a 20 2a 20 40  k chunk.. *. * @
21f0: 70 61 72 61 6d 20 63 74 78 20 61 6c 67 6f 72 69  param ctx algori
2200: 74 68 6d 20 63 6f 6e 74 65 78 74 0a 20 2a 20 40  thm context. * @
2210: 70 61 72 61 6d 20 74 79 70 65 20 74 68 65 20 61  param type the a
2220: 63 74 69 6f 6e 73 20 74 6f 20 74 61 6b 65 2c 20  ctions to take, 
2230: 63 61 6e 20 62 65 20 63 6f 6d 62 69 6e 61 74 69  can be combinati
2240: 6f 6e 20 6f 66 20 62 69 74 73 20 41 49 43 48 5f  on of bits AICH_
2250: 50 52 4f 43 45 53 53 5f 46 49 4e 41 4c 5f 42 4c  PROCESS_FINAL_BL
2260: 4f 43 4b 0a 20 2a 20 20 20 20 20 20 20 20 20 20  OCK. *          
2270: 20 20 20 61 6e 64 20 41 49 43 48 5f 50 52 4f 43     and AICH_PROC
2280: 45 53 53 5f 46 4c 55 53 48 5f 42 4c 4f 43 4b 0a  ESS_FLUSH_BLOCK.
2290: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
22a0: 72 68 61 73 68 5f 61 69 63 68 5f 70 72 6f 63 65  rhash_aich_proce
22b0: 73 73 5f 62 6c 6f 63 6b 28 61 69 63 68 5f 63 74  ss_block(aich_ct
22c0: 78 20 2a 63 74 78 2c 20 69 6e 74 20 74 79 70 65  x *ctx, int type
22d0: 29 0a 7b 0a 09 61 73 73 65 72 74 28 74 79 70 65  ).{..assert(type
22e0: 20 21 3d 20 30 29 3b 0a 09 61 73 73 65 72 74 28   != 0);..assert(
22f0: 63 74 78 2d 3e 69 6e 64 65 78 20 3c 3d 20 45 44  ctx->index <= ED
2300: 32 4b 5f 43 48 55 4e 4b 5f 53 49 5a 45 29 3b 0a  2K_CHUNK_SIZE);.
2310: 0a 09 2f 2a 20 69 66 20 74 68 65 72 65 20 69 73  ../* if there is
2320: 20 75 6e 70 72 6f 63 65 73 73 65 64 20 64 61 74   unprocessed dat
2330: 61 20 6c 65 66 74 20 69 6e 20 74 68 65 20 63 75  a left in the cu
2340: 72 72 65 6e 74 20 31 38 30 4b 20 62 6c 6f 63 6b  rrent 180K block
2350: 2e 20 2a 2f 0a 09 69 66 20 28 28 74 79 70 65 20  . */..if ((type 
2360: 26 20 41 49 43 48 5f 50 52 4f 43 45 53 53 5f 46  & AICH_PROCESS_F
2370: 4c 55 53 48 5f 42 4c 4f 43 4b 29 20 21 3d 20 30  LUSH_BLOCK) != 0
2380: 29 0a 09 7b 0a 09 09 2f 2a 20 65 6e 73 75 72 65  )..{.../* ensure
2390: 20 74 68 61 74 20 74 68 65 20 62 6c 6f 63 6b 5f   that the block_
23a0: 68 61 73 68 65 73 20 61 72 72 61 79 20 69 73 20  hashes array is 
23b0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 73 61 76  allocated to sav
23c0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  e the result */.
23d0: 09 09 69 66 20 28 63 74 78 2d 3e 62 6c 6f 63 6b  ..if (ctx->block
23e0: 5f 68 61 73 68 65 73 20 3d 3d 20 4e 55 4c 4c 29  _hashes == NULL)
23f0: 20 7b 0a 09 09 09 63 74 78 2d 3e 62 6c 6f 63 6b   {....ctx->block
2400: 5f 68 61 73 68 65 73 20 3d 20 28 75 6e 73 69 67  _hashes = (unsig
2410: 6e 65 64 20 63 68 61 72 20 28 2a 29 5b 73 68 61  ned char (*)[sha
2420: 31 5f 68 61 73 68 5f 73 69 7a 65 5d 29 6d 61 6c  1_hash_size])mal
2430: 6c 6f 63 28 42 4c 4f 43 4b 53 5f 50 45 52 5f 43  loc(BLOCKS_PER_C
2440: 48 55 4e 4b 20 2a 20 73 68 61 31 5f 68 61 73 68  HUNK * sha1_hash
2450: 5f 73 69 7a 65 29 3b 0a 09 09 09 69 66 20 28 63  _size);....if (c
2460: 74 78 2d 3e 62 6c 6f 63 6b 5f 68 61 73 68 65 73  tx->block_hashes
2470: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
2480: 63 74 78 2d 3e 65 72 72 6f 72 20 3d 20 31 3b 0a  ctx->error = 1;.
2490: 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d  ....return;....}
24a0: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 73 74 6f 72 65  ...}..../* store
24b0: 20 74 68 65 20 31 38 30 2d 4b 69 42 20 62 6c 6f   the 180-KiB blo
24c0: 63 6b 20 68 61 73 68 20 74 6f 20 74 68 65 20 62  ck hash to the b
24d0: 6c 6f 63 6b 5f 68 61 73 68 65 73 20 61 72 72 61  lock_hashes arra
24e0: 79 20 2a 2f 0a 09 09 61 73 73 65 72 74 28 28 28  y */...assert(((
24f0: 63 74 78 2d 3e 69 6e 64 65 78 20 2d 20 31 29 20  ctx->index - 1) 
2500: 2f 20 46 55 4c 4c 5f 42 4c 4f 43 4b 5f 53 49 5a  / FULL_BLOCK_SIZ
2510: 45 29 20 3c 20 42 4c 4f 43 4b 53 5f 50 45 52 5f  E) < BLOCKS_PER_
2520: 43 48 55 4e 4b 29 3b 0a 09 09 53 48 41 31 5f 46  CHUNK);...SHA1_F
2530: 49 4e 41 4c 28 63 74 78 2c 20 63 74 78 2d 3e 62  INAL(ctx, ctx->b
2540: 6c 6f 63 6b 5f 68 61 73 68 65 73 5b 28 63 74 78  lock_hashes[(ctx
2550: 2d 3e 69 6e 64 65 78 20 2d 20 31 29 20 2f 20 46  ->index - 1) / F
2560: 55 4c 4c 5f 42 4c 4f 43 4b 5f 53 49 5a 45 5d 29  ULL_BLOCK_SIZE])
2570: 3b 0a 09 7d 0a 0a 09 2f 2a 20 63 68 65 63 6b 2c  ;..}.../* check,
2580: 20 69 66 20 69 74 27 73 20 74 69 6d 65 20 74 6f   if it's time to
2590: 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 74   calculate the t
25a0: 72 65 65 20 68 61 73 68 20 66 6f 72 20 74 68 65  ree hash for the
25b0: 20 63 75 72 72 65 6e 74 20 65 64 32 6b 20 63 68   current ed2k ch
25c0: 75 6e 6b 20 2a 2f 0a 09 69 66 20 28 63 74 78 2d  unk */..if (ctx-
25d0: 3e 69 6e 64 65 78 20 3e 3d 20 45 44 32 4b 5f 43  >index >= ED2K_C
25e0: 48 55 4e 4b 5f 53 49 5a 45 20 7c 7c 20 28 74 79  HUNK_SIZE || (ty
25f0: 70 65 20 26 20 41 49 43 48 5f 50 52 4f 43 45 53  pe & AICH_PROCES
2600: 53 5f 46 49 4e 41 4c 5f 42 4c 4f 43 4b 29 29 20  S_FINAL_BLOCK)) 
2610: 7b 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61  {...unsigned cha
2620: 72 20 28 2a 70 61 69 72 29 5b 73 68 61 31 5f 68  r (*pair)[sha1_h
2630: 61 73 68 5f 73 69 7a 65 5d 3b 0a 0a 09 09 2f 2a  ash_size];..../*
2640: 20 65 6e 73 75 72 65 2c 20 74 68 61 74 20 77 65   ensure, that we
2650: 20 68 61 76 65 20 74 68 65 20 73 70 61 63 65 20   have the space 
2660: 74 6f 20 73 74 6f 72 65 20 74 72 65 65 20 68 61  to store tree ha
2670: 73 68 20 2a 2f 0a 09 09 69 66 20 28 43 54 5f 49  sh */...if (CT_I
2680: 4e 44 45 58 28 63 74 78 2d 3e 63 68 75 6e 6b 73  NDEX(ctx->chunks
2690: 5f 6e 75 6d 62 65 72 29 20 3d 3d 20 30 29 20 7b  _number) == 0) {
26a0: 0a 09 09 09 72 68 61 73 68 5f 61 69 63 68 5f 63  ....rhash_aich_c
26b0: 68 75 6e 6b 5f 74 61 62 6c 65 5f 65 78 74 65 6e  hunk_table_exten
26c0: 64 28 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64  d(ctx, (unsigned
26d0: 29 63 74 78 2d 3e 63 68 75 6e 6b 73 5f 6e 75 6d  )ctx->chunks_num
26e0: 62 65 72 29 3b 0a 09 09 09 69 66 20 28 63 74 78  ber);....if (ctx
26f0: 2d 3e 65 72 72 6f 72 29 20 72 65 74 75 72 6e 3b  ->error) return;
2700: 0a 09 09 7d 0a 09 09 61 73 73 65 72 74 28 63 74  ...}...assert(ct
2710: 78 2d 3e 63 68 75 6e 6b 5f 74 61 62 6c 65 20 20  x->chunk_table  
2720: 21 3d 20 30 29 3b 0a 09 09 61 73 73 65 72 74 28  != 0);...assert(
2730: 63 74 78 2d 3e 62 6c 6f 63 6b 5f 68 61 73 68 65  ctx->block_hashe
2740: 73 20 21 3d 20 30 29 3b 0a 0a 09 09 2f 2a 20 63  s != 0);..../* c
2750: 61 6c 63 75 6c 61 74 65 20 74 72 65 65 20 68 61  alculate tree ha
2760: 73 68 20 61 6e 64 20 73 61 76 65 20 72 65 73 75  sh and save resu
2770: 6c 74 73 20 74 6f 20 63 68 75 6e 6b 5f 74 61 62  lts to chunk_tab
2780: 6c 65 20 2a 2f 0a 09 09 70 61 69 72 20 3d 20 47  le */...pair = G
2790: 45 54 5f 48 41 53 48 5f 50 41 49 52 28 63 74 78  ET_HASH_PAIR(ctx
27a0: 2c 20 63 74 78 2d 3e 63 68 75 6e 6b 73 5f 6e 75  , ctx->chunks_nu
27b0: 6d 62 65 72 29 3b 0a 0a 09 09 2f 2a 20 73 6d 61  mber);..../* sma
27c0: 6c 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ll optimization:
27d0: 20 73 6b 69 70 20 61 20 6c 65 66 74 2d 62 72 61   skip a left-bra
27e0: 6e 63 68 2d 68 61 73 68 20 66 6f 72 20 74 68 65  nch-hash for the
27f0: 20 6c 61 73 74 20 63 68 75 6e 6b 20 2a 2f 0a 09   last chunk */..
2800: 09 69 66 20 28 21 28 74 79 70 65 20 26 20 41 49  .if (!(type & AI
2810: 43 48 5f 50 52 4f 43 45 53 53 5f 46 49 4e 41 4c  CH_PROCESS_FINAL
2820: 5f 42 4c 4f 43 4b 29 20 7c 7c 20 63 74 78 2d 3e  _BLOCK) || ctx->
2830: 63 68 75 6e 6b 73 5f 6e 75 6d 62 65 72 20 3d 3d  chunks_number ==
2840: 20 30 29 20 7b 0a 09 09 09 2f 2a 20 63 61 6c 63   0) {..../* calc
2850: 75 6c 61 74 65 20 61 20 74 72 65 65 20 68 61 73  ulate a tree has
2860: 68 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20  h to be used in 
2870: 6c 65 66 74 20 62 72 61 6e 63 68 20 2a 2f 0a 09  left branch */..
2880: 09 09 72 68 61 73 68 5f 61 69 63 68 5f 68 61 73  ..rhash_aich_has
2890: 68 5f 74 72 65 65 28 63 74 78 2c 20 70 61 69 72  h_tree(ctx, pair
28a0: 5b 31 5d 2c 20 41 49 43 48 5f 48 41 53 48 5f 4c  [1], AICH_HASH_L
28b0: 45 46 54 5f 42 52 41 4e 43 48 29 3b 0a 09 09 7d  EFT_BRANCH);...}
28c0: 0a 0a 09 09 2f 2a 20 73 6d 61 6c 6c 20 6f 70 74  ..../* small opt
28d0: 69 6d 69 7a 61 74 69 6f 6e 3a 20 73 6b 69 70 20  imization: skip 
28e0: 72 69 67 68 74 2d 62 72 61 6e 63 68 2d 68 61 73  right-branch-has
28f0: 68 20 66 6f 72 20 74 68 65 20 76 65 72 79 20 66  h for the very f
2900: 69 72 73 74 20 63 68 75 6e 6b 20 2a 2f 0a 09 09  irst chunk */...
2910: 69 66 20 28 63 74 78 2d 3e 63 68 75 6e 6b 73 5f  if (ctx->chunks_
2920: 6e 75 6d 62 65 72 20 3e 20 30 29 20 7b 0a 09 09  number > 0) {...
2930: 09 2f 2a 20 63 61 6c 63 75 6c 61 74 65 20 61 20  ./* calculate a 
2940: 74 72 65 65 20 68 61 73 68 20 74 6f 20 62 65 20  tree hash to be 
2950: 75 73 65 64 20 69 6e 20 72 69 67 68 74 20 62 72  used in right br
2960: 61 6e 63 68 20 2a 2f 0a 09 09 09 72 68 61 73 68  anch */....rhash
2970: 5f 61 69 63 68 5f 68 61 73 68 5f 74 72 65 65 28  _aich_hash_tree(
2980: 63 74 78 2c 20 70 61 69 72 5b 30 5d 2c 20 41 49  ctx, pair[0], AI
2990: 43 48 5f 48 41 53 48 5f 52 49 47 48 54 5f 42 52  CH_HASH_RIGHT_BR
29a0: 41 4e 43 48 29 3b 0a 09 09 7d 0a 0a 09 09 63 74  ANCH);...}....ct
29b0: 78 2d 3e 69 6e 64 65 78 20 3d 20 30 3b 20 2f 2a  x->index = 0; /*
29c0: 20 6d 61 72 6b 20 74 68 61 74 20 74 68 65 20 77   mark that the w
29d0: 68 6f 6c 65 20 65 64 32 6b 20 63 68 75 6e 6b 20  hole ed2k chunk 
29e0: 77 61 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  was processed */
29f0: 0a 09 09 63 74 78 2d 3e 63 68 75 6e 6b 73 5f 6e  ...ctx->chunks_n
2a00: 75 6d 62 65 72 2b 2b 3b 0a 09 7d 0a 7d 0a 0a 2f  umber++;..}.}../
2a10: 2a 2a 0a 20 2a 20 43 61 6c 63 75 6c 61 74 65 20  **. * Calculate 
2a20: 6d 65 73 73 61 67 65 20 68 61 73 68 2e 0a 20 2a  message hash.. *
2a30: 20 43 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 72   Can be called r
2a40: 65 70 65 61 74 65 64 6c 79 20 77 69 74 68 20 63  epeatedly with c
2a50: 68 75 6e 6b 73 20 6f 66 20 74 68 65 20 6d 65 73  hunks of the mes
2a60: 73 61 67 65 20 74 6f 20 62 65 20 68 61 73 68 65  sage to be hashe
2a70: 64 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 61 6d 20  d.. *. * @param 
2a80: 63 74 78 20 74 68 65 20 61 6c 67 6f 72 69 74 68  ctx the algorith
2a90: 6d 20 63 6f 6e 74 65 78 74 20 63 6f 6e 74 61 69  m context contai
2aa0: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 68 61 73  ning current has
2ab0: 68 69 6e 67 20 73 74 61 74 65 0a 20 2a 20 40 70  hing state. * @p
2ac0: 61 72 61 6d 20 6d 73 67 20 6d 65 73 73 61 67 65  aram msg message
2ad0: 20 63 68 75 6e 6b 0a 20 2a 20 40 70 61 72 61 6d   chunk. * @param
2ae0: 20 73 69 7a 65 20 6c 65 6e 67 74 68 20 6f 66 20   size length of 
2af0: 74 68 65 20 6d 65 73 73 61 67 65 20 63 68 75 6e  the message chun
2b00: 6b 0a 20 2a 2f 0a 76 6f 69 64 20 72 68 61 73 68  k. */.void rhash
2b10: 5f 61 69 63 68 5f 75 70 64 61 74 65 28 61 69 63  _aich_update(aic
2b20: 68 5f 63 74 78 20 2a 63 74 78 2c 20 63 6f 6e 73  h_ctx *ctx, cons
2b30: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
2b40: 20 6d 73 67 2c 20 73 69 7a 65 5f 74 20 73 69 7a   msg, size_t siz
2b50: 65 29 0a 7b 0a 09 69 66 20 28 63 74 78 2d 3e 65  e).{..if (ctx->e
2b60: 72 72 6f 72 29 20 72 65 74 75 72 6e 3b 0a 0a 09  rror) return;...
2b70: 77 68 69 6c 65 20 28 73 69 7a 65 20 3e 20 30 29  while (size > 0)
2b80: 20 7b 0a 09 09 75 6e 73 69 67 6e 65 64 20 6c 65   {...unsigned le
2b90: 66 74 5f 69 6e 5f 63 68 75 6e 6b 20 3d 20 45 44  ft_in_chunk = ED
2ba0: 32 4b 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2d 20  2K_CHUNK_SIZE - 
2bb0: 63 74 78 2d 3e 69 6e 64 65 78 3b 0a 09 09 75 6e  ctx->index;...un
2bc0: 73 69 67 6e 65 64 20 62 6c 6f 63 6b 5f 6c 65 66  signed block_lef
2bd0: 74 20 3d 20 28 6c 65 66 74 5f 69 6e 5f 63 68 75  t = (left_in_chu
2be0: 6e 6b 20 3c 3d 20 4c 41 53 54 5f 42 4c 4f 43 4b  nk <= LAST_BLOCK
2bf0: 5f 53 49 5a 45 20 3f 20 6c 65 66 74 5f 69 6e 5f  _SIZE ? left_in_
2c00: 63 68 75 6e 6b 20 3a 0a 09 09 09 46 55 4c 4c 5f  chunk :....FULL_
2c10: 42 4c 4f 43 4b 5f 53 49 5a 45 20 2d 20 63 74 78  BLOCK_SIZE - ctx
2c20: 2d 3e 69 6e 64 65 78 20 25 20 46 55 4c 4c 5f 42  ->index % FULL_B
2c30: 4c 4f 43 4b 5f 53 49 5a 45 29 3b 0a 09 09 61 73  LOCK_SIZE);...as
2c40: 73 65 72 74 28 62 6c 6f 63 6b 5f 6c 65 66 74 20  sert(block_left 
2c50: 3e 20 30 29 3b 0a 0a 09 09 69 66 20 28 73 69 7a  > 0);....if (siz
2c60: 65 20 3e 3d 20 62 6c 6f 63 6b 5f 6c 65 66 74 29  e >= block_left)
2c70: 20 7b 0a 09 09 09 53 48 41 31 5f 55 50 44 41 54   {....SHA1_UPDAT
2c80: 45 28 63 74 78 2c 20 6d 73 67 2c 20 62 6c 6f 63  E(ctx, msg, bloc
2c90: 6b 5f 6c 65 66 74 29 3b 0a 09 09 09 6d 73 67 20  k_left);....msg 
2ca0: 20 2b 3d 20 62 6c 6f 63 6b 5f 6c 65 66 74 3b 0a   += block_left;.
2cb0: 09 09 09 73 69 7a 65 20 2d 3d 20 62 6c 6f 63 6b  ...size -= block
2cc0: 5f 6c 65 66 74 3b 0a 09 09 09 63 74 78 2d 3e 69  _left;....ctx->i
2cd0: 6e 64 65 78 20 2b 3d 20 62 6c 6f 63 6b 5f 6c 65  ndex += block_le
2ce0: 66 74 3b 0a 0a 09 09 09 2f 2a 20 70 72 6f 63 65  ft;...../* proce
2cf0: 73 73 20 61 20 31 38 30 4b 69 42 2d 62 6c 6f 6b  ss a 180KiB-blok
2d00: 20 2a 2f 0a 09 09 09 72 68 61 73 68 5f 61 69 63   */....rhash_aic
2d10: 68 5f 70 72 6f 63 65 73 73 5f 62 6c 6f 63 6b 28  h_process_block(
2d20: 63 74 78 2c 20 41 49 43 48 5f 50 52 4f 43 45 53  ctx, AICH_PROCES
2d30: 53 5f 46 4c 55 53 48 5f 42 4c 4f 43 4b 29 3b 0a  S_FLUSH_BLOCK);.
2d40: 09 09 09 53 48 41 31 5f 49 4e 49 54 28 63 74 78  ...SHA1_INIT(ctx
2d50: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
2d60: 09 2f 2a 20 61 64 64 20 74 6f 20 61 20 6c 65 61  ./* add to a lea
2d70: 66 20 62 6c 6f 63 6b 20 2a 2f 0a 09 09 09 53 48  f block */....SH
2d80: 41 31 5f 55 50 44 41 54 45 28 63 74 78 2c 20 6d  A1_UPDATE(ctx, m
2d90: 73 67 2c 20 73 69 7a 65 29 3b 0a 09 09 09 63 74  sg, size);....ct
2da0: 78 2d 3e 69 6e 64 65 78 20 2b 3d 20 28 75 6e 73  x->index += (uns
2db0: 69 67 6e 65 64 29 73 69 7a 65 3b 0a 09 09 09 62  igned)size;....b
2dc0: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 09 61 73  reak;...}..}..as
2dd0: 73 65 72 74 28 63 74 78 2d 3e 69 6e 64 65 78 20  sert(ctx->index 
2de0: 3c 20 45 44 32 4b 5f 43 48 55 4e 4b 5f 53 49 5a  < ED2K_CHUNK_SIZ
2df0: 45 29 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 53 74  E);.}../**. * St
2e00: 6f 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 68  ore calculated h
2e10: 61 73 68 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ash into the giv
2e20: 65 6e 20 61 72 72 61 79 2e 0a 20 2a 0a 20 2a 20  en array.. *. * 
2e30: 40 70 61 72 61 6d 20 63 74 78 20 74 68 65 20 61  @param ctx the a
2e40: 6c 67 6f 72 69 74 68 6d 20 63 6f 6e 74 65 78 74  lgorithm context
2e50: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72   containing curr
2e60: 65 6e 74 20 68 61 73 68 69 6e 67 20 73 74 61 74  ent hashing stat
2e70: 65 0a 20 2a 20 40 70 61 72 61 6d 20 72 65 73 75  e. * @param resu
2e80: 6c 74 20 63 61 6c 63 75 6c 61 74 65 64 20 68 61  lt calculated ha
2e90: 73 68 20 69 6e 20 62 69 6e 61 72 79 20 66 6f 72  sh in binary for
2ea0: 6d 0a 20 2a 2f 0a 76 6f 69 64 20 72 68 61 73 68  m. */.void rhash
2eb0: 5f 61 69 63 68 5f 66 69 6e 61 6c 28 61 69 63 68  _aich_final(aich
2ec0: 5f 63 74 78 20 2a 63 74 78 2c 20 75 6e 73 69 67  _ctx *ctx, unsig
2ed0: 6e 65 64 20 63 68 61 72 20 72 65 73 75 6c 74 5b  ned char result[
2ee0: 32 30 5d 29 0a 7b 0a 09 75 69 6e 74 36 34 5f 74  20]).{..uint64_t
2ef0: 20 74 6f 74 61 6c 5f 73 69 7a 65 20 3d 0a 09 09   total_size =...
2f00: 28 28 75 69 6e 74 36 34 5f 74 29 63 74 78 2d 3e  ((uint64_t)ctx->
2f10: 63 68 75 6e 6b 73 5f 6e 75 6d 62 65 72 20 2a 20  chunks_number * 
2f20: 45 44 32 4b 5f 43 48 55 4e 4b 5f 53 49 5a 45 29  ED2K_CHUNK_SIZE)
2f30: 20 2b 20 63 74 78 2d 3e 69 6e 64 65 78 3b 0a 09   + ctx->index;..
2f40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 20 63  unsigned char* c
2f50: 6f 6e 73 74 20 68 61 73 68 20 3d 20 28 75 6e 73  onst hash = (uns
2f60: 69 67 6e 65 64 20 63 68 61 72 2a 29 63 74 78 2d  igned char*)ctx-
2f70: 3e 73 68 61 31 5f 63 6f 6e 74 65 78 74 2e 68 61  >sha1_context.ha
2f80: 73 68 3b 0a 0a 09 69 66 20 28 63 74 78 2d 3e 63  sh;...if (ctx->c
2f90: 68 75 6e 6b 73 5f 6e 75 6d 62 65 72 20 3d 3d 20  hunks_number == 
2fa0: 30 20 26 26 20 63 74 78 2d 3e 62 6c 6f 63 6b 5f  0 && ctx->block_
2fb0: 68 61 73 68 65 73 20 3d 3d 20 4e 55 4c 4c 29 20  hashes == NULL) 
2fc0: 7b 0a 09 09 61 73 73 65 72 74 28 63 74 78 2d 3e  {...assert(ctx->
2fd0: 69 6e 64 65 78 20 3c 20 46 55 4c 4c 5f 42 4c 4f  index < FULL_BLO
2fe0: 43 4b 5f 53 49 5a 45 29 3b 0a 23 69 66 64 65 66  CK_SIZE);.#ifdef
2ff0: 20 55 53 45 5f 4f 50 45 4e 53 53 4c 0a 09 09 53   USE_OPENSSL...S
3000: 48 41 31 5f 46 49 4e 41 4c 28 63 74 78 2c 20 68  HA1_FINAL(ctx, h
3010: 61 73 68 29 3b 20 2f 2a 20 72 65 74 75 72 6e 20  ash); /* return 
3020: 6a 75 73 74 20 73 68 61 31 20 68 61 73 68 20 2a  just sha1 hash *
3030: 2f 0a 23 65 6c 73 65 0a 09 09 53 48 41 31 5f 46  /.#else...SHA1_F
3040: 49 4e 41 4c 28 63 74 78 2c 20 30 29 3b 20 2f 2a  INAL(ctx, 0); /*
3050: 20 72 65 74 75 72 6e 20 6a 75 73 74 20 73 68 61   return just sha
3060: 31 20 68 61 73 68 20 2a 2f 0a 23 69 66 20 49 53  1 hash */.#if IS
3070: 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 0a 09  _LITTLE_ENDIAN..
3080: 09 72 68 61 73 68 5f 75 33 32 5f 6d 65 6d 5f 73  .rhash_u32_mem_s
3090: 77 61 70 28 63 74 78 2d 3e 73 68 61 31 5f 63 6f  wap(ctx->sha1_co
30a0: 6e 74 65 78 74 2e 68 61 73 68 2c 20 35 29 3b 0a  ntext.hash, 5);.
30b0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 09 09  #endif.#endif...
30c0: 69 66 20 28 72 65 73 75 6c 74 29 20 6d 65 6d 63  if (result) memc
30d0: 70 79 28 72 65 73 75 6c 74 2c 20 68 61 73 68 2c  py(result, hash,
30e0: 20 73 68 61 31 5f 68 61 73 68 5f 73 69 7a 65 29   sha1_hash_size)
30f0: 3b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  ;...return;..}..
3100: 09 2f 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  ./* if there is 
3110: 75 6e 70 72 6f 63 65 73 73 65 64 20 64 61 74 61  unprocessed data
3120: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6c 61 73   left in the las
3130: 74 20 31 38 30 4b 20 62 6c 6f 63 6b 20 2a 2f 0a  t 180K block */.
3140: 09 69 66 20 28 28 63 74 78 2d 3e 69 6e 64 65 78  .if ((ctx->index
3150: 20 25 20 46 55 4c 4c 5f 42 4c 4f 43 4b 5f 53 49   % FULL_BLOCK_SI
3160: 5a 45 29 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20  ZE) > 0) {.../* 
3170: 74 68 65 6e 20 70 72 6f 63 65 73 73 20 74 68 65  then process the
3180: 20 6c 61 73 74 20 62 6c 6f 63 6b 20 2a 2f 0a 09   last block */..
3190: 09 72 68 61 73 68 5f 61 69 63 68 5f 70 72 6f 63  .rhash_aich_proc
31a0: 65 73 73 5f 62 6c 6f 63 6b 28 63 74 78 2c 20 63  ess_block(ctx, c
31b0: 74 78 2d 3e 62 6c 6f 63 6b 5f 68 61 73 68 65 73  tx->block_hashes
31c0: 20 21 3d 20 4e 55 4c 4c 20 3f 0a 09 09 09 41 49   != NULL ?....AI
31d0: 43 48 5f 50 52 4f 43 45 53 53 5f 46 49 4e 41 4c  CH_PROCESS_FINAL
31e0: 5f 42 4c 4f 43 4b 20 7c 20 41 49 43 48 5f 50 52  _BLOCK | AICH_PR
31f0: 4f 43 45 53 53 5f 46 4c 55 53 48 5f 42 4c 4f 43  OCESS_FLUSH_BLOC
3200: 4b 20 3a 20 41 49 43 48 5f 50 52 4f 43 45 53 53  K : AICH_PROCESS
3210: 5f 46 4c 55 53 48 5f 42 4c 4f 43 4b 29 3b 0a 09  _FLUSH_BLOCK);..
3220: 7d 0a 0a 09 2f 2a 20 69 66 20 70 72 6f 63 65 73  }.../* if proces
3230: 73 65 64 20 6d 65 73 73 61 67 65 20 77 61 73 20  sed message was 
3240: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 61 20 65  shorter than a e
3250: 64 32 6b 20 63 68 75 6e 6b 20 2a 2f 0a 09 69 66  d2k chunk */..if
3260: 20 28 63 74 78 2d 3e 63 68 75 6e 6b 73 5f 6e 75   (ctx->chunks_nu
3270: 6d 62 65 72 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  mber == 0) {.../
3280: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
3290: 65 20 61 69 63 68 20 68 61 73 68 20 66 6f 72 20  e aich hash for 
32a0: 74 68 65 20 66 69 72 73 74 20 63 68 75 6e 6b 20  the first chunk 
32b0: 2a 2f 0a 09 09 72 68 61 73 68 5f 61 69 63 68 5f  */...rhash_aich_
32c0: 68 61 73 68 5f 74 72 65 65 28 63 74 78 2c 20 68  hash_tree(ctx, h
32d0: 61 73 68 2c 20 41 49 43 48 5f 48 41 53 48 5f 4c  ash, AICH_HASH_L
32e0: 45 46 54 5f 42 52 41 4e 43 48 29 3b 0a 09 7d 20  EFT_BRANCH);..} 
32f0: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 74 78  else {...if (ctx
3300: 2d 3e 69 6e 64 65 78 20 3e 20 30 29 20 7b 0a 09  ->index > 0) {..
3310: 09 09 2f 2a 20 70 72 6f 63 65 73 73 20 74 68 65  ../* process the
3320: 20 6c 61 73 74 20 62 6c 6f 63 6b 20 6f 66 20 74   last block of t
3330: 68 65 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09 09  he message */...
3340: 09 72 68 61 73 68 5f 61 69 63 68 5f 70 72 6f 63  .rhash_aich_proc
3350: 65 73 73 5f 62 6c 6f 63 6b 28 63 74 78 2c 20 41  ess_block(ctx, A
3360: 49 43 48 5f 50 52 4f 43 45 53 53 5f 46 49 4e 41  ICH_PROCESS_FINA
3370: 4c 5f 42 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 09 09  L_BLOCK);...}...
3380: 61 73 73 65 72 74 28 63 74 78 2d 3e 63 68 75 6e  assert(ctx->chun
3390: 6b 73 5f 6e 75 6d 62 65 72 20 3e 20 30 29 3b 0a  ks_number > 0);.
33a0: 09 09 61 73 73 65 72 74 28 63 74 78 2d 3e 62 6c  ..assert(ctx->bl
33b0: 6f 63 6b 5f 68 61 73 68 65 73 20 21 3d 20 4e 55  ock_hashes != NU
33c0: 4c 4c 29 3b 0a 0a 09 09 72 68 61 73 68 5f 61 69  LL);....rhash_ai
33d0: 63 68 5f 68 61 73 68 5f 74 72 65 65 28 63 74 78  ch_hash_tree(ctx
33e0: 2c 20 68 61 73 68 2c 20 41 49 43 48 5f 48 41 53  , hash, AICH_HAS
33f0: 48 5f 46 55 4c 4c 5f 54 52 45 45 29 3b 0a 09 7d  H_FULL_TREE);..}
3400: 0a 0a 09 72 68 61 73 68 5f 61 69 63 68 5f 63 6c  ...rhash_aich_cl
3410: 65 61 6e 75 70 28 63 74 78 29 3b 0a 09 63 74 78  eanup(ctx);..ctx
3420: 2d 3e 73 68 61 31 5f 63 6f 6e 74 65 78 74 2e 6c  ->sha1_context.l
3430: 65 6e 67 74 68 20 3d 20 74 6f 74 61 6c 5f 73 69  ength = total_si
3440: 7a 65 3b 20 2f 2a 20 73 74 6f 72 65 20 74 6f 74  ze; /* store tot
3450: 61 6c 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20  al message size 
3460: 20 2a 2f 0a 09 69 66 20 28 72 65 73 75 6c 74 29   */..if (result)
3470: 20 6d 65 6d 63 70 79 28 72 65 73 75 6c 74 2c 20   memcpy(result, 
3480: 68 61 73 68 2c 20 73 68 61 31 5f 68 61 73 68 5f  hash, sha1_hash_
3490: 73 69 7a 65 29 3b 0a 7d 0a                       size);.}.