diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0d97adc..64fc6d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 1.0.0
+
+* All APIs that were deprecated in 0.9.2 have been removed. No new APIs have
+  been added. Packages that would use 1.0.0 as a lower bound should use 0.9.2
+  instead—for example, `crypto: ">=0.9.2 <2.0.0"`.
+
 ## 0.9.2
 
 * `Hash`, `MD5`, `SHA1`, and `SHA256` now implement `Converter`. They convert
diff --git a/lib/crypto.dart b/lib/crypto.dart
index b4e7ab8..990349a 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.
 
-export 'src/base64.dart';
-export 'src/base64/decoder.dart';
-export 'src/base64/encoder.dart';
-export 'src/crypto_utils.dart';
 export 'src/digest.dart';
 export 'src/hash.dart';
 export 'src/hmac.dart';
diff --git a/lib/src/base64.dart b/lib/src/base64.dart
deleted file mode 100644
index 91d672b..0000000
--- a/lib/src/base64.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'dart:convert';
-
-import 'base64/decoder.dart';
-import 'base64/encoder.dart';
-
-/// This is deprecated.
-///
-/// Use the `BASE64` constant in `dart:convert` instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-const Base64Codec BASE64 = const Base64Codec();
-
-/// This is deprecated.
-///
-/// Use the `Base64Codec` class in `dart:convert` instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-class Base64Codec extends Codec<List<int>, String> {
-  final bool _urlSafe;
-  final bool _addLineSeparator;
-  final bool _encodePaddingCharacter;
-
-  /// 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,
-      bool encodePaddingCharacter: false})
-      : _urlSafe = urlSafe,
-        _addLineSeparator = addLineSeparator,
-        _encodePaddingCharacter = encodePaddingCharacter;
-
-  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;
-    if (addLineSeparator == null) addLineSeparator = _addLineSeparator;
-    if (encodePaddingCharacter == null) {
-      encodePaddingCharacter = _encodePaddingCharacter;
-    }
-
-    return new Base64Encoder(
-        urlSafe: urlSafe,
-        addLineSeparator: addLineSeparator,
-        encodePaddingCharacter: encodePaddingCharacter).convert(bytes);
-  }
-
-  Base64Encoder get encoder => new Base64Encoder(
-      urlSafe: _urlSafe,
-      addLineSeparator: _addLineSeparator,
-      encodePaddingCharacter: _encodePaddingCharacter);
-
-  Base64Decoder get decoder => const Base64Decoder();
-}
diff --git a/lib/src/base64/decoder.dart b/lib/src/base64/decoder.dart
deleted file mode 100644
index 8f22a99..0000000
--- a/lib/src/base64/decoder.dart
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:charcode/ascii.dart';
-
-import 'decoder_sink.dart';
-
-/// A mapping from ASCII character codes to their corresponding Base64 values.
-///
-/// Characters with a value of `null` can't be decoded directly. This includes
-/// special values like CR, LF, `=`, and `%`.
-const _decodeTable = const [
-  null, null, null, null, null, null, null, null, null, null, null, null, null,
-  null, null, null, null, null, null, null, null, null, null, null, null, null,
-  null, null, null, null, null, null, null, null, null, null, null, null, null,
-  null, null, null, null, 62, null, 62, null, 63, 52, 53, 54, 55, 56, 57, 58,
-  59, 60, 61, null, null, null, null, null, null, null, 0, 1, 2, 3, 4, 5, 6, 7,
-  8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, null,
-  null, null, null, 63, null, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
-  38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
-];
-
-/// This is deprecated.
-///
-/// Use the `Base64Decoder` class in `dart:convert` instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-class Base64Decoder extends Converter<String, List<int>> {
-  const Base64Decoder();
-
-  List<int> convert(String input) {
-    if (input.length == 0) return new Uint8List(0);
-
-    // The length of the actual data sections in the input (not CRLFs).
-    var dataLength = 0;
-
-    // Count the data, and fail for invalid characters.
-    for (var i = 0; i < input.length; i++) {
-      var codeUnit = input.codeUnitAt(i);
-
-      if (codeUnit == $cr || codeUnit == $lf) continue;
-
-      if (codeUnit == $percent &&
-          i < input.length - 2 &&
-          input.codeUnitAt(i + 1) == $3 &&
-          input.codeUnitAt(i + 2) == $D) {
-        dataLength++;
-        i += 2;
-        continue;
-      }
-
-      if (codeUnit != $equal &&
-          (codeUnit >= _decodeTable.length || _decodeTable[codeUnit] == null)) {
-        throw new FormatException('Invalid character', input, i);
-      }
-
-      dataLength++;
-    }
-
-    if (dataLength % 4 != 0) {
-      throw new FormatException(
-          'Base64 input must encode a multiple of 4 bytes.',
-          input,
-          dataLength);
-    }
-
-    // Count the trailing pad characters.
-    var padLength = 0;
-    for (var i = input.length - 1; i >= 0; i--) {
-      var codeUnit = input.codeUnitAt(i);
-      if (codeUnit == $D &&
-          i >= 2 &&
-          input.codeUnitAt(i - 2) == $percent &&
-          input.codeUnitAt(i - 1) == $3) {
-        padLength++;
-        i -= 2;
-      } else if (codeUnit == $equal) {
-        padLength++;
-      } else if (codeUnit != $cr && codeUnit != $lf) {
-        break;
-      }
-    }
-    var outputLength = ((dataLength * 6) >> 3) - padLength;
-    var out = new Uint8List(outputLength);
-
-    var inputIndex = 0;
-    var outputIndex = 0;
-    while (outputIndex < outputLength) {
-      // Accumulate four 6-bit Base64 characters into a 32-bit chunk.
-      var chunk = 0;
-      for (var i = 0; i < 4; i++) {
-        var codeUnit = input.codeUnitAt(inputIndex++);
-
-        if (codeUnit == $equal || codeUnit == $percent) {
-          // We've reached the end of the source. Pad out the rest of the chunk
-          // with zeroes.
-          chunk <<= (4 - i) * 6;
-          break;
-        }
-
-        if (codeUnit == $cr || codeUnit == $lf) {
-          i--;
-        } else {
-          chunk = (chunk << 6) | _decodeTable[codeUnit];
-        }
-      }
-
-      // Emit 8-bit pieces of the chunk to the output buffer.
-      out[outputIndex++] = chunk >> 16;
-      if (outputIndex >= outputLength) break;
-
-      out[outputIndex++] = (chunk >> 8) & 0xFF;
-      if (outputIndex >= outputLength) break;
-
-      out[outputIndex++] = chunk & 0xFF;
-    }
-
-    return out;
-  }
-
-  Base64DecoderSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) sink = new ByteConversionSink.from(sink);
-    return new Base64DecoderSink(sink);
-  }
-}
diff --git a/lib/src/base64/decoder_sink.dart b/lib/src/base64/decoder_sink.dart
deleted file mode 100644
index 0a09a82..0000000
--- a/lib/src/base64/decoder_sink.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'dart:convert';
-
-import 'decoder.dart';
-
-/// This is deprecated.
-///
-/// Use the `Base64Decoder` class in `dart:convert` instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-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 text stopping partway through a four-character
-  /// 32-bit chunk.
-  String _unconverted = "";
-
-  Base64DecoderSink(this._outSink);
-
-  void add(String chunk) {
-    if (chunk.isEmpty) return;
-    if (_unconverted.isNotEmpty) chunk = _unconverted + chunk;
-    chunk = chunk.replaceAll("%3D", "=");
-
-    // The decodable length is the length of the initial substring comprising
-    // full four-character 32-bit chunks. Any leftovers are handled when [add]
-    // or [close] are next called.
-    var decodableLength = chunk.length;
-    if (chunk.length > 3 && chunk.contains("%", chunk.length - 2)) {
-      decodableLength = chunk.lastIndexOf("%");
-    }
-    decodableLength -= decodableLength % 4;
-
-    _unconverted = chunk.substring(decodableLength);
-    if (decodableLength > 0) {
-      _outSink.add(_decoder.convert(chunk.substring(0, decodableLength)));
-    }
-  }
-
-  void close() {
-    if (_unconverted.isNotEmpty) _outSink.add(_decoder.convert(_unconverted));
-    _outSink.close();
-  }
-}
diff --git a/lib/src/base64/encoder.dart b/lib/src/base64/encoder.dart
deleted file mode 100644
index bdbf6d8..0000000
--- a/lib/src/base64/encoder.dart
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'dart:convert';
-
-import 'package:charcode/ascii.dart';
-
-import 'encoder_sink.dart';
-
-/// 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 _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 _encodeTable =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-/// The line length for Base64 strings with line separators.
-const _lineLength = 76;
-
-/// This is deprecated.
-///
-/// Use the `Base64Encoder` class in `dart:convert` instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-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;
-
-  /// The sequence of bytes to use as a padding character.
-  final List<int> _pad;
-
-  /// 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,
-      bool encodePaddingCharacter: false})
-      : _urlSafe = urlSafe,
-        _addLineSeparator = addLineSeparator,
-        _pad = encodePaddingCharacter
-            ? const [$percent, $3, $D]
-            : const [$equal];
-
-  /// 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]) {
-    RangeError.checkValidRange(start, end, bytes.length);
-    if (end == null) end = bytes.length;
-
-    var length = end - start;
-    if (length == 0) return "";
-
-    var lookup = _urlSafe ? _encodeTableUrlSafe : _encodeTable;
-
-    // The total length of the 24-bit chunks.
-    var remainderLength = length.remainder(3);
-    var chunkLength = length - remainderLength;
-
-    // The size of the base output.
-    var baseOutputLength = (length ~/ 3) * 4;
-    var remainderOutputLength = remainderLength > 0 ? 3 + _pad.length : 0;
-
-    var outputLength = baseOutputLength + remainderOutputLength;
-    if (_addLineSeparator) {
-      // Add extra expected length to account for line separators.
-      outputLength += ((outputLength - 1) ~/ _lineLength) * 2;
-    }
-    var out = new List<int>(outputLength);
-
-    // Encode 24 bit chunks.
-    var input = start;
-    var output = 0;
-    var chunks = 0;
-    while (input < chunkLength) {
-      // Get a 24-bit chunk from the next three input bytes. Mask each byte to
-      // make sure we don't do something bad if the user passes in non-byte
-      // ints.
-      var chunk = (bytes[input++] << 16) & 0x00FF0000;
-      chunk    |= (bytes[input++] << 8)  & 0x0000FF00;
-      chunk    |=  bytes[input++]        & 0x000000FF;
-
-      // Split the 24-bit chunk into four 6-bit sections to encode as
-      // characters.
-      out[output++] = lookup.codeUnitAt(chunk >> 18);
-      out[output++] = lookup.codeUnitAt((chunk >> 12) & 0x3F);
-      out[output++] = lookup.codeUnitAt((chunk >> 6) & 0x3F);
-      out[output++] = lookup.codeUnitAt(chunk & 0x3F);
-
-      // Add an optional line separator for every 76 characters we emit; that
-      // is, every 19 chunks.
-      chunks++;
-      if (_addLineSeparator && chunks == 19 && output < outputLength - 2) {
-        out[output++] = $cr;
-        out[output++] = $lf;
-        chunks = 0;
-      }
-    }
-
-    // If the input length isn't a multiple of 3, encode the remaining bytes and
-    // add padding.
-    if (remainderLength == 1) {
-      var byte = bytes[input];
-      out[output++] = lookup.codeUnitAt(byte >> 2);
-      out[output++] = lookup.codeUnitAt((byte << 4) & 0x3F);
-      out.setRange(output, output + _pad.length, _pad);
-      out.setRange(output + _pad.length, output + 2 * _pad.length, _pad);
-    } else if (remainderLength == 2) {
-      var byte1 = bytes[input++];
-      var byte2 = bytes[input];
-      out[output++] = lookup.codeUnitAt(byte1 >> 2);
-      out[output++] = lookup.codeUnitAt(((byte1 << 4) | (byte2 >> 4)) & 0x3F);
-      out[output++] = lookup.codeUnitAt((byte2 << 2) & 0x3F);
-      out.setRange(output, output + _pad.length, _pad);
-    }
-
-    return new String.fromCharCodes(out);
-  }
-
-  Base64EncoderSink startChunkedConversion(Sink<String> sink) {
-    StringConversionSink stringSink = sink is StringConversionSink
-        ? sink
-        : new StringConversionSink.from(sink);
-
-    return new Base64EncoderSink(stringSink, _urlSafe, _addLineSeparator);
-  }
-}
diff --git a/lib/src/base64/encoder_sink.dart b/lib/src/base64/encoder_sink.dart
deleted file mode 100644
index 293735b..0000000
--- a/lib/src/base64/encoder_sink.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'dart:convert';
-
-import 'encoder.dart';
-
-/// This is deprecated.
-///
-/// Use the `Base64Encoder` class in `dart:convert` instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-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 _buffer = new List<int>();
-
-  /// The length of [_buffer]; that is, the number of unconverted bytes.
-  var _bufferCount = 0;
-
-  Base64EncoderSink(this._outSink, urlSafe, addLineSeparator)
-      : _encoder = new Base64Encoder(
-            urlSafe: urlSafe, addLineSeparator: addLineSeparator);
-
-  void add(List<int> chunk) {
-    var nextBufferCount = (chunk.length + _bufferCount) % 3;
-    var decodableLength = _bufferCount + chunk.length - nextBufferCount;
-
-    if (_bufferCount + chunk.length > _buffer.length) {
-      _buffer.replaceRange(_bufferCount, _buffer.length,
-          chunk.sublist(0, _buffer.length - _bufferCount));
-      _buffer.addAll(chunk.sublist(_buffer.length - _bufferCount));
-    } else {
-      _buffer.replaceRange(_bufferCount, _bufferCount + chunk.length, chunk);
-    }
-
-    _outSink.add(_encoder.convert(_buffer, 0, decodableLength));
-    _buffer.removeRange(0, decodableLength);
-    _bufferCount = nextBufferCount;
-  }
-
-  void close() {
-    if (_bufferCount > 0) {
-      _outSink.add(_encoder.convert(_buffer.sublist(0, _bufferCount)));
-    }
-    _outSink.close();
-  }
-}
-
diff --git a/lib/src/crypto_utils.dart b/lib/src/crypto_utils.dart
deleted file mode 100644
index 4af507c..0000000
--- a/lib/src/crypto_utils.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'base64.dart';
-
-/// This class is deprecated.
-@Deprecated("Will be removed in crypto 1.0.0.")
-abstract class CryptoUtils {
-  /// This is deprecated.
-  ///
-  /// Use `hex` from `package:convert` instead.
-  static String bytesToHex(List<int> bytes) {
-    var result = new StringBuffer();
-    for (var part in bytes) {
-      result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
-    }
-    return result.toString();
-  }
-
-  /// This is deprecated.
-  ///
-  /// Use `BASE64` from `dart:convert` instead.
-  static String bytesToBase64(List<int> bytes,
-          {bool urlSafe: false, bool addLineSeparator: false}) =>
-      BASE64.encode(bytes,
-          urlSafe: urlSafe, addLineSeparator: addLineSeparator);
-
-  /// This is deprecated.
-  ///
-  /// Use `BASE64` from `dart:convert` instead.
-  static List<int> base64StringToBytes(String input) => BASE64.decode(input);
-}
diff --git a/lib/src/hash.dart b/lib/src/hash.dart
index 9714f42..fad44ae 100644
--- a/lib/src/hash.dart
+++ b/lib/src/hash.dart
@@ -15,20 +15,11 @@
 abstract class Hash extends Converter<List<int>, Digest> {
   /// The internal block size of the hash in bytes.
   ///
-  /// This is exposed for use by the [HMAC] class, which needs to know the block
+  /// This is exposed for use by the [Hmac] class, which needs to know the block
   /// size for the [Hash] it uses.
   int get blockSize;
 
-  /// The sink for implementing the deprecated APIs that involved adding data
-  /// directly to the [Hash] instance.
-  ByteConversionSink _sink;
-
-  /// The sink that [_sink] sends the [Digest] to once it finishes hashing.
-  final DigestSink _innerSink = new DigestSink();
-
-  Hash() {
-    _sink = startChunkedConversion(_innerSink);
-  }
+  const Hash();
 
   Digest convert(List<int> data) {
     var innerSink = new DigestSink();
@@ -39,25 +30,4 @@
   }
 
   ByteConversionSink startChunkedConversion(Sink<Digest> sink);
-
-  /// This is deprecated.
-  ///
-  /// Use [startChunkedConversion] instead.
-  @Deprecated("Will be removed in crypto 1.0.0.")
-  Hash newInstance();
-
-  /// This is deprecated.
-  ///
-  /// Use [convert] or [startChunkedConversion] instead.
-  @Deprecated("Will be removed in crypto 1.0.0.")
-  void add(List<int> data) => _sink.add(data);
-
-  /// This is deprecated.
-  ///
-  /// Use [convert] or [startChunkedConversion] instead.
-  @Deprecated("Will be removed in crypto 1.0.0.")
-  List<int> close() {
-    _sink.close();
-    return _innerSink.value.bytes;
-  }
 }
diff --git a/lib/src/hmac.dart b/lib/src/hmac.dart
index f1b9de2..f5bf6bf 100644
--- a/lib/src/hmac.dart
+++ b/lib/src/hmac.dart
@@ -5,8 +5,6 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
-import 'package:typed_data/typed_data.dart';
-
 import 'digest.dart';
 import 'digest_sink.dart';
 import 'hash.dart';
@@ -51,75 +49,6 @@
       new _HmacSink(sink, _hash, _key);
 }
 
-/// This is deprecated.
-///
-/// Use [Hmac] instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-class HMAC {
-  final Hmac _hmac;
-
-  /// The sink for implementing the deprecated APIs that involved adding data
-  /// directly to the [HMAC] instance.
-  _HmacSink _sink;
-
-  /// The sink that [_sink] sends the [Digest] to once it finishes hashing.
-  DigestSink _innerSink;
-
-  /// The bytes from the message so far.
-  final _message = new Uint8Buffer();
-
-  /// 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 hash, List<int> key) : _hmac = new Hmac(hash, key) {
-    _innerSink = new DigestSink();
-    _sink = _hmac.startChunkedConversion(_innerSink);
-  }
-
-  void add(List<int> data) {
-    _message.addAll(data);
-    _sink.add(data);
-  }
-
-  List<int> close() {
-    _sink.close();
-    return _innerSink.value.bytes;
-  }
-
-  List<int> get digest {
-    if (_sink._isClosed) return _innerSink.value.bytes;
-
-    // This may be called at any point while the message is being hashed, but
-    // the [_HmacSink] only supports getting the value once. To make this work,
-    // we just re-hash everything after we get the digest. It's redundant, but
-    // this API is deprecated anyway.
-    _sink.close();
-    var bytes = _innerSink.value.bytes;
-
-    _innerSink = new DigestSink();
-    _sink = _hmac._hash.startChunkedConversion(_innerSink);
-    _sink.add(_message);
-
-    return bytes;
-  }
-
-  bool verify(List<int> digest) {
-    var computedDigest = this.digest;
-    if (digest.length != computedDigest.length) {
-      throw new ArgumentError(
-          'Invalid digest size: ${digest.length} in HMAC.verify. '
-          'Expected: ${_hmac._hash.blockSize}.');
-    }
-
-    var result = 0;
-    for (var i = 0; i < digest.length; i++) {
-      result |= digest[i] ^ computedDigest[i];
-    }
-    return result == 0;
-  }
-}
-
 /// The concrete implementation of the HMAC algorithm.
 class _HmacSink extends ByteConversionSink {
   /// The sink for the outer hash computation.
diff --git a/lib/src/md5.dart b/lib/src/md5.dart
index 1374df7..69e3c32 100644
--- a/lib/src/md5.dart
+++ b/lib/src/md5.dart
@@ -18,7 +18,7 @@
 ///
 /// **Warning**: MD5 has known collisions and should only be used when required
 /// for backwards compatibility.
-final md5 = new MD5();
+final md5 = new MD5._();
 
 /// An implementation of the [MD5][rfc] hash function.
 ///
@@ -32,13 +32,7 @@
 class MD5 extends Hash {
   final int blockSize = 16 * bytesPerWord;
 
-  /// This constructor is deprecated.
-  ///
-  /// Use [md5] instead.
-  @Deprecated("Will be removed in crypto 1.0.0.")
-  MD5();
-
-  MD5 newInstance() => new MD5();
+  MD5._();
 
   ByteConversionSink startChunkedConversion(Sink<Digest> sink) =>
       new ByteConversionSink.from(new _MD5Sink(sink));
diff --git a/lib/src/sha1.dart b/lib/src/sha1.dart
index 9bb6411..0410761 100644
--- a/lib/src/sha1.dart
+++ b/lib/src/sha1.dart
@@ -25,22 +25,10 @@
 
   Sha1._();
 
-  Sha1 newInstance() => new Sha1._();
-
   ByteConversionSink startChunkedConversion(Sink<Digest> sink) =>
       new ByteConversionSink.from(new _Sha1Sink(sink));
 }
 
-/// This class is deprecated.
-///
-/// Use [sha1] instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-class SHA1 extends Sha1 {
-  SHA1() : super._();
-
-  SHA1 newInstance() => new SHA1();
-}
-
 /// The concrete implementation of [Sha1].
 ///
 /// This is separate so that it can extend [HashBase] without leaking additional
diff --git a/lib/src/sha256.dart b/lib/src/sha256.dart
index 61cd72f..0145363 100644
--- a/lib/src/sha256.dart
+++ b/lib/src/sha256.dart
@@ -34,16 +34,6 @@
       new ByteConversionSink.from(new _Sha256Sink(sink));
 }
 
-/// This class is deprecated.
-///
-/// Use [sha256] instead.
-@Deprecated("Will be removed in crypto 1.0.0.")
-class SHA256 extends Sha256 {
-  SHA256() : super._();
-
-  SHA256 newInstance() => new SHA256();
-}
-
 /// Data from a non-linear function that functions as reproducible noise.
 const List<int> _noise = const [
   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
diff --git a/pubspec.yaml b/pubspec.yaml
index 16be73c..a20644f 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: crypto
-version: 0.9.2
+version: 1.0.0
 author: Dart Team <misc@dartlang.org>
 description: Library of cryptographic functions.
 homepage: https://www.github.com/dart-lang/crypto
@@ -7,7 +7,5 @@
   sdk: '>=1.8.0 <2.0.0'
 dependencies:
   convert: '^1.0.0'
-  charcode: '^1.1.0'
-  typed_data: '^1.0.0'
 dev_dependencies:
   test: '>=0.12.0 <0.13.0'
diff --git a/test/base64_test.dart b/test/base64_test.dart
deleted file mode 100644
index a0ea9ee..0000000
--- a/test/base64_test.dart
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// 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.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:math';
-
-import "package:charcode/ascii.dart";
-import "package:crypto/crypto.dart";
-import "package:test/test.dart";
-
-void main() {
-  group("encoder", () {
-    test("for simple inputs", () {
-      expect(BASE64.encode([]), equals(''));
-      expect(BASE64.encode([$f]), equals('Zg=='));
-      expect(BASE64.encode([$f, $o]), equals('Zm8='));
-      expect(BASE64.encode([$f, $o, $o]), equals('Zm9v'));
-      expect(BASE64.encode([$f, $o, $o, $b]), equals('Zm9vYg=='));
-      expect(BASE64.encode([$f, $o, $o, $b, $a]), equals('Zm9vYmE='));
-      expect(BASE64.encode([$f, $o, $o, $b, $a, $r]), equals('Zm9vYmFy'));
-    });
-
-    test("for inputs with zeroes", () {
-      expect(BASE64.encode([0]), equals('AA=='));
-      expect(BASE64.encode([0, 0]), equals('AAA='));
-      expect(BASE64.encode([0, 0, 0]), equals('AAAA'));
-      expect(BASE64.encode([0, 0, 0, 0]), equals('AAAAAA=='));
-    });
-
-    test("for a large input with line separators", () {
-      expect(
-          BASE64.encode(
-              UTF8.encode(
-                  "Man is distinguished, not only by his reason, but by this "
-                  "singular passion from other animals, which is a lust of the "
-                  "mind, that by a perseverance of delight in the continued "
-                  "and indefatigable generation of knowledge, exceeds the "
-                  "short vehemence of any carnal pleasure."),
-              addLineSeparator: true),
-          equals(
-              "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1"
-                  "dCBieSB0aGlz\r\n"
-              "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBh"
-                  "IGx1c3Qgb2Yg\r\n"
-              "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0"
-                  "aGUgY29udGlu\r\n"
-              "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBl"
-                  "eGNlZWRzIHRo\r\n"
-              "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="));
-    });
-
-    test("for a large input without line separators", () {
-      expect(
-          BASE64.encode(
-              UTF8.encode(
-                  "Man is distinguished, not only by his reason, but by this "
-                  "singular passion from other animals, which is a lust of the "
-                  "mind, that by a perseverance of delight in the continued "
-                  "and indefatigable generation of knowledge, exceeds the "
-                  "short vehemence of any carnal pleasure.")),
-          equals(
-              "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1"
-              "dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3"
-              "aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFu"
-              "Y2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxl"
-              "IGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhl"
-              "bWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="));
-    });
-
-    test("for chunked input", () {
-      expect(_encodeChunked([
-        [102, 102],
-        [111, 102],
-        [
-          111, 111, 102, 111, 111, 98, 102, 111, 111, 98, 97, 102, 111, 111,
-          98, 97, 114
-        ]
-      ]), equals("ZmZvZm9vZm9vYmZvb2JhZm9vYmFy"));
-
-      expect(_encodeChunked([[196, 16], [], [158], [196]]), equals("xBCexA=="));
-      expect(_encodeChunked([[196, 16], [158, 196], [], []]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[196], [], [16], [], [], [158], [], [196]]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[196], [], [16], [158, 196], [], []]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[], [196], [], [], [16, 158], [], [196]]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[], [196], [16, 158, 196], []]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[196, 16, 158], [], [], [196]]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[196, 16, 158], [], [196], []]),
-          equals("xBCexA=="));
-      expect(_encodeChunked([[196, 16, 158, 196], [], [], []]),
-          equals("xBCexA=="));
-    });
-
-    test('with a URL-safe alphabet', () {
-      expect(BASE64.encode(BASE64.decode('+/A='), urlSafe: true),
-          equals('-_A='));
-    });
-
-    test('with a percent-encoded padding character', () {
-      expect(BASE64.encode([2, 8], encodePaddingCharacter: true),
-          equals('Agg%3D'));
-    });
-
-    test('with the old API', () {
-      expect(CryptoUtils.bytesToBase64([]), equals(''));
-      expect(CryptoUtils.bytesToBase64([$f]), equals('Zg=='));
-      expect(CryptoUtils.bytesToBase64([$f, $o]), equals('Zm8='));
-      expect(CryptoUtils.bytesToBase64([$f, $o, $o]), equals('Zm9v'));
-      expect(CryptoUtils.bytesToBase64([$f, $o, $o, $b]), equals('Zm9vYg=='));
-      expect(CryptoUtils.bytesToBase64([$f, $o, $o, $b, $a]),
-          equals('Zm9vYmE='));
-      expect(CryptoUtils.bytesToBase64([$f, $o, $o, $b, $a, $r]),
-          equals('Zm9vYmFy'));
-    });
-  });
-
-  group("decoder", () {
-    test("for simple inputs", () {
-      expect(BASE64.decode(''), equals([]));
-      expect(BASE64.decode('Zg=='), equals([$f]));
-      expect(BASE64.decode('Zm8='), equals([$f, $o]));
-      expect(BASE64.decode('Zm9v'), equals([$f, $o, $o]));
-      expect(BASE64.decode('Zm9vYg=='), equals([$f, $o, $o, $b]));
-      expect(BASE64.decode('Zm9vYmE='), equals([$f, $o, $o, $b, $a]));
-      expect(BASE64.decode('Zm9vYmFy'), equals([$f, $o, $o, $b, $a, $r]));
-    });
-
-    test("for inputs with zeroes", () {
-      expect(BASE64.decode('AA=='), equals([0]));
-      expect(BASE64.decode('AAA='), equals([0, 0]));
-      expect(BASE64.decode('AAAA'), equals([0, 0, 0]));
-      expect(BASE64.decode('AAAAAA=='), equals([0, 0, 0, 0]));
-    });
-
-    test("for a large input with line separators", () {
-      expect(
-          BASE64.decode(
-              "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1"
-                  "dCBieSB0aGlz\r\n"
-              "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBh"
-                  "IGx1c3Qgb2Yg\r\n"
-              "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0"
-                  "aGUgY29udGlu\r\n"
-              "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBl"
-                  "eGNlZWRzIHRo\r\n"
-              "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="),
-          equals(UTF8.encode(
-              "Man is distinguished, not only by his reason, but by this "
-              "singular passion from other animals, which is a lust of the "
-              "mind, that by a perseverance of delight in the continued and "
-              "indefatigable generation of knowledge, exceeds the short "
-              "vehemence of any carnal pleasure.")));
-    });
-
-    test("for a large input without line separators", () {
-      expect(
-          BASE64.decode(
-              "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1"
-              "dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3"
-              "aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFu"
-              "Y2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxl"
-              "IGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhl"
-              "bWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="),
-          equals(UTF8.encode(
-              "Man is distinguished, not only by his reason, but by this "
-              "singular passion from other animals, which is a lust of the "
-              "mind, that by a perseverance of delight in the continued and "
-              "indefatigable generation of knowledge, exceeds the short "
-              "vehemence of any carnal pleasure.")));
-    });
-
-    test("for chunked input", () {
-      expect(_decodeChunked(['YmFz', 'ZTY', '0I', 'GRlY29kZXI=']), equals([
-        98, 97, 115, 101, 54, 52, 32, 100, 101, 99, 111, 100, 101, 114
-      ]));
-    });
-
-    test("for chunked input containing zeroes", () {
-      expect(_decodeChunked(['AAAA', 'AAA=', 'AA==', '']),
-          equals([0, 0, 0, 0, 0, 0]));
-
-      expect(_decodeChunked(["A", "", "BCD"]), equals([0, 16, 131]));
-      expect(_decodeChunked(["A", "BCD", "", ""]), equals([0, 16, 131]));
-      expect(_decodeChunked(["A", "B", "", "", "CD", ""]),
-          equals([0, 16, 131]));
-      expect(_decodeChunked(["", "A", "BC", "", "D"]), equals([0, 16, 131]));
-      expect(_decodeChunked(["", "AB", "C", "", "", "D"]),
-          equals([0, 16, 131]));
-      expect(_decodeChunked(["AB", "CD", ""]), equals([0, 16, 131]));
-      expect(_decodeChunked(["", "ABC", "", "D"]), equals([0, 16, 131]));
-      expect(_decodeChunked(["", "ABC", "D", ""]), equals([0, 16, 131]));
-      expect(_decodeChunked(["", "", "ABCD", ""]), equals([0, 16, 131]));
-      expect(_decodeChunked(["A", "B", "C", "D"]), equals([0, 16, 131]));
-      expect(_decodeChunked(["", "A", "B", "C", "D", ""]),
-          equals([0, 16, 131]));
-      expect(_decodeChunked(["", "A", "B", "", "", "C", "", "D", ""]),
-          equals([0, 16, 131]));
-    });
-
-    test("for chunked input with encoded padding", () {
-      expect(_decodeChunked(['AA%', '3D', '%', '3', 'DEFGZ']),
-          equals(BASE64.decode('AA==EFGZ')));
-    });
-
-    test('with a URL-safe alphabet', () {
-      expect(BASE64.decode('-_A='), equals(BASE64.decode('+/A=')));
-    });
-
-    test('with a percent-encoded padding character', () {
-      expect(BASE64.decode('Agg%3D'), equals([2, 8]));
-    });
-
-    test("with the old API", () {
-      expect(CryptoUtils.base64StringToBytes(''), equals([]));
-      expect(CryptoUtils.base64StringToBytes('Zg=='), equals([$f]));
-      expect(CryptoUtils.base64StringToBytes('Zm8='), equals([$f, $o]));
-      expect(CryptoUtils.base64StringToBytes('Zm9v'), equals([$f, $o, $o]));
-      expect(CryptoUtils.base64StringToBytes('Zm9vYg=='),
-          equals([$f, $o, $o, $b]));
-      expect(CryptoUtils.base64StringToBytes('Zm9vYmE='),
-          equals([$f, $o, $o, $b, $a]));
-      expect(CryptoUtils.base64StringToBytes('Zm9vYmFy'),
-          equals([$f, $o, $o, $b, $a, $r]));
-    });
-
-    group("rejects", () {
-      test("input of the wrong length", () {
-        expect(() => BASE64.decode('A'), throwsFormatException);
-        expect(() => BASE64.decode('AB'), throwsFormatException);
-        expect(() => BASE64.decode('ABz'), throwsFormatException);
-        expect(() => BASE64.decode('ABzdE'), throwsFormatException);
-        expect(() => BASE64.decode('ABzdEf'), throwsFormatException);
-        expect(() => BASE64.decode('ABzdEfg'), throwsFormatException);
-      });
-
-      test("input with invalid characters", () {
-        expect(() => BASE64.decode('AB~'), throwsFormatException);
-      });
-
-      test("chunked input of the wrong length", () {
-        expect(() => _decodeChunked(['ABz']), throwsFormatException);
-        expect(() => _decodeChunked(['AB', 'Lx', 'z', 'xx']),
-            throwsFormatException);
-      });
-
-      test("input with the wrong padding", () {
-        expect(() => BASE64.decode('A=='), throwsFormatException);
-        expect(() => BASE64.decode('AB='), throwsFormatException);
-        expect(() => BASE64.decode('ABz=='), throwsFormatException);
-        expect(() => BASE64.decode('ABzdE='), throwsFormatException);
-      });
-
-      test("input with the wrong encoded padding", () {
-        expect(() => BASE64.decode('A%3D%3D'), throwsFormatException);
-        expect(() => BASE64.decode('AB%3D'), throwsFormatException);
-        expect(() => BASE64.decode('ABz%3D%3D'), throwsFormatException);
-        expect(() => BASE64.decode('ABzdE%3D'), throwsFormatException);
-      });
-    });
-  });
-
-  test('successfully round-trips data', () {
-    for (var i = 0; i < 10; i++) {
-      for (var j = 0; j < 256 - i; j++) {
-        var data = new List.filled(i, j);
-        expect(BASE64.decode(BASE64.encode(data)), equals(data));
-      }
-    }
-  });
-}
-
-/// Performs chunked Base64 decoding of [chunks] and returns the result as a
-/// byte array.
-List<int> _decodeChunked(Iterable<String> chunks) {
-  var bytes;
-  var innerSink = new ByteConversionSink.withCallback(
-      (result) => bytes = result);
-  var sink = BASE64.decoder.startChunkedConversion(innerSink);
-
-  for (var chunk in chunks) {
-    sink.add(chunk);
-  }
-  sink.close();
-
-  return bytes;
-}
-
-/// Performs chunked Base64 encoding of [chunks] and returns the result.
-String _encodeChunked(Iterable<List<int>> chunks) {
-  var string;
-  var innerSink = new StringConversionSink.withCallback(
-      (result) => string = result);
-  var sink = BASE64.encoder.startChunkedConversion(innerSink);
-
-  for (var chunk in chunks) {
-    sink.add(chunk);
-  }
-  sink.close();
-
-  return string;
-}
diff --git a/test/sha1_test.dart b/test/sha1_test.dart
index e3471c3..552b862 100644
--- a/test/sha1_test.dart
+++ b/test/sha1_test.dart
@@ -8,22 +8,6 @@
 import "package:test/test.dart";
 
 void main() {
-  group("with the old API", () {
-    test('add may not be called after close', () {
-      var sha = new SHA1();
-      sha.close();
-      expect(() => sha.add([0]), throwsStateError);
-    });
-
-    test('close returns the same digest repeatedly', () {
-      var sha = new SHA1();
-      var digest = sha.close();
-      expect(sha.close(), equals(digest));
-      expect(sha.close(), equals(digest));
-      expect(sha.close(), equals(digest));
-    });
-  });
-
   group("with a chunked converter", () {
     test('add may not be called after close', () {
       var sink = sha1.startChunkedConversion(new StreamController().sink);
diff --git a/test/sha256_test.dart b/test/sha256_test.dart
index c2b6d3e..75fb9e3 100644
--- a/test/sha256_test.dart
+++ b/test/sha256_test.dart
@@ -10,22 +10,6 @@
 import "utils.dart";
 
 void main() {
-  group("with the old API", () {
-    test('add may not be called after close', () {
-      var sha = new SHA256();
-      sha.close();
-      expect(() => sha.add([0]), throwsStateError);
-    });
-
-    test('close returns the same digest repeatedly', () {
-      var sha = new SHA256();
-      var digest = sha.close();
-      expect(sha.close(), equals(digest));
-      expect(sha.close(), equals(digest));
-      expect(sha.close(), equals(digest));
-    });
-  });
-
   group("with a chunked converter", () {
     test('add may not be called after close', () {
       var sink = sha256.startChunkedConversion(new StreamController().sink);
