Package doirp_v3.v1
Services
service DoIrpService doirp_v3/v1/service.proto
规范:7.2 查询操作 (OC_RESOLUTION) 客户端向负责的服务器发送查询请求,服务器返回查询结果。用于获取指定标识符上的元素。
规范:7.7.1 添加元素 (OC_ADD_ELEMENT)
客户端向负责服务器发送 ADD_ELEMENT 请求,消息头
rpc RemoveElement
Request: doirp_v3.v1.RemoveElementRequest
Response:
doirp_v3.v1.RemoveElementResponse
规范:7.7.2 删除元素 (OC_REMOVE_ELEMENT)
客户端发送 REMOVE_ELEMENT 请求,消息头
rpc ModifyElement
Request: doirp_v3.v1.ModifyElementRequest
Response:
doirp_v3.v1.ModifyElementResponse
规范:7.7.3 修改元素 (OC_MODIFY_ELEMENT)
客户端发送 MODIFY_ELEMENT 请求修改已有元素,消息头
规范:7.7.4 创建标识符 (OC_CREATE_ID) 客户端发送 CREATE_ID 请求创建新标识符。
规范:7.7.5 删除标识符 (OC_DELETE_ID)
客户端发送 DELETE_ID 请求删除已有标识符,消息头
rpc ChallengeResponse
Request: doirp_v3.v1.ChallengeResponseRequest
Response:
doirp_v3.v1.ChallengeResponseResponse
规范:7.5 客户端认证 当查询含 ADMIN_READ 且无 PUBLIC_READ 权限的元素时,需认证客户端为管理员;所有需要管理员权限的 管理请求亦需认证。
认证包含多次消息交互:服务器向客户端发送挑战,客户端返回挑战响应,若为秘密密钥认证,还包括
验证请求与响应。会话通过唯一
认证起于服务器带挑战的响应;客户端以挑战响应回复。服务器验证响应,可直接校验签名,或向持有 管理员密钥的验证服务器发送验证请求。挑战/响应旨在证明客户端持有管理员私钥或密钥。失败则返回 RC_AUTHEN_FAILED。
认证成功后还需检查权限;不足则返回 RC_INVALID_ADMIN。认证侧重身份校验(MAC 或数字签名),而非 加密。
7.5.1 服务器向客户端的 CHALLENGE:保留原
7.5.2 客户端到服务器的 CHALLENGE_RESPONSE:
Messages
message DoidRecord doirp_v3/v1/core.proto
规范:4 数据模型 每个标识符有一组元素(Identifier Record),数量不限。记录可包含签名元素;消息也可签名。 每个元素有唯一类型标识符。服务器维护记录并在解析请求时返回。可按需只返回特定元素。
4.1 Identifier Record 记录由一个或多个元素组成,每个包含类型、值、唯一索引、TTL、权限等。预定义类型见 4.3。 示例(略):标识符包含多个元素,索引区分,同类型也唯一;TTL 表示缓存时间,权限控制读写。
| Field | Type | Description | |
|---|---|---|---|
| 1 | doid |
string
|
|
| 2 | elements |
repeated
doirp_v3.v1.Element
|
|
| 3 | created_at |
uint32
|
The following two timestamp fields are not in the spec, added for convenience. Both are 4-byte unsigned integers representing the elapsed time since 00:00:00 UTC, January 1970 in seconds. the created time of the identifier |
| 4 | updated_at |
uint32
|
last time the identifier was updated at the server |
message Ttl (Nested in doirp_v3.v1.Element ) doirp_v3/v1/core.proto
规范: TTL:1 字节类型 + 4 字节值。0 表示仅本次事务使用不缓存;非 0 需结合类型解释: 相对 TTL(0x00):自客户端获取后可缓存的秒数(若为负则不缓存); 绝对 TTL(0x01):自 1970-01-01 起的过期时间(秒)。
| Field | Type | Description | |
|---|---|---|---|
| 1 | type |
doirp_v3.v1.Element.Ttl.TtlType
|
|
| 2 | seconds |
uint32
|
interpreted as int32 when |
message Element doirp_v3/v1/core.proto
规范:4.1 Identifier Record 元素可视为一组字段,下面定义并给出 DO-IRP 的标准二进制编码。
| Field | Type | Description | |
|---|---|---|---|
| 1 | index |
uint32
|
规范: 32 位无符号整数,唯一区分记录内的元素。索引 0 预留;兼容性考虑,避免使用 >=2^31 的索引。 |
| 2 | type |
string
|
规范:
UTF8 字符串,指定值字段的类型标识符。推荐使用可经 DO-IRP 解析的类型标识符,详见第 9 章。
|
| 3 | permission |
uint32
|
8 位权限位掩码,详见 |
| 4 | ttl |
doirp_v3.v1.Element.Ttl
|
元素 TTL,见 |
| 5 | created_at |
uint32
|
4 字节无符号整数,记录创建时间(秒,自 1970-01-01);非规范字段,便于使用。 |
| 6 | updated_at |
uint32
|
规范: |
| 7 | value |
bytes
|
规范:字节序列(前置 4 字节长度),其语法/格式/语义由 |
| 8 | hs_admin |
doirp_v3.v1.element.HsAdmin
|
规范:4.3.1 HS_ADMIN(管理员),详见 element/hs_admin.proto |
| 9 | hs_site |
doirp_v3.v1.element.HsSite
|
规范:4.3.2 HS_SITE、4.3.3 HS_SITE.PREFIX,详见 element/hs_site.proto |
| 10 | hs_serv |
doirp_v3.v1.element.HsServ
|
规范:4.3.4 HS_SERV、4.3.5 HS_SERV.PREFIX,详见 element/hs_serv.proto |
| 11 | hs_pubkey |
doirp_v3.v1.element.HsPubkey
|
规范:4.3.6 HS_PUBKEY,详见 element/hs_pubkey.proto |
| 12 | hs_seckey |
bytes
|
出于安全至少 16 字节 |
| 13 | hs_vlist |
repeated
doirp_v3.v1.common.ElementRef
|
规范:4.3.8 HS_VLIST
列表引用其他标识符中的元素,可在不改引用记录的情况下更新被引用元素。
|
| 14 | hs_alias |
string
|
被引用的 DOID |
message MessageHeader doirp_v3/v1/core.proto
规范:6.2.2 MESSAGE HEADER 消息头包含各操作通用字段,固定 24 字节,含 8 个字段(图 6.2.2)。非截断消息必须带消息头;若消息被截断,消息头出现在首块(不同于每块都带的 Message Envelope)。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 .---------------------------------------------------------------. | OpCode | |---------------------------------------------------------------| | ResponseCode | |---------------------------------------------------------------| | OpFlag | |---------------------------------------------------------------| | SiteInfoSerialNumber | RecursionCount| | |---------------------------------------------------------------| | ExpirationTime | |---------------------------------------------------------------| | BodyLength | '---------------------------------------------------------------'
Figure 6.2.2: Message Header Fields
OpCode op_code = 1;
| Field | Type | Description | |
|---|---|---|---|
| 2 | response_code |
doirp_v3.v1.ResponseCode
|
|
| 3 | op_flag |
uint32
|
规范:6.2.2.3 1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 .---------------------------------------------------------------. |AT |CT |ENC|REC|CA |CN |KC |PO |RD |OWE|MNS|DNR| Reserved | |---------------------------------------------------------------| | Reserved | '---------------------------------------------------------------' Figure 6.2.2.3: Option flags in the AT:主站点位,请求/响应来自主站点。 CT:签名位,请求要求服务器签名(6.2.4);响应置位表示已签名,验证失败应丢弃。 ENC:加密位,请求要求用会话密钥加密响应。 REC:递归位,请求可由服务器转发;可转发或返回 RC_SERVER_NOT_RESP。 CA:保留。 CN:连续位,表示同一请求/响应还有后续消息(区别于传输截断)。 KC:保持连接位,请求对端保持 TCP 连接。 PO:仅公共读取位(查询用)。置位则仅要 PUBLIC_READ 元素,未置位则可返回需 ADMIN_READ 的元素,需认证。 RD:请求摘要位,置位则响应携带请求摘要用于完整性校验(见 6.2.3)。 OWE:存在则覆盖,用于 CREATE_ID/ADD_ELEMENT。 MNS:生成新后缀,创建标识符时将请求中的 identifier 视为前缀并追加新后缀。 DNR:不转介,原本应转介时改为本机处理。 |
| 4 | site_info_serial_number |
uint32
|
规范:6.2.2.4 |
| 5 | recursion_count |
uint32
|
规范:6.2.2.5 |
| 6 | expiration_time |
uint32
|
规范:6.2.2.6 |
message Error doirp_v3/v1/service.proto
规范:7.3 服务器错误响应
处理请求出错时,服务器返回错误消息,消息头保留原
| Field | Type | Description | |
|---|---|---|---|
| 1 | message |
string
|
规范: |
| 2 | element_indexes |
repeated
uint32
|
规范: |
message ResolveResult doirp_v3/v1/service.proto
| Field | Type | Description | |
|---|---|---|---|
| 1 | record |
doirp_v3.v1.DoidRecord
|
message ServiceReferral doirp_v3/v1/service.proto
规范:7.4 服务转介与前缀转介 当请求的标识符由其他服务管理时,服务器可返回转介(指向合适的 DO-IRP 服务)或返回 RC_SERVER_NOT_RESP。 当标识符归属迁移时亦可用转介;前缀转介用于指示某前缀可在另一服务解析/管理。
服务器依据 HS_SITE.PREFIX/HS_SERV.PREFIX 判断是否返回 RC_PREFIX_REFERRAL。例如解析 0.NA/
具体策略由服务器配置决定,规范未限定何时发送何种转介。
转介消息头保留原
| Field | Type | Description | |
|---|---|---|---|
| 1 | referral_doid |
string
|
规范: |
| 2 | elements |
repeated
doirp_v3.v1.Element
|
规范: |
message ResolveRequest doirp_v3/v1/service.proto
规范:7.2.1 查询请求 (OC_RESOLUTION)
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | doid |
string
|
规范: |
| 3 | indexes |
repeated
uint32
|
规范: |
| 4 | types |
repeated
string
|
规范: |
message ResolveResponse doirp_v3/v1/service.proto
规范:
7.2.2 查询成功响应:消息头
7.2.3 查询失败响应:服务器无法满足请求时返回错误(格式见 7.3)。 例如标识符不存在则返回 RC_ID_NOT_FOUND(空消息体)。 若服务器不负责该标识符,不应返回 RC_ID_NOT_FOUND;应转介(7.4)或返回 RC_SERVER_NOT_RESP。 标识符存在但无匹配元素 -> RC_ELEMENT_NOT_FOUND。 过载 -> RC_SERVER_BUSY(空体)。 未置 PO 且请求特定元素、该元素无 PUBLIC_READ/ADMIN_READ -> RC_ACCESS_DENIED。 未置 PO 且查询含 ADMIN_READ、无 PUBLIC_READ 的元素时,服务器可要求管理员认证(见 7.5)。
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | error |
doirp_v3.v1.Error
|
|
| 3 | result |
doirp_v3.v1.ResolveResult
|
contains |
| 4 | service_referral |
doirp_v3.v1.ServiceReferral
|
a service referral (see section 7.4) |
message AddElementRequest doirp_v3/v1/service.proto
规范:7.7.1 添加元素 (OC_ADD_ELEMENT)
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | doid |
string
|
规范: |
| 3 | elements |
repeated
doirp_v3.v1.Element
|
规范: |
message AddElementResponse doirp_v3/v1/service.proto
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | error |
doirp_v3.v1.Error
|
message RemoveElementRequest doirp_v3/v1/service.proto
规范:7.7.2 删除元素 (OC_REMOVE_ELEMENT)
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | doid |
string
|
规范: |
| 3 | indexes |
repeated
uint32
|
规范: |
message RemoveElementResponse doirp_v3/v1/service.proto
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | error |
doirp_v3.v1.Error
|
message ModifyElementRequest doirp_v3/v1/service.proto
规范:7.7.3 修改元素 (OC_MODIFY_ELEMENT)
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | doid |
string
|
规范: |
| 3 | elements |
repeated
doirp_v3.v1.Element
|
规范: |
message ModifyElementResponse doirp_v3/v1/service.proto
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | error |
doirp_v3.v1.Error
|
message CreateDoidRequest doirp_v3/v1/service.proto
规范:7.7.4 创建标识符 (OC_CREATE_ID)
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | record |
doirp_v3.v1.DoidRecord
|
包含 |
message CreateDoidResponse doirp_v3/v1/service.proto
规范:7.7.4 创建标识符响应
消息体:[
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | error |
doirp_v3.v1.Error
|
|
| 3 | doid |
string
|
规范: |
message DeleteDoidRequest doirp_v3/v1/service.proto
规范:7.7.5 删除标识符 (OC_DELETE_ID)
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | doid |
string
|
规范: |
message DeleteDoidResponse doirp_v3/v1/service.proto
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | error |
doirp_v3.v1.Error
|
message ChallengeResponseRequest doirp_v3/v1/service.proto
规范:7.5.2 客户端到服务器的 CHALLENGE-RESPONSE
消息头
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
|
| 2 | auth_type |
doirp_v3.v1.ChallengeResponseRequest.AuthType
|
规范: |
| 3 | key_ref |
doirp_v3.v1.common.ElementRef
|
规范:
|
| 5 | challenge_response |
bytes
|
规范:
4 字节长度 + 字节数组,包含基于服务器挑战的 MAC 或数字签名。
|
message ChallengeResponseResponse doirp_v3/v1/service.proto
| Field | Type | Description | |
|---|---|---|---|
| 1 | header |
doirp_v3.v1.MessageHeader
|
Enums
enum OpCode doirp_v3/v1/core.proto
规范:6.2.2.1
| Name | Number | Description |
|---|---|---|
OP_CODE_RESERVED |
0 | Reserved |
OP_CODE_RESOLUTION |
1 | Identifier query |
OP_CODE_GET_SITEINFO |
2 | Get HS_SITE element |
OP_CODE_CREATE_ID |
100 | Create new identifier |
OP_CODE_DELETE_ID |
101 | Delete existing identifier |
OP_CODE_ADD_ELEMENT |
102 | Add element(s) |
OP_CODE_REMOVE_ELEMENT |
103 | Remove element(s) |
OP_CODE_MODIFY_ELEMENT |
104 | Modify element(s) |
OP_CODE_LIST_IDS |
105 | List identifiers |
OP_CODE_LIST_DERIVED_PREFIXES |
106 | List derived prefixes |
OP_CODE_CHALLENGE_RESPONSE |
200 | Response to challenge |
OP_CODE_VERIFY_RESPONSE |
201 | Verify challenge response |
OP_CODE_HOME_PREFIX |
300 | Home prefix (instruct server to consider itself responsible for the prefix) |
OP_CODE_UNHOME_PREFIX |
301 | Unhome prefix |
OP_CODE_LIST_HOMED_PREFIXES |
302 | List homed prefixes |
OP_CODE_SESSION_SETUP |
400 | Session setup request |
OP_CODE_SESSION_TERMINATE |
401 | Session termination request |
enum ResponseCode doirp_v3/v1/core.proto
规范:6.2.2.2
| Name | Number | Description |
|---|---|---|
RESPONSE_CODE_RESERVED |
0 | Reserved for request |
RESPONSE_CODE_SUCCESS |
1 | Success response |
RESPONSE_CODE_ERROR |
2 | General error |
RESPONSE_CODE_SERVER_BUSY |
3 | Server too busy to respond |
RESPONSE_CODE_PROTOCOL_ERROR |
4 | Corrupted or unrecognizable message |
RESPONSE_CODE_OPERATION_DENIED |
5 | Unsupported operation |
RESPONSE_CODE_RECUR_LIMIT_EXCEEDED |
6 | Too many recursions for the request |
RESPONSE_CODE_SERVER_BACKUP |
7 | Server storage is temporarily read-only as for backup |
RESPONSE_CODE_ID_NOT_FOUND |
100 | Identifier not found |
RESPONSE_CODE_ID_ALREADY_EXIST |
101 | Identifier already exists |
RESPONSE_CODE_INVALID_ID |
102 | Encoding (or syntax) error |
RESPONSE_CODE_ELEMENT_NOT_FOUND |
200 | Element not found |
RESPONSE_CODE_ELEMENT |
201 | ALREADY_EXIST Element already exists |
RESPONSE_CODE_ELEMENT_INVALID |
202 | Invalid Element |
RESPONSE_CODE_EXPIRED_SITE_INFO |
300 | SITE_INFO out of date |
RESPONSE_CODE_SERVER_NOT_RESP |
301 | Server not responsible |
RESPONSE_CODE_SERVICE_REFERRAL |
302 | Server referral |
RESPONSE_CODE_PREFIX_REFERRAL |
303 | Prefix referral |
RESPONSE_CODE_INVALID_ADMIN |
400 | Not an admin for operation |
RESPONSE_CODE_ACCESS_DENIED |
401 | Insufficient permissions |
RESPONSE_CODE_AUTHEN_NEEDED |
402 | Authentication required |
RESPONSE_CODE_AUTHEN_FAILED |
403 | Failed to authenticate |
RESPONSE_CODE_INVALID_CREDENTIAL |
404 | Invalid message credential |
RESPONSE_CODE_AUTHEN_TIMEOUT |
405 | Authentication timed out |
RESPONSE_CODE_UNABLE_TO_AUTHEN |
406 | Unexpected error authenticating |
RESPONSE_CODE_SESSION_TIMEOUT |
500 | Session expired |
RESPONSE_CODE_SESSION_FAILED |
501 | Unable to establish session |
RESPONSE_CODE_SESSION_KEY_INVALID |
502 | Invalid session key or session authentication failure |
RESPONSE_CODE_SESSION_MSG_REJECTED |
505 | Potential session replay attack |
enum Permission doirp_v3/v1/core.proto
元素权限位
| Name | Number | Description |
|---|---|---|
PERMISSION_UNSPECIFIED |
0 | |
PERMISSION_PUBLIC_WRITE |
1 | 规范:PUBLIC_WRITE (0x01) 允许任何人修改/删除。 |
PERMISSION_PUBLIC_READ |
2 | 规范:PUBLIC_READ (0x02) 允许任何人读取。 |
PERMISSION_ADMIN_WRITE |
4 | 规范:ADMIN_WRITE (0x04) 具备 Modify/Delete 权限的已认证管理员可写,见 4.3.1。 |
PERMISSION_ADMIN_READ |
8 | 规范:ADMIN_READ (0x08) 具备 Authorized_Read 的已认证管理员可读。 |
enum Type doirp_v3/v1/core.proto
用于生成常量,不直接用于 .proto
| Name | Number | Description |
|---|---|---|
TYPE_UNSPECIFIED |
0 | |
TYPE_HS_ADMIN |
1 | 0.TYPE/HS_ADMIN |
TYPE_HS_SITE |
2 | 0.TYPE/HS_SITE |
TYPE_HS_SITE_PREFIX |
3 | 0.TYPE/HS_SITE.PREFIX |
TYPE_HS_SERV |
4 | 0.TYPE/HS_SERV |
TYPE_HS_SERV_PREFIX |
5 | 0.TYPE/HS_SERV.PREFIX |
TYPE_HS_PUBKEY |
6 | 0.TYPE/HS_PUBKEY |
TYPE_HS_SECKEY |
7 | 0.TYPE/HS_SECKEY |
TYPE_HS_VLIST |
8 | 0.TYPE/HS_VLIST |
TYPE_HS_ALIAS |
9 | 0.TYPE/HS_ALIAS |
TYPE_HS_CERT |
10 | 0.TYPE/HS_CERT |
TYPE_HS_SIGNATURE |
11 | 0.TYPE/HS_SIGNATURE |
enum AuthType doirp_v3/v1/service.proto
| Name | Number | Description |
|---|---|---|
AUTH_TYPE_HS_SECKEY |
0 | |
AUTH_TYPE_HS_PUBKEY |
1 |