2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;; MODULE : tm-secure.scm
5 ;; DESCRIPTION : Secure evaluation of Scheme scripts
6 ;; COPYRIGHT : (C) 1999 Joris van der Hoeven
8 ;; This software falls under the GNU general public license version 3 or later.
9 ;; It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
10 ;; in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
12 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14 (texmacs-module (kernel texmacs tm-secure)
15 (:use (kernel texmacs tm-define) (kernel texmacs tm-plugins)))
17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18 ;; Primitive secure functions
19 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21 (define-public-macro (define-secure-symbols . l)
22 (for-each (lambda (x) (property-set! x :secure #t '())) l)
25 (define-secure-symbols
26 boolean? null? symbol? string? pair? list?
28 string-length substring string-append
29 string->list list->string string-ref string-set!
30 + - * / gcd lcm quotient remainder modulo abs log exp sqrt
31 car cdr caar cadr cdar cddr
32 caaar caadr cadar caddr cdaar cdadr cddar cdddr
33 caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
34 cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
35 cons list append length reverse
36 texmacs-version texmacs-version-release*)
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42 (define (secure-args? args env)
44 (and (secure-expr? (car args) env)
45 (secure-args? (cdr args) env))))
47 (define (secure-cond? expr env)
49 (and (or (== (caar args) 'else) (secure-expr? (caar args) env))
50 (secure-expr? (cadar args) env)
51 (secure-cond? (cdr args) env))))
53 (define (local-env env l)
55 ((pair? l) (local-env (assoc-set! env (car l) #t) (cdr l)))
56 (else (assoc-set! env l #t))))
58 (define (secure-lambda? expr env)
59 (secure-args? (cdr expr) (local-env env (car expr))))
61 (define (secure-quasiquote? args env)
62 (cond ((npair? args) #t)
63 ((func? args 'unquote 1) (secure-expr? (cadr args) env))
64 ((func? args 'unquote-splicing 1) (secure-expr? (cadr args) env))
65 (else (and (secure-quasiquote? (car args) env)
66 (secure-quasiquote? (cdr args) env)))))
68 (define (secure-expr? expr env)
71 (m (drd-ref secure-macros% f)))
72 (cond (m (m (cdr expr) env))
73 ((assoc-ref env f) (secure-args? (cdr expr) env))
75 ((== f 'quasiquote) (secure-quasiquote? (cdr expr) env))
77 (and (property f :secure)
78 (secure-args? (cdr expr) env)))
79 (else (secure-args? expr env)))))
88 (drd-table secure-macros%
93 (lambda ,secure-lambda?)
96 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
98 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
100 (define-public (secure? expr)
101 "Test whether it is secure to evaluate the expression @expr"
102 (or (secure-expr? expr '())
103 (and (lazy-plugin-force) (secure-expr? expr '()))))