예제 #1
0
        public byte[] encrypt(NoteEncryption encryptor,
                              UInt256 pk_enc)
        {
            NotePlaintext pt = new NotePlaintext();

            using (MemoryStream ms = new MemoryStream())
                using (BinaryWriter writer = new BinaryWriter(ms))
                {
                    ((ISerializable)this).Serialize(writer);
                    writer.Flush();
                    return(encryptor.Encrypt(pk_enc, ms.ToArray()));
                }
        }
예제 #2
0
        public NotePlaintext decrypt(NoteDecryption decryptor,
                                     byte[] ciphertext,
                                     UInt256 ephermeralKey,
                                     UInt256 h_sig,
                                     byte nonce)
        {
            byte[] plaintext = decryptor.Decrypt(ciphertext, ephermeralKey, h_sig, (char)nonce);

            NotePlaintext pt = new NotePlaintext();

            using (MemoryStream ms = new MemoryStream(plaintext, 0, plaintext.Length, false))
                using (BinaryReader reader = new BinaryReader(ms))
                {
                    ((IVerifiable)pt).Deserialize(reader);
                    return(pt);
                }
        }
        public virtual QrsProof prove(
            List <JSInput> inputs,
            List <JSOutput> outputs,
            List <Note> out_notes,
            List <byte[]> out_ciphertexts,
            UInt256 out_ephemeralKey,
            UInt256 pubKeyHash,
            UInt256 out_randomSeed,
            List <UInt256> out_macs,
            List <UInt256> out_nullifiers,
            List <UInt256> out_commitments,
            Fixed8 vpub_old,
            Fixed8 vpub_new,
            UInt256 rt,
            bool computeProof = true,
            // For paymentdisclosure, we need to retrieve the esk.
            // Reference as non-const parameter with default value leads to compile error.
            // So use pointer for simplicity.
            UInt256 out_esk = null
            )
        {
            Fixed8 lhs_value = vpub_old;
            Fixed8 rhs_value = vpub_new;

            for (int i = 0; i < inputs.Count; i++)
            {
                lhs_value += inputs[i].note.value;
                out_nullifiers.Add(inputs[i].Nullifier());
            }

            out_randomSeed = UInt256.Random();

            UInt256 h_sig = QrsJoinSplit.h_sig(out_randomSeed, out_nullifiers, pubKeyHash);

            UInt252 phi = new UInt252(UInt256.Random());

            for (int i = 0; i < outputs.Count; i++)
            {
                rhs_value += outputs[i].value;

                UInt256 r = UInt256.Random();

                out_notes.Add(outputs[i].note(phi, r, new Fixed8(i), h_sig));
            }

            if (lhs_value != rhs_value)
            {
                throw new ArgumentException();
            }

            for (int i = 0; i < outputs.Count; i++)
            {
                out_commitments.Add(out_notes[i].CM());
            }

            {
                NoteEncryption encryptor = new NoteEncryption(h_sig);

                for (int i = 0; i < outputs.Count; i++)
                {
                    NotePlaintext pt = new NotePlaintext(out_notes[i], outputs[i].memo);
                    out_ciphertexts.Add(pt.encrypt(encryptor, outputs[i].addr.pk_enc));
                }

                out_ephemeralKey = encryptor.get_epk();

                out_esk = encryptor.get_esk();
            }

            for (int i = 0; i < inputs.Count; i++)
            {
                out_macs.Add(PRFClass.PRF_pk(inputs[i].key, new Fixed8(i), h_sig));
            }



            return(null);
        }