2016-05-24 13:15:11 +00:00
|
|
|
|
include "base.thrift"
|
2016-05-26 12:06:07 +00:00
|
|
|
|
include "domain.thrift"
|
2016-05-24 13:15:11 +00:00
|
|
|
|
|
2016-06-21 15:45:09 +00:00
|
|
|
|
namespace java com.rbkmoney.damsel.cds
|
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
/** Часть мастер-ключа в виде JWS */
|
|
|
|
|
typedef binary SignedMasterKeyShare;
|
2016-06-10 15:53:11 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
typedef string ShareholderId;
|
|
|
|
|
|
|
|
|
|
/** Зашифрованная часть мастер-ключа и кому он предназначается */
|
|
|
|
|
struct EncryptedMasterKeyShare {
|
|
|
|
|
// Уникальный ID, для однозначного определения владения
|
|
|
|
|
1: required ShareholderId id
|
|
|
|
|
// Неуникальный идентификатор с ФИО/email/etc владельца
|
|
|
|
|
2: required string owner
|
|
|
|
|
// Зашифрованный MasterKeyShare
|
|
|
|
|
3: required binary encrypted_share
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef list<EncryptedMasterKeyShare> EncryptedMasterKeyShares;
|
2016-05-24 13:15:11 +00:00
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Дата экспирации */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
struct ExpDate {
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Месяц 1..12 */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
1: required i8 month
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Год 2015..∞ */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
2: required i16 year
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Открытые карточные данные (в отличие от domain.BankCard) */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
struct CardData {
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Номер карточки без пробелов [0-9]{14,19} */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
1: required string pan
|
|
|
|
|
2: required ExpDate exp_date
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Имя держателя */
|
2017-09-22 10:11:44 +00:00
|
|
|
|
3: optional string cardholder_name
|
2018-05-08 09:28:28 +00:00
|
|
|
|
/** Deprecated */
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Код верификации [0-9]{3,4} */
|
2018-05-08 09:28:28 +00:00
|
|
|
|
4: optional string cvv
|
2016-05-24 13:15:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct PutCardDataResult {
|
2016-05-26 12:06:07 +00:00
|
|
|
|
1: required domain.BankCard bank_card
|
2017-05-23 14:14:41 +00:00
|
|
|
|
2: required domain.PaymentSessionID session_id
|
2016-05-24 13:15:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-04-11 14:28:28 +00:00
|
|
|
|
struct PutCardResult {
|
|
|
|
|
1: required domain.BankCard bank_card
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-08 09:28:28 +00:00
|
|
|
|
/** Код проверки подлинности банковской карты */
|
|
|
|
|
struct CardSecurityCode {
|
|
|
|
|
/** Код верификации [0-9]{3,4} */
|
|
|
|
|
1: required string value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Данные, необходимые для авторизации по 3DS протоколу */
|
|
|
|
|
struct Auth3DS {
|
|
|
|
|
/** Криптограмма для проверки подлинности */
|
|
|
|
|
1: required string cryptogram
|
|
|
|
|
/** Тип транзакции */
|
|
|
|
|
2: optional string eci
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Данные, необходимые для проверки подлинности банковской карты */
|
|
|
|
|
union AuthData {
|
|
|
|
|
1: CardSecurityCode card_security_code
|
|
|
|
|
2: Auth3DS auth_3ds
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Данные сессии */
|
|
|
|
|
struct SessionData {
|
|
|
|
|
1: required AuthData auth_data
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
struct Success {}
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
union KeyringOperationStatus {
|
2016-12-13 17:23:13 +00:00
|
|
|
|
/** Успешно. */
|
2019-04-26 15:54:35 +00:00
|
|
|
|
1: Success success
|
|
|
|
|
/** Сколько частей ключа нужно еще ввести, чтобы провести манипуляцию над Keyring. */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
2: i16 more_keys_needed
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
enum Initialization {
|
|
|
|
|
uninitialized
|
|
|
|
|
validation
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Rekeying {
|
|
|
|
|
uninitialized
|
|
|
|
|
confirmation
|
|
|
|
|
postconfirmation
|
|
|
|
|
validation
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Rotation {
|
|
|
|
|
uninitialized
|
|
|
|
|
validation
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Unlock {
|
|
|
|
|
uninitialized
|
|
|
|
|
validation
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum Status {
|
|
|
|
|
// Global machine status
|
|
|
|
|
not_initialized
|
|
|
|
|
unlocked
|
|
|
|
|
locked
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
union Activity {
|
|
|
|
|
1: Initialization initialization
|
|
|
|
|
2: Rekeying rekeying
|
|
|
|
|
3: Rotation rotation
|
|
|
|
|
4: Unlock unlock
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef list<Activity> Activities;
|
|
|
|
|
|
|
|
|
|
typedef i16 ShareId
|
|
|
|
|
|
|
|
|
|
typedef map<ShareId, ShareholderId> ShareSubmitters;
|
|
|
|
|
|
|
|
|
|
typedef i32 Seconds;
|
|
|
|
|
|
|
|
|
|
struct RotationState {
|
|
|
|
|
1: required Rotation phase
|
|
|
|
|
2: optional Seconds lifetime
|
|
|
|
|
3: required ShareSubmitters confirmation_shares
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct InitializationState {
|
|
|
|
|
1: required Initialization phase
|
|
|
|
|
2: optional Seconds lifetime
|
|
|
|
|
3: required ShareSubmitters validation_shares
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct UnlockState {
|
|
|
|
|
1: required Unlock phase
|
|
|
|
|
2: optional Seconds lifetime
|
|
|
|
|
3: required ShareSubmitters confirmation_shares
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct RekeyingState {
|
|
|
|
|
1: required Rekeying phase
|
|
|
|
|
2: optional Seconds lifetime
|
|
|
|
|
3: required ShareSubmitters confirmation_shares
|
|
|
|
|
4: required ShareSubmitters validation_shares
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct ActivitiesState {
|
|
|
|
|
1: required InitializationState initialization
|
|
|
|
|
2: required RotationState rotation
|
|
|
|
|
3: required UnlockState unlock
|
|
|
|
|
4: required RekeyingState rekeying
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct KeyringState {
|
|
|
|
|
1: required Status status
|
|
|
|
|
2: required ActivitiesState activities
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exception InvalidStatus {
|
|
|
|
|
1: required Status status
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exception InvalidActivity {
|
|
|
|
|
1: required Activity activity
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-25 07:55:30 +00:00
|
|
|
|
exception InvalidCardData {
|
|
|
|
|
1: optional string reason
|
|
|
|
|
}
|
2016-05-24 13:15:11 +00:00
|
|
|
|
|
2016-12-13 17:23:13 +00:00
|
|
|
|
exception CardDataNotFound {}
|
|
|
|
|
|
2018-05-08 09:28:28 +00:00
|
|
|
|
exception SessionDataNotFound {}
|
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
exception InvalidArguments {
|
|
|
|
|
1: optional string reason
|
|
|
|
|
}
|
2016-05-24 13:15:11 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
exception OperationAborted {
|
|
|
|
|
1: optional string reason
|
|
|
|
|
}
|
2016-05-24 13:15:11 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
exception VerificationFailed {}
|
2016-05-24 13:15:11 +00:00
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Интерфейс для администраторов */
|
2016-05-24 13:15:11 +00:00
|
|
|
|
service Keyring {
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
/** Создать новый кейринг при начальном состоянии
|
2016-06-10 15:53:11 +00:00
|
|
|
|
* threshold - минимально необходимое количество ключей для восстановления мастер ключа
|
|
|
|
|
*/
|
2019-04-26 15:54:35 +00:00
|
|
|
|
EncryptedMasterKeyShares StartInit (1: i16 threshold)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: InvalidArguments invalid_args)
|
|
|
|
|
|
|
|
|
|
/** Валидирует и завершает операцию над Keyring
|
|
|
|
|
* Вызывается после Init и Rekey (CDS-25)
|
|
|
|
|
* key_share - SignedMasterKeyShare в виде JWS
|
|
|
|
|
*/
|
|
|
|
|
KeyringOperationStatus ValidateInit (1: ShareholderId shareholder_id,
|
|
|
|
|
2: SignedMasterKeyShare key_share)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: VerificationFailed verification_failed,
|
|
|
|
|
// Исключения ниже переводят машину в состояние `uninitialized`
|
|
|
|
|
4: OperationAborted operation_aborted)
|
|
|
|
|
|
|
|
|
|
/** Отменяет Init не прошедший валидацию и дает возможность запустить его заново */
|
|
|
|
|
void CancelInit () throws (1: InvalidStatus invalid_status)
|
|
|
|
|
|
|
|
|
|
/** Создать новый masterkey при наличии уже имеющегося
|
|
|
|
|
* threshold - минимально необходимое количество ключей для восстановления мастер ключа
|
|
|
|
|
*/
|
|
|
|
|
void StartRekey (1: i16 threshold)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: InvalidArguments invalid_args)
|
|
|
|
|
|
|
|
|
|
/** Подтвердить операцию создания нового masterkey
|
|
|
|
|
* key_share - старый masterkey share в количестве threshold
|
|
|
|
|
*/
|
|
|
|
|
KeyringOperationStatus ConfirmRekey (1: ShareholderId shareholder_id,
|
|
|
|
|
2: SignedMasterKeyShare key_share)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: VerificationFailed verification_failed,
|
|
|
|
|
4: OperationAborted operation_aborted)
|
|
|
|
|
|
|
|
|
|
/** Начать валидацию операции и получить Зашифрованные masterkey share */
|
|
|
|
|
EncryptedMasterKeyShares StartRekeyValidation ()
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity)
|
|
|
|
|
|
|
|
|
|
/** Провалидировать расшифрованными фрагментами нового ключа
|
|
|
|
|
* key_share - новый masterkey share в количестве num
|
|
|
|
|
*/
|
|
|
|
|
KeyringOperationStatus ValidateRekey (1: ShareholderId shareholder_id,
|
|
|
|
|
2: SignedMasterKeyShare key_share)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: VerificationFailed verification_failed,
|
|
|
|
|
4: OperationAborted operation_aborted)
|
|
|
|
|
|
|
|
|
|
/** Отменить операцию создания нового masterkey */
|
|
|
|
|
void CancelRekey () throws (1: InvalidStatus invalid_status)
|
|
|
|
|
|
|
|
|
|
/** Получить состояние операций */
|
|
|
|
|
KeyringState GetState ()
|
|
|
|
|
|
|
|
|
|
/** Начинает процесс блокировки */
|
|
|
|
|
void StartUnlock ()
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Предоставить часть мастер-ключа для расшифровки кейринга.
|
|
|
|
|
* Необходимо вызвать с разными частами мастер столько раз, сколько было указано в качестве
|
|
|
|
|
* параметра threshold при создании кейринга
|
|
|
|
|
*/
|
2019-04-26 15:54:35 +00:00
|
|
|
|
KeyringOperationStatus ConfirmUnlock (1: ShareholderId shareholder_id,
|
|
|
|
|
2: SignedMasterKeyShare key_share)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: VerificationFailed verification_failed,
|
|
|
|
|
4: OperationAborted operation_aborted)
|
|
|
|
|
|
|
|
|
|
/** Отменяет процесс блокировки */
|
|
|
|
|
void CancelUnlock () throws (1: InvalidStatus invalid_status)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Зашифровать кейринг */
|
2019-04-26 15:54:35 +00:00
|
|
|
|
void Lock () throws (1: InvalidStatus invalid_status)
|
|
|
|
|
|
|
|
|
|
/** Начать процесс добавления нового ключа в кейринг */
|
|
|
|
|
void StartRotate ()
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
/* Предоставить часть мастер-ключа для зашифровки нового инстанса кейринга.
|
|
|
|
|
* См. `Unlock`
|
|
|
|
|
*/
|
|
|
|
|
KeyringOperationStatus ConfirmRotate (1: ShareholderId shareholder_id,
|
|
|
|
|
2: SignedMasterKeyShare key_share)
|
|
|
|
|
throws (1: InvalidStatus invalid_status,
|
|
|
|
|
2: InvalidActivity invalid_activity,
|
|
|
|
|
3: VerificationFailed verification_failed,
|
|
|
|
|
4: OperationAborted operation_aborted)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2019-04-26 15:54:35 +00:00
|
|
|
|
/** Отменяет процесс добавления нового ключа в кейринг */
|
|
|
|
|
void CancelRotate () throws (1: InvalidStatus invalid_status)
|
2016-05-24 13:15:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-25 11:58:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Интерфейс для приложений
|
|
|
|
|
*
|
|
|
|
|
* При недоступности (отсутствии или залоченности) кейринга сервис сигнализирует об этом с помощью
|
|
|
|
|
* woody-ошибки `Resource Unavailable`.
|
|
|
|
|
*/
|
2016-05-24 13:15:11 +00:00
|
|
|
|
service Storage {
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Получить карточные данные без CVV */
|
2016-05-26 12:06:07 +00:00
|
|
|
|
CardData GetCardData (1: domain.Token token)
|
2017-12-25 11:58:02 +00:00
|
|
|
|
throws (1: CardDataNotFound not_found)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Получить карточные данные c CVV */
|
2017-05-23 14:14:41 +00:00
|
|
|
|
CardData GetSessionCardData (1: domain.Token token, 2: domain.PaymentSessionID session_id)
|
2017-12-25 11:58:02 +00:00
|
|
|
|
throws (1: CardDataNotFound not_found)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2018-05-08 09:28:28 +00:00
|
|
|
|
/** Получить данные сессии */
|
|
|
|
|
SessionData GetSessionData (1: domain.PaymentSessionID session_id)
|
|
|
|
|
throws (1: SessionDataNotFound not_found)
|
|
|
|
|
|
2019-04-11 14:28:28 +00:00
|
|
|
|
/** Сохранить карточные и сессионные данные */
|
|
|
|
|
PutCardDataResult PutCardData (1: CardData card_data, 2: SessionData session_data)
|
|
|
|
|
throws (
|
|
|
|
|
1: InvalidCardData invalid
|
|
|
|
|
)
|
|
|
|
|
|
2016-06-10 15:53:11 +00:00
|
|
|
|
/** Сохранить карточные данные */
|
2019-04-11 14:28:28 +00:00
|
|
|
|
PutCardResult PutCard (1: CardData card_data)
|
2019-04-10 17:23:55 +00:00
|
|
|
|
throws (
|
|
|
|
|
1: InvalidCardData invalid
|
|
|
|
|
)
|
2016-12-13 17:23:13 +00:00
|
|
|
|
|
2019-04-11 14:28:28 +00:00
|
|
|
|
/** Сохранить сессионные данные */
|
|
|
|
|
void PutSession (1: domain.PaymentSessionID session_id, 2: SessionData session_data)
|
|
|
|
|
|
2016-05-24 13:15:11 +00:00
|
|
|
|
}
|