public static CardManager GetManagerWithConstAccessTokenProvider(ConstAccessTokenProvider constAccessTokenProvider)
        {
            Func <RawSignedModel, Task <RawSignedModel> > signCallBackFunc = async(model) =>
            {
                var response = await EmulateServerResponseToSignByAppRequest(model.ExportAsString());

                return(RawSignedModelUtils.GenerateFromString(response));
            };

            var validator = new VirgilCardVerifier(new VirgilCardCrypto())
            {
                VerifySelfSignature = true, VerifyVirgilSignature = true
            };

            validator.ChangeServiceCreds(AppSettings.ServicePublicKeyDerBase64);
            var manager = new CardManager(new CardManagerParams()
            {
                CardCrypto          = CardCrypto,
                ApiUrl              = AppSettings.CardsServiceAddress,
                AccessTokenProvider = constAccessTokenProvider,
                SignCallBack        = signCallBackFunc,
                Verifier            = validator
            });

            return(manager);
        }
        /// <summary>
        /// Imports and verifies <see cref="Card"/> from BASE64 string.
        /// </summary>
        /// <param name="str">BASE64 string to get card from.</param>
        /// <returns>Imported and verified card.</returns>
        public Card ImportCardFromString(string str)
        {
            var rawSignedModel = RawSignedModelUtils.GenerateFromString(str);
            var card           = CardUtils.Parse(CardCrypto, rawSignedModel);

            this.ValidateCards(new[] { card });
            return(card);
        }
        /// <summary>
        /// Generates a new <see cref="RawSignedModel"/> in order to apply for a card registration.
        /// </summary>
        /// <param name="cardParams">The instance of <see cref="CardParams"/> class.
        /// It should has mandatory parameters: identity, public key, private key</param>
        /// <returns>A new self signed instance of <see cref="RawSignedModel"/> class.</returns>
        public RawSignedModel GenerateRawCard(CardParams cardParams)
        {
            ValidateCardParams(cardParams, true);
            var timeNow = DateTime.UtcNow;

            //to truncate milliseconds and microseconds
            timeNow = timeNow.AddTicks(-timeNow.Ticks % TimeSpan.TicksPerSecond);
            var model = RawSignedModelUtils.Generate(CardCrypto, cardParams, timeNow);

            ModelSigner.SelfSign(model, cardParams.PrivateKey, cardParams.ExtraFields);
            return(model);
        }
        public void GeneratePureModelFromJson_Should_ReturnEquivalentModel()
        {
            //STC-1
            var model        = faker.PredefinedRawSignedModel();
            var exportedJson = model.ExportAsJson();

            var importedModel = RawSignedModelUtils.GenerateFromJson(exportedJson);

            Assert.IsTrue(importedModel.ContentSnapshot.SequenceEqual(model.ContentSnapshot));
            Assert.AreEqual(Configuration.Serializer.Serialize(importedModel.Signatures),
                            Configuration.Serializer.Serialize(model.Signatures));
        }
        public void GenerateFullModelFromJson_Should_ReturnEquivalentModel()
        {
            //STC-2
            var model = faker.PredefinedRawSignedModel(
                "a666318071274adb738af3f67b8c7ec29d954de2cabfd71a942e6ea38e59fff9",
                true, true, true);
            var exportedJson  = model.ExportAsJson();
            var importedModel = RawSignedModelUtils.GenerateFromJson(exportedJson);

            Assert.IsTrue(importedModel.ContentSnapshot.SequenceEqual(model.ContentSnapshot));
            Assert.AreEqual(Configuration.Serializer.Serialize(importedModel.Signatures),
                            Configuration.Serializer.Serialize(model.Signatures));
        }
        private static Task <string> EmulateServerResponseToSignByAppRequest(string modelStr)
        {
            var serverResponse = Task <string> .Factory.StartNew(() =>
            {
                Thread.Sleep(1000); // simulation of long-term processing
                                    // var appPrivateKey = Crypto.ImportVirgilPrivateKey(
                                    //    Bytes.FromString(AccessPublicKeyId, StringEncoding.BASE64));
                var rawSignedModel = RawSignedModelUtils.GenerateFromString(modelStr);

                return(rawSignedModel.ExportAsString());
            });

            return(serverResponse);
        }
 /// <summary>
 /// Exports card as an instance of <see cref="RawSignedModel"/>.
 /// </summary>
 /// <param name="card">the instance of <see cref="Card"/> to be exported.</param>
 /// <returns>an instance of <see cref="RawSignedModel"/> representing Card. </returns>
 public RawSignedModel ExportCardAsRawCard(Card card)
 {
     return(RawSignedModelUtils.Parse(CardCrypto, card));
 }