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,42 @@ 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 ;
31+ public readonly buffer : Uint8Array ;
2832
29- constructor ( payload : string , recipientPublicAccount ?: PublicAccount ) {
30- super ( MessageType . EncryptedMessage , payload ) ;
31- this . recipientPublicAccount = recipientPublicAccount ;
33+ /**
34+ * @internal
35+ * @param buffer the buffer.
36+ */
37+ constructor ( buffer : Uint8Array ) {
38+ this . buffer = buffer ;
39+ this . payload = EncryptedMessage . getPayload ( buffer ) ;
3240 }
3341
3442 /**
3543 *
3644 * @param message - Plain message to be encrypted
3745 * @param recipientPublicAccount - Recipient public account
3846 * @param privateKey - Sender private key
39- * @return {EncryptedMessage }
47+ * @param iv - iv for encoding, for unit tests.
48+ * @return The encrypted message.
49+ */
50+ public static create ( message : string , recipientPublicAccount : PublicAccount , privateKey : string , iv ?: Buffer ) : EncryptedMessage {
51+ const encryptedHex = Crypto . encode ( privateKey , recipientPublicAccount . publicKey , message , false , iv ) . toUpperCase ( ) ;
52+ return new EncryptedMessage ( EncryptedMessage . createBuffer ( encryptedHex ) ) ;
53+ }
54+
55+ /**
56+ *
57+ * @param encryptMessage - Encrypted message to be decrypted
58+ * @param privateKey - Recipient private key
59+ * @param recipientPublicAccount - Sender public account
60+ * @return {PlainMessage }
4061 */
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- ) ;
62+ public static decrypt ( encryptMessage : EncryptedMessage , privateKey : string , recipientPublicAccount : PublicAccount ) : PlainMessage {
63+ return PlainMessage . create ( Convert . hexToUtf8 ( Crypto . decode ( privateKey , recipientPublicAccount . publicKey , encryptMessage . payload ) ) ) ;
4664 }
4765
4866 /**
@@ -54,17 +72,44 @@ export class EncryptedMessage extends Message {
5472 * @param payload
5573 */
5674 public static createFromPayload ( payload : string ) : EncryptedMessage {
57- return new EncryptedMessage ( this . decodeHex ( payload ) ) ;
75+ return new EncryptedMessage ( EncryptedMessage . createBuffer ( payload ) ) ;
5876 }
5977
6078 /**
6179 *
62- * @param encryptMessage - Encrypted message to be decrypted
63- * @param privateKey - Recipient private key
64- * @param recipientPublicAccount - Sender public account
65- * @return {PlainMessage }
80+ * It creates the Plain message from a payload hex with the 00 prefix.
81+ *
82+ * @internal
83+ */
84+ public static createFromBuilder ( builder : Uint8Array ) : EncryptedMessage {
85+ return new EncryptedMessage ( builder ) ;
86+ }
87+
88+ /**
89+ * Create DTO object
6690 */
67- public static decrypt ( encryptMessage : EncryptedMessage , privateKey , recipientPublicAccount : PublicAccount ) : PlainMessage {
68- return new PlainMessage ( this . decodeHex ( Crypto . decode ( privateKey , recipientPublicAccount . publicKey , encryptMessage . payload ) ) ) ;
91+ toDTO ( ) : string {
92+ return Convert . uint8ToHex ( this . toBuffer ( ) ) ;
93+ }
94+
95+ toBuffer ( ) : Uint8Array {
96+ return this . buffer ;
97+ }
98+
99+ public static createBuffer ( payload : string ) : Uint8Array {
100+ if ( ! payload ) {
101+ return Uint8Array . of ( ) ;
102+ }
103+ const message = Convert . utf8ToHex ( payload ) ;
104+ const payloadBuffer = Convert . hexToUint8 ( message ) ;
105+ const typeBuffer = GeneratorUtils . uintToBuffer ( MessageType . EncryptedMessage , 1 ) ;
106+ return GeneratorUtils . concatTypedArrays ( typeBuffer , payloadBuffer ) ;
107+ }
108+
109+ public static getPayload ( buffer : Uint8Array ) : string {
110+ if ( ! buffer . length ) {
111+ return '' ;
112+ }
113+ return Convert . uint8ToUtf8 ( buffer . slice ( 1 ) ) ;
69114 }
70115}
0 commit comments