ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
encrypt.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2025 Marco Spedaletti (asimov@mclink.it)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *----------------------------------------------------------------------------
18 * Concesso in licenza secondo i termini della Licenza Apache, versione 2.0
19 * (la "Licenza"); è proibito usare questo file se non in conformità alla
20 * Licenza. Una copia della Licenza è disponibile all'indirizzo:
21 *
22 * http://www.apache.org/licenses/LICENSE-2.0
23 *
24 * Se non richiesto dalla legislazione vigente o concordato per iscritto,
25 * il software distribuito nei termini della Licenza è distribuito
26 * "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o
27 * implicite. Consultare la Licenza per il testo specifico che regola le
28 * autorizzazioni e le limitazioni previste dalla medesima.
29 ****************************************************************************/
30
31/****************************************************************************
32 * INCLUDE SECTION
33 ****************************************************************************/
34
35#include "../../ugbc.h"
36
37/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
46/* <usermanual>
47@keyword ENCRYPT
48
49@english
50
51The ''ENCRYPT'' command applies a symmetric encryption algorithm to a
52structured variable or memory area, appending a security checksum to
53prevent data corruption or accidental tampering.
54
55When the command is executed, the destination buffer is filled with the
56original data transformed by the encryption operation. A computed value
57a checksum is appended to the end of the buffer, to serve as a trust seal.
58
59Note that the size of the key must be the same as the size of the data.
60
61@italian
62
63Il comando ''ENCRYPT'' applica un algoritmo di crittografia simmetrica a una
64variabile strutturata o a un'area di memoria, aggiungendo un checksum di sicurezza per
65impedire il danneggiamento dei dati o la manomissione accidentale.
66
67Quando il comando viene eseguito, il buffer di destinazione viene riempito con i
68dati originali trasformati dall'operazione di crittografia. Un valore calcolato,
69un checksum, viene aggiunto alla fine del buffer, come sigillo di attendibilità.
70
71Si noti che la dimensione della chiave deve essere uguale alla dimensione dei dati.
72
73@syntax = ENCRYPT( data, key )
74
75@example DIM params(2) AS INTEGER
76@example data = ENCRYPT( params, "OKOK")
77
78</usermanual> */
79Variable * encrypt( Environment * _environment, char * _data, char * _key ) {
80
81 Variable * data = variable_retrieve( _environment, _data );
82 Variable * key = variable_retrieve( _environment, _key );
83 Variable * output = variable_temporary( _environment, VT_DSTRING, "(result)" );
84
85 Variable * dataAddress = variable_temporary( _environment, VT_ADDRESS, "(address of data)");
86 Variable * dataSize = variable_temporary( _environment, VT_BYTE, "(size of data)");
87
88 Variable * keyAddress = variable_temporary( _environment, VT_ADDRESS, "(address of data)");
89 Variable * keySize = variable_temporary( _environment, VT_BYTE, "(size of data)");
90
91 Variable * outputAddress = variable_temporary( _environment, VT_ADDRESS, "(address of output)");
92
93 switch( data->type ) {
94 case VT_STRING: {
95 cpu_move_8bit( _environment, data->realName, dataSize->realName );
96 cpu_addressof_16bit( _environment, data->realName, dataAddress->realName );
97 cpu_inc_16bit( _environment, dataAddress->realName );
98 break;
99 };
100 case VT_DSTRING: {
101 cpu_dsdescriptor( _environment, data->realName, dataAddress->realName, dataSize->realName );
102 break;
103 };
104 case VT_TYPE:
105 case VT_TARRAY:
106 case VT_BUFFER: {
107 cpu_store_8bit( _environment, dataSize->realName, data->size );
108 cpu_addressof_16bit( _environment, data->realName, dataAddress->realName );
109 break;
110 };
111 }
112
113 switch( key->type ) {
114 case VT_STRING: {
115 cpu_move_8bit( _environment, key->realName, keySize->realName );
116 cpu_addressof_16bit( _environment, key->realName, keyAddress->realName );
117 cpu_inc_16bit( _environment, keyAddress->realName );
118 break;
119 };
120 case VT_TARRAY:
121 case VT_TYPE:
122 case VT_BUFFER: {
123 cpu_store_8bit( _environment, keySize->realName, key->size );
124 cpu_addressof_16bit( _environment, key->realName, keyAddress->realName );
125 break;
126 };
127 case VT_DSTRING: {
128 cpu_dsdescriptor( _environment, key->realName, keyAddress->realName, keySize->realName );
129 break;
130 };
131 }
132
133 cpu_inc( _environment, dataSize->realName );
134 cpu_dsfree( _environment, output->realName );
135 cpu_dsalloc( _environment, dataSize->realName, output->realName );
136 cpu_dsdescriptor( _environment, output->realName, outputAddress->realName, NULL );
137
138 cpu_encrypt( _environment, dataAddress->realName, dataSize->realName, keyAddress->realName, keySize->realName, outputAddress->realName );
139
140 return output;
141
142}
143
void cpu_dsfree(Environment *_environment, char *_index)
Definition 6309.c:5917
void cpu_addressof_16bit(Environment *_environment, char *_source, char *_destination)
Definition 6309.c:1485
void cpu_inc(Environment *_environment, char *_variable)
Definition 6309.c:4555
void cpu_encrypt(Environment *_environment, char *_data, char *_data_size, char *_key, char *_key_size, char *_output)
Definition 6309.c:7569
void cpu_dsalloc(Environment *_environment, char *_size, char *_index)
Definition 6309.c:5895
void cpu_store_8bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 8 bit
Definition 6309.c:761
void cpu_inc_16bit(Environment *_environment, char *_variable)
Definition 6309.c:4565
void cpu_move_8bit(Environment *_environment, char *_source, char *_destination)
CPU 6309: emit code to move 8 bit
Definition 6309.c:743
void cpu_dsdescriptor(Environment *_environment, char *_index, char *_address, char *_size)
Definition 6309.c:5977
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
Variable * encrypt(Environment *_environment, char *_data, char *_key)
Emit code for ENCRYPT.
Definition encrypt.c:79
int size
Definition ugbc.h:1077
VariableType type
Definition ugbc.h:988
char * realName
Definition ugbc.h:982
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_TARRAY
Definition ugbc.h:480
@ VT_STRING
Definition ugbc.h:474
@ VT_BYTE
Definition ugbc.h:450
@ VT_BUFFER
Definition ugbc.h:477
@ VT_TYPE
Definition ugbc.h:546
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_DSTRING
Definition ugbc.h:483