Markus Triska
8668aee7fd
ENHANCED: Reorder fields in time stamps so that (@<)/2 is meaningful.
2020-07-16 23:40:03 +02:00
Markus Triska
4f386b3e5e
ADDED: file_modification_time/2, obtaining a time stamp.
...
This addresses a remaining aspect of #511 .
2020-07-16 23:40:03 +02:00
Markus Triska
0f4667d942
ADDED: path_canonical/2, obtaining the canonical absolute path.
...
This addresses a remaining aspect of #511 .
2020-07-15 20:43:34 +02:00
Markus Triska
94e9e17c79
ADDED: working_directory/2, addressing a remaining aspect of #511
2020-07-14 23:05:29 +02:00
Markus Triska
5134e64cae
ADDED: delete_file/1, addressing a remaining aspect of #511
2020-07-14 22:21:46 +02:00
Markus Triska
b227e160f0
mention symmetric encryption and ChaCha20-Poly1305
2020-07-12 11:59:34 +02:00
Markus Triska
88a2b82f7e
ENHANCED: library(crypto): Retain the compact representation of strings.
...
This avoids the costly (in terms of space requirements!) conversion of
compact lists of characters to lists of integers, making hashing, HKDF,
encryption, decryption, signing and signature verification an order of
magnitude more efficient (primarily in terms of space, also in time).
This makes library(crypto) suitable to process also very large files.
2020-07-12 11:54:37 +02:00
Markus Triska
0fa8feb475
use newly available character type in must_be/2
2020-07-11 21:00:25 +02:00
Markus Triska
eb872f8fca
ADDED: library(os), reasoning about environment variables.
...
Together with library(files), this addresses #511 .
2020-07-11 21:00:25 +02:00
Markus Triska
65f200e02c
directory_files/2: throw representation error if into_string() fails
...
Suggested by @notoria in #606 . Many thanks!
2020-06-24 23:30:40 +02:00
Markus Triska
aa9432e24f
comment on indexing, addressing a comment by @pmoura in #606
...
If indexing is needed for lists of characters, it should be added to
the engine.
2020-06-24 22:29:34 +02:00
Markus Triska
30d1585468
ADDED: library(files), for reasoning about files and directories.
2020-06-24 22:29:34 +02:00
Markus Triska
bcd6d4e8a7
library(format) is not used in this example
2020-06-21 09:46:05 +02:00
Markus Triska
32eb896c56
ADDED: load_xml/3 to load XML files from streams, files and strings.
2020-06-21 09:45:37 +02:00
Markus Triska
b3c9fb2fea
import member/2 from library(lists)
...
This is needed when processing redirects.
2020-06-20 19:07:43 +02:00
Markus Triska
d66ea07ba4
ADDED: library(xpath) for convenient analysis of HTML and XML documents.
2020-06-20 18:08:11 +02:00
Markus Triska
79829cb6d2
ADDED: library(sgml), providing load_html/3 to parse HTML documents
2020-06-19 16:40:01 +02:00
Markus Triska
5eda2dfe0e
put_char/[1,2]: throw type errors for atoms that are not characters
...
Example:
?- put_char(hello).
%@ caught: error(type_error(character,hello),put_char/2)
2020-06-18 00:15:00 +02:00
Markus Triska
19acd608a5
ADDED: library(http/http_open), opening HTTP and HTTPS streams for reading
...
Example:
?- http_open("https://github.com/mthom/scryer-prolog ", Stream, []),
length(Ls, 10),
maplist(get_char(Stream), Ls).
Yielding:
%@ Stream = '$stream'(0x7fba4c59ef10), Ls = "\n\n\n\n\n<!DOC"
%@ ; false.
2020-06-17 20:10:22 +02:00
Markus Triska
8958ea036e
ENHANCED: much faster format/3 for text streams
...
This is now also used by format/2 to emit output on the terminal,
and significantly speeds up toplevel output of long strings.
2020-06-16 21:13:03 +02:00
Markus Triska
10a0f708b9
use format/3 to benefit from efficiency improvements
2020-06-14 10:51:24 +02:00
Markus Triska
409d3c168d
ENHANCED: faster format/3 when writing to binary streams
...
This is also more secure, since it does not change the atom table
and therefore leaves little trace of what was processed.
2020-06-14 10:43:25 +02:00
Markus Triska
f910e013a6
use take() for extra fast processing of binary files
...
Suggested by @notoria in #589 . Many thanks!
2020-06-13 16:47:46 +02:00
Markus Triska
5f1b03261c
better naming: str --> string
...
Suggested by @notoria in #589 . Many thanks!
2020-06-13 16:47:46 +02:00
Markus Triska
862197fc96
explain .scryerrc configuration file
2020-06-13 16:47:02 +02:00
Markus Triska
44ebd894d5
ADDED: portray_clause/2, writing to a specified stream.
2020-06-13 16:45:47 +02:00
Markus Triska
b85ff7db36
ENHANCED: Read more characters at once, significantly speeding up library(pio).
2020-06-13 16:25:41 +02:00
Markus Triska
22fd216de5
ADDED: read_line_to_chars/3, reading up to and including "\n" from a stream, yielding a list difference.
...
This works for both binary and text streams.
2020-06-13 09:14:44 +02:00
Markus Triska
d96ea6b815
include library(pio) and library(charsio) in the itemization
2020-06-12 00:02:41 +02:00
Markus Triska
40c3e31955
ENHANCED: phrase_from_file/[2,3] now read the file lazily.
...
This allows processing extremely large files. In addition, the
efficient string representation helps to reduce memory usage.
These features unleash the full power of Prolog for text processing,
the exact use case Prolog was designed for.
2020-06-12 00:02:41 +02:00
Markus Triska
2fc887724b
ADDED: format_time//2 for describing strings involving dates and times
...
current_time/1 yields the current system time as an opaque time stamp.
2020-06-11 00:55:38 +02:00
Markus Triska
184ef94e7e
ENHANCED: throw Prolog exception on expired certificates
...
Example:
?- socket_client_open('expired.badssl.com':443, S, [tls(true)]).
caught: error(permission_error(open,source_sink,'expired.badssl.com'),socket_client_open/3)
2020-06-09 23:01:28 +02:00
Markus Triska
7b30daf88d
ADDED: Encrypted client connections in library(sockets) via new option tls/1.
...
Use tls(true) to negotiate an encrypted network connection via TLS.
2020-06-09 07:43:29 +02:00
Markus Triska
d5e76da475
ADDED: type checks for type boolean
2020-06-08 00:41:47 +02:00
Markus Triska
c22816de08
type check for ~d and ~D specifiers
2020-06-08 00:09:55 +02:00
Markus Triska
9bb851d437
ENHANCED: format_//2 now evaluates arithmetic expressions for ~d, ~D, ~f, ~r and ~R
...
Example:
?- phrase(format_("~d", [1+2]), Cs).
Cs = "3"
; false.
2020-06-08 00:09:55 +02:00
Markus Triska
c8a9f8dcf5
better domain error in format_//2
...
Example:
?- format("", [hello]).
caught: error(domain_error(empty_list,[hello]),format_//2)
2020-06-07 23:59:37 +02:00
Markus Triska
e8653ffe32
add type check for scalar argument in crypto_curve_scalar_mult/4
...
Suggested by @notoria in #576 . Many thanks!
2020-06-07 18:51:13 +02:00
Markus Triska
5499df418a
use secp256k1 in the example
2020-06-07 11:04:24 +02:00
Markus Triska
b586618411
ENHANCED: Faster Rust-based crypto_curve_scalar_mult/4 using OpenSSL.
2020-06-07 11:04:24 +02:00
Markus Triska
7cc92ec1c1
ADDED: Logo.
...
Motivation and considerations:
- A Scryer certainly needs a raven. Ravens are among the most
intelligent animals on earth.
- When writing Prolog programs, a few strokes are often enough.
- Purple is the colour most associated with magic and royalty,
indicating the almost surreal and pure features provided by Scryer,
in the lineage of Marseille Prolog.
- The shape of the silhouette looks a bit like an "S" for "Scryer".
- A square which surrounds the image is traditionally associated with
finishing a proof (square, Latin "quadratum", has the same starting
letters as "quod erat demonstrandum").
I call this raven: *Cryer*. Cryer is an archaic spelling for "crier",
an officer who makes public announcements in a court of justice.
The Prolog top-level likewise makes announcements about what is true.
2020-05-26 22:13:51 +02:00
Markus Triska
b0df981b01
ADDED: halt/1, halting with specified exit code
2020-05-23 19:28:17 +02:00
Markus Triska
48c0b0ab3c
ENHANCED: Faster format/3 for binary streams.
...
This speeds up web servers considerably when sending binary files.
2020-05-22 17:30:29 +02:00
Markus Triska
cbbed310c5
ADDED: format/3, writing formatted output to a stream
...
Both binary and text streams are supported.
2020-05-22 17:23:51 +02:00
Markus Triska
1108c99688
document that lists of integers can be specified if encoding(octet) is used
...
This seems to be a good compromise: The API now strongly encourages
lists of characters, which are ideally suited to represent text, and
also allows lists of bytes if the encoding(octet) option is used.
2020-05-21 13:41:57 +02:00
Markus Triska
93da831ef0
correct mode indication for ed25519_verify/4
...
Noted by @notoria in #545 . Many thanks!
2020-05-21 01:27:06 +02:00
Markus Triska
72bf45912e
"PrivateKey" --> "KeyPair"
2020-05-21 00:14:15 +02:00
Markus Triska
5d94276c4f
remove several mentions of list of bytes in predicate descriptions
...
This is to focus more on the intended core representation of text: In
Prolog, text is ideally represented as a list of characters, and this
is what we want to encourage, especially given Scryer's compact
representation for strings.
For the time being, library(crypto) still also supports lists of bytes in
several predicates. This will likely be removed at some point in the
future. Please use lists of characters to make your code future-proof.
2020-05-21 00:07:42 +02:00
Markus Triska
b43f27030e
require PKCS#8 v2 format for better security
...
Notably, this format requires that the public key also be present.
This format is what ed25519_new_keypair/1 generates, and it is
strongly encouraged for higher security.
2020-05-20 23:55:21 +02:00
Markus Triska
2845f55157
ADDED: ed25519_keypair_public_key/2, relating a key pair to its public key
2020-05-20 23:43:28 +02:00
Markus Triska
e254d84710
clarify format of public key
2020-05-20 23:17:42 +02:00
Markus Triska
0ef7b5488d
ADDED: ed25519_new_keypair/1 to dynamically create a new Ed25519 key pair
2020-05-20 23:11:56 +02:00
Markus Triska
56b04f8df8
use LessSafeKey to simplify the implementation of authenticated encryption
...
The nonce is explicitly specified, and the application programmer
must (and always had to) ensure that it is unique for a given key.
2020-05-20 22:32:39 +02:00
Markus Triska
2d036c6b25
"codes" --> "bytes"
...
Support for lists of bytes may be dropped from library(crypto). Use
lists of characters to make your code future-proof. Lists of
characters will always be supported due to their compactness,
and because Prolog applications should move towards characters.
2020-05-20 22:32:39 +02:00
Markus Triska
ad3be5c848
ADDED: Public key signatures and signature verification with Ed25519
2020-05-20 22:32:39 +02:00
Markus Triska
21b7348c6a
import member/2 from library(lists)
2020-05-19 20:13:06 +02:00
Markus Triska
0bd9831eec
ADDED: phrase_from_file/3 in library(pio)
...
This allows us to specify type(binary), and read from binary files
with DCGs.
2020-05-19 18:52:18 +02:00
Markus Triska
dec2ef70c7
better error handling in crypto_data_hkdf/4
...
Noted by @notoria in #533 . Many thanks!
2020-05-19 18:22:25 +02:00
Markus Triska
d19d8ea770
crypto_data_hkdf/4: do not crash for length > usize::max_value()
...
For now, we fail silently in such cases.
Noted by @notoria in #533 . Many thanks!
2020-05-19 17:31:36 +02:00
Markus Triska
34f7752c0f
use more fixnums in cryptographic routines
2020-05-19 17:03:02 +02:00
Markus Triska
da4d061067
correct option processing in crypto_data_decrypt/6
2020-05-19 17:02:33 +02:00
Markus Triska
85155439be
use Fixnums for bytes in hashing.
...
Suggested by @notoria in #533 . Many thanks!
2020-05-19 16:43:44 +02:00
Markus Triska
dd32e69061
use matching to select the hashing algorithm
...
Suggested by @notoria in #533 . Many thanks!
2020-05-19 16:37:50 +02:00
Markus Triska
9f5322d309
ADDED: Support for BLAKE2 algorithms in crypto_data_hash/3.
2020-05-19 12:44:10 +02:00
Markus Triska
f5c2f6f9e9
ADDED: Support for SHA-3 algorithms in crypto_data_hash/3
2020-05-19 12:10:46 +02:00
Markus Triska
a423eb5323
stronger validation of input lists for cryptographic routines
...
Example:
?- crypto_data_hkdf(Var, 32, Bs, []).
caught: error(instantiation_error,must_be/2)
Reported by @notoria in #527 . Many thanks!
2020-05-18 13:28:52 +02:00
Markus Triska
fd732550d8
crypto_data_hkdf/4: Fail if the length is too long.
...
Due to the way the counter is constructed in the HKDF specification,
the requested output length can be at most 255 times the size of the
digest algorithm's output.
Reported by @notoria in #527 . Many thanks!
2020-05-18 13:21:38 +02:00
Markus Triska
fac7ba70c8
crypto_password_hash/3: fail if the number of iterations is too high
...
Discussed in #527 .
2020-05-18 13:11:39 +02:00
Markus Triska
e9f8b35918
centralize reasoning about encoding
2020-05-18 11:29:35 +02:00
Markus Triska
23034dd4f5
raise instantiation errors for variable encoding
...
Reported by notoria in #527 .
Note that from a declarative perspective, it would indeed be valid to
give answers for both available encodings.
2020-05-18 11:21:38 +02:00
Markus Triska
70ad44adfd
type check for length argument in crypto_data_hkdf/4
...
Reported by @notoria in #527 .
2020-05-18 11:12:59 +02:00
Markus Triska
95ca8a2630
throw instantiation error if the list of options contains a variable ( #523 )
...
Many thanks to @notoria for the test case!
2020-05-18 09:58:09 +02:00
Markus Triska
3855d7ea02
type test for salt in crypto_password_hash/3
2020-05-17 22:01:22 +02:00
Markus Triska
862ae26631
Authenticated encryption in library(crypto), new encoding/1 option for hashes ( #515 )
...
* shorten n_newlines//1
* remove unneeded variable
* ADDED: authenticated encryption and decryption with ChaCha20-Poly1305
* ADDED: encoding/1 option for crypto_data_hash/3 and crypto_data_hkdf/4
2020-05-16 11:51:41 -06:00
Markus Triska
4e69301562
ADDED: Password-based key derivation (PBKDF2) ( #509 )
...
The new predicates crypto_password_hash/[2,3] let you store
passwords safely, and easily verify passwords later.
2020-05-15 10:49:23 -06:00
Markus Triska
50776748a7
ADDED: HMAC-based key derivation (HKDF) via crypto_data_hkdf/4
...
This is useful to generate keys and initialization vectors
from suitable input keying material, so that future predicates
for symmetric encryption can be used with appropriate parameters.
2020-05-14 20:07:59 +02:00
Markus Triska
4084005ee7
ADDED: Reasoning about elliptic curves in library(crypto).
...
This is useful to establish shared secrets, using ECDH key exchange.
Note that CLP(ℤ) goal expansion is currently disabled due to #445 ,
and this slows down the computations considerably for the time being.
2020-05-13 22:44:27 +02:00
Markus Triska
fd761735d4
ADDED: ripemd160 digest algorithm
...
This is used for example for Bitcoin address generation.
2020-05-13 22:36:40 +02:00
Markus Triska
8cd7d08573
ADDED: crypto_data_hash/3, computing cryptographically secure digests
2020-05-13 19:23:09 +02:00
Markus Triska
716fde5784
ADDED: crypto_n_random_bytes/2, creating cryptographically secure random bytes
...
The ring crate is used since it will be needed also for future
predicates in library(crypto).
2020-05-13 00:36:27 +02:00
Markus Triska
d75449ea63
ADDED: ~Nr and ~NR are now available for radix conversions
2020-05-09 19:19:25 +02:00
Markus Triska
a131c93a14
ADDED: Initial version of library(crypto).
2020-05-08 22:33:49 +02:00
Markus Triska
2dfdaaa4ba
disable goal expansion until #445 is resolved
2020-05-04 18:55:52 +02:00
Markus Triska
605c233753
do not project queue/2 attributes to residual goals
2020-05-04 00:54:43 +02:00
Markus Triska
ec6d725587
use ℤ
...
This is now possible thanks to the great contribution by @matt2xu.
Many thanks!
2020-05-02 00:06:16 +02:00
Markus Triska
ca5a5b4392
correct overeager CLP(ℤ) goal expansion
...
For instance, consider:
t(X) :- X #= 1.
We *cannot* expand this to:
?- listing(t/1).
t(A) :-
( integer(A) ->
A=:=A
; ( var(A) ->
true
; true,
clpz:clpz_equal(A,A)
)
).
Also, a new binding *must not* be dragged outside of disjunctions,
since the code may look for example like this:
i(X) :-
( X #= 3
; X #= 4
).
This commit fixes such issues, and still rewrites CLP(ℤ) expressions
as far as possible already at compilation time.
For example:
n(X) :- X #= 1+3.
This is now compiled to (note that 1+3 is evaluated to 4):
?- listing(n/1).
n(A) :-
( integer(A) ->
A=:=4
; ( var(A) ->
A=4
; B=4,
clpz:clpz_equal(A,B)
)
).
Ideally, it should be compiled to:
n(4).
2020-05-01 18:29:00 +02:00
Markus Triska
1dbadbfc35
enable goal expansion for CLP(ℤ) goals
...
Example:
integer_successor(I0, I) :- I #= I0 + 1.
Yielding:
?- listing(integer_successor/2).
integer_successor(A,B) :-
( integer(B) ->
( integer(A) ->
B=:=A+1
; C is B,
clpz:clpz_equal(C,A+1)
)
; ( integer(A) ->
( var(B) ->
B is A+1
; C is A+1,
clpz:clpz_equal(B,C)
)
; clpz:clpz_equal(B,A+1)
)
).
Thus, fast low-level arithmetic is used whenever possible.
2020-04-30 23:09:15 +02:00
Markus Triska
a39f4b4487
correct verify_attributes/3 for variables that have no CLP(ℤ) attribute attached ( #373 )
...
Example:
?- freeze(B, queen_value_truth(C,N,B)), Q #= N #<==> B.
clpz:(Q#=N#<==>B), clpz:(B in 0..1), freeze:freeze(B,queen_value_truth(C,N,B))
; false.
2020-04-30 18:10:09 +02:00
Markus Triska
b499c575bc
include library(arithmetic) in the overview
...
Many thanks to @notoria for these very useful predicates!
2020-04-29 22:06:49 +02:00
Markus Triska
20b76a703a
mention portray_clause/1 and listing/1
2020-04-28 18:27:46 +02:00
Markus Triska
dcc09b7bb5
mention backtrackable and non-backtrackable global variables
2020-04-28 18:22:18 +02:00
Markus Triska
4ea0dee90a
use new nth0/3 from library(lists)
2020-04-28 17:59:49 +02:00
Markus Triska
e61116d35a
use singleton variable, correct a mistake in maplist/8
2020-04-28 17:59:49 +02:00
Markus Triska
f7256c75d5
ADDED: nth0/3, relating indices to list elements
2020-04-28 17:59:49 +02:00
Markus Triska
2696fd1291
small typographic corrections
2020-04-28 17:59:49 +02:00
Markus Triska
b139620fba
use new predicates from library(error) to throw type and domain errors
2020-04-28 17:59:49 +02:00
Markus Triska
5f35dffa34
if_ --> if_/3
2020-04-27 19:53:25 +02:00
Markus Triska
89a4b5a6ff
add more information about Constraint Logic Programming (CLP)
2020-04-27 19:48:46 +02:00
Markus Triska
ff41d6aef9
include the new library(random) in the overview
...
Many thanks to @notoria for this contribution!
2020-04-27 18:44:59 +02:00
Markus Triska
8e1ba58551
use new predicates from library(error)
2020-04-27 18:44:59 +02:00