use of org.bouncycastle.crypto.Mac in project robovm by robovm.
the class CCMBlockCipher method calculateMac.
private int calculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock) {
Mac cMac = new CBCBlockCipherMac(cipher, macSize * 8);
cMac.init(keyParam);
//
// build b0
//
byte[] b0 = new byte[16];
if (hasAssociatedText()) {
b0[0] |= 0x40;
}
b0[0] |= (((cMac.getMacSize() - 2) / 2) & 0x7) << 3;
b0[0] |= ((15 - nonce.length) - 1) & 0x7;
System.arraycopy(nonce, 0, b0, 1, nonce.length);
int q = dataLen;
int count = 1;
while (q > 0) {
b0[b0.length - count] = (byte) (q & 0xff);
q >>>= 8;
count++;
}
cMac.update(b0, 0, b0.length);
//
if (hasAssociatedText()) {
int extra;
int textLength = getAssociatedTextLength();
if (textLength < ((1 << 16) - (1 << 8))) {
cMac.update((byte) (textLength >> 8));
cMac.update((byte) textLength);
extra = 2;
} else // can't go any higher than 2^32
{
cMac.update((byte) 0xff);
cMac.update((byte) 0xfe);
cMac.update((byte) (textLength >> 24));
cMac.update((byte) (textLength >> 16));
cMac.update((byte) (textLength >> 8));
cMac.update((byte) textLength);
extra = 6;
}
if (initialAssociatedText != null) {
cMac.update(initialAssociatedText, 0, initialAssociatedText.length);
}
if (associatedText.size() > 0) {
byte[] tmp = associatedText.toByteArray();
cMac.update(tmp, 0, tmp.length);
}
extra = (extra + textLength) % 16;
if (extra != 0) {
for (int i = extra; i != 16; i++) {
cMac.update((byte) 0x00);
}
}
}
//
// add the text
//
cMac.update(data, dataOff, dataLen);
return cMac.doFinal(macBlock, 0);
}
use of org.bouncycastle.crypto.Mac in project google-authenticator by google.
the class AuthenticatorScreen method computePin.
/**
* Computes the one-time PIN given the secret key.
*
* @param secret
* the secret key
* @return the PIN
* @throws GeneralSecurityException
* @throws DecodingException
* If the key string is improperly encoded.
*/
public static String computePin(String secret, Long counter) {
try {
final byte[] keyBytes = Base32String.decode(secret);
Mac mac = new HMac(new SHA1Digest());
mac.init(new KeyParameter(keyBytes));
PasscodeGenerator pcg = new PasscodeGenerator(mac);
if (counter == null) {
// time-based totp
return pcg.generateTimeoutCode();
} else {
// counter-based hotp
return pcg.generateResponseCode(counter.longValue());
}
} catch (RuntimeException e) {
return "General security exception";
} catch (DecodingException e) {
return "Decoding exception";
}
}
use of org.bouncycastle.crypto.Mac in project XobotOS by xamarin.
the class CCMBlockCipher method calculateMac.
private int calculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock) {
Mac cMac = new CBCBlockCipherMac(cipher, macSize * 8);
cMac.init(keyParam);
//
// build b0
//
byte[] b0 = new byte[16];
if (hasAssociatedText()) {
b0[0] |= 0x40;
}
b0[0] |= (((cMac.getMacSize() - 2) / 2) & 0x7) << 3;
b0[0] |= ((15 - nonce.length) - 1) & 0x7;
System.arraycopy(nonce, 0, b0, 1, nonce.length);
int q = dataLen;
int count = 1;
while (q > 0) {
b0[b0.length - count] = (byte) (q & 0xff);
q >>>= 8;
count++;
}
cMac.update(b0, 0, b0.length);
//
if (hasAssociatedText()) {
int extra;
if (associatedText.length < ((1 << 16) - (1 << 8))) {
cMac.update((byte) (associatedText.length >> 8));
cMac.update((byte) associatedText.length);
extra = 2;
} else // can't go any higher than 2^32
{
cMac.update((byte) 0xff);
cMac.update((byte) 0xfe);
cMac.update((byte) (associatedText.length >> 24));
cMac.update((byte) (associatedText.length >> 16));
cMac.update((byte) (associatedText.length >> 8));
cMac.update((byte) associatedText.length);
extra = 6;
}
cMac.update(associatedText, 0, associatedText.length);
extra = (extra + associatedText.length) % 16;
if (extra != 0) {
for (int i = 0; i != 16 - extra; i++) {
cMac.update((byte) 0x00);
}
}
}
//
// add the text
//
cMac.update(data, dataOff, dataLen);
return cMac.doFinal(macBlock, 0);
}
use of org.bouncycastle.crypto.Mac in project google-authenticator by google.
the class CheckCodeScreen method getCheckCode.
static String getCheckCode(String secret) throws Base32String.DecodingException {
final byte[] keyBytes = Base32String.decode(secret);
Mac mac = new HMac(new SHA1Digest());
mac.init(new KeyParameter(keyBytes));
PasscodeGenerator pcg = new PasscodeGenerator(mac);
return pcg.generateResponseCode(0L);
}
Aggregations