Update documentation comments.

R=rnystrom@google.com

Review URL: https://codereview.chromium.org//1348983002 .
diff --git a/lib/crypto.dart b/lib/crypto.dart
index 29fd62a..e6ffa55 100644
--- a/lib/crypto.dart
+++ b/lib/crypto.dart
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Cryptographic algorithms, with support for hash functions such as
- * SHA-1, SHA-256, HMAC, and MD5.
- */
 library crypto;
 
 export 'src/base64.dart';
diff --git a/lib/src/base64.dart b/lib/src/base64.dart
index ad0d8bc..b3896b6 100644
--- a/lib/src/base64.dart
+++ b/lib/src/base64.dart
@@ -7,8 +7,15 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
+/// An instance of the default implementation of [Base64Codec].
+///
+/// This provides convenient access to most common Base64 use-cases.
 const Base64Codec BASE64 = const Base64Codec();
 
+/// A mapping from ASCII character codes to their corresponding Base64 values.
+///
+/// Characters with a value of -2 are invalid. Characters with a value of -1
+/// should be ignored. The padding character, "=", is represented as 0.
 const List<int> _decodeTable = const [
   -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2,
   -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
@@ -28,47 +35,64 @@
   -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
 ];
 
+/// A String representing a mapping from numbers between 0 and 63, inclusive, to
+/// their corresponding encoded character.
+///
+/// This is the table for URL-safe encodings.
 const String _encodeTableUrlSafe =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
 
+/// A String representing a mapping from numbers between 0 and 63, inclusive, to
+/// their corresponding encoded character.
+///
+/// This is the table for URL-unsafe encodings.
 const String _encodeTable =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
+/// The line length for Base64 strings with line separators.
 const int _LINE_LENGTH = 76;
+
+/// A carriage return.
 const int _CR = 13; // '\r'
+
+/// A line feed.
 const int _LF = 10; // '\n'
+
+/// The byte sequence representing non-URL-encoded padding.
 const List<int> _PAD_BYTES = const [61]; // '='
+
+/// The byte sequence representing URL-encoded padding.
 const List<int> _ENCODED_PAD_BYTES = const [37, 51, 68]; // '%3D'
+
+/// The string representing non-URL-encoded padding.
 const String _PAD = "=";
+
+/// The string representing URL-encoded padding.
 const String _ENCODED_PAD = "%3D";
 
+/// A codec that converts between binary data and [Base64][rfc]-encoded strings.
+///
+/// [rfc]: https://tools.ietf.org/html/rfc4648
 class Base64Codec extends Codec<List<int>, String> {
   final bool _urlSafe;
   final bool _addLineSeparator;
   final bool _encodePaddingCharacter;
 
-  /**
-   * Instantiates a new [Base64Codec].
-   *
-   * The optional [urlSafe] argument specifies if [encoder] and [encode]
-   * should generate a string, that is safe to use in an URL.
-   *
-   * If [urlSafe] is `true` (and not overriden at the method invocation)
-   * the [encoder] and [encode] use '-' instead of '+' and '_' instead of '/'.
-   *
-   * The default value of [urlSafe] is `false`.
-   *
-   * The optional [addLineSeparator] argument specifies if the [encoder] and
-   * [encode] should add line separators.
-   *
-   * If `addLineSeparator` is `true` [encode] adds an
-   * optional line separator (CR + LF) for each 76 char output.
-   *
-   * The default value of [addLineSeparator] if `false`.
-   *
-   * If [encodePaddingCharacter] is `true` `encode` converts `=` to `%3D`.
-   * The default value of [encodePaddingCharacter] is `false`.
-   */
+  /// Creates a new [Base64Codec].
+  ///
+  /// The default [BASE64] codec will be good enough for most cases. A new codec
+  /// only needs to be instantiated when you want to do multiple conversions
+  /// with the same configuration.
+  ///
+  /// If [urlSafe] is `true`, a URL-safe alphabet will be used when encoding.
+  /// Specifically, the characters `-` and `_` will be used instead of `+` and
+  /// `/`.
+  ///
+  /// If [addLineSeparator] is `true`, `\r\n` line separators will be added
+  /// every 76 characters when encoding.
+  ///
+  /// If [encodePaddingCharacter] is `true`, the padding character `=` will be
+  /// written as `%3D` when encoding.
   const Base64Codec(
       {bool urlSafe: false,
       bool addLineSeparator: false,
@@ -79,6 +103,20 @@
 
   String get name => "base64";
 
+  /// Encodes [bytes] into a Base64 string.
+  ///
+  /// If [urlSafe] is `true`, a URL-safe alphabet will be used when encoding.
+  /// Specifically, the characters `-` and `_` will be used instead of `+` and
+  /// `/`.
+  ///
+  /// If [addLineSeparator] is `true`, `\r\n` line separators will be added
+  /// every 76 characters when encoding.
+  ///
+  /// If [encodePaddingCharacter] is `true`, the padding character `=` will be
+  /// written as `%3D` when encoding.
+  ///
+  /// Any flags passed to this method take precedence over the flags passed to
+  /// the codec itself.
   String encode(List<int> bytes,
       {bool urlSafe, bool addLineSeparator, bool encodePaddingCharacter}) {
     if (urlSafe == null) urlSafe = _urlSafe;
@@ -100,38 +138,36 @@
   Base64Decoder get decoder => new Base64Decoder();
 }
 
-/**
- * This class encodes byte strings (lists of unsigned
- * 8-bit integers) to strings according to Base64.
- */
+/// An encoder that converts sequences of bytes to strings using [Base64][rfc].
+///
+/// [rfc]: https://tools.ietf.org/html/rfc4648
 class Base64Encoder extends Converter<List<int>, String> {
+  /// Whether this encoder generates URL-safe strings.
   final bool _urlSafe;
+
+  /// Whether this encoder adds line breaks to the output.
   final bool _addLineSeparator;
+
+  /// Whether this encoder URL-encodes trailing padding characters.
   final bool _encodePaddingCharacter;
+
+  /// The sequence of bytes to use as a padding character.
   final List<int> _pad;
 
-  /**
-   * Instantiates a new [Base64Encoder].
-   *
-   * The optional [urlSafe] argument specifies if [convert]
-   * should generate a string, that is safe to use in an URL.
-   *
-   * If it is `true` the [convert] use
-   * '-' instead of '+' and '_' instead of '/'.
-   *
-   * The default value of [urlSafe] is `false`.
-   *
-   * The optional [addLineSeparator] argument specifies if [convert]
-   * should add line separators.
-   *
-   * If it is `true` [convert] adds an optional line separator(CR + LF)
-   * for each 76 char output.
-   *
-   * The default value of [addLineSeparator] if `false`.
-   *
-   * If [encodePaddingCharacter] is `true` `encode` converts `=` to `%3D`.
-   * The default value of [encodePaddingCharacter] is `false`.
-   */
+  /// Creates a new [Base64Encoder].
+  ///
+  /// The default [BASE64.encoder] will be good enough for most cases. A new
+  /// codec only needs to be instantiated when you want to do multiple
+  /// conversions with the same configuration.
+  ///
+  /// If [urlSafe] is `true`, a URL-safe alphabet will be used. Specifically,
+  /// the characters `-` and `_` will be used instead of `+` and `/`.
+  ///
+  /// If [addLineSeparator] is `true`, `\r\n` line separators will be added
+  /// every 76 characters.
+  ///
+  /// If [encodePaddingCharacter] is `true`, the padding character `=` will be
+  /// written as `%3D`.
   const Base64Encoder(
       {bool urlSafe: false,
       bool addLineSeparator: false,
@@ -141,12 +177,10 @@
         _encodePaddingCharacter = encodePaddingCharacter,
         _pad = encodePaddingCharacter == true ? _ENCODED_PAD_BYTES : _PAD_BYTES;
 
-  /**
-   * Converts [bytes] to its Base64 representation as a string.
-   *
-   * if [start] and [end] are provided, only the sublist
-   * `bytes.sublist(start, end)` is converted.
-   */
+  /// Converts [bytes] to Base64.
+  ///
+  /// If [start] and [end] are provided, only the sublist `bytes.sublist(start,
+  /// end)` is converted.
   String convert(List<int> bytes, [int start = 0, int end]) {
     int bytes_length = bytes.length;
     RangeError.checkValidRange(start, end, bytes_length);
@@ -224,10 +258,21 @@
   }
 }
 
+/// A [ChunkedConversionSink] for encoding chunks of data to Base64.
 class _Base64EncoderSink extends ChunkedConversionSink<List<int>> {
+  /// The encoder used to encode each chunk.
   final Base64Encoder _encoder;
+
+  /// The underlying sink to which to emit the encoded strings.
   final ChunkedConversionSink<String> _outSink;
+
+  /// The buffer of as-yet-unconverted bytes.
+  ///
+  /// This is used to ensure that we don't generate interstitial padding
+  /// characters.
   final List<int> _buffer = new List<int>();
+
+  /// The length of [_buffer]; that is, the number of unconverted bytes.
   int _bufferCount = 0;
 
   _Base64EncoderSink(this._outSink, urlSafe, addLineSeparator)
@@ -260,14 +305,10 @@
   }
 }
 
-/**
- * This class decodes strings to lists of bytes(lists of
- * unsigned 8-bit integers) according to Base64.
- */
+/// An encoder that converts [Base64][rfc] strings to sequences of bytes.
+///
+/// [rfc]: https://tools.ietf.org/html/rfc4648
 class Base64Decoder extends Converter<String, List<int>> {
-  /**
-   * Instantiates a new [Base64Decoder]
-   */
   const Base64Decoder();
 
   List<int> convert(String input) {
@@ -357,9 +398,18 @@
   }
 }
 
+/// A [ChunkedConversionSink] for decoding chunks of Base64 strings to data.
 class _Base64DecoderSink extends ChunkedConversionSink<String> {
+  /// The encoder used to decode each chunk.
   final Base64Decoder _decoder = new Base64Decoder();
+
+  /// The underlying sink to which to emit the decoded strings.
   final ChunkedConversionSink<List<int>> _outSink;
+
+  /// The as-yet-unconverted text.
+  ///
+  /// This is used to handle a chunk stopping partway in the middle of a
+  /// URL-encoded `=` character.
   String _unconverted = "";
 
   _Base64DecoderSink(this._outSink);
diff --git a/lib/src/crypto_utils.dart b/lib/src/crypto_utils.dart
index 99613ef..821fd2b 100644
--- a/lib/src/crypto_utils.dart
+++ b/lib/src/crypto_utils.dart
@@ -6,14 +6,10 @@
 
 import 'base64.dart';
 
-/**
- * Utility methods for working with message digests.
- */
+/// Utility methods for working with message digests.
 abstract class CryptoUtils {
-  /**
-   * Convert a list of bytes (for example a message digest) into a hex
-   * string.
-   */
+  /// Convert a list of bytes (for example a message digest) into a hexadecimal
+  /// string.
   static String bytesToHex(List<int> bytes) {
     var result = new StringBuffer();
     for (var part in bytes) {
@@ -22,37 +18,32 @@
     return result.toString();
   }
 
-  /**
-   * Converts a list of bytes into a Base 64 encoded string.
-   *
-   * The list can be any list of integers in the range 0..255,
-   * for example a message digest.
-   *
-   * If [addLineSeparator] is true, the resulting string will  be
-   * broken into lines of 76 characters, separated by "\r\n".
-   *
-   * If [urlSafe] is true, the result is URL and filename safe.
-   *
-   * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
-   *
-   */
+  /// Converts a list of bytes into a [Base64-encoded][rfc] string.
+  ///
+  /// [rfc]: https://tools.ietf.org/html/rfc4648
+  ///
+  /// The list can be any list of integers from 0 to 255 inclusive, for example
+  /// a message digest.
+  ///
+  /// If [addLineSeparator] is true, the resulting string will  be
+  /// broken into lines of 76 characters, separated by "\r\n".
+  ///
+  /// If [urlSafe] is true, the resulting string will be URL- and filename-
+  /// safe.
   static String bytesToBase64(List<int> bytes,
       {bool urlSafe: false, bool addLineSeparator: false}) {
     return BASE64.encode(bytes,
         urlSafe: urlSafe, addLineSeparator: addLineSeparator);
   }
 
-  /**
-   * Converts a Base 64 encoded String into list of bytes.
-   *
-   * Decoder ignores "\r\n" sequences from input.
-   *
-   * Accepts both URL safe and unsafe Base 64 encoded strings.
-   *
-   * Throws a FormatException exception if input contains invalid characters.
-   *
-   * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
-   */
+  /// Converts a [Base64-encoded][rfc] String into list of bytes.
+  ///
+  /// [rfc]: https://tools.ietf.org/html/rfc4648
+  ///
+  /// This ignores "\r\n" sequences in [input]. It accepts both URL-safe and
+  /// -unsafe Base 64 encoded strings.
+  ///
+  /// Throws a [FormatException] if [input] contains invalid characters.
   static List<int> base64StringToBytes(String input) {
     return BASE64.decode(input);
   }
diff --git a/lib/src/hash.dart b/lib/src/hash.dart
index 03d4b1c..bb228fa 100644
--- a/lib/src/hash.dart
+++ b/lib/src/hash.dart
@@ -4,42 +4,30 @@
 
 library crypto.hash;
 
-/**
- * Interface for cryptographic hash functions.
- *
- * The [add] method is used to add data to the hash. The [close] method
- * is used to extract the message digest.
- *
- * Once the [close] method has been called no more data can be added using the
- * [add] method. If [add] is called after the first call to [close] a
- * HashException is thrown.
- *
- * If multiple instances of a given Hash is needed the [newInstance]
- * method can provide a new instance.
- */
+/// An interface for cryptographic hash functions.
+///
+/// The [add] method adds data to the hash. The [close] method extracts the
+/// message digest.
+///
+/// If multiple instances of a given Hash is needed, the [newInstance] method
+/// can provide a new instance.
 // TODO(floitsch): make Hash implement Sink, EventSink or similar.
 abstract class Hash {
-  /**
-   * Add a list of bytes to the hash computation.
-   */
+  /// Add a list of bytes to the hash computation.
+  ///
+  /// If [this] has already been closed, throws a [StateError].
   void add(List<int> data);
 
-  /**
-   * Finish the hash computation and extract the message digest as
-   * a list of bytes.
-   */
+  /// Finish the hash computation and extract the message digest as a list of
+  /// bytes.
   List<int> close();
 
-  /**
-   * Returns a new instance of this hash function.
-   */
+  /// Returns a new instance of this hash function.
   Hash newInstance();
 
-  /**
-   * Internal block size of the hash in bytes.
-   *
-   * This is exposed for use by the HMAC class which needs to know the
-   * block size for the [Hash] it is using.
-   */
+  /// The internal block size of the hash in bytes.
+  ///
+  /// This is exposed for use by the [HMAC] class, which needs to know the block
+  /// size for the [Hash] it uses.
   int get blockSize;
 }
diff --git a/lib/src/hash_base.dart b/lib/src/hash_base.dart
index 796fd14..b77b26d 100644
--- a/lib/src/hash_base.dart
+++ b/lib/src/hash_base.dart
@@ -10,18 +10,44 @@
 import 'hash.dart';
 import 'utils.dart';
 
-// Base class encapsulating common behavior for cryptographic hash
-// functions.
+/// A base class for [Hash] implementations.
+///
+/// Subclasses should override [updateHash], and define it to update [h] with
+/// the results of the hash function.
 abstract class HashBase implements Hash {
+  /// The size (in 32-bit words) of the chunks of input data that the hash
+  /// function consumes at once.
   final int _chunkSizeInWords;
+
+  /// The size (in 32-bit words) of the digest that the hash function emits.
   final int _digestSizeInWords;
+
+  /// Whether the hash function operates on big-endian words.
   final bool _bigEndianWords;
+
+  /// The words in the current chunk.
   final Uint32List _currentChunk;
+
+  /// The words in the current digest.
+  ///
+  /// The size of this buffer is given by the `digestSizeInWords` constructor
+  /// parameter.
   final Uint32List h;
+
+  /// The length of the input data so far, in bytes.
   int _lengthInBytes = 0;
+
+  /// Data that has yet to be processed by the hash function.
   List<int> _pendingData;
+
+  /// Whether [close] has been called.
   bool _digestCalled = false;
 
+  /// Creates a new hash.
+  ///
+  /// [chunkSizeInWords] represents the size of the input chunks processed by
+  /// the algorithm. [digestSizeInWords] represents the size of the algorithm's
+  /// output digest. Both are in terms of 32-bit words.
   HashBase(
       int chunkSizeInWords, int digestSizeInWords, bool this._bigEndianWords)
       : _pendingData = [],
@@ -30,7 +56,6 @@
         _chunkSizeInWords = chunkSizeInWords,
         _digestSizeInWords = digestSizeInWords;
 
-  // Update the hasher with more data.
   void add(List<int> data) {
     if (_digestCalled) {
       throw new StateError(
@@ -41,7 +66,6 @@
     _iterate();
   }
 
-  // Finish the hash computation and return the digest string.
   List<int> close() {
     if (_digestCalled) {
       return _resultAsBytes();
@@ -53,15 +77,19 @@
     return _resultAsBytes();
   }
 
-  // Returns the block size of the hash in bytes.
   int get blockSize {
     return _chunkSizeInWords * BYTES_PER_WORD;
   }
 
-  // One round of the hash computation.
+  /// Runs a single iteration of the hash computation, updating [h] with the
+  /// result.
+  ///
+  /// [m] is the current chunk, whose size is given by the `chunkSizeInWords`
+  /// parameter passed to the constructor.
   void updateHash(Uint32List m);
 
-  // Compute the final result as a list of bytes from the hash words.
+  /// Computes the final result of the hash as a list of bytes from the hash
+  /// words.
   List<int> _resultAsBytes() {
     var result = [];
     for (var i = 0; i < h.length; i++) {
@@ -70,7 +98,9 @@
     return result;
   }
 
-  // Converts a list of bytes to a chunk of 32-bit words.
+  /// Converts a list of bytes to a chunk of 32-bit words.
+  ///
+  /// Stores the result in [_currentChunk].
   void _bytesToChunk(List<int> data, int dataIndex) {
     assert((data.length - dataIndex) >= (_chunkSizeInWords * BYTES_PER_WORD));
 
@@ -88,7 +118,7 @@
     }
   }
 
-  // Convert a 32-bit word to four bytes.
+  /// Converts a 32-bit word to four bytes.
   List<int> _wordToBytes(int word) {
     List bytes = new List<int>(BYTES_PER_WORD);
     bytes[0] = (word >> (_bigEndianWords ? 24 : 0)) & MASK_8;
@@ -98,8 +128,8 @@
     return bytes;
   }
 
-  // Iterate through data updating the hash computation for each
-  // chunk.
+  /// Iterates through [_pendingData], updating the hash computation for each
+  /// chunk.
   void _iterate() {
     var len = _pendingData.length;
     var chunkSizeInBytes = _chunkSizeInWords * BYTES_PER_WORD;
@@ -113,13 +143,15 @@
     }
   }
 
-  // Finalize the data. Add a 1 bit to the end of the message. Expand with
-  // 0 bits and add the length of the message.
+  /// Finalizes [_pendingData].
+  ///
+  /// This adds a 1 bit to the end of the message, and expands it with 0 bits to
+  /// pad it out.
   void _finalizeData() {
     _pendingData.add(0x80);
     var contentsLength = _lengthInBytes + 9;
     var chunkSizeInBytes = _chunkSizeInWords * BYTES_PER_WORD;
-    var finalizedLength = roundUp(contentsLength, chunkSizeInBytes);
+    var finalizedLength = _roundUp(contentsLength, chunkSizeInBytes);
     var zeroPadding = finalizedLength - contentsLength;
     for (var i = 0; i < zeroPadding; i++) {
       _pendingData.add(0);
@@ -138,4 +170,7 @@
       _pendingData.addAll(_wordToBytes((lengthInBits >> 32) & MASK_32));
     }
   }
+
+  /// Rounds [val] to the nearest multiple of [n].
+  int _roundUp(val, n) => (val + n - 1) & -n;
 }
diff --git a/lib/src/hmac.dart b/lib/src/hmac.dart
index 2e9e0ef..668f40f 100644
--- a/lib/src/hmac.dart
+++ b/lib/src/hmac.dart
@@ -6,35 +6,48 @@
 
 import 'hash.dart';
 
-/**
- * Hash-based Message Authentication Code support.
- *
- * The [add] method is used to add data to the message. The [digest] and
- * [close] methods are used to extract the message authentication code.
- */
-// TODO(floitsch): make Hash implement Sink, EventSink or similar.
+/// An implementation of [keyed-hash method authentication codes][rfc].
+///
+/// [rfc]: https://tools.ietf.org/html/rfc2104
+///
+/// HMAC allows messages to be cryptographically authenticated using any
+/// iterated cryptographic hash function.
+///
+/// The message's data is added using [add]. Once it's been fully added, the
+/// [digest] and [close] methods can be used to extract the message
+/// authentication digest.
+///
+/// If an expected authentication digest is available, the [verify] method may
+/// also be used to ensure that the message actually corresponds to that digest.
+// TODO(floitsch): make HMAC implement Sink, EventSink or similar.
 class HMAC {
+  /// The bytes from the message so far.
   final List<int> _message;
+
+  /// The hash function used to compute the authentication digest.
   Hash _hash;
+
+  /// The secret key shared by the sender and the receiver.
   List<int> _key;
+
+  /// Whether this is closed.
   bool _isClosed = false;
 
-  /**
-   * Create an [HMAC] object from a [Hash] and a key.
-   */
+  /// Create an [HMAC] object from a [Hash] and a binary key.
+  ///
+  /// The key should be a secret shared between the sender and receiver of the
+  /// message.
   HMAC(Hash this._hash, List<int> this._key) : _message = [];
 
-  /**
-   * Add a list of bytes to the message.
-   */
+  /// Adds a list of bytes to the message.
+  ///
+  /// If [this] has already been closed, throws a [StateError].
   void add(List<int> data) {
     if (_isClosed) throw new StateError("HMAC is closed");
     _message.addAll(data);
   }
 
-  /**
-   * Extract the message digest as a list of bytes without closing [this].
-   */
+  /// Returns the digest of the message so far, as a list of bytes.
   List<int> get digest {
     var blockSize = _hash.blockSize;
 
@@ -79,25 +92,22 @@
     return _hash.close();
   }
 
-  /**
-   * Perform the actual computation and extract the message digest
-   * as a list of bytes.
-   */
+  /// Closes [this] and returns the digest of the message as a list of bytes.
+  ///
+  /// Once closed, [add] may no longer be called.
   List<int> close() {
     _isClosed = true;
     return digest;
   }
 
-  /**
-   * Verify that the HMAC computed for the data so far matches the
-   * given message digest.
-   *
-   * This method should be used instead of memcmp-style comparisons
-   * to avoid leaking information via timing.
-   *
-   * Throws an exception if the given digest does not have the same
-   * size as the digest computed by this HMAC instance.
-   */
+  /// Returns whether the digest computed for the data so far matches the given
+  /// [digest].
+  ///
+  /// This method should be used instead of iterative comparisons to avoid
+  /// leaking information via timing.
+  ///
+  /// Throws an [ArgumentError] if the given digest does not have the same size
+  /// as the digest computed by [this].
   bool verify(List<int> digest) {
     var computedDigest = this.digest;
     if (digest.length != computedDigest.length) {
diff --git a/lib/src/md5.dart b/lib/src/md5.dart
index 077b218..e1caf88 100644
--- a/lib/src/md5.dart
+++ b/lib/src/md5.dart
@@ -10,18 +10,22 @@
 import 'hash_base.dart';
 import 'utils.dart';
 
-/**
- * MD5 hash function implementation.
- *
- * WARNING: MD5 has known collisions and should only be used when
- * required for backwards compatibility.
- */
+/// An implementation of the [MD5][rfc] hash function.
+///
+/// [rfc]: https://tools.ietf.org/html/rfc1321
+///
+/// **Warning**: MD5 has known collisions and should only be used when required
+/// for backwards compatibility.
 abstract class MD5 implements Hash {
   factory MD5() = _MD5;
 
   MD5 newInstance();
 }
 
+/// The concrete implementation of [MD5].
+///
+/// This is separate so that it can extend [HashBase] without leaking additional
+/// public memebers.
 class _MD5 extends HashBase implements MD5 {
   _MD5() : super(16, 4, false) {
     h[0] = 0x67452301;
@@ -30,11 +34,12 @@
     h[3] = 0x10325476;
   }
 
-  // Returns a new instance of this Hash.
   MD5 newInstance() {
     return new _MD5();
   }
 
+  /// Data from a non-linear mathematical function that functions as
+  /// reproducible noise.
   static const _k = const [
     0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a,
     0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
@@ -49,6 +54,7 @@
     0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
   ];
 
+  /// Per-round shift amounts.
   static const _r = const [
     07, 12, 17, 22, 07, 12, 17, 22, 07, 12, 17, 22, 07, 12, 17, 22, 05, 09, 14,
     20, 05, 09, 14, 20, 05, 09, 14, 20, 05, 09, 14, 20, 04, 11, 16, 23, 04, 11,
@@ -56,8 +62,6 @@
     10, 15, 21, 06, 10, 15, 21
   ];
 
-  // Compute one iteration of the MD5 algorithm with a chunk of
-  // 16 32-bit pieces.
   void updateHash(Uint32List m) {
     assert(m.length == 16);
 
diff --git a/lib/src/sha1.dart b/lib/src/sha1.dart
index d059226..7041a6f 100644
--- a/lib/src/sha1.dart
+++ b/lib/src/sha1.dart
@@ -10,19 +10,26 @@
 import 'hash_base.dart';
 import 'utils.dart';
 
-/**
- * SHA1 hash function implementation.
- */
+/// An implementation of the [SHA-1][rfc] hash function.
+///
+/// [rfc]: http://tools.ietf.org/html/rfc3174
 abstract class SHA1 implements Hash {
   factory SHA1() = _SHA1;
 
   SHA1 newInstance();
 }
 
+/// The concrete implementation of [SHA1].
+///
+/// This is separate so that it can extend [HashBase] without leaking additional
+/// public memebers.
 class _SHA1 extends HashBase implements SHA1 {
+  /// The sixteen words from the original chunk, extended to 80 words.
+  ///
+  /// This is an instance variable to avoid re-allocating, but its data isn't
+  /// used across invocations of [updateHash].
   final Uint32List _w;
 
-  // Construct a SHA1 hasher object.
   _SHA1()
       : _w = new Uint32List(80),
         super(16, 5, true) {
@@ -33,13 +40,10 @@
     h[4] = 0xC3D2E1F0;
   }
 
-  // Returns a new instance of this Hash.
   SHA1 newInstance() {
     return new _SHA1();
   }
 
-  // Compute one iteration of the SHA1 algorithm with a chunk of
-  // 16 32-bit pieces.
   void updateHash(Uint32List m) {
     assert(m.length == 16);
 
diff --git a/lib/src/sha256.dart b/lib/src/sha256.dart
index 158f3f9..f66976d 100644
--- a/lib/src/sha256.dart
+++ b/lib/src/sha256.dart
@@ -10,19 +10,26 @@
 import 'hash_base.dart';
 import 'utils.dart';
 
-/**
- * SHA256 hash function implementation.
- */
+/// An implementation of the [SHA-256][rfc] hash function.
+///
+/// [rfc]: http://tools.ietf.org/html/rfc6234
 abstract class SHA256 implements Hash {
   factory SHA256() = _SHA256;
 
   SHA256 newInstance();
 }
 
+/// The concrete implementation of [SHA256].
+///
+/// This is separate so that it can extend [HashBase] without leaking additional
+/// public memebers.
 class _SHA256 extends HashBase implements SHA256 {
+  /// The sixteen words from the original chunk, extended to 64 words.
+  ///
+  /// This is an instance variable to avoid re-allocating, but its data isn't
+  /// used across invocations of [updateHash].
   final Uint32List _w;
 
-  // Construct a SHA256 hasher object.
   _SHA256()
       : _w = new Uint32List(64),
         super(16, 8, true) {
@@ -38,13 +45,11 @@
     h[7] = 0x5be0cd19;
   }
 
-  // Returns a new instance of this Hash.
   SHA256 newInstance() {
     return new _SHA256();
   }
 
-  // Table of round constants. First 32 bits of the fractional
-  // parts of the cube roots of the first 64 prime numbers.
+  /// Data from a non-linear function that functions as reproducible noise.
   static const List<int> _K = const [
     0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,
     0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,
@@ -61,7 +66,9 @@
     0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
   ];
 
-  // Helper functions as defined in http://tools.ietf.org/html/rfc6234
+  // The following helper functions are taken directly from
+  // http://tools.ietf.org/html/rfc6234.
+
   _rotr32(n, x) => (x >> n) | ((x << (32 - n)) & MASK_32);
   _ch(x, y, z) => (x & y) ^ ((~x & MASK_32) & z);
   _maj(x, y, z) => (x & y) ^ (x & z) ^ (y & z);
@@ -70,8 +77,6 @@
   _ssig0(x) => _rotr32(7, x) ^ _rotr32(18, x) ^ (x >> 3);
   _ssig1(x) => _rotr32(17, x) ^ _rotr32(19, x) ^ (x >> 10);
 
-  // Compute one iteration of the SHA256 algorithm with a chunk of
-  // 16 32-bit pieces.
   void updateHash(Uint32List M) {
     assert(M.length == 16);
 
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 3f8a5c9..f2f265d 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -4,20 +4,23 @@
 
 library crypto.utils;
 
-// Constants.
+/// A bitmask that limits an integer to 8 bits.
 const MASK_8 = 0xff;
+
+/// A bitmask that limits an integer to 32 bits.
 const MASK_32 = 0xffffffff;
+
+/// The number of bits in a byte.
 const BITS_PER_BYTE = 8;
+
+/// The number of bytes in a 32-bit word.
 const BYTES_PER_WORD = 4;
 
-// Helper methods.
+/// Adds [x] and [y] with 32-bit overflow semantics.
 int add32(x, y) => (x + y) & MASK_32;
 
-int roundUp(val, n) => (val + n - 1) & -n;
-
-// Helper functions used by more than one hasher.
-
-// Rotate left limiting to unsigned 32-bit values.
+/// Bitwise rotates [val] to the left by [shift], obeying 32-bit overflow
+/// semantics.
 int rotl32(int val, int shift) {
   var mod_shift = shift & 31;
   return ((val << mod_shift) & MASK_32) |