Java Code Examples for javax.crypto.Mac#update()

The following examples show how to use javax.crypto.Mac#update() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: DynamoDBSigner.java    From aws-dynamodb-encryption-java with Apache License 2.0 6 votes vote down vote up
/**
 * Constant-time equality check.
 */
private boolean safeEquals(ByteBuffer signature, byte[] calculatedSig) {
    try {
        signature.rewind();
        Mac hmac = Mac.getInstance(hmacComparisonKey.getAlgorithm());
        hmac.init(hmacComparisonKey);
        hmac.update(signature);
        byte[] signatureHash = hmac.doFinal();

        hmac.reset();
        hmac.update(calculatedSig);
        byte[] calculatedHash = hmac.doFinal();

        return MessageDigest.isEqual(signatureHash, calculatedHash);
    } catch (GeneralSecurityException ex) {
        // We've hardcoded these algorithms, so the error should not be possible.
        throw new RuntimeException("Unexpected exception", ex);
    }
}
 
Example 2
Source File: ScramSaslClient.java    From mongodb-async-driver with Apache License 2.0 6 votes vote down vote up
/**
 * Generates the SCRAM salted password. See section 3 of RFC 5802.
 *
 * @param passwordBytes
 *            The password bytes.
 * @return The salted password.
 * @throws SaslException
 *             On a failure to initialize the {@link Mac}.
 */
private byte[] generateSaltedPassword(final byte[] passwordBytes)
        throws SaslException {
    final Mac mac = initMac(passwordBytes);

    mac.update(mySalt);
    mac.update(ONE_UINT32_BE);
    final byte[] result = mac.doFinal();

    byte[] previous = result;
    for (int i = 1; i < myIterationCount; i++) {
        previous = mac.doFinal(previous);
        for (int x = 0; x < result.length; x++) {
            result[x] ^= previous[x];
        }
    }

    return result;
}
 
Example 3
Source File: PBMacBuffer.java    From dragonwell8_jdk with GNU General Public License v2.0 6 votes vote down vote up
/**
 * NULL ByteBuffer test case. Pass NULL ByteBuffer to Mac.update(ByteBuffer
 * buffer) method. An IllegalArgumentException expected.
 *
 * @param theMac Mac object to test.
 * @return true - test case pass; false - otherwise.
 */
protected boolean nullByteBufferTest(Mac theMac) {
    try {
        ByteBuffer buf = null;
        theMac.update(buf);
        theMac.doFinal();
    } catch (IllegalArgumentException e) {
        // expected exception has been thrown
        return true;
    }

    System.out.println("FAIL: "
            + "IllegalArgumentException hasn't been thrown as expected");

    return false;
}
 
Example 4
Source File: EmptyByteBufferTest.java    From dragonwell8_jdk with GNU General Public License v2.0 6 votes vote down vote up
@Override
public void doTest(String alg) throws NoSuchAlgorithmException,
        InvalidKeyException, NoSuchProviderException {
    SecretKey key = Utils.getSecretKeySpec();

    // instantiate Mac object and init it with a SecretKey
    Mac mac = Mac.getInstance(alg, "SunJCE");
    mac.init(key);

    // prepare buffer
    byte[] data = new byte[0];
    ByteBuffer buf = ByteBuffer.wrap(data);

    mac.update(buf);
    mac.doFinal();
}
 
Example 5
Source File: VideoUtil.java    From arcusplatform with Apache License 2.0 5 votes vote down vote up
public static String generateAccessSignature(SecretKeySpec secret, UUID recordingId, long expTime) {
   try {
      byte[] expTimeBytes = ByteBuffer.allocate(8).putLong(expTime).array();
      byte[] recordingIdBytes = recordingId.toString().getBytes(StandardCharsets.UTF_8);

      Mac hmac = Mac.getInstance("HmacSHA256");
      hmac.init(secret);
      hmac.update(recordingIdBytes);
      byte[] result = hmac.doFinal(expTimeBytes);

      return Base64.getEncoder().encodeToString(result);
   } catch (Exception ex) {
      throw new RuntimeException(ex);
   }
}
 
Example 6
Source File: PBKDF.java    From guarda-android-wallets with GNU General Public License v3.0 5 votes vote down vote up
/**
 * Implementation of PBKDF2 (RFC2898).
 *
 * @param   mac     Pre-initialized {@link Mac} instance to use.
 * @param   S       Salt.
 * @param   c       Iteration count.
 * @param   DK      Byte array that derived key will be placed in.
 * @param   dkLen   Intended length, in octets, of the derived key.
 *
 * @throws  GeneralSecurityException
 */
public static void pbkdf2(Mac mac, byte[] S, int c, byte[] DK, int dkLen) throws GeneralSecurityException {
    int hLen = mac.getMacLength();

    if (dkLen > (Math.pow(2, 32) - 1) * hLen) {
        throw new GeneralSecurityException("Requested key length too long");
    }

    byte[] U      = new byte[hLen];
    byte[] T      = new byte[hLen];
    byte[] block1 = new byte[S.length + 4];

    int l = (int) Math.ceil((double) dkLen / hLen);
    int r = dkLen - (l - 1) * hLen;

    arraycopy(S, 0, block1, 0, S.length);

    for (int i = 1; i <= l; i++) {
        block1[S.length + 0] = (byte) (i >> 24 & 0xff);
        block1[S.length + 1] = (byte) (i >> 16 & 0xff);
        block1[S.length + 2] = (byte) (i >> 8  & 0xff);
        block1[S.length + 3] = (byte) (i >> 0  & 0xff);

        mac.update(block1);
        mac.doFinal(U, 0);
        arraycopy(U, 0, T, 0, hLen);

        for (int j = 1; j < c; j++) {
            mac.update(U);
            mac.doFinal(U, 0);

            for (int k = 0; k < hLen; k++) {
                T[k] ^= U[k];
            }
        }

        arraycopy(T, 0, DK, (i - 1) * hLen, (i == l ? r : hLen));
    }
}
 
Example 7
Source File: CryptoHelper.java    From android_9.0.0_r45 with Apache License 2.0 5 votes vote down vote up
@NonNull
private byte[] createMac(@NonNull byte[] cipher, @NonNull byte[] iv) throws GeneralSecurityException {
    Mac mac = Mac.getInstance(MAC_ALGORITHM);
    mac.init(mMacKey);
    mac.update(cipher);
    mac.update(iv);
    return mac.doFinal();
}
 
Example 8
Source File: PKCS12KeyStore.java    From Bytecoder with Apache License 2.0 5 votes vote down vote up
private byte[] calculateMac(char[] passwd, byte[] data)
    throws IOException
{
    byte[] mData = null;
    String algName = macAlgorithm.substring(7);

    try {
        // Generate a random salt.
        byte[] salt = getSalt();

        // generate MAC (MAC key is generated within JCE)
        Mac m = Mac.getInstance(macAlgorithm);
        PBEParameterSpec params =
                    new PBEParameterSpec(salt, macIterationCount);
        SecretKey key = getPBEKey(passwd);
        m.init(key, params);
        m.update(data);
        byte[] macResult = m.doFinal();

        // encode as MacData
        MacData macData = new MacData(algName, macResult, salt,
                macIterationCount);
        DerOutputStream bytes = new DerOutputStream();
        bytes.write(macData.getEncoded());
        mData = bytes.toByteArray();
    } catch (Exception e) {
        throw new IOException("calculateMac failed: " + e, e);
    }
    return mData;
}
 
Example 9
Source File: LargeByteBufferTest.java    From openjdk-jdk8u with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void doTest(String alg) throws NoSuchAlgorithmException,
        InvalidKeyException, NoSuchProviderException {
    SecretKey key = Utils.getSecretKeySpec();

    // instantiate Mac object and init it with a SecretKey
    Mac mac = Mac.getInstance(alg, "SunJCE");
    mac.init(key);

    // prepare buffer
    byte[] data = new byte[BUFFER_SIZE];
    for (int i = 0; i < BUFFER_SIZE; i++) {
        data[i] = (byte) (i % 256);
    }

    ByteBuffer buf = ByteBuffer.wrap(data);
    int limitBefore = buf.limit();

    mac.update(buf);
    mac.doFinal();

    int limitAfter = buf.limit();
    int positonAfter = buf.position();

    if (limitAfter != limitBefore) {
        System.out.println("limit after = " + limitAfter);
        System.out.println("limit before = " + limitBefore);
        throw new RuntimeException("Test failed: "
                + "limit of buffer has been chenged.");
    }

    if (positonAfter != limitAfter) {
        System.out.println("position after = " + positonAfter);
        System.out.println("limit after = " + limitAfter);
        throw new RuntimeException("Test failed: "
                + "position of buffer isn't equal to its limit");
    }
}
 
Example 10
Source File: MacSameTest.java    From openjdk-jdk8u-backup with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void doTest(String algo) throws NoSuchAlgorithmException,
        NoSuchProviderException, InvalidKeyException {
    Mac mac;
    try {
        mac = Mac.getInstance(algo, "SunJCE");
    } catch (NoSuchAlgorithmException nsae) {
        // depending on Solaris configuration,
        // it can support HMAC or not with Mac
        System.out.println("Expected NoSuchAlgorithmException thrown: "
                + nsae);
        return;
    }

    byte[] plain = new byte[MESSAGE_SIZE];
    for (int i = 0; i < MESSAGE_SIZE; i++) {
        plain[i] = (byte) (i % 256);
    }

    byte[] tail = new byte[plain.length - OFFSET];
    System.arraycopy(plain, OFFSET, tail, 0, tail.length);

    SecureRandom srdm = new SecureRandom();
    byte[] keyVal = new byte[KEY_SIZE];
    srdm.nextBytes(keyVal);
    SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");

    mac.init(keySpec);
    byte[] result1 = mac.doFinal(plain);

    mac.reset();
    mac.update(plain[0]);
    mac.update(plain, 1, OFFSET - 1);
    byte[] result2 = mac.doFinal(tail);

    if (!java.util.Arrays.equals(result1, result2)) {
        throw new RuntimeException("result1 and result2 are not the same");
    }
}
 
Example 11
Source File: HMACProvider.java    From keycloak with Apache License 2.0 5 votes vote down vote up
public static byte[] sign(byte[] data, Algorithm algorithm, SecretKey key) {
    try {
        Mac mac = getMAC(algorithm);
        mac.init(key);
        mac.update(data);
        return mac.doFinal();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
 
Example 12
Source File: DoubleClickCrypto.java    From openrtb-doubleclick with Apache License 2.0 5 votes vote down vote up
/**
 * {@code signature = hmac(integrityKey, payload || initVector)}
 */
private int hmacSignature(byte[] workBytes) {
  try {
    Mac integrityHmac = createMac();
    integrityHmac.init(keys.getIntegrityKey());
    integrityHmac.update(workBytes, PAYLOAD_BASE, workBytes.length - OVERHEAD_SIZE);
    integrityHmac.update(workBytes, INITV_BASE, INITV_SIZE);
    return Ints.fromByteArray(integrityHmac.doFinal());
  } catch (InvalidKeyException e) {
    throw new IllegalStateException(e);
  }
}
 
Example 13
Source File: StringUtils.java    From RestServices with Apache License 2.0 5 votes vote down vote up
public static String generateHmacSha256Hash(String key, String valueToEncrypt)
{
	try {
		SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
		Mac mac = Mac.getInstance("HmacSHA256");
		mac.init(secretKey);
		mac.update(valueToEncrypt.getBytes("UTF-8"));
		byte[] hmacData = mac.doFinal();

           return Base64.getEncoder().encodeToString(hmacData);
	}
	catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException | NoSuchAlgorithmException e) {
		throw new RuntimeException("CommunityCommons::EncodeHmacSha256::Unable to encode: " + e.getMessage(), e);
	}
}
 
Example 14
Source File: MacSameTest.java    From jdk8u-jdk with GNU General Public License v2.0 4 votes vote down vote up
private void doTest(String algo, Provider provider)
        throws NoSuchAlgorithmException, NoSuchProviderException,
        InvalidKeyException {
    System.out.println("Test " + algo);
    Mac mac;
    try {
        mac = Mac.getInstance(algo, provider);
    } catch (NoSuchAlgorithmException nsae) {
        if ("SunPKCS11-Solaris".equals(provider.getName())) {
            // depending on Solaris configuration,
            // it can support HMAC or not with Mac
            System.out.println("Expected NoSuchAlgorithmException thrown: "
                    + nsae);
            return;
        }
        throw nsae;
    }

    byte[] plain = new byte[MESSAGE_SIZE];
    for (int i = 0; i < MESSAGE_SIZE; i++) {
        plain[i] = (byte) (i % 256);
    }

    byte[] tail = new byte[plain.length - OFFSET];
    System.arraycopy(plain, OFFSET, tail, 0, tail.length);

    SecureRandom srdm = new SecureRandom();
    byte[] keyVal = new byte[KEY_SIZE];
    srdm.nextBytes(keyVal);
    SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");

    mac.init(keySpec);
    byte[] result1 = mac.doFinal(plain);

    mac.reset();
    mac.update(plain[0]);
    mac.update(plain, 1, OFFSET - 1);
    byte[] result2 = mac.doFinal(tail);

    if (!java.util.Arrays.equals(result1, result2)) {
        throw new RuntimeException("result1 and result2 are not the same");
    }
}
 
Example 15
Source File: PBKDF2KeyImpl.java    From openjdk-jdk8u-backup with GNU General Public License v2.0 4 votes vote down vote up
private static byte[] deriveKey(final Mac prf, final byte[] password,
        byte[] salt, int iterCount, int keyLengthInBit) {
    int keyLength = keyLengthInBit/8;
    byte[] key = new byte[keyLength];
    try {
        int hlen = prf.getMacLength();
        int intL = (keyLength + hlen - 1)/hlen; // ceiling
        int intR = keyLength - (intL - 1)*hlen; // residue
        byte[] ui = new byte[hlen];
        byte[] ti = new byte[hlen];
        // SecretKeySpec cannot be used, since password can be empty here.
        SecretKey macKey = new SecretKey() {
            private static final long serialVersionUID = 7874493593505141603L;
            @Override
            public String getAlgorithm() {
                return prf.getAlgorithm();
            }
            @Override
            public String getFormat() {
                return "RAW";
            }
            @Override
            public byte[] getEncoded() {
                return password;
            }
            @Override
            public int hashCode() {
                return Arrays.hashCode(password) * 41 +
                  prf.getAlgorithm().toLowerCase(Locale.ENGLISH).hashCode();
            }
            @Override
            public boolean equals(Object obj) {
                if (this == obj) return true;
                if (this.getClass() != obj.getClass()) return false;
                SecretKey sk = (SecretKey)obj;
                return prf.getAlgorithm().equalsIgnoreCase(
                    sk.getAlgorithm()) &&
                    MessageDigest.isEqual(password, sk.getEncoded());
            }
        };
        prf.init(macKey);

        byte[] ibytes = new byte[4];
        for (int i = 1; i <= intL; i++) {
            prf.update(salt);
            ibytes[3] = (byte) i;
            ibytes[2] = (byte) ((i >> 8) & 0xff);
            ibytes[1] = (byte) ((i >> 16) & 0xff);
            ibytes[0] = (byte) ((i >> 24) & 0xff);
            prf.update(ibytes);
            prf.doFinal(ui, 0);
            System.arraycopy(ui, 0, ti, 0, ui.length);

            for (int j = 2; j <= iterCount; j++) {
                prf.update(ui);
                prf.doFinal(ui, 0);
                // XOR the intermediate Ui's together.
                for (int k = 0; k < ui.length; k++) {
                    ti[k] ^= ui[k];
                }
            }
            if (i == intL) {
                System.arraycopy(ti, 0, key, (i-1)*hlen, intR);
            } else {
                System.arraycopy(ti, 0, key, (i-1)*hlen, hlen);
            }
        }
    } catch (GeneralSecurityException gse) {
        throw new RuntimeException("Error deriving PBKDF2 keys");
    }
    return key;
}
 
Example 16
Source File: ScramUtils.java    From Openfire with Apache License 2.0 4 votes vote down vote up
public static byte[] computeHmac(final byte[] key, final String string)
        throws SaslException {
    Mac mac = createSha1Hmac(key);
    mac.update(string.getBytes(StandardCharsets.UTF_8));
    return mac.doFinal();
}
 
Example 17
Source File: TestHmacSHAOids.java    From openjdk-jdk9 with GNU General Public License v2.0 4 votes vote down vote up
private static void runTest(DataTuple dataTuple)
        throws NoSuchAlgorithmException, NoSuchProviderException,
        InvalidKeyException {
    Mac mcAlgorithm = Mac.getInstance(dataTuple.algorithm,
            PROVIDER_NAME);
    Mac mcOid = Mac.getInstance(dataTuple.oid, PROVIDER_NAME);

    if (mcAlgorithm == null) {
        throw new RuntimeException(String.format(
                "Test failed: Mac using algorithm "
                        + "string %s getInstance failed.%n",
                dataTuple.algorithm));
    }

    if (mcOid == null) {
        throw new RuntimeException(String.format(
                "Test failed: Mac using OID %s getInstance failed.%n",
                dataTuple.oid));
    }

    if (!mcAlgorithm.getAlgorithm().equals(dataTuple.algorithm)) {
        throw new RuntimeException(String.format(
                "Test failed: Mac using algorithm string %s getInstance "
                        + "doesn't generate expected algorithm.%n",
                dataTuple.algorithm));
    }

    KeyGenerator kg = KeyGenerator.getInstance(dataTuple.algorithm,
            PROVIDER_NAME);
    SecretKey key = kg.generateKey();

    mcAlgorithm.init(key);
    mcAlgorithm.update(INPUT);

    mcOid.init(key);
    mcOid.update(INPUT);

    // Comparison
    if (!Arrays.equals(mcAlgorithm.doFinal(), mcOid.doFinal())) {
        throw new RuntimeException("Digest comparison failed: "
                + "the two MACs are not the same");
    }
}
 
Example 18
Source File: PBKDF2KeyImpl.java    From jdk8u-jdk with GNU General Public License v2.0 4 votes vote down vote up
private static byte[] deriveKey(final Mac prf, final byte[] password,
        byte[] salt, int iterCount, int keyLengthInBit) {
    int keyLength = keyLengthInBit/8;
    byte[] key = new byte[keyLength];
    try {
        int hlen = prf.getMacLength();
        int intL = (keyLength + hlen - 1)/hlen; // ceiling
        int intR = keyLength - (intL - 1)*hlen; // residue
        byte[] ui = new byte[hlen];
        byte[] ti = new byte[hlen];
        // SecretKeySpec cannot be used, since password can be empty here.
        SecretKey macKey = new SecretKey() {
            private static final long serialVersionUID = 7874493593505141603L;
            @Override
            public String getAlgorithm() {
                return prf.getAlgorithm();
            }
            @Override
            public String getFormat() {
                return "RAW";
            }
            @Override
            public byte[] getEncoded() {
                return password;
            }
            @Override
            public int hashCode() {
                return Arrays.hashCode(password) * 41 +
                  prf.getAlgorithm().toLowerCase(Locale.ENGLISH).hashCode();
            }
            @Override
            public boolean equals(Object obj) {
                if (this == obj) return true;
                if (this.getClass() != obj.getClass()) return false;
                SecretKey sk = (SecretKey)obj;
                return prf.getAlgorithm().equalsIgnoreCase(
                    sk.getAlgorithm()) &&
                    Arrays.equals(password, sk.getEncoded());
            }
        };
        prf.init(macKey);

        byte[] ibytes = new byte[4];
        for (int i = 1; i <= intL; i++) {
            prf.update(salt);
            ibytes[3] = (byte) i;
            ibytes[2] = (byte) ((i >> 8) & 0xff);
            ibytes[1] = (byte) ((i >> 16) & 0xff);
            ibytes[0] = (byte) ((i >> 24) & 0xff);
            prf.update(ibytes);
            prf.doFinal(ui, 0);
            System.arraycopy(ui, 0, ti, 0, ui.length);

            for (int j = 2; j <= iterCount; j++) {
                prf.update(ui);
                prf.doFinal(ui, 0);
                // XOR the intermediate Ui's together.
                for (int k = 0; k < ui.length; k++) {
                    ti[k] ^= ui[k];
                }
            }
            if (i == intL) {
                System.arraycopy(ti, 0, key, (i-1)*hlen, intR);
            } else {
                System.arraycopy(ti, 0, key, (i-1)*hlen, hlen);
            }
        }
    } catch (GeneralSecurityException gse) {
        throw new RuntimeException("Error deriving PBKDF2 keys");
    }
    return key;
}
 
Example 19
Source File: CryptoHelper.java    From java-jwt with MIT License 3 votes vote down vote up
/**
 * Create signature for JWT header and payload.
 *
 * @param algorithm algorithm name.
 * @param secretBytes algorithm secret.
 * @param headerBytes JWT header.
 * @param payloadBytes JWT payload.
 * @return the signature bytes.
 * @throws NoSuchAlgorithmException if the algorithm is not supported.
 * @throws InvalidKeyException if the given key is inappropriate for initializing the specified algorithm.
 */

byte[] createSignatureFor(String algorithm, byte[] secretBytes, byte[] headerBytes, byte[] payloadBytes) throws NoSuchAlgorithmException, InvalidKeyException {
    final Mac mac = Mac.getInstance(algorithm);
    mac.init(new SecretKeySpec(secretBytes, algorithm));
    mac.update(headerBytes);
    mac.update(JWT_PART_SEPARATOR);
    return mac.doFinal(payloadBytes);
}
 
Example 20
Source File: HmacUtils.java    From java-android-websocket-client with Apache License 2.0 2 votes vote down vote up
/**
 * Updates the given {@link Mac}. This generates a digest for valueToDigest and the key the Mac was initialized
 *
 * @param mac
 *            the initialized {@link Mac} to update
 * @param valueToDigest
 *            the value to update the {@link Mac} with (maybe null or empty)
 * @return the updated {@link Mac}
 * @throws IllegalStateException
 *             if the Mac was not initialized
 * @since 1.x
 */
public static Mac updateHmac(final Mac mac, final byte[] valueToDigest) {
    mac.reset();
    mac.update(valueToDigest);
    return mac;
}