*/
  public synchronized byte[] Final () {
    byte	bits[];
    int		index, padlen;
    MD5State	fin;

    if (finals == null) {
      fin = new MD5State(state);

      bits = Encode(fin.count, 8);
    
      index = (int) ((fin.count[0] >>> 3) & 0x3f);
      padlen = (index < 56) ? (56 - index) : (120 - index);

      Update(fin, padding, 0, padlen);
      /**/
      Update(fin, bits, 0, 8);	

      /* Update() sets finalds to null */
      finals = fin;
    } 

    return Encode(finals.state, 16);
  }