encodeOpenSshPrivateBytes static method
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();
}