encodeOpenSshPrivateBytes static method

Uint8List encodeOpenSshPrivateBytes({
  1. required Uint8List seed,
  2. required Uint8List publicKey,
  3. String comment = '',
})

Implementation

static Uint8List encodeOpenSshPrivateBytes({
  required Uint8List seed,
  required Uint8List publicKey,
  String comment = '',
}) {
  if (seed.length != 32) {
    throw ArgumentError('Seed Ed25519 deve ter 32 bytes');
  }
  if (publicKey.length != 32) {
    throw ArgumentError('Chave publica Ed25519 deve ter 32 bytes');
  }

  final pubBlob = _encodeSshString(utf8.encode('ssh-ed25519')) +
      _encodeSshString(publicKey);
  final priv64 = Uint8List(64)
    ..setRange(0, 32, seed)
    ..setRange(32, 64, publicKey);

  const check = 0xA1B2C3D4;
  final privateSection = BytesBuilder()
    ..add(_u32(check))
    ..add(_u32(check))
    ..add(_encodeSshString(utf8.encode('ssh-ed25519')))
    ..add(_encodeSshString(publicKey))
    ..add(_encodeSshString(priv64))
    ..add(_encodeSshString(utf8.encode(comment)));
  final privBeforePad = privateSection.toBytes();
  final padLen = (8 - (privBeforePad.length % 8)) % 8;
  final privPadded = BytesBuilder()..add(privBeforePad);
  for (var i = 1; i <= padLen; i++) {
    privPadded.addByte(i);
  }

  final out = BytesBuilder()
    ..add(utf8.encode('openssh-key-v1\u0000'))
    ..add(_encodeSshString(utf8.encode('none')))
    ..add(_encodeSshString(utf8.encode('none')))
    ..add(_encodeSshString(Uint8List(0)))
    ..add(_u32(1))
    ..add(_encodeSshString(pubBlob))
    ..add(_encodeSshString(privPadded.toBytes()));
  return out.toBytes();
}