16aff3115Swdenk /* 2bc11756dSGrant Erickson * (C) Copyright 2002-2008 36aff3115Swdenk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 46aff3115Swdenk * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 66aff3115Swdenk */ 76aff3115Swdenk 8371ee137SAndreas Fenkart #include <stdint.h> 99d80b49aSStefano Babic #include <uboot_aes.h> 10e3c52f2bSTom Rini 1100c234f3SStefano Babic /* 1200c234f3SStefano Babic * Programs using the library must check which API is available, 1300c234f3SStefano Babic * that varies depending on the U-Boot version. 1400c234f3SStefano Babic * This can be changed in future 1500c234f3SStefano Babic */ 1600c234f3SStefano Babic #define FW_ENV_API_VERSION 1 1700c234f3SStefano Babic 1881974f44SAndreas Fenkart struct env_opts { 19371ee137SAndreas Fenkart #ifdef CONFIG_FILE 20371ee137SAndreas Fenkart char *config_file; 21371ee137SAndreas Fenkart #endif 22371ee137SAndreas Fenkart int aes_flag; /* Is AES encryption used? */ 2381974f44SAndreas Fenkart uint8_t aes_key[AES_KEY_LENGTH]; 24d40dbfb7SB, Ravi char *lockname; 25371ee137SAndreas Fenkart }; 2607ce9440SAndreas Fenkart 27371ee137SAndreas Fenkart int parse_aes_key(char *key, uint8_t *bin_key); 28371ee137SAndreas Fenkart 29fd4e3280SAndreas Fenkart /** 30fd4e3280SAndreas Fenkart * fw_printenv() - print one or several environment variables 31fd4e3280SAndreas Fenkart * 32fd4e3280SAndreas Fenkart * @argc: number of variables names to be printed, prints all if 0 33fd4e3280SAndreas Fenkart * @argv: array of variable names to be printed, if argc != 0 34fd4e3280SAndreas Fenkart * @value_only: do not repeat the variable name, print the bare value, 35fd4e3280SAndreas Fenkart * only one variable allowed with this option, argc must be 1 36fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 37fd4e3280SAndreas Fenkart * 38fd4e3280SAndreas Fenkart * Description: 39fd4e3280SAndreas Fenkart * Uses fw_env_open, fw_getenv 40fd4e3280SAndreas Fenkart * 41fd4e3280SAndreas Fenkart * Return: 42fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 43fd4e3280SAndreas Fenkart */ 4481974f44SAndreas Fenkart int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts); 45fd4e3280SAndreas Fenkart 46fd4e3280SAndreas Fenkart /** 47*382bee57SSimon Glass * fw_env_set() - adds or removes one variable to the environment 48fd4e3280SAndreas Fenkart * 49fd4e3280SAndreas Fenkart * @argc: number of strings in argv, argv[0] is variable name, 50fd4e3280SAndreas Fenkart * argc==1 means erase variable, argc > 1 means add a variable 51fd4e3280SAndreas Fenkart * @argv: argv[0] is variable name, argv[1..argc-1] are concatenated separated 52fd4e3280SAndreas Fenkart * by single blank and set as the new value of the variable 53fd4e3280SAndreas Fenkart * @opts: how to retrieve environment from flash, defaults are used if NULL 54fd4e3280SAndreas Fenkart * 55fd4e3280SAndreas Fenkart * Description: 5633f0086cSStefano Babic * Uses fw_env_open, fw_env_write, fw_env_flush 57fd4e3280SAndreas Fenkart * 58fd4e3280SAndreas Fenkart * Return: 59fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 60fd4e3280SAndreas Fenkart * 61fd4e3280SAndreas Fenkart * ERRORS: 62fd4e3280SAndreas Fenkart * EROFS - some variables ("ethaddr", "serial#") cannot be modified 63fd4e3280SAndreas Fenkart */ 64*382bee57SSimon Glass int fw_env_set(int argc, char *argv[], struct env_opts *opts); 65fd4e3280SAndreas Fenkart 66fd4e3280SAndreas Fenkart /** 67fd4e3280SAndreas Fenkart * fw_parse_script() - adds or removes multiple variables with a batch script 68fd4e3280SAndreas Fenkart * 69fd4e3280SAndreas Fenkart * @fname: batch script file name 70fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 71fd4e3280SAndreas Fenkart * 72fd4e3280SAndreas Fenkart * Description: 7333f0086cSStefano Babic * Uses fw_env_open, fw_env_write, fw_env_flush 74fd4e3280SAndreas Fenkart * 75fd4e3280SAndreas Fenkart * Return: 76fd4e3280SAndreas Fenkart * 0 success, -1 on failure (modifies errno) 77fd4e3280SAndreas Fenkart * 78fd4e3280SAndreas Fenkart * Script Syntax: 79fd4e3280SAndreas Fenkart * 80fd4e3280SAndreas Fenkart * key [ [space]+ value] 81fd4e3280SAndreas Fenkart * 82fd4e3280SAndreas Fenkart * lines starting with '#' treated as comment 83fd4e3280SAndreas Fenkart * 84fd4e3280SAndreas Fenkart * A variable without value will be deleted. Any number of spaces are allowed 85fd4e3280SAndreas Fenkart * between key and value. The value starts with the first non-space character 86fd4e3280SAndreas Fenkart * and ends with newline. No comments allowed on these lines. Spaces inside 87fd4e3280SAndreas Fenkart * the value are preserved verbatim. 88fd4e3280SAndreas Fenkart * 89fd4e3280SAndreas Fenkart * Script Example: 90fd4e3280SAndreas Fenkart * 91fd4e3280SAndreas Fenkart * netdev eth0 92fd4e3280SAndreas Fenkart * 93fd4e3280SAndreas Fenkart * kernel_addr 400000 94fd4e3280SAndreas Fenkart * 95fd4e3280SAndreas Fenkart * foo spaces are copied verbatim 96fd4e3280SAndreas Fenkart * 97fd4e3280SAndreas Fenkart * # delete variable bar 98fd4e3280SAndreas Fenkart * 99fd4e3280SAndreas Fenkart * bar 100fd4e3280SAndreas Fenkart */ 10181974f44SAndreas Fenkart int fw_parse_script(char *fname, struct env_opts *opts); 102fd4e3280SAndreas Fenkart 103fd4e3280SAndreas Fenkart 104fd4e3280SAndreas Fenkart /** 105fd4e3280SAndreas Fenkart * fw_env_open() - read enviroment from flash into RAM cache 106fd4e3280SAndreas Fenkart * 107fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 108fd4e3280SAndreas Fenkart * 109fd4e3280SAndreas Fenkart * Return: 110fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 111fd4e3280SAndreas Fenkart */ 11281974f44SAndreas Fenkart int fw_env_open(struct env_opts *opts); 113fd4e3280SAndreas Fenkart 114fd4e3280SAndreas Fenkart /** 115fd4e3280SAndreas Fenkart * fw_getenv() - lookup variable in the RAM cache 116fd4e3280SAndreas Fenkart * 117fd4e3280SAndreas Fenkart * @name: variable to be searched 118fd4e3280SAndreas Fenkart * Return: 119fd4e3280SAndreas Fenkart * pointer to start of value, NULL if not found 120fd4e3280SAndreas Fenkart */ 121fd4e3280SAndreas Fenkart char *fw_getenv(char *name); 122fd4e3280SAndreas Fenkart 123fd4e3280SAndreas Fenkart /** 124fd4e3280SAndreas Fenkart * fw_env_write() - modify a variable held in the RAM cache 125fd4e3280SAndreas Fenkart * 126fd4e3280SAndreas Fenkart * @name: variable 127fd4e3280SAndreas Fenkart * @value: delete variable if NULL, otherwise create or overwrite the variable 128fd4e3280SAndreas Fenkart * 129fd4e3280SAndreas Fenkart * This is called in sequence to update the environment in RAM without updating 130fd4e3280SAndreas Fenkart * the copy in flash after each set 131fd4e3280SAndreas Fenkart * 132fd4e3280SAndreas Fenkart * Return: 133fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 134fd4e3280SAndreas Fenkart * 135fd4e3280SAndreas Fenkart * ERRORS: 136fd4e3280SAndreas Fenkart * EROFS - some variables ("ethaddr", "serial#") cannot be modified 137fd4e3280SAndreas Fenkart */ 138c3a23e8bSAndreas Fenkart int fw_env_write(char *name, char *value); 139fd4e3280SAndreas Fenkart 140fd4e3280SAndreas Fenkart /** 14133f0086cSStefano Babic * fw_env_flush - write the environment from RAM cache back to flash 14233f0086cSStefano Babic * 14333f0086cSStefano Babic * @opts: encryption key, configuration file, defaults are used if NULL 14433f0086cSStefano Babic * 14533f0086cSStefano Babic * Return: 14633f0086cSStefano Babic * 0 on success, -1 on failure (modifies errno) 14733f0086cSStefano Babic */ 14833f0086cSStefano Babic int fw_env_flush(struct env_opts *opts); 14933f0086cSStefano Babic 15033f0086cSStefano Babic /** 15133f0086cSStefano Babic * fw_env_close - free allocated structure and close env 152fd4e3280SAndreas Fenkart * 153fd4e3280SAndreas Fenkart * @opts: encryption key, configuration file, defaults are used if NULL 154fd4e3280SAndreas Fenkart * 155fd4e3280SAndreas Fenkart * Return: 156fd4e3280SAndreas Fenkart * 0 on success, -1 on failure (modifies errno) 157fd4e3280SAndreas Fenkart */ 15881974f44SAndreas Fenkart int fw_env_close(struct env_opts *opts); 1596aff3115Swdenk 16033f0086cSStefano Babic 16100c234f3SStefano Babic /** 16200c234f3SStefano Babic * fw_env_version - return the current version of the library 16300c234f3SStefano Babic * 16400c234f3SStefano Babic * Return: 16500c234f3SStefano Babic * version string of the library 16600c234f3SStefano Babic */ 16700c234f3SStefano Babic char *fw_env_version(void); 16800c234f3SStefano Babic 169c3a23e8bSAndreas Fenkart unsigned long crc32(unsigned long, const unsigned char *, unsigned); 170