From 9fc3613cf5ea071d76cd24cb569a528914cddd36 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 11 Jan 2025 16:46:35 +0800 Subject: [PATCH] feat: update deno-sshsig-mod.ts --- libraries/deno-sshsig-mod.ts | 48 ++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/libraries/deno-sshsig-mod.ts b/libraries/deno-sshsig-mod.ts index b113530..35e50a9 100644 --- a/libraries/deno-sshsig-mod.ts +++ b/libraries/deno-sshsig-mod.ts @@ -1,7 +1,7 @@ import {crypto} from "jsr:@std/crypto"; import {decodeBase64} from "jsr:@std/encoding/base64"; import {encodeBase64Url} from "jsr:@std/encoding/base64url"; -import {encodeHex} from "jsr:@std/encoding/hex"; +import {decodeHex, encodeHex} from "jsr:@std/encoding/hex"; // Reference: // * https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.sshsig @@ -66,8 +66,8 @@ class BinaryWriter { } writeString(byte: Uint8Array) { - this._writeUint32(byte.byteLength); - this._writeBytes(byte); + this.writeUint32(byte.byteLength); + this.writeBytes(byte); } writeStringFromString(str: string) { @@ -77,16 +77,22 @@ class BinaryWriter { writeLengthFromString(str: string) { const bytes = new TextEncoder().encode(str); - this._writeBytes(bytes); + this.writeBytes(bytes); } - _writeUint32(num: number) { + writeUint32(num: number) { let dataView = new DataView(new ArrayBuffer(4), 0); dataView.setUint32(0, num); - this._writeBytes(new Uint8Array(dataView.buffer)); + this.writeBytes(new Uint8Array(dataView.buffer)); } - _writeBytes(bytes: Uint8Array) { + writeNumber(num: number) { + let n = new Uint8Array(1) + n[0] = num; + this.writeBytes(n); + } + + writeBytes(bytes: Uint8Array) { this.buffers.push(bytes); } } @@ -203,6 +209,33 @@ class SshSignatureValue { const s = signatureEcReader.readString(); return new SshSignatureValue(signatureAlgorithm, r, s); } + + // SEQUENCE { + // INTEGER: 00cdf3f5e083974961a9737daa2352cf08f7e652f103d4e3cc494b5ffadccf1a6d + // INTEGER: 69658b75c9c7523c15e6de16907350f0d0fd51114237c3e32bdd9fe92465e768 + // } + toDer(): Uint8Array { + let writer = new BinaryWriter(); + writer.writeNumber(0x30); + writer.writeNumber(0x45); + + writer.writeNumber(2); + const rFirstByte = this.ecSignatureR[0]; + writer.writeNumber(((rFirstByte >= 0x80) ? 1 : 0) + this.ecSignatureR.byteLength); + if (rFirstByte >= 0x80) { + writer.writeNumber(0); + } + writer.writeBytes(this.ecSignatureR); + + writer.writeNumber(2); + const sFirstByte = this.ecSignatureS[0]; + writer.writeNumber(((sFirstByte >= 0x80) ? 1 : 0) + this.ecSignatureS.byteLength); + if (sFirstByte >= 0x80) { + writer.writeNumber(0); + } + writer.writeBytes(this.ecSignatureS); + return writer.merge(); + } } class SshPublicKey { @@ -331,6 +364,7 @@ console.log(encodeHex(sig)); const publicKey = await sshSignature.publicKey.importJwk(); console.log(publicKey); +console.log(encodeHex(sshSignature.signature.toDer())); // crypto.subtle.verify( // {