1414 * limitations under the License.
1515 */
1616
17+ import { GeneratorUtils } from 'catbuffer-typescript' ;
18+ import { Convert } from '../../core' ;
1719import { Crypto } from '../../core/crypto' ;
1820import { PublicAccount } from '../account' ;
1921import { Message } from './Message' ;
@@ -23,26 +25,40 @@ import { PlainMessage } from './PlainMessage';
2325/**
2426 * Encrypted Message model
2527 */
26- export class EncryptedMessage extends Message {
27- public readonly recipientPublicAccount ?: PublicAccount ;
28+ export class EncryptedMessage implements Message {
29+ public readonly type = MessageType . EncryptedMessage ;
30+ public readonly payload : string ;
2831
29- constructor ( payload : string , recipientPublicAccount ?: PublicAccount ) {
30- super ( MessageType . EncryptedMessage , payload ) ;
31- this . recipientPublicAccount = recipientPublicAccount ;
32+ /**
33+ * @internal
34+ * @param buffer the buffer.
35+ */
36+ constructor ( private readonly buffer : Uint8Array ) {
37+ this . payload = EncryptedMessage . getPayload ( buffer ) ;
3238 }
3339
3440 /**
3541 *
3642 * @param message - Plain message to be encrypted
3743 * @param recipientPublicAccount - Recipient public account
3844 * @param privateKey - Sender private key
39- * @return {EncryptedMessage }
45+ * @param iv - iv for encoding, for unit tests.
46+ * @return The encrypted message.
47+ */
48+ public static create ( message : string , recipientPublicAccount : PublicAccount , privateKey : string , iv ?: Buffer ) : EncryptedMessage {
49+ const encryptedHex = Crypto . encode ( privateKey , recipientPublicAccount . publicKey , message , false , iv ) . toUpperCase ( ) ;
50+ return new EncryptedMessage ( EncryptedMessage . createBuffer ( encryptedHex ) ) ;
51+ }
52+
53+ /**
54+ *
55+ * @param encryptMessage - Encrypted message to be decrypted
56+ * @param privateKey - Recipient private key
57+ * @param recipientPublicAccount - Sender public account
58+ * @return {PlainMessage }
4059 */
41- public static create ( message : string , recipientPublicAccount : PublicAccount , privateKey : string ) : EncryptedMessage {
42- return new EncryptedMessage (
43- Crypto . encode ( privateKey , recipientPublicAccount . publicKey , message ) . toUpperCase ( ) ,
44- recipientPublicAccount ,
45- ) ;
60+ public static decrypt ( encryptMessage : EncryptedMessage , privateKey : string , recipientPublicAccount : PublicAccount ) : PlainMessage {
61+ return PlainMessage . create ( Convert . hexToUtf8 ( Crypto . decode ( privateKey , recipientPublicAccount . publicKey , encryptMessage . payload ) ) ) ;
4662 }
4763
4864 /**
@@ -54,17 +70,44 @@ export class EncryptedMessage extends Message {
5470 * @param payload
5571 */
5672 public static createFromPayload ( payload : string ) : EncryptedMessage {
57- return new EncryptedMessage ( this . decodeHex ( payload ) ) ;
73+ return new EncryptedMessage ( EncryptedMessage . createBuffer ( payload ) ) ;
5874 }
5975
6076 /**
6177 *
62- * @param encryptMessage - Encrypted message to be decrypted
63- * @param privateKey - Recipient private key
64- * @param recipientPublicAccount - Sender public account
65- * @return {PlainMessage }
78+ * It creates the Plain message from a payload hex with the 00 prefix.
79+ *
80+ * @internal
81+ */
82+ public static createFromBuilder ( builder : Uint8Array ) : EncryptedMessage {
83+ return new EncryptedMessage ( builder ) ;
84+ }
85+
86+ /**
87+ * Create DTO object
6688 */
67- public static decrypt ( encryptMessage : EncryptedMessage , privateKey , recipientPublicAccount : PublicAccount ) : PlainMessage {
68- return new PlainMessage ( this . decodeHex ( Crypto . decode ( privateKey , recipientPublicAccount . publicKey , encryptMessage . payload ) ) ) ;
89+ toDTO ( ) : string {
90+ return Convert . uint8ToHex ( this . toBuffer ( ) ) ;
91+ }
92+
93+ toBuffer ( ) : Uint8Array {
94+ return this . buffer ;
95+ }
96+
97+ public static createBuffer ( payload : string ) : Uint8Array {
98+ if ( ! payload ) {
99+ return Uint8Array . of ( ) ;
100+ }
101+ const message = Convert . utf8ToHex ( payload ) ;
102+ const payloadBuffer = Convert . hexToUint8 ( message ) ;
103+ const typeBuffer = GeneratorUtils . uintToBuffer ( MessageType . EncryptedMessage , 1 ) ;
104+ return GeneratorUtils . concatTypedArrays ( typeBuffer , payloadBuffer ) ;
105+ }
106+
107+ public static getPayload ( buffer : Uint8Array ) : string {
108+ if ( ! buffer . length ) {
109+ return '' ;
110+ }
111+ return Convert . uint8ToUtf8 ( buffer . slice ( 1 ) ) ;
69112 }
70113}
0 commit comments