]> Repositorios git - scryer-prolog.git/commitdiff
ADDED: ed25519_new_keypair/1 to dynamically create a new Ed25519 key pair
authorMarkus Triska <[email protected]>
Wed, 20 May 2020 21:06:09 +0000 (23:06 +0200)
committerMarkus Triska <[email protected]>
Wed, 20 May 2020 21:11:56 +0000 (23:11 +0200)
src/prolog/clause_types.rs
src/prolog/lib/crypto.pl
src/prolog/machine/system_calls.rs

index 067e44375d0463fd609de28e2b0404746b251fa6..536c9061b442474aea77f18922cb14d979325cf5 100644 (file)
@@ -293,7 +293,8 @@ pub enum SystemClauseType {
     CryptoDataEncrypt,
     CryptoDataDecrypt,
     Ed25519Sign,
-    Ed25519Verify
+    Ed25519Verify,
+    Ed25519NewKeyPair
 }
 
 impl SystemClauseType {
@@ -484,6 +485,7 @@ impl SystemClauseType {
             &SystemClauseType::CryptoDataDecrypt => clause_name!("$crypto_data_decrypt"),
             &SystemClauseType::Ed25519Sign => clause_name!("$ed25519_sign"),
             &SystemClauseType::Ed25519Verify => clause_name!("$ed25519_verify"),
+            &SystemClauseType::Ed25519NewKeyPair => clause_name!("$ed25519_new_keypair")
         }
     }
 
@@ -654,6 +656,7 @@ impl SystemClauseType {
             ("$crypto_data_decrypt", 5) => Some(SystemClauseType::CryptoDataDecrypt),
             ("$ed25519_sign", 3) => Some(SystemClauseType::Ed25519Sign),
             ("$ed25519_verify", 3) => Some(SystemClauseType::Ed25519Verify),
+            ("$ed25519_new_keypair", 1) => Some(SystemClauseType::Ed25519NewKeyPair),
             _ => None,
         }
     }
index 804c116f5b7e4279342d062731ac8af3cc006a51..5807292e7063b67959a90f3e8f2f14fb8554c3bd 100644 (file)
@@ -21,6 +21,7 @@
            crypto_password_hash/3,     % +Password, -Hash, +Options
            crypto_data_encrypt/6,      % +PlainText, +Algorithm, +Key, +IV, -CipherText, +Options
            crypto_data_decrypt/6,      % +CipherText, +Algorithm, +Key, +IV, -PlainText, +Options
+           ed25519_new_keypair/1,      % -KeyPair
            ed25519_sign/4,             % +PrivateKey, +Data, -Signature, +Options
            ed25519_verify/4,           % +PublicKey, +Data, -Signature, +Options
            crypto_name_curve/2,        % +Name, -Curve
@@ -630,28 +631,37 @@ encoding_bytes(utf8, Cs, Bs) :-
    Digital signatures with Ed25519
    ===============================
 
-   ed25519_sign(+Key, +Data, -Signature, +Options)
+   - ed25519_new_keypair(-Pair)
+     Yields a new Ed25519 key pair Pair, a list of characters. The
+     pair contains the private key and must be kept absolutely secret.
+     Pair can be used for signing. Its public key can be obtained
+     with ed25519_keypair_public_key/2.
 
-   Key and Data must be lists of characters. Key is a private key in
-   PKCS#8 (v1 or v2) DER format. Sign Data with Key, yielding
-   Signature as a list of hexadecimal characters.
+   - ed25519_keypair_public_key(+Pair, -PublicKey)
+     PublicKey is the public key of the given key pair. The public key
+     can be used for signature verification, and can be shared freely.
 
+   - ed25519_sign(+Key, +Data, -Signature, +Options)
+     Key and Data must be lists of characters. Key is a private key or
+     key pair in PKCS#8 (v1 or v2) DER format. Sign Data with Key,
+     yielding Signature as a list of hexadecimal characters.
 
-   ed25519_verify(+Key, +Data, +Signature, +Options)
+   - ed25519_verify(+Key, +Data, +Signature, +Options)
+     Key and Data must be lists of characters. Key is a public key.
+     Succeeds if Data was signed with the private key corresponding to
+     Key, where Signature is a list of hexadecimal characters as
+     generated by ed25519_sign/4. Fails otherwise.
 
-   Key and Data must be lists of characters. Key is a public key in
-   PKCS#8 DER format. Succeeds if Data was signed with the private key
-   corresponding to Key, where Signature is a list of hexadecimal
-   characters as generated by ed25519_sign/4. Fails otherwise.
-
-
-   Currently, the only option for both predicates is:
+   Currently, the only option for signing and verifying is:
 
      - encoding(+Encoding)
        The default encoding of Data is utf8. The alternative is octet,
        which treats Data as a list of raw bytes.
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 
+ed25519_new_keypair(Pair) :-
+        '$ed25519_new_keypair'(Pair).
+
 ed25519_sign(Key0, Data0, Signature, Options) :-
         options_data_bytes(Options, Data0, Data),
         encoding_bytes(octet, Key0, Key),
index 71a866273ff6cc0c77ec0bcd47df21c168f02d4f..38f044b0b26b590e0a5f4a3867259a77886f1c06 100644 (file)
@@ -5448,6 +5448,15 @@ impl MachineState {
 
                 self.unify(self[temp_v!(5)], complete_string);
             }
+            &SystemClauseType::Ed25519NewKeyPair => {
+                let pkcs8_bytes = signature::Ed25519KeyPair::generate_pkcs8(rng()).unwrap();
+                let complete_string = {
+                          let buffer = String::from_iter(pkcs8_bytes.as_ref().iter().map(|b| *b as char));
+                          self.heap.put_complete_string(&buffer)
+                      };
+
+                self.unify(self[temp_v!(1)], complete_string);
+            }
             &SystemClauseType::Ed25519Sign => {
                 let stub1 = MachineError::functor_stub(clause_name!("ed25519_sign"), 4);
                 let key = self.integers_to_bytevec(temp_v!(1), stub1);