Beispiel #1
0
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))
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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)
Beispiel #5
0
    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")
Beispiel #6
0
    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))
Beispiel #7
0
 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
Beispiel #8
0
    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)
Beispiel #9
0
    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
Beispiel #10
0
    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)
Beispiel #11
0
    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)