Skip to content

dimchat/mkm-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ming Ke Ming (名可名) -- Account Module (Java)

license Version PRs Welcome Platform

This document introduces a common Account Module for decentralized user identity authentication.

Copyright © 2018-2019 Albert Moky

0. Meta

The Meta was generated by your private key, it can be used to build a new ID for entity, or verify the ID/PK pair.

It consists of 4 fields:

Field Description
version Meta Algorithm Version
seed Entity Name
key Public Key
fingerprint Signature to generate address

0.0. Version

  • 0x01 Default version
  • 0x02 BTC version
  • 0x03 Extended BTC version
  • 0x04 ETH version
  • 0x05 Extended ETH version

0.1. Seed

A string as same as ID.name for generate the fingerprint.

0.2. Key

A public key (PK) was binded to an ID by the Meta Algorithm.

0.3. Fingerprint

THe fingerprint field was generated by your private key and seed:

data = seed.getBytes(Charset.forName("UTF-8"));
fingerprint = privateKey.sign(data);

1. ID

The ID is used to identify an entity(user/group). It consists of 3 fields and 2 extended properties:

Field Description
name Same with meta.seed
address Unique Identification
terminal Login point, it's optional.
type Network type
number Search Number

The ID format is name@address[/terminal].

1.0. Type

The network type of a person is 8, and group is 16:

public enum NetworkType {
    /*
     *  Person Account
     */
    Main           (0x08), // 0000 1000 (Person)

    /*
     *  Virtual Groups
     */
    Group          (0x10), // 0001 0000 (Multi-Persons)
    Polylogue      (0x10), // 0001 0000 (Multi-Persons Chat, N < 100)
    Chatroom       (0x30), // 0011 0000 (Multi-Persons Chat, N >= 100)

    /*
     *  Network
     */
    Provider       (0x76), // 0111 0110 (Service Provider)
    Station        (0x88), // 1000 1000 (Server Node)

    /*
     *  Internet of Things
     */
    Thing          (0x80), // 1000 0000 (IoT)
    Robot          (0xC8); // 1100 1000

    public final int value;

    NetworkType(int value) {
        this.value = value;
    }
}

1.1. Name

The Name field is a username, or just a random string for group:

  1. The length of name must more than 1 byte, less than 32 bytes;
  2. It should be composed by a-z, A-Z, 0-9, or charactors '_', '-', '.';
  3. It cannot contain key charactors('@', '/').
# Name examples
user_name  = "Albert.Moky";
group_name = "Group-9527";

1.2. Address

The Address field was created with the Fingerprint in Meta and a Network ID:

public final class BTCAddress extends Address {

    private static byte[] checkCode(byte[] data) {
        byte[] sha256d = SHA256.digest(SHA256.digest(data));
        byte[] cc = new byte[4];
        System.arraycopy(sha256d, 0, cc, 0, 4);
        return cc;
    }

    private static long userNumber(byte[] cc) {
        return (long)(cc[3] & 0xFF) << 24 | (cc[2] & 0xFF) << 16 | (cc[1] & 0xFF) << 8 | (cc[0] & 0xFF);
    }

    static BTCAddress generate(byte[] fingerprint, NetworkType network) {
        // 1. digest = ripemd160(sha256(fingerprint))
        byte[] digest = RIPEMD160.digest(SHA256.digest(fingerprint));
        // 2. head = network + digest
        byte[] head = new byte[21];
        head[0] = network.toByte();
        System.arraycopy(digest, 0, head, 1, 20);
        // 3. cc = sha256(sha256(head)).prefix(4)
        byte[] cc = checkCode(head);
        // 4. data = base58_encode(head + cc)
        byte[] data = new byte[25];
        System.arraycopy(head, 0, data, 0, 21);
        System.arraycopy(cc,0, data, 21, 4);
        return new BTCAddress(Base58.encode(data));
    }
}

When you get a meta for the entity ID from the network, you must verify it with the consensus algorithm before accept its public key.

1.3. Terminal

A resource identifier as Login Point.

1.4. Number

A Search Number is defined for easy remember. Its value is converted from the check code of the address. It's greater than 0 and smaller than 232 (4,294,967,296).

2. Samples

ID

# ID examples
ID1 = "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj";  // Immortal Hulk
ID2 = "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk";  // Monkey King

Meta

/* Meta(JsON) for hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj */
{
    "version"     : 0x01,
    "key"         : {
        "algorithm" : "RSA",
        "data"      : "-----BEGIN PUBLIC KEY-----\nMIGJAoGBALB+vbUK48UU9rjlgnohQowME+3JtTb2hLPqtatVOW364/EKFq0/PSdnZVE9V2Zq+pbX7dj3nCS4pWnYf40ELH8wuDm0Tc4jQ70v4LgAcdy3JGTnWUGiCsY+0Z8kNzRkm3FJid592FL7ryzfvIzB9bjg8U2JqlyCVAyUYEnKv4lDAgMBAAE=\n-----END PUBLIC KEY-----",
        "mode"      : "ECB",
        "padding"   : "PKCS1",
        "digest"    : "SHA256"
    },
    "seed"        : "hulk",
    "fingerprint" : "jIPGWpWSbR/DQH6ol3t9DSFkYroVHQDvtbJErmFztMUP2DgRrRSNWuoKY5Y26qL38wfXJQXjYiWqNWKQmQe/gK8M8NkU7lRwm+2nh9wSBYV6Q4WXsCboKbnM0+HVn9Vdfp21hMMGrxTX1pBPRbi0567ZjNQC8ffdW2WvQSoec2I="
}

(All data encode with BASE64 algorithm as default, excepts the address)

About

Ming Ke Ming (名可名) -- Account Module

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages