feat: update deno-sshsig-mod.ts
This commit is contained in:
@@ -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(
|
||||
// {
|
||||
|
||||
Reference in New Issue
Block a user