forked from Qortal/qortal-ui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.6 KiB
77 lines
2.6 KiB
"use strict"; |
|
import ChatBase from "./ChatBase.js" |
|
import nacl from '../../deps/nacl-fast.js' |
|
import ed2curve from '../../deps/ed2curve.js' |
|
import { Sha256 } from 'asmcrypto.js' |
|
|
|
|
|
export default class ChatTransaction extends ChatBase { |
|
constructor() { |
|
super(); |
|
this.type = 18 |
|
this.fee = 0 |
|
} |
|
|
|
set recipientPublicKey(recipientPublicKey) { |
|
this._base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this.constructor.Base58.encode(recipientPublicKey) : recipientPublicKey |
|
this._recipientPublicKey = this.constructor.Base58.decode(this._base58RecipientPublicKey) |
|
|
|
} |
|
|
|
set proofOfWorkNonce(proofOfWorkNonce) { |
|
this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) |
|
} |
|
|
|
|
|
set recipient(recipient) { |
|
this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) |
|
this._hasReceipient = new Uint8Array(1) |
|
this._hasReceipient[0] = 1 |
|
} |
|
|
|
set message(message) { |
|
|
|
this.messageText = message; |
|
|
|
this._message = this.constructor.utils.stringtoUTF8Array(message) |
|
this._messageLength = this.constructor.utils.int32ToBytes(this._message.length) |
|
} |
|
|
|
set isEncrypted(isEncrypted) { |
|
this._isEncrypted = new Uint8Array(1); |
|
this._isEncrypted[0] = isEncrypted; |
|
|
|
if (isEncrypted === 1) { |
|
const convertedPrivateKey = ed2curve.convertSecretKey(this._keyPair.privateKey) |
|
const convertedPublicKey = ed2curve.convertPublicKey(this._recipientPublicKey) |
|
const sharedSecret = new Uint8Array(32); |
|
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey); |
|
|
|
this._chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result |
|
this._encryptedMessage = nacl.secretbox(this._message, this._lastReference.slice(0, 24), this._chatEncryptionSeed) |
|
} |
|
|
|
this._myMessage = isEncrypted === 1 ? this._encryptedMessage : this._message |
|
this._myMessageLenth = isEncrypted === 1 ? this.constructor.utils.int32ToBytes(this._myMessage.length) : this._messageLength |
|
} |
|
|
|
set isText(isText) { |
|
this._isText = new Uint8Array(1); |
|
this._isText[0] = isText; |
|
} |
|
|
|
get params() { |
|
const params = super.params; |
|
params.push( |
|
this._proofOfWorkNonce, |
|
this._hasReceipient, |
|
this._recipient, |
|
this._myMessageLenth, |
|
this._myMessage, |
|
this._isEncrypted, |
|
this._isText, |
|
this._feeBytes |
|
) |
|
return params; |
|
} |
|
}
|
|
|