ArraySSI (RFC-012)
A period when the community can review the RFC (comment Docs).
Document Maintainers: Andi Gabriel Tan 2024. List of other contributors in Annex. 1.
Copyright: MIT license
Copyright © 2018-2024 Axiologic Research and Contributors. This document is licensed under MIT license.
- Abstract
- 1. Type-specific and control substrings
- 2. Specific functions for ArraySSI
- 3. Common KeySSI functions from KeySSIMixin
- Function autoload(identifier)
- Function validateKeySSICharLength()
- Function load(subtype, dlDomain, subtypeSpecificString, control, vn, hint)
- Function getDerivedType(ssiType, callback)
- Function getRelatedType(ssiType, callback)
- Function getRootKeySSITypeName()
- Function getAnchorId(plain)
- Function getSpecificString()
- Function getDLDomain()
- Function getControlString()
- Function getHint()
- Function getVn()
- Function getDSURepresentationName()
- Function getNoHintIdentifier(plain)
- Function getIdentifier(plain)
- Function getBricksDomain()
- Function clone()
- Function cast(newType)
- Function canSign()
- Function setCanSign(canSign)
- Function canBeVerified()
- Function sign(dataToSign, callback)
- Function verify(data, signature)
- Function hash(data)
- Function toJSON()
- Function canAppend()
- Function isTransfer()
- Function isAlias()
- Function isTemplate()
- Function createAnchorValue(brickMapHash, previousAnchorValue, callback)
- 4. Cryptographic algorithms used by ArraySSIs (advanced)
- Annex 1. Contributors
Abstract
ArraySSIs are created from multiple inputs that are easy to remember for the user. In our example, inputs are represented by company identifiers, serial numbers and product identifiers, but they could also be something else like name and telephone number. They may be different, depending on the use case.
Figure 1: ConstSSI generated from serialization numbers
There are no restrictions regarding the number of inputs we can use to create the ArraySSI. For example, adding a fourth input like GTIN can make the key more robust. Then, the array of inputs passes through a key derivation function, and the result is encoded to obtain the specific identifier of the ArraySSI. Next, the ArraySSI is derived to get a ConstSSI that can be used to create and resolve DSUs.
| Subtype | Description |
|---|---|
| array | An arraySSI is built using an array of multiple identifiers, such as productID, companyID etc. Example: ssi:array:domain:encodedArray::v0 |
1. Type-specific and control substrings
As stated before, the specific string of the ArraySSI corresponds to the array of inputs that passes through a key derivation function. The result of the derivation is used to get the specific string.
| Type | Type Specific substring | Control substring |
|---|---|---|
| array | encoded(KDF(array)) | none |
2. Specific functions for ArraySSI
(Common functions for all keySSIs are available here.)
Function arraySSI.initialize(dlDomain, arr, vn, hint)
Description: Initialize ArraySSI with owned parameters.
| Name | Type | Value | Description |
|---|---|---|---|
| dlDomain | string | *required | The blockchain domain wanted to be used. |
| constArray | string | *required | An array with keys that will be used in the initialization to get the final specific string of your ArraySSI. |
| vn (optional) | string | The version number of the SeedSSI you want to use. Default value: “v0”. | |
| hint (optional) | string | Optional information for the keySSI resolver. Default value: undefine. |
Function arraySSI.derive()
Description: Derive your arraySSI and return a constSSI. The constSSI will conserve all parameters from the ArraySSI, except for a control substring that will be added. The specific substring of the ConstSSI will be the same as the one calculated during the initialization of the arraySSI using the array of inputs. It is then possible to create and load a DSU using the ConstSSI.
Returns
| Name | Description |
|---|---|
| constSSI object | A constSSI object is returned. |
Function arraySSI.getEncryptionKey()
Description: Get the encryption key associated with the ArraySSI.
Returns
| Name | Description |
|---|---|
| String | The encryption key. |
Function arraySSI.getTypeName()
Description:
Returns
| Name | Description |
|---|---|
| SSITypes.ARRAY_SSI | A string representing the type of the SSI. |
Function arraySSI.createAnchorValue(brickMapHash, previousAnchorValue, callback)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| brickMapHash | |||
| previousAnchorValue | |||
| callback | function |
Callback parameters
| Name | Type | Response example |
|---|---|---|
| err | Error object | |
| anchorValue |
Description: Contains a message and the error. / The anchor value that was just created.
3. Common KeySSI functions from KeySSIMixin
Function autoload(identifier)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| identifier | string | *required |
Function validateKeySSICharLength()
Description: Throws an error if the length of the identifier exceeds the maximum char length.
Function load(subtype, dlDomain, subtypeSpecificString, control, vn, hint)
Description: Initialize ArraySSI with your own parameters.
| Name | Type | Value | Description |
|---|---|---|---|
| subtype | string | ||
| dldomain | string | *required | The blockchain domain wanted to be used. |
| subtypeSpecificString | string | ||
| control | string | ||
| vn (optional) | string | The version number of the SeedSSI you want to use. Default value: “v0” | |
| hint (optional) | string | Optional information for the keySSI resolver. Default value: undefined. |
Function getDerivedType(ssiType, callback)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| ssiType | string | ||
| callback | function |
Callback parameters
| Name | Type | Response example |
|---|---|---|
| err | Error object |
Description:
Function getRelatedType(ssiType, callback)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| ssiType | string | ||
| callback | function |
Callback parameters
| Name | Type | Response example |
|---|---|---|
| err | Error object |
Description:
Function getRootKeySSITypeName()
Description:
Returns
| Name | Description |
|---|---|
| String |
Function getAnchorId(plain)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| plain | bool | True if you want the ID in plain text, false if you want the ID encoded in base 58. |
Returns
| Name | Description |
|---|---|
| anchor id | The identifier for the anchor, without any hints. |
Function getSpecificString()
Description: Returns
| Name | Description |
|---|---|
| _subtypeSpecificString |
Function getDLDomain()
Description:
Returns
| Name | Description |
|---|---|
| _dlDomain | If the domain is undefined or empty, the function will return undefined. |
Function getControlString()
Description:
Returns
| Name | Description |
|---|---|
| _controlString |
Function getHint()
Description:
Returns
| Name | Description |
|---|---|
| _hint |
Function getVn()
Description: Returns
| Name | Description |
|---|---|
| _vn |
Function getDSURepresentationName()
Description: Returns
| Name | Description |
|---|---|
| DSURepresentationNames [_subtype] |
Function getNoHintIdentifier(plain)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| plain | bool | True if you want the ID in plain text, false if you want the ID encoded in base 58. |
Returns
| Name | Description |
|---|---|
| identifier | The identifier, either in plain text or encoded in base 58. |
Function getIdentifier(plain)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| plain | bool | True if you want the ID in plain text, false if you want the ID encoded in base 58. |
Returns
| Name | Description |
|---|---|
| identifier:hint | If there is a defined hint, the identifier will be followed by the ‘:’ symbol and the hint. The identifier (and hint), either in plain text or encoded in base 58. |
Function getBricksDomain()
Description:
Returns
| Name | Description |
|---|---|
| _hintObject[BRICKS_DOMAIN_KEY] | If _hintObject[BRICKS_DOMAIN_KEY] is undefined, the _dlDomain will be returned instead. |
Function clone()
Description:
Returns
| Name | Description |
|---|---|
| clone |
Function cast(newType)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| plain | bool | True if you want the ID in plain text, false if you want the ID encoded in base 58. |
Function canSign()
Description:
Returns
| Name | Description |
|---|---|
| _canSign |
Function setCanSign(canSign)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| canSign | bool |
Function canBeVerified()
Description:
Returns
| Name | Description |
|---|---|
| false |
Function sign(dataToSign, callback)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| dataToSign | |||
| callback | function |
Callback parameters
| Name | Type | Response example |
|---|---|---|
| err | Error object | |
| signature |
Description: Contains a message and the error.
Function verify(data, signature)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| data | |||
| signature |
Returns
| Name | Description |
|---|---|
Function hash(data)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| data |
Returns
| Name | Description |
|---|---|
Function toJSON()
Description:
Returns
| Name | Description |
|---|---|
| identifier |
Function canAppend()
Description:
Returns
| Name | Description |
|---|---|
| true |
Function isTransfer()
Description:
Returns
| Name | Description |
|---|---|
| false |
Function isAlias()
Description:
Returns
| Name | Description |
|---|---|
| false |
Function isTemplate()
Description: Check if the target is a template or an actual instance.
Returns
| Name | Description |
|---|---|
| true or false | Bool value showing if the target is a template or an instance. |
Function createAnchorValue(brickMapHash, previousAnchorValue, callback)
Description:
| Name | Type | Value | Description |
|---|---|---|---|
| brickMapHash | |||
| previousAnchorValue | |||
| callback | function |
Callback parameters
| Name | Type | Response example |
|---|---|---|
| err | Error object | |
| anchorValue |
Description: Contains a message and the error. / The anchor value that was just created.
4. Cryptographic algorithms used by ArraySSIs (advanced)
In this paragraph, we present the algorithms that ArraySSIs use. These algorithms can differ according to the type of KeySSI used and its version number. Most of the functions use the nodejs crypto library.
| Type | Operations | Algorithms |
|---|---|---|
| Default | KeyDerivation | crypto.deriveKey (aes-256-gcm, password, iterations). |
| EncryptionKey Generation | Generate a random encryption key compatible with the aes-256-gcm. | |
| enconding | Base58 enconding | |
| deconding | Base58 deconding |
Contributors
-
Axiologic Research: New content and improvements. Original texts under PharmaLedger Association and Novartis funding. MIT licensed content accordingly with the contracts. Publish and maintain the www.opendsu.org site.
-
PharmaLedger Project: Review, feedback, observations, new content, and corrections MIT licensed accordingly with the consortium agreements.
- PrivateSky Research Project: MIT licensed content accordingly with the contracts. https://profs.info.uaic.ro/~ads/PrivateSky/
Annex 1. Contributors
| Current Editors | |
|---|---|
| Sînică Alboaie | sinica.alboaie@axiologic.net |
| Cosmin Ursache | cosmin@axiologic.net |
| Teodor Lupu | teodor@axiologic.net |
| Andi-Gabriel Țan | andi@axiologic.net |
| Contributors Axiologic Research | |
| Adrian Ganga | adrian@axiologic.net |
| Andi-Gabriel Țan | andi@axiologic.net |
| Cosmin Ursache | cosmin@axiologic.net |
| Daniel Sava | daniel@axiologic.net |
| Nicoleta Mihalache | nicoleta@axiologic.net |
| Valentin Gérard | valentin@axiologic.net |
| PrivateSky Contributors | |
| Alex Sofronie | alsofronie@gmail.com (DPO) |
| Cosmin Ursache | cos.ursache@gmail.com (UAIC) |
| Daniel Sava | sava.dumitru.daniel@gmail.com (HVS, AQS) |
| Daniel Visoiu | visoiu.daniel.g@gmail.com (SGiant) |
| Lenuța Alboaie | lalboaie@gmail.com (UAIC) |
| Rafael Mastaleru | rafael@rms.ro (RMS) |
| Sînică Alboaie | salboaie@gmail.com (UAIC) |
| Vlad Balmos | vlad.balmos@gmail.com (Code932) |
| PharmaLedger Contributors | |
| Ana Balan | bam@rms.ro (RMS) |
| Bogdan Mastahac | mab@rms.ro (RMS) |
| Cosmin Ursache | cos@rms.ro (RMS) |
| Rafael Mastaleru | raf@rms.ro (RMS) |