Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Android Source
Vendor Blobs
vendor_xiaomi_sdm845-common-extra
Commits
bca11b1c
Commit
bca11b1c
authored
Oct 26, 2021
by
Chenyang Zhong
Browse files
sdm845-common: initial import of IFAA
Signed-off-by:
Chenyang Zhong
<
zhongcy95@gmail.com
>
parent
12ea90f9
Changes
9
Hide whitespace changes
Inline
Side-by-side
ifaa.mk
0 → 100644
View file @
bca11b1c
PRODUCT_PACKAGES
+=
\
org.ifaa.android.manager
PRODUCT_BOOT_JARS
+=
\
org.ifaa.android.manager
org.ifaa.android.manager/Android.bp
0 → 100644
View file @
bca11b1c
/*
* Copyright (C) 2017-2020 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
java_library {
name: "org.ifaa.android.manager",
installable: true,
srcs: [
"src/**/*.java",
"src/**/I*.aidl",
],
libs: [
"app-compat-annotations",
"unsupportedappusage",
],
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IFAAManager.java
0 → 100644
View file @
bca11b1c
package
org.ifaa.android.manager
;
import
android.compat.annotation.UnsupportedAppUsage
;
import
android.content.Context
;
import
android.os.Build.VERSION
;
import
android.os.SystemProperties
;
public
abstract
class
IFAAManager
{
private
static
final
int
IFAA_VERSION_V2
=
2
;
private
static
final
int
IFAA_VERSION_V3
=
3
;
private
static
final
int
IFAA_VERSION_V4
=
4
;
static
int
sIfaaVer
;
static
boolean
sIsFod
=
SystemProperties
.
getBoolean
(
"ro.hardware.fp.fod"
,
false
);
/**
* 返回手机系统上支持的校验方式,目前IFAF协议1.0版本指纹为0x01、虹膜为0x02
*/
@UnsupportedAppUsage
public
abstract
int
getSupportBIOTypes
(
Context
context
);
/**
* 启动系统的指纹/虹膜管理应用界面,让用户进行指纹录入。指纹录入是在系统的指纹管理应用中实现的,
* 本函数的作用只是将指纹管理应用运行起来,直接进行页面跳转,方便用户录入。
* @param context
* @param authType 生物特征识别类型,指纹为1,虹膜为2
* @return 0,成功启动指纹管理应用;-1,启动指纹管理应用失败。
*/
@UnsupportedAppUsage
public
abstract
int
startBIOManager
(
Context
context
,
int
authType
);
/**
* 通过ifaateeclient的so文件实现REE到TA的通道
* @param context
* @param param 用于传输到IFAA TA的数据buffer
* @return IFAA TA返回给REE数据buffer
*/
@UnsupportedAppUsage
public
native
byte
[]
processCmd
(
Context
context
,
byte
[]
param
);
/**
* 获取设备型号,同一款机型型号需要保持一致
*/
@UnsupportedAppUsage
public
abstract
String
getDeviceModel
();
/**
* 获取IFAAManager接口定义版本,目前为1
*/
@UnsupportedAppUsage
public
abstract
int
getVersion
();
/**
* load so to communicate from REE to TEE
*/
static
{
sIfaaVer
=
1
;
if
(
VERSION
.
SDK_INT
>=
28
)
{
sIfaaVer
=
IFAA_VERSION_V4
;
}
else
if
(
sIsFod
)
{
sIfaaVer
=
IFAA_VERSION_V3
;
}
else
if
(
VERSION
.
SDK_INT
>=
24
)
{
sIfaaVer
=
IFAA_VERSION_V2
;
}
else
{
System
.
loadLibrary
(
"teeclientjni"
);
//teeclientjni for TA test binary //ifaateeclient
}
}
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IFAAManagerFactory.java
0 → 100644
View file @
bca11b1c
package
org.ifaa.android.manager
;
import
android.compat.annotation.UnsupportedAppUsage
;
import
android.content.Context
;
public
class
IFAAManagerFactory
{
@UnsupportedAppUsage
public
static
IFAAManager
getIFAAManager
(
Context
context
,
int
authType
)
{
return
IFAAManagerImpl
.
getInstance
(
context
);
}
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IFAAManagerImpl.java
0 → 100644
View file @
bca11b1c
package
org.ifaa.android.manager
;
import
android.content.ComponentName
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.ServiceConnection
;
import
android.os.Build
;
import
android.os.Build.VERSION
;
import
android.os.HwBinder
;
import
android.os.HwBlob
;
import
android.os.HwParcel
;
import
android.os.IBinder
;
import
android.os.IBinder.DeathRecipient
;
import
android.os.IHwBinder
;
import
android.os.Parcel
;
import
android.os.RemoteException
;
import
android.os.SystemProperties
;
import
android.util.Slog
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
org.json.JSONObject
;
public
class
IFAAManagerImpl
extends
IFAAManagerV4
{
private
static
final
int
CODE_PROCESS_CMD
=
1
;
private
static
final
int
CODE_GETIDLIST_CMD
=
2
;
private
static
final
int
IFAA_TYPE_FINGER
=
1
;
private
static
final
int
IFAA_TYPE_IRIS
=
2
;
private
static
final
int
IFAA_TYPE_SENSOR_FOD
=
16
;
private
static
final
int
ACTIVITY_START_SUCCESS
=
0
;
private
static
final
int
ACTIVITY_START_FAILED
=
-
1
;
private
static
volatile
IFAAManagerImpl
INSTANCE
=
null
;
private
static
final
String
CA_CERT_ALIAS_DELIMITER
=
" "
;
private
static
final
String
INTERFACE_DESCRIPTOR
=
"vendor.xiaomi.hardware.mlipay@1.0::IMlipayService"
;
private
static
final
String
SERVICE_NAME
=
"vendor.xiaomi.hardware.mlipay@1.0::IMlipayService"
;
private
static
final
String
TAG
=
"IfaaManagerImpl"
;
private
static
final
String
mIfaaActName
=
"org.ifaa.android.manager.IFAAService"
;
private
static
final
String
mIfaaInterfaceDesc
=
"org.ifaa.android.manager.IIFAAService"
;
private
static
final
String
mIfaaPackName
=
"com.tencent.soter.soterserver"
;
private
static
IBinder
mService
=
null
;
private
String
mDevModel
=
null
;
private
static
Context
mContext
=
null
;
private
static
ServiceConnection
ifaaconn
=
new
ServiceConnection
()
{
public
void
onServiceConnected
(
ComponentName
name
,
IBinder
service
)
{
mService
=
service
;
try
{
mService
.
linkToDeath
(
mDeathRecipient
,
0
);
}
catch
(
RemoteException
e
)
{
Slog
.
e
(
TAG
,
"linkToDeath fail."
,
e
);
}
}
public
void
onServiceDisconnected
(
ComponentName
name
)
{
if
(
mContext
!=
null
)
{
Slog
.
i
(
TAG
,
"re-bind the service."
);
initService
();
}
}
};
private
static
DeathRecipient
mDeathRecipient
=
new
DeathRecipient
()
{
public
void
binderDied
()
{
if
(
mService
!=
null
)
{
Slog
.
d
(
TAG
,
"binderDied, unlink the service."
);
mService
.
unlinkToDeath
(
mDeathRecipient
,
0
);
}
}
};
public
static
IFAAManagerV4
getInstance
(
Context
context
)
{
if
(
INSTANCE
==
null
)
{
synchronized
(
IFAAManagerImpl
.
class
)
{
if
(
INSTANCE
==
null
)
{
INSTANCE
=
new
IFAAManagerImpl
();
if
(
VERSION
.
SDK_INT
>=
28
)
{
mContext
=
context
;
initService
();
}
}
}
}
return
INSTANCE
;
}
private
String
initExtString
()
{
String
extStr
=
""
;
JSONObject
obj
=
new
JSONObject
();
JSONObject
keyInfo
=
new
JSONObject
();
String
xy
=
""
;
String
wh
=
""
;
if
(
VERSION
.
SDK_INT
>=
28
)
{
xy
=
SystemProperties
.
get
(
"persist.vendor.sys.fp.fod.location.X_Y"
,
""
);
wh
=
SystemProperties
.
get
(
"persist.vendor.sys.fp.fod.size.width_height"
,
""
);
}
else
{
xy
=
SystemProperties
.
get
(
"persist.sys.fp.fod.location.X_Y"
,
""
);
wh
=
SystemProperties
.
get
(
"persist.sys.fp.fod.size.width_height"
,
""
);
}
try
{
if
(
validateVal
(
xy
)
&&
validateVal
(
wh
))
{
String
[]
splitXy
=
xy
.
split
(
","
);
String
[]
splitWh
=
wh
.
split
(
","
);
keyInfo
.
put
(
"startX"
,
Integer
.
parseInt
(
splitXy
[
0
]));
keyInfo
.
put
(
"startY"
,
Integer
.
parseInt
(
splitXy
[
1
]));
keyInfo
.
put
(
"width"
,
Integer
.
parseInt
(
splitWh
[
0
]));
keyInfo
.
put
(
"height"
,
Integer
.
parseInt
(
splitWh
[
1
]));
keyInfo
.
put
(
"navConflict"
,
true
);
obj
.
put
(
"type"
,
0
);
obj
.
put
(
"fullView"
,
keyInfo
);
extStr
=
obj
.
toString
();
}
else
{
Slog
.
e
(
TAG
,
"initExtString invalidate, xy:"
+
xy
+
" wh:"
+
wh
);
}
}
catch
(
Exception
e
)
{
Slog
.
e
(
TAG
,
"Exception , xy:"
+
xy
+
" wh:"
+
wh
,
e
);
}
return
extStr
;
}
private
static
void
initService
()
{
Intent
ifaaIntent
=
new
Intent
();
ifaaIntent
.
setClassName
(
mIfaaPackName
,
mIfaaActName
);
if
(!
mContext
.
bindService
(
ifaaIntent
,
ifaaconn
,
1
))
{
Slog
.
e
(
TAG
,
"cannot bind service org.ifaa.android.manager.IFAAService"
);
}
}
private
boolean
validateVal
(
String
value
)
{
return
!
""
.
equalsIgnoreCase
(
value
)
&&
value
.
contains
(
","
);
}
public
String
getDeviceModel
()
{
if
(
mDevModel
==
null
)
{
mDevModel
=
Build
.
MANUFACTURER
+
"-"
+
Build
.
DEVICE
;
}
Slog
.
i
(
TAG
,
"getDeviceModel deviceModel:"
+
mDevModel
);
return
mDevModel
;
}
public
int
getEnabled
(
int
bioType
)
{
return
1
==
bioType
?
1000
:
1003
;
}
public
String
getExtInfo
(
int
authType
,
String
keyExtInfo
)
{
Slog
.
i
(
TAG
,
"getExtInfo:"
+
authType
+
CA_CERT_ALIAS_DELIMITER
+
keyExtInfo
);
return
initExtString
();
}
public
int
[]
getIDList
(
int
bioType
)
{
int
[]
idList
=
new
int
[]{
0
};
if
(
1
==
bioType
)
{
int
retry_count
=
10
;
while
(
true
)
{
int
retry_count2
=
retry_count
-
1
;
if
(
retry_count
<=
0
)
{
break
;
}
if
(
mService
==
null
||
!
mService
.
pingBinder
())
{
try
{
Thread
.
sleep
(
30
);
}
catch
(
InterruptedException
e
)
{
Slog
.
e
(
TAG
,
"getIDList InterruptedException while waiting: "
+
e
,
e
);
}
}
else
{
Parcel
data
=
Parcel
.
obtain
();
Parcel
reply
=
Parcel
.
obtain
();
try
{
data
.
writeInterfaceToken
(
mIfaaInterfaceDesc
);
data
.
writeInt
(
bioType
);
mService
.
transact
(
CODE_GETIDLIST_CMD
,
data
,
reply
,
0
);
reply
.
readException
();
idList
=
reply
.
createIntArray
();
}
catch
(
RemoteException
e
)
{
Slog
.
e
(
TAG
,
"getIDList transact failed. "
,
e
);
}
catch
(
Throwable
th
)
{
data
.
recycle
();
reply
.
recycle
();
}
data
.
recycle
();
reply
.
recycle
();
}
retry_count
=
retry_count2
;
}
}
return
idList
;
}
public
int
getSupportBIOTypes
(
Context
context
)
{
int
ifaaProp
;
String
fpVendor
=
""
;
if
(
VERSION
.
SDK_INT
>=
28
)
{
ifaaProp
=
SystemProperties
.
getInt
(
"persist.vendor.sys.pay.ifaa"
,
0
);
fpVendor
=
SystemProperties
.
get
(
"persist.vendor.sys.fp.vendor"
,
""
);
}
else
{
ifaaProp
=
SystemProperties
.
getInt
(
"persist.sys.ifaa"
,
0
);
fpVendor
=
SystemProperties
.
get
(
"persist.sys.fp.vendor"
,
""
);
}
int
res
=
"none"
.
equalsIgnoreCase
(
fpVendor
)
?
ifaaProp
&
IFAA_TYPE_IRIS
:
ifaaProp
&
(
IFAA_TYPE_FINGER
|
IFAA_TYPE_IRIS
);
if
((
res
&
IFAA_TYPE_FINGER
)
==
IFAA_TYPE_FINGER
&&
sIsFod
)
{
res
|=
IFAA_TYPE_SENSOR_FOD
;
}
Slog
.
i
(
TAG
,
"getSupportBIOTypes:"
+
ifaaProp
+
", "
+
sIsFod
+
", "
+
fpVendor
+
", res:"
+
res
);
return
res
;
}
public
int
getVersion
()
{
Slog
.
i
(
TAG
,
"getVersion sdk:"
+
VERSION
.
SDK_INT
+
" ifaaVer:"
+
sIfaaVer
);
return
sIfaaVer
;
}
public
byte
[]
processCmdV2
(
Context
context
,
byte
[]
param
)
{
Slog
.
i
(
TAG
,
"processCmdV2 sdk:"
+
VERSION
.
SDK_INT
);
if
(
VERSION
.
SDK_INT
>=
28
)
{
int
retry_count
=
10
;
while
(
true
)
{
int
retry_count2
=
retry_count
-
1
;
if
(
retry_count
<=
0
)
{
break
;
}
if
(
mService
==
null
||
!
mService
.
pingBinder
())
{
Slog
.
i
(
TAG
,
"processCmdV2 waiting ifaaService, remain: "
+
retry_count2
+
" time(s)"
);
try
{
Thread
.
sleep
(
30
);
}
catch
(
InterruptedException
e
)
{
Slog
.
e
(
TAG
,
"processCmdV2 InterruptedException while waiting: "
+
e
,
e
);
}
}
else
{
Parcel
data
=
Parcel
.
obtain
();
Parcel
reply
=
Parcel
.
obtain
();
try
{
data
.
writeInterfaceToken
(
mIfaaInterfaceDesc
);
data
.
writeByteArray
(
param
);
mService
.
transact
(
CODE_PROCESS_CMD
,
data
,
reply
,
0
);
reply
.
readException
();
return
reply
.
createByteArray
();
}
catch
(
RemoteException
e
)
{
Slog
.
e
(
TAG
,
"processCmdV2 transact failed. "
,
e
);
retry_count
=
retry_count2
;
}
finally
{
data
.
recycle
();
reply
.
recycle
();
}
}
retry_count
=
retry_count2
;
}
Slog
.
e
(
TAG
,
"processCmdV2, return null"
);
return
null
;
}
HwParcel
hidl_reply
=
new
HwParcel
();
try
{
IHwBinder
hwService
=
HwBinder
.
getService
(
SERVICE_NAME
,
"default"
);
if
(
hwService
!=
null
)
{
HwParcel
hidl_request
=
new
HwParcel
();
hidl_request
.
writeInterfaceToken
(
INTERFACE_DESCRIPTOR
);
ArrayList
sbuf
=
new
ArrayList
(
Arrays
.
asList
(
HwBlob
.
wrapArray
(
param
)));
hidl_request
.
writeInt8Vector
(
sbuf
);
hidl_request
.
writeInt32
(
sbuf
.
size
());
hwService
.
transact
(
CODE_PROCESS_CMD
,
hidl_request
,
hidl_reply
,
0
);
hidl_reply
.
verifySuccess
();
hidl_request
.
releaseTemporaryStorage
();
ArrayList
<
Byte
>
val
=
hidl_reply
.
readInt8Vector
();
byte
[]
array
=
new
byte
[
val
.
size
()];
for
(
int
i
=
0
;
i
<
val
.
size
();
i
++)
{
array
[
i
]
=
((
Byte
)
val
.
get
(
i
)).
byteValue
();
}
hidl_reply
.
release
();
return
array
;
}
}
catch
(
RemoteException
e
)
{
Slog
.
e
(
TAG
,
"transact failed. "
,
e
);
}
catch
(
Throwable
th
)
{
hidl_reply
.
release
();
}
hidl_reply
.
release
();
Slog
.
e
(
TAG
,
"processCmdV2, return null"
);
return
null
;
}
public
void
setExtInfo
(
int
authType
,
String
keyExtInfo
,
String
valExtInfo
)
{
}
public
int
startBIOManager
(
Context
context
,
int
authType
)
{
int
res
=
ACTIVITY_START_FAILED
;
if
(
authType
==
IFAA_TYPE_FINGER
)
{
Intent
intent
=
new
Intent
(
"android.settings.SECURITY_SETTINGS"
);
intent
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
context
.
startActivity
(
intent
);
res
=
ACTIVITY_START_SUCCESS
;
}
Slog
.
i
(
TAG
,
"startBIOManager authType:"
+
authType
+
" res:"
+
res
);
return
res
;
}
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IFAAManagerV2.java
0 → 100644
View file @
bca11b1c
package
org.ifaa.android.manager
;
import
android.compat.annotation.UnsupportedAppUsage
;
import
android.content.Context
;
public
abstract
class
IFAAManagerV2
extends
IFAAManager
{
@UnsupportedAppUsage
public
abstract
byte
[]
processCmdV2
(
Context
paramContext
,
byte
[]
paramArrayOfByte
);
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IFAAManagerV3.java
0 → 100644
View file @
bca11b1c
package
org.ifaa.android.manager
;
import
android.compat.annotation.UnsupportedAppUsage
;
public
abstract
class
IFAAManagerV3
extends
IFAAManagerV2
{
@UnsupportedAppUsage
public
static
final
String
KEY_FINGERPRINT_FULLVIEW
=
"org.ifaa.ext.key.CUSTOM_VIEW"
;
@UnsupportedAppUsage
public
static
final
String
KEY_GET_SENSOR_LOCATION
=
"org.ifaa.ext.key.GET_SENSOR_LOCATION"
;
@UnsupportedAppUsage
public
static
final
String
VALUE_FINGERPRINT_DISABLE
=
"disable"
;
@UnsupportedAppUsage
public
static
final
String
VLAUE_FINGERPRINT_ENABLE
=
"enable"
;
@UnsupportedAppUsage
public
abstract
String
getExtInfo
(
int
authType
,
String
keyExtInfo
);
@UnsupportedAppUsage
public
abstract
void
setExtInfo
(
int
authType
,
String
keyExtInfo
,
String
valExtInfo
);
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IFAAManagerV4.java
0 → 100644
View file @
bca11b1c
package
org.ifaa.android.manager
;
import
android.compat.annotation.UnsupportedAppUsage
;
public
abstract
class
IFAAManagerV4
extends
IFAAManagerV3
{
@UnsupportedAppUsage
public
abstract
int
getEnabled
(
int
i
);
@UnsupportedAppUsage
public
abstract
int
[]
getIDList
(
int
i
);
}
org.ifaa.android.manager/src/org/ifaa/android/manager/IIFAAService.aidl
0 → 100644
View file @
bca11b1c
package
org
.
ifaa
.
android
.
manager
;
interface
IIFAAService
{
byte
[]
processCmd_v2
(
in
byte
[]
param
);
int
[]
getIDList
(
int
bioType
);
int
faceEnroll
(
String
sessionId
,
int
flags
);
int
faceUpgrade
(
int
action
,
String
path
,
int
offset
,
in
byte
[]
data
,
int
data_len
);
int
faceAuthenticate_v2
(
String
sessionId
,
int
flags
);
int
faceCancel_v2
(
String
sessionId
);
byte
[]
faceInvokeCommand
(
in
byte
[]
param
);
int
faceGetCellinfo
();
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment