Skip to content

Commit 3d8a889

Browse files
author
Grégory Saive
authored
Merge pull request #133 from rg911/task/g132_encrypted_message
Fixed #132 bugs in encrypt / decrypt messages
2 parents ad87563 + c67281a commit 3d8a889

File tree

5 files changed

+89
-33
lines changed

5 files changed

+89
-33
lines changed

src/infrastructure/transaction/CreateTransactionFromDTO.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ import {AggregateTransaction} from '../../model/transaction/AggregateTransaction
3030
import {AggregateTransactionCosignature} from '../../model/transaction/AggregateTransactionCosignature';
3131
import {AggregateTransactionInfo} from '../../model/transaction/AggregateTransactionInfo';
3232
import {Deadline} from '../../model/transaction/Deadline';
33+
import { EncryptedMessage } from '../../model/transaction/EncryptedMessage';
3334
import {LockFundsTransaction} from '../../model/transaction/LockFundsTransaction';
35+
import { MessageType } from '../../model/transaction/MessageType';
3436
import {ModifyAccountPropertyAddressTransaction} from '../../model/transaction/ModifyAccountPropertyAddressTransaction';
3537
import {ModifyAccountPropertyEntityTypeTransaction} from '../../model/transaction/ModifyAccountPropertyEntityTypeTransaction';
3638
import {ModifyAccountPropertyMosaicTransaction} from '../../model/transaction/ModifyAccountPropertyMosaicTransaction';
@@ -126,7 +128,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr
126128
new UInt64(transactionDTO.maxFee || [0, 0]),
127129
extractRecipient(transactionDTO.recipient),
128130
extractMosaics(transactionDTO.mosaics),
129-
extractMessage(transactionDTO.message !== undefined ? transactionDTO.message.payload : undefined),
131+
extractMessage(transactionDTO.message !== undefined ? transactionDTO.message : undefined),
130132
transactionDTO.signature,
131133
transactionDTO.signer ? PublicAccount.createFromPublicKey(transactionDTO.signer,
132134
extractNetworkType(transactionDTO.version)) : undefined,
@@ -426,15 +428,15 @@ export const extractMosaics = (mosaics: any): Mosaic[] => {
426428
* @param message - message payload
427429
* @return {PlainMessage}
428430
*/
429-
const extractMessage = (message: any): PlainMessage => {
430-
let plainMessage = EmptyMessage;
431-
if (message !== undefined && convert.isHexString(message)) {
432-
plainMessage = PlainMessage.createFromPayload(message);
433-
} else {
434-
plainMessage = PlainMessage.create(message);
431+
const extractMessage = (message: any): PlainMessage | EncryptedMessage => {
432+
let msgObj = EmptyMessage;
433+
if (message.type === MessageType.PlainMessage) {
434+
msgObj = convert.isHexString(message) ? PlainMessage.createFromPayload(message.payload) :
435+
PlainMessage.create(message.payload);
436+
} else if (message.type === MessageType.EncryptedMessage) {
437+
msgObj = EncryptedMessage.createFromPayload(message.payload);
435438
}
436-
437-
return plainMessage;
439+
return msgObj;
438440
};
439441

440442
/**
@@ -454,7 +456,7 @@ const extractMessage = (message: any): PlainMessage => {
454456
*/
455457
export const extractBeneficiary = (
456458
blockDTO: any,
457-
networkType: NetworkType
459+
networkType: NetworkType,
458460
): PublicAccount | undefined => {
459461

460462
let dtoPublicAccount: PublicAccount | undefined;

src/infrastructure/transaction/CreateTransactionFromPayload.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ import { AddressAliasTransaction } from '../../model/transaction/AddressAliasTra
3131
import { AggregateTransaction } from '../../model/transaction/AggregateTransaction';
3232
import { AggregateTransactionCosignature } from '../../model/transaction/AggregateTransactionCosignature';
3333
import { Deadline } from '../../model/transaction/Deadline';
34+
import { EncryptedMessage } from '../../model/transaction/EncryptedMessage';
3435
import { HashType } from '../../model/transaction/HashType';
3536
import { LockFundsTransaction } from '../../model/transaction/LockFundsTransaction';
3637
import { Message } from '../../model/transaction/Message';
38+
import { MessageType } from '../../model/transaction/MessageType';
3739
import { ModifyAccountPropertyAddressTransaction } from '../../model/transaction/ModifyAccountPropertyAddressTransaction';
3840
import { ModifyAccountPropertyEntityTypeTransaction } from '../../model/transaction/ModifyAccountPropertyEntityTypeTransaction';
3941
import { ModifyAccountPropertyMosaicTransaction } from '../../model/transaction/ModifyAccountPropertyMosaicTransaction';
@@ -267,7 +269,8 @@ const CreateTransaction = (type: number, transactionData: string, networkType: N
267269
const transferMessageSize = parseInt(convert.uint8ToHex(convert.hexToUint8(transactionData.substring(50, 54)).reverse()), 16);
268270

269271
const transferMessageAndMosaicSubString = transactionData.substring(56);
270-
const transferMessageType = transferMessageAndMosaicSubString.substring(0, 2);
272+
const transferMessageType = parseInt(convert.uint8ToHex(convert.hexToUint8(
273+
transferMessageAndMosaicSubString.substring(0, 2)).reverse()), 16);
271274
const transferMessage = transferMessageAndMosaicSubString.substring(2, (transferMessageSize - 1) * 2 + 2);
272275
const transferMosaic = transferMessageAndMosaicSubString.substring(transferMessageSize * 2);
273276
const transferMosaicArray = transferMosaic.match(/.{1,32}/g);
@@ -279,7 +282,7 @@ const CreateTransaction = (type: number, transactionData: string, networkType: N
279282
new MosaicId(UInt64.fromHex(reverse(mosaic.substring(0, 16))).toDTO()),
280283
UInt64.fromHex(reverse(mosaic.substring(16))),
281284
)) : [],
282-
PlainMessage.createFromPayload(transferMessage),
285+
extractMessage(transferMessageType, transferMessage),
283286
networkType,
284287
);
285288
case TransactionType.SECRET_LOCK:
@@ -480,3 +483,20 @@ const decodeHex = (hex: string): string => {
480483
return str;
481484
}
482485
};
486+
487+
488+
/**
489+
* @internal
490+
* @param messageType - Message Type
491+
* @param payload - Message Payload
492+
* @returns {Message}
493+
*/
494+
const extractMessage = (messageType: MessageType, payload: string): Message => {
495+
if (messageType === MessageType.PlainMessage) {
496+
return PlainMessage.createFromPayload(payload);
497+
} else if (messageType === MessageType.EncryptedMessage) {
498+
return EncryptedMessage.createFromPayload(payload);
499+
} else {
500+
throw new Error('Invalid message type');
501+
}
502+
};

src/model/transaction/EncryptedMessage.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ export class EncryptedMessage extends Message {
3535

3636
/**
3737
*
38-
* @param message
39-
* @param recipientPublicAccount
40-
* @param privateKey
38+
* @param message - Plain message to be encrypted
39+
* @param recipientPublicAccount - Recipient public account
40+
* @param privateKey - Sender private key
4141
*/
4242
public static create(message: string, recipientPublicAccount: PublicAccount, privateKey) {
4343
return new EncryptedMessage(
@@ -49,17 +49,17 @@ export class EncryptedMessage extends Message {
4949
*
5050
* @param payload
5151
*/
52-
public static createFromDTO(payload: string): EncryptedMessage {
53-
return new EncryptedMessage(payload);
52+
public static createFromPayload(payload: string): EncryptedMessage {
53+
return new EncryptedMessage(this.decodeHex(payload));
5454
}
5555

5656
/**
5757
*
58-
* @param encryptMessage
59-
* @param privateKey
60-
* @param recipientPublicAccount
58+
* @param encryptMessage - Encrypted message to be decrypted
59+
* @param privateKey - Recipient private key
60+
* @param recipientPublicAccount - Sender public account
6161
*/
6262
public static decrypt(encryptMessage: EncryptedMessage, privateKey, recipientPublicAccount: PublicAccount): PlainMessage {
63-
return new PlainMessage(Message.decodeHex(crypto.decode(privateKey, recipientPublicAccount.publicKey, encryptMessage.payload)));
63+
return new PlainMessage(this.decodeHex(crypto.decode(privateKey, recipientPublicAccount.publicKey, encryptMessage.payload)));
6464
}
6565
}

test/core/utils/TransactionMapping.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { PropertyModificationType } from '../../../src/model/account/PropertyMod
2525
import { PropertyType } from '../../../src/model/account/PropertyType';
2626
import { PublicAccount } from '../../../src/model/account/PublicAccount';
2727
import { NetworkType } from '../../../src/model/blockchain/NetworkType';
28+
import { EncryptedMessage } from '../../../src/model/model';
2829
import { MosaicId } from '../../../src/model/mosaic/MosaicId';
2930
import { MosaicNonce } from '../../../src/model/mosaic/MosaicNonce';
3031
import { MosaicProperties } from '../../../src/model/mosaic/MosaicProperties';
@@ -42,6 +43,7 @@ import { Deadline } from '../../../src/model/transaction/Deadline';
4243
import { HashType } from '../../../src/model/transaction/HashType';
4344
import { LinkAction } from '../../../src/model/transaction/LinkAction';
4445
import { LockFundsTransaction } from '../../../src/model/transaction/LockFundsTransaction';
46+
import { MessageType } from '../../../src/model/transaction/MessageType';
4547
import { ModifyAccountPropertyAddressTransaction } from '../../../src/model/transaction/ModifyAccountPropertyAddressTransaction';
4648
import { ModifyAccountPropertyMosaicTransaction } from '../../../src/model/transaction/ModifyAccountPropertyMosaicTransaction';
4749
import { ModifyMultisigAccountTransaction } from '../../../src/model/transaction/ModifyMultisigAccountTransaction';
@@ -573,6 +575,23 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () =>
573575
expect(transaction.message.payload).to.be.equal('test-message');
574576
});
575577

578+
it('should create TransferTransaction - Encrypted Message', () => {
579+
const transferTransaction = TransferTransaction.create(
580+
Deadline.create(),
581+
Address.createFromRawAddress('SBILTA367K2LX2FEXG5TFWAS7GEFYAGY7QLFBYKC'),
582+
[
583+
NetworkCurrencyMosaic.createRelative(100),
584+
],
585+
new EncryptedMessage('12324556'),
586+
NetworkType.MIJIN_TEST,
587+
);
588+
589+
const transaction = TransactionMapping.createFromDTO(transferTransaction.toJSON()) as TransferTransaction;
590+
591+
expect((transaction.recipient as Address).plain()).to.be.equal('SBILTA367K2LX2FEXG5TFWAS7GEFYAGY7QLFBYKC');
592+
expect(transaction.message.type).to.be.equal(MessageType.EncryptedMessage);
593+
});
594+
576595
it('should create AccountLinkTransaction', () => {
577596
const accountLinkTransaction = AccountLinkTransaction.create(
578597
Deadline.create(),

test/model/transaction/EncryptedMessage.spec.ts

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,48 @@
1616

1717
import {expect} from 'chai';
1818
import {Account} from '../../../src/model/account/Account';
19+
import { NetworkType } from '../../../src/model/model';
1920
import {EncryptedMessage} from '../../../src/model/transaction/EncryptedMessage';
20-
import { TestingAccount } from '../../conf/conf.spec';
2121

2222
describe('EncryptedMessage', () => {
2323

24-
let account: Account;
24+
let sender: Account;
25+
let recipient: Account;
2526

2627
before(() => {
27-
account = TestingAccount;
28+
// Catapult-server-bootstrap generated account
29+
sender = Account.createFromPrivateKey('2602F4236B199B3DF762B2AAB46FC3B77D8DDB214F0B62538D3827576C46C108',
30+
NetworkType.MIJIN_TEST);
31+
recipient = Account.createFromPrivateKey('B72F2950498111BADF276D6D9D5E345F04E0D5C9B8342DA983C3395B4CF18F08',
32+
NetworkType.MIJIN_TEST);
2833
});
2934

3035
it('should create a encrypted message from a DTO', () => {
31-
const encryptedMessage = EncryptedMessage.createFromDTO('test transaction');
32-
expect(encryptedMessage.payload).to.be.equal('test transaction');
36+
const encryptedMessage = EncryptedMessage.createFromPayload('test transaction');
37+
expect(encryptedMessage.payload).not.to.be.equal('test transaction'); // As DTO returns Hexed payload
3338
});
3439

35-
it('should return encrypted message dto', () => {;
36-
const encryptedMessage = account.encryptMessage('test transaction', account.publicAccount);
37-
const plainMessage = account.decryptMessage(encryptedMessage, account.publicAccount);
40+
it('should return encrypted message dto', () => {
41+
const encryptedMessage = sender.encryptMessage('test transaction', recipient.publicAccount);
42+
const plainMessage = recipient.decryptMessage(encryptedMessage, sender.publicAccount);
3843
expect(plainMessage.payload).to.be.equal('test transaction');
3944
});
4045

46+
it('should decrypt message from raw encrypted message payload', () => {
47+
const payload = 'AE044953E4FF05BC3C14AA10B367E8563D8929680C0D75DBC180F9A7B927D335E66C3BA94266408B366F88B1E503EB' +
48+
'4A3730D9B2F16F1FC16E335262A701CC786E6739A38880A6788530A9E8E4D13C7F';
49+
const plainMessage = recipient.decryptMessage(new EncryptedMessage(payload), sender.publicAccount);
50+
expect(plainMessage.payload).to.be.equal('Testing simple transfer');
51+
});
52+
4153
it('should create an encrypted message from a DTO and decrypt it', () => {
54+
// message payload generated from catapult-server
4255
const encryptMessage = EncryptedMessage
43-
.createFromDTO('7245170507448c53d808524221b5d157e19b06f574120a044e48f54dd8e0a4dedbf50ded7ae71' +
44-
'b90b59949bb6acde81d987ee6648aae9f093b94ac7cc3e8dba0bed8fa04ba286df6b32d2d6d21cbdc4e');
45-
const plainMessage = account.decryptMessage(encryptMessage, account.publicAccount);
46-
expect(plainMessage.payload).to.be.equal('test transaction');
56+
.createFromPayload('4132343743314236463730363143314331453730434334373744323831464132343731364343443635313334354' +
57+
'33433383842364546413532364139354144463043354431424545463939373044314337384537413837353435363938424' +
58+
'63336413939413631373630313936324238324246453435454241353037303236424144313032394141364636383242343' +
59+
'339334142453843383931343143413938');
60+
const plainMessage = recipient.decryptMessage(encryptMessage, sender.publicAccount);
61+
expect(plainMessage.payload).to.be.equal('Testing simple transfer');
4762
});
4863
});

0 commit comments

Comments
 (0)