def testAnonCreds(aliceAgent, aliceAcceptedFaber, aliceAcceptedAcme, acmeAgent, emptyLooper): # 1. request Claims from Faber faberLink = aliceAgent.wallet.getLink('Faber College') name, version, origin = faberLink.availableClaims[0] claimDefKey = ClaimDefinitionKey(name, version, origin) aliceAgent.sendReqClaim(faberLink, claimDefKey) # 2. check that claim is received from Faber async def chkClaims(): claim = await aliceAgent.prover.wallet.getClaims(ID(claimDefKey)) assert claim.primaryClaim emptyLooper.run(eventually(chkClaims, timeout=20)) # 3. send claim proof to Acme acmeLink, acmeClaimPrfReq = aliceAgent.wallet.getMatchingLinksWithClaimReq( "Job-Application", "Acme Corp")[0] aliceAgent.sendProof(acmeLink, acmeClaimPrfReq) # 4. check that claim proof is verified by Acme def chkProof(): internalId = acmeAgent.getInternalIdByInvitedNonce( acmeLink.invitationNonce) link = acmeAgent.wallet.getLinkByInternalId(internalId) assert "Job-Application" in link.verifiedClaimProofs emptyLooper.run(eventually(chkProof, timeout=20))
async def checkTranscriptWritten(): faberId = faberAgent.wallet.defaultId claimDefId = ID(ClaimDefinitionKey("Transcript", "1.2", faberId)) claimDef = await faberAgent.issuer.wallet.getClaimDef(claimDefId) assert claimDef assert claimDef.seqId issuerKey = faberAgent.issuer.wallet.getPublicKey(claimDefId) assert issuerKey
async def checkJobCertWritten(): acmeId = acmeAgent.wallet.defaultId claimDefId = ID(ClaimDefinitionKey("Job-Certificate", "0.2", acmeId)) claimDef = await acmeAgent.issuer.wallet.getClaimDef(claimDefId) assert claimDef assert claimDef.seqId issuerKey = await acmeAgent.issuer.wallet.getPublicKey(claimDefId) assert issuerKey assert issuerKey.seqId
async def sendReqClaimAsync(self, link: Link, claimDefKey): name, version, origin = claimDefKey claimDefKey = ClaimDefinitionKey(name, version, origin) claimReq = await self.prover.createClaimRequest( claimDefId=ID(claimDefKey), proverId=link.invitationNonce, reqNonRevoc=False) op = { NONCE: link.invitationNonce, TYPE: REQUEST_CLAIM, NAME: name, VERSION: version, ORIGIN: origin, CLAIM_REQ_FIELD: claimReq.toStrDict() } self.signAndSend(msg=op, linkName=link.name)
async def handleReqClaimResponse(self, msg): body, _ = msg issuerId = body.get(IDENTIFIER) claim = body[DATA] li = self._getLinkByTarget(getCryptonym(issuerId)) if li: self.notifyResponseFromMsg(li.name, body.get(f.REQ_ID.nm)) self.notifyMsgListener(' Received claim "{}".\n'.format( claim[NAME])) name, version, claimAuthor = \ claim[NAME], claim[VERSION], claim[f.IDENTIFIER.nm] claimDefKey = ClaimDefinitionKey(name, version, claimAuthor) claimDef = await self.prover.wallet.getClaimDef(ID(claimDefKey)) claimDefId = ID(claimDefKey=claimDefKey, claimDefId=claimDef.seqId) claim = Claims.fromStrDict(claim[CLAIM_FIELD]) await self.prover.processClaim(claimDefId, claim) else: self.notifyMsgListener("No matching link found")
async def processReqClaim(self, msg): body, (frm, ha) = msg link = self.verifyAndGetLink(msg) if not link: raise NotImplementedError name = body[NAME] if not self.isClaimAvailable(link, name): self.notifyToRemoteCaller(EVENT_NOTIFY_MSG, "This claim is not yet available", self.issuer.wallet.defaultId, frm, origReqId=body.get(f.REQ_ID.nm)) return version = body[VERSION] origin = body[ORIGIN] claimReq = ClaimRequest.fromStrDict(body[CLAIM_REQ_FIELD]) claimDefKey = ClaimDefinitionKey(name, version, origin) claimDef = await self.issuer.wallet.getClaimDef(ID(claimDefKey)) claimDefId = ID(claimDefKey=claimDefKey, claimDefId=claimDef.seqId) self._addAtrribute(claimDefKey=claimDefKey, proverId=claimReq.userId, link=link) claim = await self.issuer.issueClaim(claimDefId, claimReq) claimDetails = { NAME: claimDef.name, VERSION: claimDef.version, CLAIM_FIELD: claim.toStrDict(), f.IDENTIFIER.nm: claimDef.issuerId } resp = self.getCommonMsg(CLAIM, claimDetails) self.signAndSend(resp, link.localIdentifier, frm, origReqId=body.get(f.REQ_ID.nm))
async def getMatchingLinksWithReceivedClaimAsync(self, claimName=None): matchingLinkAndAvailableClaim = self.wallet.getMatchingLinksWithAvailableClaim( claimName) matchingLinkAndReceivedClaim = [] for li, cl in matchingLinkAndAvailableClaim: name, version, origin = cl claimDefKeyId = ID( ClaimDefinitionKey(name=name, version=version, issuerId=origin)) claimDef = await self.prover.wallet.getClaimDef(claimDefKeyId) claimAttrs = set(claimDef.attrNames) claim = None try: claim = await self.prover.wallet.getClaims(claimDefKeyId) except ValueError: pass # it means no claim was issued attrs = {k: None for k in claimAttrs} if claim: issuedAttributes = claim.primaryClaim.attrs if claimAttrs.intersection(issuedAttributes.keys()): attrs = {k: issuedAttributes[k] for k in claimAttrs} matchingLinkAndReceivedClaim.append((li, cl, attrs)) return matchingLinkAndReceivedClaim
def __init__(self, basedirpath: str, client: Client = None, wallet: Wallet = None, port: int = None, loop=None): if not basedirpath: config = getConfig() basedirpath = basedirpath or os.path.expanduser(config.baseDir) portParam, = self.getPassedArgs() super().__init__('Acme Corp', basedirpath, client, wallet, portParam or port, loop=loop) self.availableClaims = [] # maps invitation nonces to internal ids self._invites = { "57fbf9dc8c8e6acde33de98c6d747b28c": 1, "3a2eb72eca8b404e8d412c5bf79f2640": 2, "8513d1397e87cada4214e2a650f603eb": 3, "810b78be79f29fc81335abaa4ee1c5e8": 4 } self._attrDefJobCert = AttribDef('Acme Job Certificat', [AttribType('first_name', encode=True), AttribType('last_name', encode=True), AttribType('employee_status', encode=True), AttribType('experience', encode=True), AttribType('salary_bracket', encode=True)]) self._attrDefJobApp = AttribDef('Acme Job Application', [AttribType('first_name', encode=True), AttribType('last_name', encode=True), AttribType('phone_number', encode=True), AttribType('degree', encode=True), AttribType('status', encode=True), AttribType('ssn', encode=True)]) # maps internal ids to attributes self._attrsJobCert = { 1: self._attrDefJobCert.attribs( first_name="Alice", last_name="Garcia", employee_status="Permanent", experience="3 years", salary_bracket="between $50,000 to $100,000"), 2: self._attrDefJobCert.attribs( first_name="Carol", last_name="Atkinson", employee_status="Permanent", experience="2 years", salary_bracket="between $60,000 to $90,000"), 3: self._attrDefJobCert.attribs( first_name="Frank", last_name="Jeffrey", employee_status="Temporary", experience="4 years", salary_bracket="between $40,000 to $80,000"), 4: self._attrDefJobCert.attribs( first_name="Craig", last_name="Richards", employee_status="On Contract", experience="3 years", salary_bracket="between $50,000 to $70,000") } self._claimDefJobCertKey = ClaimDefinitionKey("Job-Certificate", "0.2", self.wallet.defaultId) self._claimDefJobAppKey = ClaimDefinitionKey("Job-Application", "0.2", self.wallet.defaultId)
def executeGstFlow(name, userCLI, userMap, be, connectedToTest, do, fMap, aMap, jobCertificateClaimMap, newKeyringOut, reqClaimOut, reqClaimOut1, syncLinkOutWithEndpoint, syncedInviteAcceptedOutWithoutClaims, tMap, transcriptClaimMap): async def getPublicKey(wallet, claimDefId): return await wallet.getPublicKey(claimDefId) async def getClaim(claimDefId): return userCLI.agent.prover.wallet.getClaims(claimDefId) # Start User cli be(userCLI) setPromptAndKeyring(do, name, newKeyringOut, userMap) do('connect test', within=3, expect=connectedToTest) # Accept faber do('load sample/faber-invitation.sovrin') syncInvite(be, do, userCLI, syncLinkOutWithEndpoint, fMap) do('show link faber') acceptInvitation(be, do, userCLI, fMap, syncedInviteAcceptedOutWithoutClaims) # Request claim do('show claim Transcript') aliceRequestedTranscriptClaim( be, do, userCLI, transcriptClaimMap, reqClaimOut, None, # Passing None since its not used None) # Passing None since its not used faberClaimDefId = ID( ClaimDefinitionKey('Transcript', '1.2', fMap['target'])) faberIssuerKey = userCLI.looper.run( getPublicKey(faberAgent.issuer.wallet, faberClaimDefId)) userFaberIssuerKey = userCLI.looper.run( getPublicKey(userCLI.agent.prover.wallet, faberClaimDefId)) assert faberIssuerKey == userFaberIssuerKey do('show claim Transcript') assert userCLI.looper.run(getClaim(faberClaimDefId)) # Accept acme do('load sample/acme-job-application.sovrin') syncInvite(be, do, userCLI, syncLinkOutWithEndpoint, aMap) acceptInvitation(be, do, userCLI, aMap, syncedInviteAcceptedOutWithoutClaims) # Send claim do('show claim request Job-Application') do('set first_name to Alice') do('set last_name to Garcia') do('set phone_number to 123-45-6789') do('show claim request Job-Application') # Passing some args as None since they are not used in the method jobApplicationClaimSent(be, do, userCLI, aMap, None, None, None) # Request new available claims Job-Certificate jobCertClaimRequested(be, do, userCLI, jobCertificateClaimMap, reqClaimOut1, None, None) acmeClaimDefId = ID( ClaimDefinitionKey('Job-Certificate', '0.2', aMap['target'])) acmeIssuerKey = userCLI.looper.run( getPublicKey(acmeAgent.issuer.wallet, acmeClaimDefId)) userAcmeIssuerKey = userCLI.looper.run( getPublicKey(userCLI.agent.prover.wallet, acmeClaimDefId)) assert acmeIssuerKey == userAcmeIssuerKey do('show claim Job-Certificate') assert userCLI.looper.run(getClaim(acmeClaimDefId)) # Accept thrift do('load sample/thrift-loan-application.sovrin') acceptInvitation(be, do, userCLI, tMap, syncedInviteAcceptedOutWithoutClaims) # Send claims bankBasicClaimSent(be, do, userCLI, tMap, None) thriftAcmeIssuerKey = userCLI.looper.run( getPublicKey(thriftAgent.issuer.wallet, acmeClaimDefId)) assert acmeIssuerKey == thriftAcmeIssuerKey passed = False try: bankKYCClaimSent(be, do, userCLI, tMap, None) passed = True except: thriftFaberIssuerKey = userCLI.looper.run( getPublicKey(thriftAgent.issuer.wallet, faberClaimDefId)) assert faberIssuerKey == thriftFaberIssuerKey assert passed
def __init__(self, basedirpath: str, client: Client = None, wallet: Wallet = None, port: int = None, loop=None): if not basedirpath: config = getConfig() basedirpath = basedirpath or os.path.expanduser(config.baseDir) portParam, = self.getPassedArgs() super().__init__('Faber College', basedirpath, client, wallet, portParam or port, loop=loop) self.availableClaims = [] # maps invitation nonces to internal ids self._invites = { "b1134a647eb818069c089e7694f63e6d": 1, "2a2eb72eca8b404e8d412c5bf79f2640": 2, "7513d1397e87cada4214e2a650f603eb": 3, "710b78be79f29fc81335abaa4ee1c5e8": 4 } self._attrDef = AttribDef('faber', [AttribType('student_name', encode=True), AttribType('ssn', encode=True), AttribType('degree', encode=True), AttribType('year', encode=True), AttribType('status', encode=True)]) # maps internal ids to attributes self._attrs = { 1: self._attrDef.attribs( student_name="Alice Garcia", ssn="123-45-6789", degree="Bachelor of Science, Marketing", year="2015", status="graduated"), 2: self._attrDef.attribs( student_name="Carol Atkinson", ssn="783-41-2695", degree="Bachelor of Science, Physics", year="2012", status="graduated"), 3: self._attrDef.attribs( student_name="Frank Jeffrey", ssn="996-54-1211", degree="Bachelor of Arts, History", year="2013", status="dropped"), 4: self._attrDef.attribs( student_name="Craig Richards", ssn="151-44-5876", degree="MBA, Finance", year="2015", status="graduated") } self._claimDefKey = ClaimDefinitionKey("Transcript", "1.2", self.wallet.defaultId)
def __init__(self, basedirpath: str, client: Client = None, wallet: Wallet = None, port: int = None, loop=None): if not basedirpath: config = getConfig() basedirpath = basedirpath or os.path.expanduser(config.baseDir) portParam, = self.getPassedArgs() super().__init__('Bulldog', basedirpath, client, wallet, portParam or port, loop=loop, agentLogger=bulldogLogger) self.availableClaims = [] # maps invitation nonces to internal ids self._invites = { '2e9882ea71976ddf9': 1, "2d03828a7383ea3ad": 2 } self._attrDef = AttribDef('bulldog', [AttribType('title', encode=True), AttribType('first_name', encode=True), AttribType('last_name', encode=True), AttribType('address_1', encode=True), AttribType('address_2', encode=True), AttribType('address_3', encode=True), AttribType('postcode_zip', encode=True), AttribType('date_of_birth', encode=True), AttribType('account_type', encode=True), AttribType('year_opened', encode=True), AttribType('account_status', encode=True) ]) # maps internal ids to attributes self._attrs = { 1: self._attrDef.attribs( title='Mrs.', first_name='Alicia', last_name='Garcia', address_1='H-301', address_2='Street 1', address_3='UK', postcode_zip='G61 3NR', date_of_birth='December 28, 1990', account_type='savings', year_opened='2000', account_status='active'), 2: self._attrDef.attribs( title='Mrs.', first_name='Jay', last_name='Raj', address_1='222', address_2='Baker Street', address_3='UK', postcode_zip='G61 3NR', date_of_birth='January 15, 1980', account_type='savings', year_opened='1999', account_status='active') } claimVersionFileName = 'bulldog-claim-def-version.txt' claimVersionNumber = 0.8 claimVersionFilePath = '{}/{}'.format(basedirpath, claimVersionFileName) # get version number from file if os.path.isfile(claimVersionFilePath): try: with open(claimVersionFilePath, mode='r+') as file: claimVersionNumber = float(file.read()) + 0.1 file.seek(0) # increment version and update file file.write(str(claimVersionNumber)) file.truncate() except OSError as e: bulldogLogger.warn('Error occurred while reading version file:' 'error:{}'.format(e)) raise e except ValueError as e: bulldogLogger.warn('Invalid version number') raise e else: try: with open(claimVersionFilePath, mode='w') as file: file.write(str(claimVersionNumber)) except OSError as e: bulldogLogger.warn('Error creating version file {}'.format(e)) raise e self._claimDefKey = ClaimDefinitionKey('Banking-Relationship', str(claimVersionNumber), self.wallet.defaultId)