How to use AES128Cipher method in wpt

Best JavaScript code snippet using wpt

mypage.js

Source:mypage.js Github

copy

Full Screen

1var express = require('express');2var router = express.Router();3var sequelize = require('../models').sequelize;4var Medicine = require('../models').Medicine;5var User = require('../models').User;6var aes128Cipher = require('./aes128Cipher');7var v = require('voca');8var crypto = require('crypto');9router.post('/showAllmedicine', function(req, res) {10 11 Medicine.findAll({12 attributes: { exclude: ['id'] } 13 })14 .then(function(resultSet)15 {16 var Success = aes128Cipher.encrypt('Success');17 var all_medi = aes128Cipher.encrypt(JSON.stringify(resultSet));18 let hmac_success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');19 let hmac_medi_list = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(all_medi).digest('hex');20 let hmac_success_buf = Buffer.from(hmac_success, 'hex').toString('base64');21 let hmac_medi_list_buf = Buffer.from(hmac_medi_list, 'hex').toString('base64');22 var response = {AllMedicine: Success,23 All_medi_list: all_medi,24 MAC_AllMedicine: hmac_success_buf,25 MAC_All_medi_list: hmac_medi_list_buf26 };27 console.log(response);28 res.json(response);29 30 console.log('response Success!'); 31 })32 .catch(function(err) {33 console.log('데이터 읽어오기 프로세스 오류 :' +err);34 });35});36router.post('/search', function(req, res) {37 var temp_keyword = req.body.SearchMedicine;38 var temp_i = v.replaceAll(temp_keyword, String.fromCharCode(32), '+');39 40 var temp_hmac_keyword = req.body.MAC_SearchMedicine;41 var temp_h = v.replaceAll(temp_hmac_keyword, String.fromCharCode(32), '+');42 43 var mac_h = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_i).digest('hex');44 var mac_h_buf = Buffer.from(mac_h, 'hex').toString('base64');45 if(mac_h_buf!=temp_h) {46 console.log("맥 값이 다릅니다.");47 return;48 } 49 50 var keyword = aes128Cipher.decrypt(temp_i);51 sequelize.query('select name, ingredient, period, effect, caution, company from medicines where name like :searchkeyword',52 { replacements: { searchkeyword: '%'+keyword+'%' }, type: sequelize.QueryTypes.SELECT})53 .then(function(resultSet) {54 var Success= aes128Cipher.encrypt('Success');55 var Search_medi = aes128Cipher.encrypt(JSON.stringify(resultSet));56 57 let hmac_success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');58 let hmac_success_buf = Buffer.from(hmac_success, 'hex').toString('base64');59 let hmac_search = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Search_medi).digest('hex');60 let hmac_search_buf = Buffer.from(hmac_search, 'hex').toString('base64');61 62 var response={63 SearchMedicine: Success,64 Search_medi_list: Search_medi,65 MAC_SearchMedicine: hmac_success_buf,66 MAC_Search_medi_list: hmac_search_buf67 };68 console.log(response);69 res.json(response);70 console.log('response Success!');71 })72 .catch(function(err) {73 console.log('데이터 읽어오기 프로세스 오류 :'+err);74 });75});76 77router.post('/addMedicine', function(req, res) {78 var temp_sess_id = req.body.ID;79 var temp_keyword = req.body.AddMedicine;80 var temp_mac_sess_id = req.body.MAC_ID;81 var temp_mac_keyword = req.body.MAC_AddMedicine;82 var temp_s = v.replaceAll(temp_sess_id, String.fromCharCode(32), '+');83 var temp_k = v.replaceAll(temp_keyword, String.fromCharCode(32), '+');84 var temp_m_s = v.replaceAll(temp_mac_sess_id, String.fromCharCode(32), '+');85 var temp_m_k = v.replaceAll(temp_mac_keyword, String.fromCharCode(32), '+');86 var sess_id = aes128Cipher.decrypt(temp_s);87 var keyword = aes128Cipher.decrypt(temp_k);88 var hmac_sess_str = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_s).digest('hex');89 var hmac_key_str = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_k).digest('hex');90 var hmac_sess_buf = Buffer.from(hmac_sess_str, 'hex').toString('base64');91 var hmac_key_buf = Buffer.from(hmac_key_str, 'hex').toString('base64');92 if(temp_m_s!=hmac_sess_buf || temp_m_k!=hmac_key_buf) {93 console.log("MAC 값이 다릅니다.");94 95 return;96 }97 User.findOne({where: { user_id: sess_id} })98 .then(function(data) {99 var userID = data.id; 100 Medicine.findOne({where: { name: keyword } })101 .then(function(result) {102 var medicineID = result.id;103 104 sequelize.query('select * from user_medicine where userId=:USERID and medicineId=:MEDICINEID', {105 replacements: { USERID: userID,106 MEDICINEID: medicineID107 },108 type: sequelize.QueryTypes.SELECT})109 .then(function(rawResult) {110 console.log(rawResult);111 if(rawResult.length===0) {112 sequelize.query('insert into user_medicine values(now(), now(), '+userID+', '+medicineID+')', {type: sequelize.QueryTypes.CREATE}).then(function(finalResult) {113 var Success = aes128Cipher.encrypt('Success');114 115 let mac_Success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');116 let mac_Success_buf = Buffer.from(mac_Success, 'hex').toString('base64');117 var response = {118 AddMedicine: Success,119 MAC_AddMedicine: mac_Success_buf120 };121 console.log(response);122 res.json(response);123 console.log('중복된 데이터가 없어서 데이터 삽입에 성공하였습니다.');124 console.log(sess_id+'의'+keyword+'를(을) 추가하였습니다.');125 });126 }else if(rawResult!=null) {127 var fail = aes128Cipher.encrypt('Fail');128 129 let mac_fail = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(fail).digest('hex');130 let mac_fail_buf = Buffer.from(mac_fail, 'hex').toString('base64');131 var response = {132 AddMedicine: fail,133 MAC_AddMedicine: mac_fail_buf134 };135 console.log(response);136 res.json(response);137 console.log('실패! 이미 데이터가 존재합니다.');138 }139 }).catch(function(err){140 console.log('추가 프로세스 오류:'+err);141 });142 143 });144 });145});146router.post('/deleteMedicine', function(req, res) {147 var temp_sess_id = req.body.ID;148 var temp_keyword = req.body.DeleteMedicine;149 var mac_sess_id = req.body.MAC_ID;150 var mac_sess_keyword = req.body.MAC_DeleteMedicine;151 152 var temp_s = v.replaceAll(temp_sess_id, String.fromCharCode(32), '+');153 var temp_k = v.replaceAll(temp_keyword, String.fromCharCode(32), '+');154 var temp_m_s = v.replaceAll(mac_sess_id, String.fromCharCode(32), '+');155 var temp_m_k = v.replaceAll(mac_sess_keyword, String.fromCharCode(32), '+');156 157 var mac_sess_str = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_s).digest('hex');158 var mac_key_str = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_k).digest('hex');159 160 var mac_sess_buf = Buffer.from(mac_sess_str, 'hex').toString('base64');161 var mac_key_buf = Buffer.from(mac_key_str, 'hex').toString('base64');162 163 if(mac_sess_buf!=temp_m_s || mac_key_buf!=temp_m_k){164 console.log("MAC 값이 다릅니다.");165 console.log("상대방맥값(키워드):"+temp_m_k);166 return;167 }168 var sess_id = aes128Cipher.decrypt(temp_s);169 var keyword = aes128Cipher.decrypt(temp_k);170 171 User.findOne({where: {user_id: sess_id} })172 .then(function(data) {173 var userID = data.id;174 175 Medicine.findOne({where: {name: keyword } })176 .then(function(result) {177 var medicineID = result.id;178 179 sequelize.query('delete from user_medicine where userId=:USERID and medicineId=:MEDICINEID', {180 replacements: { USERID: userID,181 MEDICINEID: medicineID182 },183 type: sequelize.QueryTypes.DELETE})184 .then(function(resultSet){185 var Success = aes128Cipher.encrypt('Success');186 let mac_Success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');187 let mac_Success_buf = Buffer.from(mac_Success, 'hex').toString('base64');188 var response = {Delete: Success, MAC_Delete: mac_Success_buf};189 console.log(response);190 res.json(response);191 console.log('요청을 수행하여, '+sess_id+'의 '+keyword+'을(를) 삭제하였습니다.');192 }).catch(function(err){193 console.log('삭제 프로세스 오류 : ' +err);194 });195 196 });197 198 }); 199});200router.post('/changeName', function(req, res) {201 var temp_AlterName = req.body.AlterName;202 var temp_sess_id = req.body.ID;203 var temp_mac_Altername = req.body.MAC_AlterName;204 var temp_mac_sess = req.body.MAC_ID;205 var temp_a = v.replaceAll(temp_AlterName, String.fromCharCode(32), '+');206 var temp_s = v.replaceAll(temp_sess_id, String.fromCharCode(32), '+');207 var temp_m_A = v.replaceAll(temp_mac_Altername, String.fromCharCode(32), '+');208 var temp_m_s = v.replaceAll(temp_mac_sess, String.fromCharCode(32), '+');209 var mac_Alter_str = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_a).digest('hex');210 var mac_sess_str = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_s).digest('hex');211 var mac_Alter_buf = Buffer.from(mac_Alter_str, 'hex').toString('base64');212 var mac_sess_buf = Buffer.from(mac_sess_str, 'hex').toString('base64');213 if(mac_Alter_buf!=temp_m_A || mac_sess_buf!=temp_m_s) {214 console.log("MAC 값이 다릅니다.");215 return;216 }217 var AlterName = aes128Cipher.decrypt(temp_a);218 var sess_id = aes128Cipher.decrypt(temp_s);219 220 User.findOne({where: {user_id: sess_id} })221 .then(function(data) {222 var previousName = data.name;223 User.update({224 name: AlterName225 }, {226 where: { name: previousName },227 });228 var Success = aes128Cipher.encrypt('Success'); 229 let mac_success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');230 let mac_success_buf = Buffer.from(mac_success, 'hex').toString('base64');231 var response = {ModifyName: Success, MAC_ModifyName: mac_success_buf};232 console.log(response);233 res.json(response); 234 console.log(previousName+'을(를) '+AlterName+'으로 변경하였습니다.');235 })236 .catch(function(err) {237 console.log("이름 바꾸기 프로세스 오류 +" +err);238 });239});240router.post('/changePassword', function(req, res) {241 var temp_AlterPassword = req.body.NewPassword;242 var temp_sess_id = req.body.ID;243 244 var temp_a = v.replaceAll(temp_AlterPassword, String.fromCharCode(32), '+');245 var temp_s = v.replaceAll(temp_sess_id, String.fromCharCode(32), '+'); 246 var AlterPassword = aes128Cipher.decrypt(temp_a);247 var sess_id = aes128Cipher.decrypt(temp_s);248 User.findOne({where: {user_id: sess_id} })249 .then(function(data) {250 var previousPassword = data.password;251 User.update({252 password: AlterPassword253 }, {254 where: {password: previousPassword },255 });256 var Success = aes128Cipher.encrypt('Success');257 let mac_Success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');258 let mac_Success_buf = Buffer.from(mac_Success, 'hex').toString('base64');259 var response = {ModifyPassword: Success, MAC_ModifyPassword: mac_Success_buf};260 console.log(response);261 res.json(response);262 console.log("비밀번호 변경 성공");263 }).catch(function(err) {264 console.log("비밀번호 바꾸기 프로세스 오류 +"+err);265 });266});...

Full Screen

Full Screen

register.js

Source:register.js Github

copy

Full Screen

1var express = require('express');2var router = express.Router();3var User = require('../models').User;4var aes128Cipher = require('./aes128Cipher');5var crypto = require('crypto');6var v = require('voca');7//회원가입8router.post('/', function(req, res, next) {9 var temp_user_ID = req.body.ID;10 var temp_Password = req.body.Password;11 var temp_Name = req.body.Name;12 var temp_Age = req.body.Age;13 var temp_Sex = req.body.Sex;14 //받아오는 mac코드15 var mac_u = req.body.MAC_ID;16 var mac_p = req.body.MAC_Password;17 var mac_n = req.body.MAC_Name;18 var mac_a = req.body.MAC_Age;19 var mac_s = req.body.MAC_Sex; 20 var temp_u = v.replaceAll(temp_user_ID, String.fromCharCode(32), '+');21 var temp_P = v.replaceAll(temp_Password, String.fromCharCode(32), '+');22 var temp_N = v.replaceAll(temp_Name, String.fromCharCode(32), '+');23 var temp_A = v.replaceAll(temp_Age, String.fromCharCode(32), '+');24 var temp_S = v.replaceAll(temp_Sex, String.fromCharCode(32), '+');25 26 var MAC_user_id = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_u).digest('hex');27 var MAC_password = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_P).digest('hex');28 var MAC_name = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_N).digest('hex');29 var MAC_age = crypto.createHmac('sha256',Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_A).digest('hex');30 var MAC_sex = crypto.createHmac('sha256', Buffer.from('myverTopSecretK', 'utf8')).update(temp_S).digest('hex');31 var MAC_user_id_buf = Buffer.from(MAC_user_id, 'hex').toString('base64');32 var MAC_password_buf = Buffer.from(MAC_password, 'hex').toString('base64');33 var MAC_name_buf = Buffer.from(MAC_name, 'hex').toString('base64');34 var MAC_age_buf = Buffer.from(MAC_age, 'hex').toString('base64');35 var MAC_sex_buf = Buffer.from(MAC_sex, 'hex').toString('base64');36 if(mac_u!=MAC_user_id_buf || mac_p!=MAC_password_buf || mac_n!=MAC_name_buf || mac_a!=MAC_age_buf || mac_s!=MAC_sex_buf){37 console.log("MAC 값이 다릅니다.");38 }39 var user_ID = aes128Cipher.decrypt(temp_u);40 var Password = aes128Cipher.decrypt(temp_P);41 var Name = aes128Cipher.decrypt(temp_N);42 var Age = aes128Cipher.decrypt(temp_A);43 var Sex = aes128Cipher.decrypt(temp_S);44 User.create({45 user_id: user_ID,46 password: Password,47 name: Name,48 age: Age,49 sex: Sex,50 flag: 0,51 })52 .then(function(data) {53 console.log('회원가입 성공! ID: '+user_ID);54 var Success = aes128Cipher.encrypt('Success');55 56 var mac_success = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Success).digest('hex');57 var mac_success_buf = Buffer.from(mac_success, 'hex').toString('base64');58 var response = {register: Success, MAC_register: mac_success_buf};59 res.json(response);60 })61 .catch(function(err) {62 console.log('error!!' + err);63 });64});65//아이디 중복체크66router.post('/check', function(req, res, next) {67 var temp_id = req.body.ID; 68 var mac_id = req.body.MAC_ID;69 70 var temp_i = v.replaceAll(temp_id, String.fromCharCode(32), '+');71 var temp_mac_id = v.replaceAll(mac_id, String.fromCharCode(32), '+');72 73 var mac_test_id = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(temp_i).digest('hex');74 var mac_test_id_buf = Buffer.from(mac_test_id, 'hex').toString('base64');75 76 if(temp_mac_id!=mac_test_id_buf) {77 console.log("MAC코드가 다릅니다!");78 return;79 }80 var id = aes128Cipher.decrypt(temp_i);81 console.log("idididid???"+id);82 if(id == ''){83 console.log("아이디 중복 체크: 비어있음");84 var Empty = aes128Cipher.encrypt('Empty');85 86 var mac_empty = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(Empty).digest('hex');87 var mac_empty_buf = Buffer.from(mac_empty, 'hex').toString('base64');88 var response = {register: Empty, MAC_register: mac_empty_buf};89 console.log("Successfully response !==>" +response); 90 res.json(response);91 return;92 } 93 console.log(id);94 95 User.findOne({ where: { user_id: id} }) //테이블 SQL 쿼리 96 .then(function(data) //결과가 data에 담기게 된다.97 {98 if(data == null || data == undefined) {99 console.log("아이디 중복체크: 중복 아님!");100 var NotEmpty = aes128Cipher.encrypt('NotEmpty');101 102 var mac_notempty = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(NotEmpty).digest('hex');103 var mac_notempty_buf = Buffer.from(mac_notempty, 'hex').toString('base64');104 var response = {register: NotEmpty, MAC_register: mac_notempty_buf};105 res.json(response);106 console.log("Sucessfully response! ==>" + response);107 108 return;109 }110 else {111 console.log("아이디 중복체크: 중복!");112 var fail = aes128Cipher.encrypt('fail');113 var mac_fail = crypto.createHmac('sha256', Buffer.from('myVeryTopSecretK', 'utf8')).update(fail).digest('hex');114 var mac_fail_buf = Buffer.from(mac_fail, 'hex').toString('base64');115 var response = {register: fail, MAC_register: mac_fail_buf};116 res.json(response);117 return;118 }119 });120});...

Full Screen

Full Screen

ble-device.d.ts

Source:ble-device.d.ts Github

copy

Full Screen

1import { Characteristic, Device } from 'react-native-ble-plx';2import * as aesjs from 'aes-js';3import 'fastestsmallesttextencoderdecoder';4import { BleControlRequestChannel, Stream, Env, Aes128Cipher } from '@particle/ecjpake';5import { UUIDs } from './types';6import DeviceRequests, { INetwork } from './requests';7export declare const maxPacketSize = 244;8declare class ReactNativeAes128Cipher implements Aes128Cipher {9 _ciph: aesjs.ModeOfOperation.ModeOfOperationECB;10 constructor(key: Uint8Array);11 encryptBlock(block: Uint8Array): Promise<Uint8Array>;12}13declare class ReactNativeEnv implements Env {14 randomBytes: any;15 constructor();16 createAes128Cipher(key: Uint8Array): ReactNativeAes128Cipher;17 getRandomBytes(size: number): Promise<Uint8Array>;18}19export declare class BLEDevice {20 device: Device;21 versionCharacteristic?: Characteristic;22 txCharacteristic?: Characteristic;23 rxCharacteristic?: Characteristic;24 requestChannel?: BleControlRequestChannel;25 deviceRequests?: DeviceRequests;26 stream?: Stream;27 env: ReactNativeEnv;28 uuids: UUIDs;29 constructor(device: Device, uuids: UUIDs);30 connect(mobileSecret: string): Promise<void>;31 disconnect(): Promise<void>;32 get name(): string | undefined;33 findCharacteristics({ serviceUUID, versionCharacteristicUUID, rxCharacteristicUUID, txCharacteristicUUID }: UUIDs): Promise<void>;34 getVersion(): Promise<number>;35 checkProtocolVersion(): Promise<void>;36 openControlRequestChannel(mobileSecret: string): Promise<void>;37 closeControlRequestChannel(): Promise<void>;38 scanNetworks(): Promise<INetwork[]>;39 joinNewNetwork(network: INetwork, password?: string): Promise<void>;40 onDisconnect(listener: (error: Error | null) => void): void;41}...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptoolbox = require('wptoolbox');2var aes = new wptoolbox.AES128Cipher();3var encrypted = aes.encrypt('Hello World');4var decrypted = aes.decrypt(encrypted);5console.log(encrypted);6console.log(decrypted);7var wptoolbox = require('wptoolbox');8var aes = new wptoolbox.AES256Cipher();9var encrypted = aes.encrypt('Hello World');10var decrypted = aes.decrypt(encrypted);11console.log(encrypted);12console.log(decrypted);13var wptoolbox = require('wptoolbox');14var aes = new wptoolbox.AES128Cipher();15var encrypted = aes.encrypt('Hello World');16var decrypted = aes.decrypt(encrypted);17console.log(encrypted);18console.log(decrypted);19var wptoolbox = require('wptoolbox');20var aes = new wptoolbox.AES256Cipher();21var encrypted = aes.encrypt('Hello World');22var decrypted = aes.decrypt(encrypted);23console.log(encrypted);24console.log(decrypted);25var wptoolbox = require('wptoolbox');26var aes = new wptoolbox.AES128Cipher();27var encrypted = aes.encrypt('Hello World');

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptoolkit = require('wptoolkit');2var cipher = new wptoolkit.AES128Cipher('key');3var encrypted = cipher.encrypt('text');4var decrypted = cipher.decrypt(encrypted);5console.log('encrypted: ' + encrypted);6console.log('decrypted: ' + decrypted);7var crypto = require('crypto');8var AES128Cipher = function (key) {9 this.key = key;10};11AES128Cipher.prototype.encrypt = function (text) {12 var cipher = crypto.createCipher('aes-128-cbc', this.key);13 var crypted = cipher.update(text, 'utf8', 'hex');14 crypted += cipher.final('hex');15 return crypted;16};17AES128Cipher.prototype.decrypt = function (text) {18 var decipher = crypto.createDecipher('aes-128-cbc', this.key);19 var dec = decipher.update(text, 'hex', 'utf8');20 dec += decipher.final('utf8');21 return dec;22};23module.exports = AES128Cipher;24var crypto = require('crypto');25var AES128Cipher = function (key) {26 this.key = key;27};28AES128Cipher.prototype.encrypt = function (text) {29 var cipher = crypto.createCipher('aes-128-cbc', this.key);30 var crypted = cipher.update(text, 'utf8', 'hex');31 crypted += cipher.final('hex');32 return crypted;33};34AES128Cipher.prototype.decrypt = function (text) {35 var decipher = crypto.createDecipher('aes-128-cbc', this.key);36 var dec = decipher.update(text, 'hex', 'utf8');37 dec += decipher.final('utf8');38 return dec;39};40module.exports = AES128Cipher;41var crypto = require('crypto');42var AES128Cipher = function (key) {43 this.key = key;44};45AES128Cipher.prototype.encrypt = function (text

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run wpt automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful