aboutsummaryrefslogtreecommitdiffstats
path: root/test/netlib/test_utils.py
blob: 9dcbffd814d56242490452abffb2c4b5f4f4b8c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding=utf-8

from netlib import utils, tutils


def test_is_valid_host():
    assert not utils.is_valid_host(b"")
    assert utils.is_valid_host(b"one.two")
    assert not utils.is_valid_host(b"one" * 255)
    assert utils.is_valid_host(b"one.two.")


def test_bidi():
    b = utils.BiDi(a=1, b=2)
    assert b.a == 1
    assert b.get_name(1) == "a"
    assert b.get_name(5) is None
    tutils.raises(AttributeError, getattr, b, "c")
    tutils.raises(ValueError, utils.BiDi, one=1, two=1)
ld } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
 * Copyright (C) 2015 Vincent Breitmoser <v.breitmoser@mugenguild.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.sufficientlysecure.keychain.pgp;


import java.nio.ByteBuffer;
import java.util.Date;
import java.util.Map;

import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.PGPPublicKeyRing;
import org.bouncycastle.openpgp.PGPSignature;
import org.bouncycastle.openpgp.PGPSignatureGenerator;
import org.bouncycastle.openpgp.PGPSignatureSubpacketGenerator;
import org.bouncycastle.openpgp.PGPSignatureSubpacketVector;
import org.bouncycastle.openpgp.PGPUserAttributeSubpacketVector;
import org.bouncycastle.openpgp.operator.jcajce.NfcSyncPGPContentSignerBuilder.NfcInteractionNeeded;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel.SecurityTokenSignOperationsBuilder;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;


public class PgpCertifyOperation {

    public PgpCertifyResult certify(
            CanonicalizedSecretKey secretKey,
            CanonicalizedPublicKeyRing publicRing,
            OperationLog log,
            int indent,
            CertifyAction action,
            Map<ByteBuffer, byte[]> signedHashes,
            Date creationTimestamp) {

        if (!secretKey.isMasterKey()) {
            throw new AssertionError("tried to certify with non-master key, this is a programming error!");
        }
        if (publicRing.getMasterKeyId() == secretKey.getKeyId()) {
            throw new AssertionError("key tried to self-certify, this is a programming error!");
        }

        // create a signatureGenerator from the supplied masterKeyId and passphrase
        PGPSignatureGenerator signatureGenerator = secretKey.getCertSignatureGenerator(signedHashes);

        { // supply signatureGenerator with a SubpacketVector
            PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();
            if (creationTimestamp != null) {
                spGen.setSignatureCreationTime(false, creationTimestamp);
                Log.d(Constants.TAG, "For NFC: set sig creation time to " + creationTimestamp);
            }
            PGPSignatureSubpacketVector packetVector = spGen.generate();
            signatureGenerator.setHashedSubpackets(packetVector);
        }

        // get the master subkey (which we certify for)
        PGPPublicKey publicKey = publicRing.getPublicKey().getPublicKey();

        SecurityTokenSignOperationsBuilder requiredInput = new SecurityTokenSignOperationsBuilder(creationTimestamp,
                publicKey.getKeyID(), publicKey.getKeyID());

        try {
            if (action.mUserIds != null) {
                log.add(LogType.MSG_CRT_CERTIFY_UIDS, 2, action.mUserIds.size(),
                        KeyFormattingUtils.convertKeyIdToHex(action.mMasterKeyId));

                // fetch public key ring, add the certification and return it
                for (String userId : action.mUserIds) {
                    try {
                        PGPSignature sig = signatureGenerator.generateCertification(userId, publicKey);
                        publicKey = PGPPublicKey.addCertification(publicKey, userId, sig);
                    } catch (NfcInteractionNeeded e) {
                        requiredInput.addHash(e.hashToSign, e.hashAlgo);
                    }
                }

            }

            if (action.mUserAttributes != null) {
                log.add(LogType.MSG_CRT_CERTIFY_UATS, 2, action.mUserAttributes.size(),
                        KeyFormattingUtils.convertKeyIdToHex(action.mMasterKeyId));

                // fetch public key ring, add the certification and return it
                for (WrappedUserAttribute userAttribute : action.mUserAttributes) {
                    PGPUserAttributeSubpacketVector vector = userAttribute.getVector();
                    try {
                        PGPSignature sig = signatureGenerator.generateCertification(vector, publicKey);
                        publicKey = PGPPublicKey.addCertification(publicKey, vector, sig);
                    } catch (NfcInteractionNeeded e) {
                        requiredInput.addHash(e.hashToSign, e.hashAlgo);
                    }
                }

            }
        } catch (PGPException e) {
            Log.e(Constants.TAG, "signing error", e);
            return new PgpCertifyResult();
        }

        if (!requiredInput.isEmpty()) {
            return new PgpCertifyResult(requiredInput.build());
        }

        PGPPublicKeyRing ring = PGPPublicKeyRing.insertPublicKey(publicRing.getRing(), publicKey);
        return new PgpCertifyResult(new UncachedKeyRing(ring));

    }

    public static class PgpCertifyResult {

        final RequiredInputParcel mRequiredInput;
        final UncachedKeyRing mCertifiedRing;

        PgpCertifyResult() {
            mRequiredInput = null;
            mCertifiedRing = null;
        }

        PgpCertifyResult(RequiredInputParcel requiredInput) {
            mRequiredInput = requiredInput;
            mCertifiedRing = null;
        }

        PgpCertifyResult(UncachedKeyRing certifiedRing) {
            mRequiredInput = null;
            mCertifiedRing = certifiedRing;
        }

        public boolean success() {
            return mCertifiedRing != null || mRequiredInput != null;
        }

        public boolean nfcInputRequired() {
            return mRequiredInput != null;
        }

        public UncachedKeyRing getCertifiedRing() {
            return mCertifiedRing;
        }

        public RequiredInputParcel getRequiredInput() {
            return mRequiredInput;
        }

    }

}