Git Product home page Git Product logo

aescrypt's Introduction

AES Crypt

NOTE: This repository is retired. Code is still under development and posted at https://www.aescrypt.com/.


This is a branch of the soure repository for the AES Crypt software available from www.aescrypt.com. This branch has a few more build options than the master code available from aescrypt.com directly.

AES Crypt was initially developed for Windows and then later ported to Linux. Other versions of the software, including Mac, Java, Android, and iOS, were created, most of which were derived from the Linux code.

The code for each platform is stored in a directory for that platform (e.g., Windows and Linux). A "readme" file exists in each that provides any additional information that might be useful for that platform.

Some of the source code is not yet published here, though all source code is still available from https://www.aescrypt.com.

The code in this repository is older code and may contain code that has not been fully tested. As a new version binary is released and a version number associated with it, the source code and binary will be posted to www.aescrypt.com/download.

aescrypt's People

Contributors

alonbl avatar mmangione avatar paulej avatar pigsflew avatar skeeto avatar szaszaiz avatar yayachiken avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aescrypt's Issues

Crashes on Mac

Downloaded: "AES Crypt - GUI (Mac x86) (This is the version most newer Mac users want.)"
...and it crashes after install. I right-click then select "Open" talks about unknown dev hit "open/run" and can't get past that.

OS info:
Mac OSX 10.11.6
3.06 GHz Intel Core 2 Duo

Let me know if anyone needs more info.

Unexpected behavior when specifying same input and output file

Hi!
Yesterday a programmer pointed out a corner case in pyAesCrypt usage:
marcobellaccini/pyAesCrypt#5
He was wondering whether specifying same input and output file is legit.
I don't think that's a valid use case, so I explicitly prevented the user from doing it.
For the sake of completeness, I've tested the same use case with the Linux command-line version of AESCrypt (v3.13) and I've got this error:

$ aescrypt -o foo.aes -d foo.aes
Enter password: ******
Error: Input file is too short.

after executing the command, foo.aes is deleted too.

Cheers

Marco

Question

How to encrypt a file, if the number of its size is not An integer multiple of 16?

Unauthenticated header data is trusted, making the plaintext malleable (security issue)

There's a security flaw in that the header is unauthenticated but is still trusted when decrypting data. An attacker, without knowing the key, can modify an encrypted file such that it decrypts to a different output undetected.

Here's a dramatic demonstration of the flaw. You can run each of these commands yourself to see it in action. I chose this example because proves this flaw could be exploited for a practical attack.

Alice, a spy, has had her cover blown and she needs to meet with her trusted emergency contact, Bob, as soon as possible. They've never met in person and, for security reasons, don't even know what the other looks like. As planned, she uses AESCrypt to coordinate this with Bob, encrypting with their prearranged passphrase, "foo". Since AESCrypt authenticates its encrypted data, Bob will be able to trust that the message was sent by Alice, or at least someone who knows the passphrase.

$ echo "let's meet tonight at 530" > message.txt
$ aescrypt -e -p foo message.txt 
$ aescrypt -d -p foo -o - message.txt.aes 
let's meet tonight at 530

Mallory, a counter-spy, is watching Alice now that her cover is blown. She saw that Alice sent a message to Bob, and that Alice ordered a rideshare service to pick her up at 5:15pm. She guesses that the message establishes a meeting with Bob at 5:30pm, and, if she's lucky, the message ends with the meeting time.

Mallory doesn't know the passphrase, "foo", but she does have the opportunity to manipulate the message before Bob will see it. Remembering her training, she knows about a particular cryptographic flaw in AESCrypt. To exploit it, she changes the byte at offset 0x117 from 0x0a to 0x07. This corresponds to the last_block_size field of the header.

$ printf '\x07' | dd of=message.txt.aes bs=1 seek=$((0x117)) conv=notrunc

Bob receives the manipulated ciphertext file and decrypts it. He's even careful to check the exit status, just in case.

$ aescrypt -d -p foo -o - message.txt.aes 
let's meet tonight at 5
$ echo $?
0

AESCrypt says it's legitimate, so he makes plans to meet Alice at 5:00pm. Unfortunately, Bob arrives to the meeting a half hour too early, meets "Alice," blowing his cover, too, without Alice's knowledge. Alice arrives at 5:30pm to meet "Bob," who has the right credentials thanks to the 5:00pm interception.

The security flaw is that AESCrypt does not use a proper padding scheme. Instead it trusts the last_block_size field of the header. The header is not authenticated, so it shouldn't be trusted. This allows attackers control the size of the last block, which is implicitly padded with the previous block of input. An attacker can trivially either shorten (as Mallory did) or lengthen this last block, repeating bytes from the previous block.

It's very easy to fix: Get rid of the last_block_size field and instead use a proper padding scheme like PKCS#5. Pad each byte of the last block with the number of padding bytes. If the last block is full, append an entire extra block of padding (e.g. 16 bytes of 0x10). When decrypting, read the last byte of the last block, make sure it's in 1–16, and remove that many bytes from the end of the decrypted plaintext. The padding is authenticated, so you can trust it.

Please clearly indicate license terms

Hi, I'd like to reuse parts of your code to create simular open source utility that just employs different encryption algorithm. However, I can't find any reference to exact license terms that this code is covered by. Can you please follow standard practice and add file called LICENSE in the root of your repo with exact license terms.

sha256 doesn't follow FIPS 180-2 or FIPS 180-4 spec

I translated the sha256.c file into Rust and read up on the FIPS 180-2 standard and I found an issue.

Rust discovered that in the second call to the sha256_update method within the sha256_finish method causes u32 to exceed its max limit. From studying the standard and making some changes on the Rust side I found the answer.

The C code here has these following methods:

#define F0(x,y,z) ((x & y) | (z & (x | y)))
#define F1(x,y,z) (z ^ (x & (y ^ z)))

Used here:

#define P(a,b,c,d,e,f,g,h,x,K)                  \
{                                               \
    temp1 = h + S3(e) + F1(e,f,g) + K + x;      \
    temp2 = S2(a) + F0(a,b,c);                  \
    d += temp1; h = temp1 + temp2;              \
}

F0 and F1 do not follow the FIPS 180-2 standards and have a different formula. In the specification the F1 method would be the method Ch and has the following formula (in mathematical notation):

Ch( x, y, z) = ( x ^ y) ⊕  ( ¬x ^ z)

F0 should be the Maj method and has this following formula (in mathematical notation):

Maj( x, y, z) = ( x ^ y) ⊕ ( x ^ z) ⊕ ( y ^ z)

In my Rust code I swapped out the methods with the following:

#[inline(always)] fn ch(x: u32, y: u32, z: u32) -> u32 { (x & y) ^ (!x & z) }
#[inline(always)] fn maj(x: u32, y: u32, z: u32) -> u32 { (x & y) ^ (x & z) ^ (y & z) }

This fixed the u32 addition overflow issue and is according to the FIPS 180-2 spec (which the C file comment says this adheres to) and the FIPS 180-4 spec. Also my code now works in Rust with the tests.

I just wanted to pass along a solution I discovered and hope you find this helpful.

Cheers!

Windows 10 installation error

When running AESCrypt.msi, Windows installs AESCrypt but when running aescrypt.exe, it will immediately close itself and when running AESCrypt32.exe, I get the error: Usage: aescrypt32 [/d|/e] filename. When running setup.exe, I get the error: Fix the following problem: A newer version of Microsoft Visual C++ 2010 Redistributable was detected on the computer.

[Linux] undefined macro: AC_LIBTOOL_WIN32_DLL

.../AESCrypt/Linux$ autoreconf -ivf
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf --force
configure.ac:80: error: possibly undefined macro: AC_LIBTOOL_WIN32_DLL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
configure.ac:81: error: possibly undefined macro: AC_LIBTOOL_RC
configure.ac:82: error: possibly undefined macro: AC_PROG_LIBTOOL
autoreconf: /usr/bin/autoconf failed with exit status: 1

$ uname -a
Linux h 4.4.0-34-generic #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:    16.04
Codename:   xenial

Linux x64 ELF Installation Issues with Ubuntu 18.04 LTS

I can successfully execute the file AESCrypt-GUI-3.11-Linux-x86_64-Install. After prompting for my password, it exits silently with status 0 (from strace). Afterwards, no context entry is available when I right-click, and AESCrypt does not show up in my installed programs. Neither "aescrypt" nor "aescrypt-gui" are recognized commands.

I would debug this operation, but I'm not even sure where to begin. Why exit with status 0?

Release tags

Hello,
Could you please add release tags in git?

Can't compile with MINGW

Hi
I get everytime this error when i compile using mingw on windows x64:



C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xa2): undefined re
ference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xc0): undefined re
ference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x15c): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x3c2): undefined r
eference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x3e0): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x468): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x519): undefined r
eference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x531): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x548): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x558): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x57e): undefined r
eference to `aes_set_key(aes_context*, unsigned char*, int)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x72e): undefined r
eference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x749): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x815): undefined r
eference to `aes_encrypt(aes_context*, unsigned char*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x829): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x891): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x899): undefined r
eference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x8b4): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x8cc): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x8dc): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x95a): undefined r
eference to `aes_set_key(aes_context*, unsigned char*, int)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xb2b): undefined r
eference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xb46): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xbf0): undefined r
eference to `aes_encrypt(aes_context*, unsigned char*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xc04): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xcd2): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xcda): undefined r
eference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xcf5): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xd0d): undefined r
eference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0xd1d): undefined r
eference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1094): undefined
reference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x10ac): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x10bc): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x10cc): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1105): undefined
reference to `aes_set_key(aes_context*, unsigned char*, int)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x12b5): undefined
reference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x12c9): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x135d): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1374): undefined
reference to `aes_decrypt(aes_context*, unsigned char*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x14b1): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x14b9): undefined
reference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x14cd): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x14e5): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x14f5): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x15be): undefined
reference to `aes_set_key(aes_context*, unsigned char*, int)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1778): undefined
reference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1790): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1816): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x182d): undefined
reference to `aes_decrypt(aes_context*, unsigned char*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1a06): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1a0e): undefined
reference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1a29): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1a41): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1a51): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1b6b): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1b73): undefined
reference to `sha256_starts(sha256_context*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1b8e): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1ba6): undefined
reference to `sha256_update(sha256_context*, unsigned char*, unsigned long)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1bb6): undefined
reference to `sha256_finish(sha256_context*, unsigned char*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x1ee1): undefined
reference to `getopt(int, wchar_t* const*, wchar_t const*)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x2368): undefined
reference to `read_password(wchar_t*, encryptmode_t)'
C:\Users\MyPC\AppData\Local\Temp\cclSPvvW.o:aescrypt.c:(.text+0x25d8): undefined
reference to `read_password_error(int)'
C:/Program Files (x86)/mingw-w64/i686-6.1.0-posix-dwarf-rt_v5-rev1/mingw32/bin/.
./lib/gcc/i686-w64-mingw32/6.1.0/../../../../i686-w64-mingw32/lib/../lib/libming
w32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined refe
rence to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

Any fix please?

Add LDFLAGS to Makefile

Somewhere between releases 3.0.6b and 3.14 aescrypt compiled from the Linux source downloaded from https://www.aescrypt.com/download/v3/linux/aescrypt-3.14.tgz stopped honoring LDFLAGS.

This small patch fixes the problem:

--- Makefile  2018-10-21 00:27:35.000000000 +0000
+++ Makefile  2021-07-20 00:00:00.000000000 +0000
@@ -27,13 +27,13 @@
 all: aescrypt aescrypt_keygen
 
 aescrypt: $(AESCRYPT_OBJS)
-       $(CC) $(CFLAGS) $(LIBS) -o $@ $(AESCRYPT_OBJS)
+       $(CC) $(CFLAGS) $(LIBS) $(LDFLAGS) -o $@ $(AESCRYPT_OBJS)
 
 aescrypt_keygen: $(KEYGEN_OBJS)
-       $(CC) $(CFLAGS) $(LIBS) -o $@ $(KEYGEN_OBJS)
+       $(CC) $(CFLAGS) $(LIBS) $(LDFLAGS) -o $@ $(KEYGEN_OBJS)
 
 %.o: %.c %.h
-       $(CC) $(CFLAGS) -c $*.c
+       $(CC) $(CFLAGS) $(LDFLAGS) -c $*.c
 
 install: aescrypt
        install -o root -g root -m 755 aescrypt /usr/bin

I don't really understand how code flows between this repository and the web site, but I hope you can include this in future releases. :) Thank you.

RPM package for AESCrypt?

Hi @paulej . Long time aescrypt user here. In fact, at some point it became a critical part of my life and it's one of the first thing I have to install on newly provisioned systems.

As such I want to make an RPM package for it so it's easier to install on Fedora, CentOS, and RHEL boxes.

If I do this, will you give it your blessing (assuming it meets quality standards of course)? I can also work to get it included in the Fedora repos and becoming the package maintainer if you are agreeable to that.

Please let me know.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.