stateDiagram-v2
direction LR
[*] --> INITIALIZE: initDelegateCertificate
INITIALIZE --> WAITING_TO_ACCEPT: delegateCertificate, chủ CTS nhập PIN
INITIALIZE --> EXPIRED: quá hạn phiên xác thực
WAITING_TO_ACCEPT --> ACTIVE: người nhận đồng ý
WAITING_TO_ACCEPT --> REJECTED: người nhận từ chối
WAITING_TO_ACCEPT --> EXPIRED: quá hạn lời mời
ACTIVE --> REVOKED: chủ CTS thu hồi hoặc hệ thống thu hồi
EXPIRED --> [*]
REJECTED --> [*]
REVOKED --> [*]
sequenceDiagram
autonumber
actor CS as Chủ CTS
participant APP as App + SDK (chủ CTS)
participant EK as eKYC
participant SSA
participant HSM
actor NN as Người được uỷ quyền
CS->>APP: Mở Thông tin CTS, chọn Uỷ quyền CTS
APP->>SSA: listDelegateAccount (credentialID)
SSA-->>APP: Danh sách tài khoản đang được uỷ quyền
CS->>APP: Thêm tài khoản, nhập username và CCCD
rect rgba(127,127,127,0.08)
Note over APP,EK: Kiểm tra tài khoản, app gọi thẳng eKYC
Note over APP: signature = HMAC-SHA256 trên username,
identity, nonce, timestamp
APP->>EK: POST /account/checkAccount
Note over EK: Kiểm tra timestamp lệch tối đa 10 phút,
nonce chưa dùng, chữ ký đúng
EK-->>APP: accountExists
end
alt Tài khoản đã tồn tại
APP->>CS: Popup Tài khoản đã tồn tại, có uỷ quyền
không
CS->>APP: Đồng ý
else Tài khoản chưa tồn tại
APP->>CS: Mở thêm ô Email và Số điện thoại
CS->>APP: Nhập email, SĐT, bấm Xác nhận
end
rect rgba(127,127,127,0.08)
Note over APP,HSM: Khởi tạo uỷ quyền, chưa cần PIN
APP->>SSA: initDelegateCertificate (credentialID,
username, identity, email và phone nếu
tài khoản mới, message)
Note over SSA: Tự xác định tài khoản mới hay đã có,
kiểm tra CCCD khớp, không trùng uỷ
quyền, không tự uỷ quyền
SSA->>HSM: initKeyDelegation
HSM-->>SSA: authId, authData (challenge chứa
username và CCCD người nhận)
Note over SSA: Tạo bản ghi INITIALIZE, expiry_time =
hạn phiên xác thực
SSA-->>APP: delegateCertRequestId, authId, authData,
expireTime
end
rect rgba(127,127,127,0.08)
Note over CS,HSM: Chủ CTS xác thực bằng PIN
APP->>CS: Màn Nhập mã PIN
CS->>APP: Nhập PIN
Note over APP: SDK dùng PIN mở KAK, ký challenge bằng
RS256
APP->>SSA: delegateCertificate
(delegateCertRequestId, authId,
authSignature, nonce)
SSA->>HSM: confirmKeyDelegation (authSignature)
Note over HSM: Xác minh chữ ký bằng KAK public, lưu
auth_signature làm bằng chứng
HSM-->>SSA: Hợp lệ
opt Tài khoản mới
Note over SSA,HSM: Tạo tài khoản theo username và CCCD
trong challenge đã ký, cấp userSid từ
pool HSM, gửi email thông tin đăng nhập
end
Note over SSA: WAITING_TO_ACCEPT, ghi delegate_time,
expiry_time = hạn lời mời
SSA-)NN: Gửi thông báo lời mời uỷ quyền
SSA-->>APP: Thành công
APP->>CS: Đã gửi yêu cầu uỷ quyền
end
sequenceDiagram
autonumber
actor NN as Người được uỷ quyền
participant APP as App + SDK (người nhận)
participant SSA
NN->>APP: Mở mục Thông báo
APP->>SSA: listDelegateCertificate (statuses)
SSA-->>APP: Danh sách lời mời, kèm thông tin CTS và
expireTime
NN->>APP: Chọn Đồng ý hoặc Từ chối
APP->>SSA: confirmDelegateCertificate
(delegateCertRequestId, confirm,
message, nonce)
Note over SSA: Chỉ người nhận được gọi, bản ghi phải
đang WAITING_TO_ACCEPT và chưa quá hạn
lời mời
alt Đồng ý
Note over SSA: ACTIVE, ghi accept_time
else Từ chối
Note over SSA: REJECTED, ghi reject_time và reject_reason
end
SSA-->>APP: Kết quả
sequenceDiagram
autonumber
actor NN as Người được uỷ quyền
participant APP as App + SDK (người nhận)
participant SSA
participant HSM
NN->>APP: Chọn CTS được uỷ quyền để ký tài liệu
APP->>SSA: Yêu cầu ký với credentialID của chủ CTS
Note over SSA: Kiểm tra có bản ghi ACTIVE cho cặp CTS
và người gọi
SSA->>HSM: initSign kèm granteeSid
Note over HSM: Kiểm tra uỷ quyền ACTIVE, tạo challenge
ký cho người nhận
HSM-->>SSA: Challenge
SSA-->>APP: Challenge
NN->>APP: Nhập PIN của chính mình
APP->>SSA: confirmSign (chữ ký KAK của người nhận)
SSA->>HSM: Xác minh và ký bằng khoá của CTS chủ
HSM-->>SSA: Kết quả ký
sequenceDiagram
autonumber
actor CS as Chủ CTS
participant APP as App + SDK (chủ CTS)
participant SSA
participant HSM
actor NN as Người được uỷ quyền
CS->>APP: Chọn tài khoản trong danh sách, bấm Thu
hồi
APP->>SSA: initRevokeDelegateCertificate
(credentialID, delegateCertRequestId,
message)
Note over SSA: Bản ghi phải đang ACTIVE
SSA->>HSM: initRevokeKeyDelegation
HSM-->>SSA: authId, authData
SSA-->>APP: delegateCertRequestId, authId, authData,
expireTime
APP->>CS: Màn Nhập mã PIN
CS->>APP: Nhập PIN
APP->>SSA: revokeDelegateCertificate
(delegateCertRequestId, authId,
authSignature, nonce)
SSA->>HSM: revokeKeyDelegation (authSignature)
HSM-->>SSA: Hợp lệ
Note over SSA: REVOKED, revoke_by = GRANTOR, ghi
revoke_time và revoke_reason
SSA-)NN: Thông báo đã bị thu hồi quyền dùng CTS
SSA-->>APP: Thành công