Skip to content
Snippets Groups Projects
privacypass.py 2.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jean-Paul Calderone's avatar
    Jean-Paul Calderone committed
    # Copyright 2019 PrivateStorage.io, LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    """
    Ristretto-flavored PrivacyPass helpers for the test suite.
    """
    
    
    from __future__ import (
        absolute_import,
    )
    
    from privacypass import (
        BatchDLEQProof,
        PublicKey,
    )
    
    def make_passes(signing_key, for_message, random_tokens):
    
    Jean-Paul Calderone's avatar
    Jean-Paul Calderone committed
        """
        Create a number of cryptographically correct privacy passes.
    
        :param privacypass.SigningKey signing_key: The key to use to sign the
            passes.
    
        :param unicode for_message: The request-binding message with which to
            associate the passes.
    
        :param list[privacypass.RandomToken] random_tokens: The random tokens to
            feed in to the pass generation process.
    
        :return list[unicode]: The privacy passes.  The returned list has one
            element for each element of ``random_tokens``.
        """
    
        blinded_tokens = list(
            token.blind()
            for token
            in random_tokens
        )
        signatures = list(
            signing_key.sign(blinded_token)
            for blinded_token
            in blinded_tokens
        )
        proof = BatchDLEQProof.create(
            signing_key,
            blinded_tokens,
            signatures,
        )
        unblinded_signatures = proof.invalid_or_unblind(
            random_tokens,
            blinded_tokens,
            signatures,
            PublicKey.from_signing_key(signing_key),
        )
        preimages = list(
            unblinded_signature.preimage()
            for unblinded_signature
            in unblinded_signatures
        )
        verification_keys = list(
            unblinded_signature.derive_verification_key_sha512()
            for unblinded_signature
            in unblinded_signatures
        )
        message_signatures = list(
            verification_key.sign_sha512(for_message.encode("utf-8"))
            for verification_key
            in verification_keys
        )
        passes = list(
            u"{} {}".format(
                preimage.encode_base64().decode("ascii"),
                signature.encode_base64().decode("ascii"),
            ).encode("ascii")
            for (preimage, signature)
            in zip(preimages, message_signatures)
        )
        return passes