// 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.

library crypto.crypto_utils;

import 'base64.dart';

/// Utility methods for working with message digests.
abstract class CryptoUtils {
  /// 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) {
      result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
    }
    return result.toString();
  }

  /// 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}) =>
      BASE64.encode(bytes,
          urlSafe: urlSafe, addLineSeparator: addLineSeparator);

  /// 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) => BASE64.decode(input);
}
