Search in sources :

Example 1 with DecodingException

use of com.google.authenticator.blackberry.Base32String.DecodingException 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";
    }
}
Also used : HMac(org.bouncycastle.crypto.macs.HMac) SHA1Digest(org.bouncycastle.crypto.digests.SHA1Digest) KeyParameter(org.bouncycastle.crypto.params.KeyParameter) DecodingException(com.google.authenticator.blackberry.Base32String.DecodingException) HMac(org.bouncycastle.crypto.macs.HMac) Mac(org.bouncycastle.crypto.Mac)

Example 2 with DecodingException

use of com.google.authenticator.blackberry.Base32String.DecodingException in project google-authenticator by google.

the class AuthenticatorScreen method parseSecret.

/**
   * Parses a secret value from a URI. The format will be:
   * 
   * <pre>
   * https://www.google.com/accounts/KeyProv?user=username#secret 
   *   OR
   * totp://username@domain#secret  
   * otpauth://totp/user@example.com?secret=FFF...
   * otpauth://hotp/user@example.com?secret=FFF...&amp;counter=123
   * </pre>
   * 
   * @param uri The URI containing the secret key
   */
void parseSecret(Uri uri) {
    String scheme = uri.getScheme().toLowerCase();
    String path = uri.getPath();
    String authority = uri.getAuthority();
    String user = DEFAULT_USER;
    String secret;
    AccountDb.OtpType type = AccountDb.OtpType.TOTP;
    // only interesting for HOTP
    Integer counter = new Integer(0);
    if (OTP_SCHEME.equals(scheme)) {
        if (authority != null && authority.equals(TOTP)) {
            type = AccountDb.OtpType.TOTP;
        } else if (authority != null && authority.equals(HOTP)) {
            type = AccountDb.OtpType.HOTP;
            String counterParameter = uri.getQueryParameter(COUNTER_PARAM);
            if (counterParameter != null) {
                counter = Integer.valueOf(counterParameter);
            }
        }
        if (path != null && path.length() > 1) {
            // path is "/user", so remove leading /
            user = path.substring(1);
        }
        secret = uri.getQueryParameter(SECRET_PARAM);
    // TODO: remove TOTP scheme
    } else if (TOTP.equals(scheme)) {
        if (authority != null) {
            user = authority;
        }
        secret = uri.getFragment();
    } else {
        // https://www.google.com... URI format
        String userParam = uri.getQueryParameter(USER_PARAM);
        if (userParam != null) {
            user = userParam;
        }
        secret = uri.getFragment();
    }
    if (secret == null) {
        // Secret key not found in URI
        return;
    }
    // TODO: April 2010 - remove version parameter handling.
    String version = uri.getQueryParameter(VERSION_PARAM);
    if (version == null) {
        // version is null for legacy URIs
        try {
            secret = Base32String.encode(Base32Legacy.decode(secret));
        } catch (DecodingException e) {
            // Error decoding legacy key from URI
            e.printStackTrace();
        }
    }
    if (!secret.equals(getSecret(user)) || counter != AccountDb.getCounter(user) || type != AccountDb.getType(user)) {
        saveSecret(user, secret, null, type);
        mStatusText.setText(sResources.getString(SECRET_SAVED));
    }
}
Also used : OtpType(com.google.authenticator.blackberry.AccountDb.OtpType) DecodingException(com.google.authenticator.blackberry.Base32String.DecodingException)

Aggregations

DecodingException (com.google.authenticator.blackberry.Base32String.DecodingException)2 OtpType (com.google.authenticator.blackberry.AccountDb.OtpType)1 Mac (org.bouncycastle.crypto.Mac)1 SHA1Digest (org.bouncycastle.crypto.digests.SHA1Digest)1 HMac (org.bouncycastle.crypto.macs.HMac)1 KeyParameter (org.bouncycastle.crypto.params.KeyParameter)1