Code Monkey home page Code Monkey logo

security-samples's Introduction

Android Security Samples Repository

This repository contains a set of individual Android Studio projects to help you get started writing/understanding Android security features.

This is the canonical sample that demonstrates how to integrate Android Biometrics into your apps. Whether your project is for government, healthcare, financial, enterprise, or general usage, this sample should guide your implementation.

This sample demonstrates how to store and access data in a device protected storage that is always available while the device is booted.

A sample that demonstrates how to use the Jetpack Security library to encrypt and decrypt files by implementing a simple note taking app.

security-samples's People

Contributors

codingjeremy avatar ggfan avatar guilhe avatar isaidamier avatar jdkoren avatar jmarkoff avatar kokoro-team avatar kvvat avatar nic0lette avatar scauzhangpeng avatar yrezgui avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

security-samples's Issues

CRASH when app go in background

Issue by doffi88
Tuesday Nov 08, 2016 at 09:38 GMT
Originally opened as googlearchive/android-FingerprintDialog#42


hy guys, sorry for my english , I have this problem when I close authentication dialog and app go in background

D/AbstractTracker: Event success
E/System: Uncaught exception thrown by finalizer
E/System: java.lang.IllegalStateException: Binder has been finalized!
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:536)
at android.security.IKeystoreService$Stub$Proxy.abort(IKeystoreService.java:1302)
at android.security.KeyStore.abort(KeyStore.java:496)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.finalize(AndroidKeyStoreCipherSpiBase.java:680)
at android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding.finalize(AndroidKeyStoreUnauthenticatedAESCipherSpi.java:73)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:219)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:197)
at java.lang.Thread.run(Thread.java:818)

how can I resolve this issue?

thanks in advance

Does not work on Motorola Nexus6

Issue by DirajHS
Monday Jun 13, 2016 at 09:20 GMT
Originally opened as googlearchive/android-DirectBoot#6


I am seeing this FATAL exception after boot saying:

java.lang.RuntimeException: Unable to instantiate receiver com.example.android.directboot.BootBroadcastReceiver: java.lang.ClassNotFoundException: Didn't find class "com.example.android.directboot.BootBroadcastReceiver" on path: DexPathList

java.lang.RuntimeException: Annotation processors must be explicitly declared now.

Issue by Lyonshare
Thursday Jun 14, 2018 at 21:45 GMT
Originally opened as googlearchive/android-FingerprintDialog#52


org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':Application:javaPreCompileDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.

  • dagger-compiler-1.2.2.jar (com.squareup.dagger:dagger-compiler:1.2.2)
    Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
    See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.
    at com.android.build.gradle.tasks.JavaPreCompileTask.preCompile(JavaPreCompileTask.java:142)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:780)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:747)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:121)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
    ... 32 more

Backup and restore

Hi
Is there a solution to backup and restore the encrypted file ans hared pref

Thank you

Getting Failure [INSTALL_FAILED_OLDER_SDK] error

Issue by Anushak5248
Tuesday Jun 16, 2015 at 08:11 GMT
Originally opened as googlearchive/android-FingerprintDialog#5


Hi,
I want to know about the biometric fingerprint so, when Im run this application Im unable to install. It shows me below error
pkg: /data/local/tmp/com.example.android.fingerprintdialog
Failure [INSTALL_FAILED_OLDER_SDK]
Even I have changed build .gradle file
compileSdkVersion "android-MNC"
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 15
maxSdkVersion 17
versionCode 1
versionName "1.0"
}
I want to check the functionality but im unable to get apk file
Please help me on this

Exception thrown after fingerprint app is closed ,as mentioned below

Issue by sairajkishore
Monday Aug 07, 2017 at 21:53 GMT
Originally opened as googlearchive/android-FingerprintDialog#50


java.lang.IllegalStateException: Binder has been finalized!
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:628)
at android.security.IKeystoreService$Stub$Proxy.abort(IKeystoreService.java:1387)
at android.security.KeyStore.abort(KeyStore.java:879)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.finalize(AndroidKeyStoreCipherSpiBase.java:744)
at android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding.finalize(AndroidKeyStoreUnauthenticatedAESCipherSpi.java)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:222)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:209)
at java.lang.Thread.run(Thread.java:762)

Fingerprint permission

Issue by andris95
Thursday Mar 16, 2017 at 08:16 GMT
Originally opened as googlearchive/android-FingerprintDialog#45


Hello! In this sample project there is comment like this:

Now the protection level of USE_FINGERPRINT permission is normal instead of dangerous.

But it is not true, in my project I am using compilseSdkVersion and targetSdkVersion 25.0.2.
And for example, to check if the device has a fingerprint sensor, i call this method:
if (!mFingerprintManager.isHardwareDetected())
and it says

if (!mFingerprintManager.isHardwareDetected())

Dialog destroyed on rotation

Issue by alex-townsend
Tuesday May 24, 2016 at 19:11 GMT
Originally opened as googlearchive/android-FingerprintDialog#30


The dialog fragment for the fingerprint authentication does not survive rotation, despite having setRetainInstanceState(true) set. This appears to be because the CancellationSignal does not emit the cancellation before the dialog fragment is recreated and resumed again -- mSelfCancelled = false then, causing mCallback.onError() to be called and to close the newly created dialog fragment to be dismissed.

Flow looks something like this (user selects Purchase to start):

  1. FingerprintAuthenticationDialogFragment created:
  • onResume() called -- mFingerprintUiHelper.startListening() called
  1. User rotates device
  • onPause() called -- mFingerprintUiHelper.stopListening() called (cancels CancellationSignal, sets mSelfCancelled = true)
  • No messages sent through FingerprintManager.AuthenticationCallback during this time
  1. New FingerprintAuthenticationDialogFragment created:
  • onResume() and startListening() called -- setting mSelfCancelled = false
  • now we get a cancellation message in UI Helper's onAuthenticationError, but I believe this cancel message is from the previous onPause() call

So it looks like the cancellation is not sent quickly enough on a rotation, causing the fragment created after the rotation to receive that cancellation message, which then closes the dialog fragment.

Android Enterprise app not detecting any fingerprints

Issue by ruscles
Monday Jul 03, 2017 at 14:18 GMT
Originally opened as googlearchive/android-FingerprintDialog#48


Hi,

I have an app that is developed to run inside the Android Enterprise container (for corporate devices). The fingerprint authentication from this sample works perfectly when the app is installed outside the enterprise container. However, when the app is running inside the container, it is unable to detect any fingerprints that the user registered outside the container (on the normal device).

It fails at this piece (line 137 of MainActivity):

if (!fingerprintManager.hasEnrolledFingerprints()) {
            // User hasn't enrolled any fingerprints to authenticate with
            Toast.makeText(this, "Go to 'Settings -> Security -> Fingerprint' and register at least one fingerprint", Toast.LENGTH_LONG).show();
            return;
        }

Is there a way to detect registered fingerprints outside the Enterprise container from an app that is running inside the container? I have tested this on an S7, S8, and Pixel. Thanks!

crash after emulator reboot

Issue by Ghostish
Monday Aug 01, 2016 at 01:49 GMT
Originally opened as googlearchive/android-FingerprintDialog#33


I was testing the sample app at Nexux 5x emulator.
When I restart the app after rebooting the emulator, it crashed.

In android monitor it read:

java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use

That's so weird . I checked the return value of mFingerprintManager.hasEnrolledFingerprints() ,which was true. But the exception still was thrown during the createKey() .

CRASH: on save instance state exception

Issue by br00
Wednesday Oct 12, 2016 at 07:50 GMT
Originally opened as googlearchive/android-FingerprintDialog#39


Hi,
To make it crash do this:

  • authenticate with your finger
  • the animation with "Fingerprint recognised" text is shown
  • because that animation has 1 sec of delay before calling the callback mCallback.onAuthenticated();
  • if you send the app in background during the animation then it crash (just press home button before the animation is gone)

The issue is that are missing some checks when you call dismiss()

@OverRide
public void onAuthenticated() {
// Callback from FingerprintUiHelper. Let the activity know that authentication was
// successful.
mActivity.onPurchased(true /* withFingerprint */, mCryptoObject);
dismiss();
}

I suggest to put
Activity anActivity = getActivity();
if (getDialog() != null && getDialog().isShowing() && isResumed() && anActivity != null && !anActivity.isFinishing()) {
dismiss();
}

or you can use dismissAllowingStateLoss()

Attachment.PLATFORM cause RESULT_CANCELED

STEPS TO REPRODUCE:

  1. Remove installed apk
  2. Android Studio debug reinstall apk
  3. Press "Create(Platform)" button, which is for FIDO2 CREATE by on-device authenticator only
    3.1. Expected fingerprint prompt, some devices work fine, but others might not as well
    3.2. The other devices which cannot work fine, after retry random times it'll work fine
  4. Press "Create(Cross-platform)" button, this is for FIDO2 CREATE by external authenticator only
    4.1. Press "Create(None)" button, this is for FIDO2 CREATE by any authenticator
    4.2. The above 2 button cause same WORK FINE result, it'll show the menu for user to choose which type of authenticator they want to use

EXPECTED RESULTS:
As above description 3.1

OBSERVED RESULTS:
As above description 3.2

Work FINE:
Asus Zenfone6: Android 10
Google Pixel 3: Android 11

NG:
HTC U11: Android 9
OPPO A3: Android 8.0.1
Samsung A8+: Android 9
Asus Zenfone3: Android 8

  • Android app version if an app related issue:
    compileSdkVersion 30
    defaultConfig {
    minSdkVersion 24
    targetSdkVersion 30
    }
    implementation 'com.google.android.gms:play-services-auth:18.1.0'
    implementation 'com.google.android.gms:play-services-fido:18.1.0'

More detail from Logcat:

2020-08-04 11:47:07.131 413-413/? E/Fido: [FingerprintUiHelper] Fingerprint authentication is not available
2020-08-04 11:47:07.132 413-413/? D/AndroidRuntime: Shutting down VM
2020-08-04 11:47:07.143 413-413/? I/GCore-Chimera-Crash: ChgKB2Fkc19mZHIQuL23ChiBAiCA56-OrwYKUwoJY29udGFpbm
VyEPjQzmAYQCCQopP_-zoqA3BheSoOdmlzaW9uLmJhcmNvZGUq
C3Zpc2lvbi5mYWNlKgp2aXNpb24uaWNhKgp2aXNpb24ub2NyCh
oKBm5lYXJieRCDx8HHBxiBAiCQibnToKzNAyAA
GCore-Chimera-Crash
2020-08-04 11:47:07.143 413-418/? I/art: Do partial code cache collection, code=59KB, data=61KB
2020-08-04 11:47:07.144 413-418/? I/art: After code cache collection, code=49KB, data=48KB
2020-08-04 11:47:07.144 413-418/? I/art: Increasing code cache capacity to 256KB
2020-08-04 11:47:07.146 413-413/? I/DeviceDrDatabaseHelper: Cleaning stale data from database!
2020-08-04 11:47:07.161 413-413/? W/DeviceDoctorHandler: Crash Hash: cd892641a62411098665ad95ac93c7c604ec07a8
2020-08-04 11:47:07.169 413-413/? W/DeviceDoctorHandler: Shushing crash.
2020-08-04 11:47:07.169 413-413/? E/DeviceDoctorHandler: FATAL EXCEPTION: main
Process: com.google.android.gms.ui, PID: 413
java.lang.IllegalStateException: Fragment already added: TmpXDialogFragmentProxy{b13b127} (3c415164-0f37-4294-957c-feb8a1738651) fragment_fingerprint_or_lock_screen}
at en.a(:com.google.android.gms@[email protected] (040400-320008519):3)
at eh.f(:com.google.android.gms@[email protected] (040400-320008519):1)
at eh.a(:com.google.android.gms@[email protected] (040400-320008519):65)
at eh.a(:com.google.android.gms@[email protected] (040400-320008519):9)
at eh.a(:com.google.android.gms@[email protected] (040400-320008519):263)
at ea.run(:com.google.android.gms@[email protected] (040400-320008519):0)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

Physical Devices - At least one fingerprint must be enrolled to create keys requiring user authentication for every use.

Issue by zolbayars
Friday Jun 09, 2017 at 08:37 GMT
Originally opened as googlearchive/android-FingerprintDialog#47


The app is throwing an IllegalStateException on following physical devices with registered fingerprints:

  • Samsung S5 - SM-G800H (Android 6.0.1 API 23)
  • Samsung Note 4 - SM-N9105S (Android 6.0.1 API 23)
  • Samsung S6 Edge - SM-G925F (Android 6.0.1 API 23)

I tried these without success:

  • Deleted all fingerprints and re-registered them again. (And setting screen lock with fingerprint)
  • Updated Android SDK Build-Tools to the latest.
  • Restarted the devices

What should I do?

Stacktrace:

06-09 16:24:59.682 6873-6873/com.example.android.fingerprintdialog E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.example.android.fingerprintdialog, PID: 6873
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.fingerprintdialog/com.example.android.fingerprintdialog.MainActivity}: java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3319)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
 at android.app.ActivityThread.access$1100(ActivityThread.java:229)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:148)
 at android.app.ActivityThread.main(ActivityThread.java:7331)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
 Caused by: java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use
 at com.example.android.fingerprintdialog.MainActivity.createKey(MainActivity.java:269)
 at com.example.android.fingerprintdialog.MainActivity.onCreate(MainActivity.java:152)
 at android.app.Activity.performCreate(Activity.java:6904)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
 at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:7331) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
 Caused by: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use
 at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:238)
 at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi$AES.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:53)
 at javax.crypto.KeyGenerator.init(KeyGenerator.java:189)
 at com.example.android.fingerprintdialog.MainActivity.createKey(MainActivity.java:265)
 at com.example.android.fingerprintdialog.MainActivity.onCreate(MainActivity.java:152) 
 at android.app.Activity.performCreate(Activity.java:6904) 
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266) 
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
 at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:7331) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
 Caused by: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use
 at android.security.keystore.KeymasterUtils.addUserAuthArgs(KeymasterUtils.java:115)
 at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:234)
 at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi$AES.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:53) 
 at javax.crypto.KeyGenerator.init(KeyGenerator.java:189) 
 at com.example.android.fingerprintdialog.MainActivity.createKey(MainActivity.java:265) 
 at com.example.android.fingerprintdialog.MainActivity.onCreate(MainActivity.java:152) 
 at android.app.Activity.performCreate(Activity.java:6904) 
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266) 
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
 at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:7331) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Role of cryptoObject

Issue by yashasvigirdhar
Tuesday Jun 06, 2017 at 07:14 GMT
Originally opened as googlearchive/android-FingerprintDialog#46


After going through the sample,

I am still curious about what is the use of passing cryptoObject to authenticate api of FingerprintManager.

If we see the code here, it stores the reference to cryptoObject in a field which it uses only at one place : to create the AuthenticationResult when authenticatin succeeds (see here).

Also, apart from this, it uses the cryptoObject's getOpId method to set some sessionId that it passes to authenticate api of IFingerprintService.

What's this OpId? I guess this is the thing that makes all difference, but I've no clue what it is and can't seem to find any documentation :-/

This question has been asked here, here and here but I didn't find a good answer in all the places.

Docs not clear on management of master key

In the FileLocker app, a master key is generated with the function getOrCreate(..). I assume this generates one global key for the app.
Is this key destroyed on upgrade? On uninstall? Can we rotate it? Should we?
I'm also curious what the mechanism is to stop hackers calling this same function to get the master key?

Caused by java.security.InvalidKeyException: Only SecretKey is supported

Issue by Lucashuang0802
Wednesday Jan 23, 2019 at 09:11 GMT
Originally opened as googlearchive/android-FingerprintDialog#55


Got an exception like this by using the standard approach to authenticate via fingerprint:

   private void generateKey() throws Exception {
        try {
            keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
            keyStore.load(null);
            keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                    .setUserAuthenticationRequired(true)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                    .build());
            keyGenerator.generateKey();
        } catch (KeyStoreException
                | NoSuchAlgorithmException
                | NoSuchProviderException
                | InvalidAlgorithmParameterException
                | CertificateException
                | IOException exc) {
            exc.printStackTrace();
            throw new Exception(exc);
        }
    }
    private boolean initCipher() {
        try {
            cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw new RuntimeException("Failed to get Cipher", e);
        }

        try {
            keyStore.load(null);
            SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return true;
        } catch (KeyPermanentlyInvalidatedException e) {
            return false;
        } catch (KeyStoreException | CertificateException
                | UnrecoverableKeyException | IOException
                | NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to init Cipher", e);
        }
    }
Caused by java.security.InvalidKeyException: Only SecretKey is supported
       at com.android.org.conscrypt.OpenSSLCipher.checkAndSetEncodedKey(OpenSSLCipher.java:436)
       at com.android.org.conscrypt.OpenSSLCipher.engineInit(OpenSSLCipher.java:261)
       at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2668)
       at javax.crypto.Cipher.tryCombinations(Cipher.java:2575)
       at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2480)
       at javax.crypto.Cipher.chooseProvider(Cipher.java:567)
       at javax.crypto.Cipher.init(Cipher.java:831)
       at javax.crypto.Cipher.init(Cipher.java:772)

Mostly users got crashes by 8 and 9 starts getting crashes:
screen shot 2019-01-23 at 1 10 10 am

Problem checkPassword

Issue by moisesvs
Friday Dec 11, 2015 at 10:36 GMT
Originally opened as googlearchive/android-FingerprintDialog#23


I am checking the source code of the fingerprintDialog and I saw the method checkPassword in the FingerprintAuthenticationDialogFragment class but this method isn't working because only checked if the password isn't empty and nothing else.

My question is: This method should check the pin code of the phone, no?

Regards

fail to detect new fingerprint enrolled

Issue by jiazhao2048
Monday Sep 05, 2016 at 10:12 GMT
Originally opened as googlearchive/android-FingerprintDialog#35


Hi, I test this app on Nexus5x and Samsung s6. It both fail to detect that a new fingerprint is enrolled.

What I was do:

  1. kill the app (not delete the app).
  2. enroll a new fingerprint.
  3. launch the app and click "purchase" button

It works out of expect and the new fingerprint also "purchase" successfully.

If the app is designed to work like this.So, how can I detect the change of fingerprint catalog? I need the user to re-input the password when the fingerprint cataglog is changed because of the security requirement.

Glad to see your reply soon. Thanks!

Does not work on Pixel C

Issue by debbiefu
Tuesday Jul 12, 2016 at 08:06 GMT
Originally opened as googlearchive/android-DirectBoot#7


07-12 03:24:22.197 492 526 E Parcel : Class not found when unmarshalling: com.example.android.directboot.alarms.Alarm
07-12 03:24:22.197 492 526 E Parcel : java.lang.ClassNotFoundException: com.example.android.directboot.alarms.Alarm
07-12 03:24:22.197 492 526 E Parcel : at java.lang.Class.classForName(Native Method)
07-12 03:24:22.197 492 526 E Parcel : at java.lang.Class.forName(Class.java:400)
07-12 03:24:22.197 492 526 E Parcel : at android.os.Parcel.readParcelableCreator(Parcel.java:2490)
07-12 03:24:22.197 492 526 E Parcel : at android.os.Parcel.readParcelable(Parcel.java:2444)
07-12 03:24:22.197 492 526 E Parcel : at android.os.Parcel.readValue(Parcel.java:2347)
07-12 03:24:22.197 492 526 E Parcel : at android.os.Parcel.readArrayMapInternal(Parcel.java:2700)
07-12 03:24:22.197 492 526 E Parcel : at android.os.BaseBundle.unparcel(BaseBundle.java:269)
07-12 03:24:22.197 492 526 E Parcel : at android.os.Bundle.putAll(Bundle.java:226)
07-12 03:24:22.197 492 526 E Parcel : at android.content.Intent.fillIn(Intent.java:8171)
07-12 03:24:22.197 492 526 E Parcel : at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:240)
07-12 03:24:22.197 492 526 E Parcel : at com.android.server.am.PendingIntentRecord.sendWithResult(PendingIntentRecord.java:209)
07-12 03:24:22.197 492 526 E Parcel : at com.android.server.am.ActivityManagerService.sendIntentSender(ActivityManagerService.java:7084)
07-12 03:24:22.197 492 526 E Parcel : at android.app.PendingIntent.send(PendingIntent.java:806)
07-12 03:24:22.197 492 526 E Parcel : at com.android.server.AlarmManagerService$DeliveryTracker.deliverLocked(AlarmManagerService.java:2984)
07-12 03:24:22.197 492 526 E Parcel : at com.android.server.AlarmManagerService.deliverAlarmsLocked(AlarmManagerService.java:2424)
07-12 03:24:22.197 492 526 E Parcel : at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:2543)
07-12 03:24:22.197 492 526 E Parcel : Caused by: java.lang.ClassNotFoundException: com.example.android.directboot.alarms.Alarm
07-12 03:24:22.197 492 526 E Parcel : at java.lang.Class.classForName(Native Method)
07-12 03:24:22.197 492 526 E Parcel : at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
07-12 03:24:22.197 492 526 E Parcel : at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
07-12 03:24:22.197 492 526 E Parcel : at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
07-12 03:24:22.197 492 526 E Parcel : ... 16 more
07-12 03:24:22.197 492 526 E Parcel : Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
--------- beginning of crash
07-12 03:24:22.204 3178 3215 E AndroidRuntime: FATAL EXCEPTION: IntentService[com.example.android.directboot.alarms.AlarmIntentService]
07-12 03:24:22.204 3178 3215 E AndroidRuntime: Process: com.example.android.directboot, PID: 3178
07-12 03:24:22.204 3178 3215 E AndroidRuntime: java.lang.NullPointerException: Attempt to read from field 'int com.example.android.directboot.alarms.Alarm.hour' on a null object reference
07-12 03:24:22.204 3178 3215 E AndroidRuntime: at com.example.android.directboot.alarms.AlarmIntentService.onHandleIntent(AlarmIntentService.java:54)
07-12 03:24:22.204 3178 3215 E AndroidRuntime: at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:67)
07-12 03:24:22.204 3178 3215 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
07-12 03:24:22.204 3178 3215 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
07-12 03:24:22.204 3178 3215 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)

Build Failed with dagger

Issue by AkashMen10
Thursday Apr 21, 2016 at 12:15 GMT
Originally opened as googlearchive/android-FingerprintDialog#27


Build failed with below error:
Error:(43, 9) error: cannot find symbol method library()
Error:(44, 9) error: cannot find symbol method injects()
Error:(44, 19) error: illegal initializer for
Error:Execution failed for task ':compileDebugJavaWithJavac'.

Compilation failed; see the compiler error output for details.

Get Which Biometric is used for authentication on Onsucesscallback

BiometricPrompt.AuthenticationResult only provide following value

AUTHENTICATION_RESULT_TYPE_UNKNOWN,
AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL,
AUTHENTICATION_RESULT_TYPE_BIOMETRIC

But from AUTHENTICATION_RESULT_TYPE_BIOMETRIC cant identify whether face or finger print or iris.

Usecase : my application only support finger print. Since Fingerprint only in strong authentication(class 3) now i can use, but safer side when any of other (fingerprint , iris) meet class 3 specification in future i need to show error message on success scenario.

How to Open Encrypted file on Windows PC?

Hi,

I see encrypted file able to decrypt in app is fine.
I want to know, how to open the encrypted file generated in app on Windows 10 PC using same password given Android app.

Please help on it.

Thank you.

Design issues of this sample

Issue by mice777
Tuesday Mar 14, 2017 at 21:24 GMT
Originally opened as googlearchive/android-FingerprintDialog#44


This sample is somehow incomplete:

  • it creates new symetric key at each start, which actually prohibits decryption of SECRET_MESSAGE anytime later
  • what's use of the SECRET_MESSAGE in this sample, when it's just encrypted (with problem above), and result is not saved, not used next time, it's just displayed on screen

I think that basic principles of AndroidKeyStore and FingerprintManager are somehow mixed to show that finger scanning works, but result is strange. All I get is "password entered or your finger recognized".

I'd expect that symetric key is created once if it's already not in keystore.
Then possibly encrypt user-entered password with the key, and save it to a file. Next time when fingerprint is used, decrypt saved encrypted password, and use it same way as if user entered it manually.
So user has choice to use fast path with finger, or slower path by typing password.

Meizu crashed when using AndroidKeyStore

Issue by jimmysuncpt
Thursday Jan 03, 2019 at 07:30 GMT
Originally opened as googlearchive/android-FingerprintDialog#54


There are crashes in some Meizu phones, such as M5 note, PRO 7 Plus and so on. The system version is Android 7.0. The log is:

java.util.concurrent.TimeoutException: android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding.finalize(AndroidKeyStoreUnauthenticatedAESCipherSpi.java) timed out after 20 seconds
	at android.os.BinderProxy.transactNative(BinderProxy.java)
	at android.os.BinderProxy.transact(BinderProxy.java:626)
	at android.security.IKeystoreService$Stub$Proxy.abort(IKeystoreService.java:1341)
	at android.security.KeyStore.abort(KeyStore.java:538)
	at android.security.keystore.AndroidKeyStoreCipherSpiBase.finalize(AndroidKeyStoreCipherSpiBase.java:744)
	at android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding.finalize(AndroidKeyStoreUnauthenticatedAESCipherSpi.java)
	at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:239)
	at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:226)
	at java.lang.Thread.run(Thread.java:761)

How to fix it?

Issue with the app

Issue by ravi6342
Tuesday Jul 16, 2019 at 13:14 GMT
Originally opened as googlearchive/android-FingerprintDialog#57


The app is not running on the device which does't have a fingerprint sensor. The app is crashing when i try to authenticate with the password and at the same time the password entered by me is not matching the system password and is letting me in the app with any letters.

KeyPermanentlyInvalidatedException not thrown all the time after enrolling new fingerprint

Issue by TheNephilim88
Monday Nov 30, 2015 at 20:18 GMT
Originally opened as googlearchive/android-FingerprintDialog#21


The initCipher()-method checks if lockscreen has been disabled or new fingerprints have been enrolled.
For this it checks if a KeyPermanentlyInvalidatedException will be thrown or not. If it wil lbe thrown, any of above reasons apply.

But this does not seem to trigger all the time. It only triggers randomly on my device (Nexus 5X) after adding new fingerprints.
Most of the time I get normal fingerprint-authentication dialog and it works as nothing has been changed. Only very few times I get "A new fingerprint was added to this device"-message to reauthenticate.

Can anyone tell me why this is not triggering all the time when new fingerprints have been enrolled? Is this a bug or a feature? :D

Is it possible to check for fingerprint-changes in another way?

What's the ProGuard config?

Set "minifyEnabled" to true(no problem if set false) before running release apk, there would be a FC:

2020-05-18 13:10:21.228 1992-1992/com.my.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.my.app, PID: 1992
    java.lang.ExceptionInInitializerError
        at androidx.security.crypto.EncryptedSharedPreferences$PrefKeyEncryptionScheme.<clinit>(:146)
        at c.c.d.f.i.g.<clinit>(:35)
        at c.c.d.f.i.g.a(:110)
        at c.c.d.f.f.l(:148)
        at c.c.d.f.f.m(:120)
        at c.c.d.f.f.a(:63)
        at com.my.app.MyApp$a.a(:69)
        at d.a.a.onCreate(:181)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6609)
        at android.app.ActivityThread.access$1400(ActivityThread.java:229)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1892)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:228)
        at android.app.ActivityThread.main(ActivityThread.java:7589)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)
     Caused by: java.lang.RuntimeException: Field keySize_ for c.b.c.a.g.ja not found. Known fields are [public int c.b.c.a.g.ja.g, public static final c.b.c.a.g.ja c.b.c.a.g.ja.e, public static volatile c.b.e.ea c.b.c.a.g.ja.f]
        at c.b.e.Y.a(:608)
        at c.b.e.Y.a(:502)
        at c.b.e.Y.a(:221)
        at c.b.e.N.a(:85)
        at c.b.e.N.a(:71)
        at c.b.e.ga.a(:93)
        at c.b.e.ga.a(:107)
        at com.google.protobuf.GeneratedMessageLite.l(:171)
        at com.google.protobuf.GeneratedMessageLite$a.d(:391)
        at com.google.protobuf.GeneratedMessageLite$a.c(:399)
        at c.b.c.a.c.e.a(:45)
        at c.b.c.a.c.e.<clinit>(:38)
        at androidx.security.crypto.EncryptedSharedPreferences$PrefKeyEncryptionScheme.<clinit>(:146) 
        at c.c.d.f.i.g.<clinit>(:35) 
        at c.c.d.f.i.g.a(:110) 
        at c.c.d.f.f.l(:148) 
        at c.c.d.f.f.m(:120) 
        at c.c.d.f.f.a(:63) 
        at com.my.app.MyApp$a.a(:69) 
        at d.a.a.onCreate(:181) 
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6609) 
        at android.app.ActivityThread.access$1400(ActivityThread.java:229) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1892) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:228) 
        at android.app.ActivityThread.main(ActivityThread.java:7589) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953) 

I tried:

-keep class androidx.security.crypto.** {*;}
-keep public enum androidx.security.crypto.EncryptedSharedPreferences$** {
  **[] $VALUES;
  public *;
}

but not working.

method encryptFile() has bug

 private fun encryptFile() {
        val title = binding.titleEditText.text.toString()
        val body = binding.bodyEditText.text.toString()

        if (title.isBlank()) return

        try {
            deleteFile(existingFileTitle)
            val encryptedFile = getEncryptedFile(title)
            encryptedFile.openFileOutput().use { output ->
                output.write(body.toByteArray())
            }
        } catch (e: Exception) {
            e.printStackTrace()
            showSnackbar(R.string.error_unable_to_save_file)
        }
    }

should change deleteFile(existingFileTitle) to deleteFile(title )

Delete registered WebAuthn login from my phone?

---can be deleted---
Useless summary for the curious:
I was wondering how to remove registered WebAuthn accounts. It turns out they can be overwritten by the software, or they can be removed by removing the fingerprints/screen lock. I merely got confused by the software I used (didn't actually delete the account server-side, so re-registering didn't work).
---can be deleted---

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.