code: public static byte[] calculateXorCRC32(byte[] message, int offset, int len) {
  		// Check whether the CRC really is what it is supposed to be.
  		// Re-calculate the check sum
  		CRC32 checksum = new CRC32();
  		checksum.update(message, offset, len);
  
  		long crc = checksum.getValue();
  		byte[] xorCRC32 = new byte[4];
  
  		xorCRC32[0] = (byte) ((byte) ((crc >> 24) & 0xff) ^ XOR_MASK[0]);
  		xorCRC32[1] = (byte) ((byte) ((crc >> 16) & 0xff) ^ XOR_MASK[1]);
  		xorCRC32[2] = (byte) ((byte) ((crc >> 8) & 0xff) ^ XOR_MASK[2]);
  		xorCRC32[3] = (byte) ((byte) (crc & 0xff) ^ XOR_MASK[3]);
  
  		return xorCRC32;
  	}
docs: Calculates and returns the CRC32 checksum for <tt>message</tt> after
  applying the <tt>XOR_MASK</tt> specified by RFC 5389.
  
  @param message
  the message whose checksum we'd like to have
  @param offset
  the location in <tt>message</tt> where the actual message
  starts.
  @param len
  the number of message bytes in <tt>message</tt>
  
  @return the CRC value that should be sent in a <tt>FINGERPRINT</tt>
  attribute traveling in the <tt>message</tt> message.