/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.x509; import java.util.BitSet; import org.bouncycastle.asn1.x509.KeyUsage; /** * Representation of the bit meanings in the <code>KeyUsage</code> BIT STRING type defined in section 4.2.1.3 of RFC * 2459. * * @author Middleware Services * @version $Revision: 2745 $ */ public enum KeyUsageBits { /** digitalSignature bit. */ DigitalSignature(7), /** nonRepudiation bit. */ NonRepudiation(6), /** keyEncipherment bit. */ KeyEncipherment(5), /** dataEncipherment bit. */ DataEncipherment(4), /** keyAgreement bit. */ KeyAgreement(3), /** keyCertSign bit. */ KeyCertSign(2), /** cRLSign bit. */ CRLSign(1), /** encipherOnly bit. */ EncipherOnly(0), /** decipherOnly bit. */ DecipherOnly(15); /** Bit mask offset. */ private final int offset; /** * Creates a bit flag with the given bit mask offset. * * @param offset Bit mask offset. */ KeyUsageBits(final int offset) { this.offset = offset; } /** @return Bit mask value. */ public int getMask() { return 1 << offset; } /** * Determines whether this key usage bit is set in the given key usage value. * * @param keyUsage BC key usage object. * * @return True if bit is set, false otherwise. */ public boolean isSet(final KeyUsage keyUsage) { return isSet(keyUsage.getBytes()); } /** * Determines whether this key usage bit is set in the given key usage bit string. * * @param bitString Key usage bit string as a byte array. * * @return True if bit is set, false otherwise. */ public boolean isSet(final byte[] bitString) { return BitSet.valueOf(bitString).get(offset); } /** * Determines whether this key usage bit is set in the given key usage bit string. * * @param bitString Key usage bit string as a big endian integer. * * @return True if bit is set, false otherwise. */ public boolean isSet(final int bitString) { return (bitString & getMask()) >> offset == 1; } /** * Computes the key usage value from one or more key usage bits. * * @param bits One ore more key usage bits. * * @return Key usage bit string as an integer. */ public static int usage(final KeyUsageBits... bits) { int usage = 0; for (KeyUsageBits bit : bits) { usage |= bit.getMask(); } return usage; } }