GithubHelp home page GithubHelp logo

libsam3's People

Contributors

eyedeekay avatar majestrate avatar mikalv avatar sehraf avatar str4d 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

Watchers

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

libsam3's Issues

Correctly parse Destinations with Certificates

libsam3.h contains the following definition:

#define SAM3_PUBKEY_SIZE (516)

sam3NameLookup insists that the size of the public key returned via sam3FindField is equal to SAM3_PUBKEY_SIZE (516) while some results returned are larger than this.

Specifically, the base64 public key returned for zzz.i2p is:

GKapJ8koUcBj~jmQzHsTYxDg2tpfWj0xjQTzd8BhfC9c3OS5fwPBNajgF-eOD6eCjFTqTlorlh7Hnd8kXj1qblUGXT-tDoR9~YV8dmXl51cJn9MVTRrEqRWSJVXbUUz9t5Po6Xa247Vr0sJn27R4KoKP8QVj1GuH6dB3b6wTPbOamC3dkO18vkQkfZWUdRMDXk0d8AdjB0E0864nOT~J9Fpnd2pQE5uoFT6P0DqtQR2jsFvf9ME61aqLvKPPWpkgdn4z6Zkm-NJOcDz2Nv8Si7hli94E9SghMYRsdjU-knObKvxiagn84FIwcOpepxuG~kFXdD5NfsH0v6Uri3usE3XWD7Pw6P8qVYF39jUIq4OiNMwPnNYzy2N4mDMQdsdHO3LUVh~DEppOy9AAmEoHDjjJxt2BFBbGxfdpZCpENkwvmZeYUyNCCzASqTOOlNzdpne8cuesn3NDXIpNnqEE6Oe5Qm5YOJykrX~Vx~cFFT3QzDGkIjjxlFBsjUJyYkFjBQAEAAcAAA==

This value is the correct value from the router's address book and is 524 bytes long. A base32 conversion of this value also yields the correct b32 value in the router's address book:

lhbd7ojcaiofbfku7ixh47qj537g572zmhdc4oilvugzxdpdghua.b32.i2p

Is this a case where perhaps the libsam function should be a little more forgiving, rather than throwing errors?

Implement SAM v3.1

This library was originally written for SAM v3.0. In the intervening time, SAM v3.1 added support for configurable Destination signature types, which enables apps to move away from the default DSA 1024 signature type.

build fail

#21 partial help fix build, need fix for libsam3a.c

my error after attempt fiх libsam3a.c:

src/libsam3a/libsam3a.c:923:57: error: invalid conversion from 'void*' to 'void (*)(Sam3ASession*)' [-fpermissive]
  923 |       void (*cbComplete)(Sam3ASession * ses) = ses->aio.udata;
      |                                                ~~~~~~~~~^~~~~
      |                                                         |
      |                                                         void*
src/libsam3a/libsam3a.c: In function 'int sam3aSesStartHandshake(Sam3ASession*, void (*)(Sam3ASession*))':
src/libsam3a/libsam3a.c:936:22: error: invalid conversion from 'void (*)(Sam3ASession*)' to 'void*' [-fpermissive]
  936 |     ses->aio.udata = cbComplete;
      |                      ^~~~~~~~~~
      |                      |
      |                      void (*)(Sam3ASession*)

sam3GenerateKeys returns wrong public key

The returned public key is the end of the private key:

c++ test.cpp -lsam3 -L`pwd` && ./a.out
pub  qex~CbtDpHmoGoPK20SMg==
priv 8OiN7vVSRL6TMxjFdBHOq~IFwOfMso3QnGzeQ8ASJfI6EqMR4KwUC5AA4Klic4bciqKb7UmoesHTLT7kGw5UPBTlc1xGcagB-M39l7M3LXVK8~prD6AMXDw-b4hg006nzvhfvc6TdqZ2JyrTqAvIMDvdxg0GKRRyzdU1Nweol1vwRjSM5UkheKJAxcY9~lIWaFpKYNhpdR8Kdsm29~9OsMBNt31ejLJ5ccdtPvR5nUrDvpKDHXxunrRhEBOq5O02TvmeGQv5qhwUC5hFUP8w2ZQ~7LGCCY~QTqRl2ttW~nFgJakMxS0w7UPKkvQxmV-k74DW82RZfb-l6Dpr-RtTdL6ysaaWo1JjB6CZfUypanMw7nleLX~nCPGVWalAv2xyEUbi14Pcs3KHo~2tXQ35ypSJvem~uvUE7OGgAxuadAVz9~GafI3hA3lda76IKZOVFiz8s46~xSl9ES2GalvBuLRxJPCEzoodMxPAyacmgTOtG~f15WrCE5LJE15Vg73gBQAEAAcAAKuzeJdCuBl2am432oZdCYNsvVW8aOz7pLfFVZ-W27V2PykNOdgDLqlrGBmwl4aEKev5oXfQMiZGJCUmxhAnxxOAa1lNHrKhDqAe2cEePMiq8X-QCf4XbhIc9EQ8y6mvNmOUDN4KueR5pgpft2zt1zCgIBRmIzaqUN86Oc8mcMIWRT8x9WM4T1HhoMAjjNz-R6duCaJTmZD5bZhBkk4V95mD3KZF8EqXKL2IIUEVQgdG8oT9AjkTvc0znmjXCuxqt1qzjoLZnQuAOW7Z2ACUxhv~LAaJzS3cb-ksirVR8TKlbRxCpKrckso550tv4Xw6-ETGaapJJZZ9BZAIvpQ8U6oLMrsGCGHbGPp0~VfIVS3uQqex~CbtDpHmoGoPK20SMg==

Code

#include <string>
#include <iostream>
#include <stdio.h>
#include "src/libsam3/libsam3.h"

int main() {
	// The session is only usef for transporting the data
	Sam3Session ss;

	if (0 > sam3GenerateKeys(&ss, SAM3_HOST_DEFAULT, SAM3_PORT_DEFAULT, Sam3SigType::EdDSA_SHA512_Ed25519)) {
		printf("got error");
		return -1;
	}
	auto pub = std::string(ss.pubkey);
	auto priv = std::string(ss.privkey);

	std::cout << "pub  " << pub << std::endl << "priv " << priv << std::endl;
	return 0;
} 

Question regarding unistd.h

Hello!

I have been sneaking around the i2p project for a while, curiously looking at it in contrast to TOR and other overlay network technologies. Now, after some time, I wanted to look at how I could use i2p myself, and came to libsam. But the first thing I noticed is that you must use MinGW to build for Windows - and I can see why. A lot of POSIX specific APIs are used.

Why, though? The one that sticks out the most to me would be unistd.h. But aside from that, what else really "hinders" a native Win32 build?

I mainly want to use libsam3 with the V language, which uses TCC by default but MSVC or GCC depending on platform and situation (or choice). So having a way to build "natively" would be really useful.

Thank you in advance and kind regards,
Ingwie

Is not support Windows?

Hi! 😄

I just wanna use libsam3.c on D programming language with the C FFI.
But libsam3.c used some POSIX headers(ex. sys/netdb).
Is not any plan for support windows?

Regards,

Implement SAM v3.3

SAM v3.3 enables a single session (and thus Destination) to be used for streams, datagrams and raw simultaneously. This enables applications using the SAM API to maintain a single set of tunnels, and publish a single Destination that can be used for both TCP-like and UDP-like communication over I2P.

Blocks on #1 and #2 because SAM versioning requires that implementations support all features between the minimum and maximum advertised version.

SILENT is not working

I get this

SENDING: STREAM FORWARD ID=KXe1O836ednEUg1eUJf-hHbVDZGSjWH9w3THvi4EJieN-1rlhrQKgUVmMb5R7 PORT=4458 HOST=127.0.0.1 SILENT=���j

Same goes for CONNECT, interestingly only the first call has corrupted data, everything following is just empty:

SENDING: STREAM CONNECT ID=KXe1O836ednEUg1eUJf-hHbVDZGSjWH9w3THvi4EJieN-1rlhrQKgUVmMb5R7 DESTINATION=1e3...A== SILENT=��
SENDING: STREAM CONNECT ID=KXe1O836ednEUg1eUJf-hHbVDZGSjWH9w3THvi4EJieN-1rlhrQKgUVmMb5R7 DESTINATION=3ns...AA== SILENT=
SENDING: STREAM CONNECT ID=KXe1O836ednEUg1eUJf-hHbVDZGSjWH9w3THvi4EJieN-1rlhrQKgUVmMb5R7 DESTINATION=XX...AA== SILENT=
SENDING: STREAM CONNECT ID=KXe1O836ednEUg1eUJf-hHbVDZGSjWH9w3THvi4EJieN-1rlhrQKgUVmMb5R7 DESTINATION=0J...AA== SILENT=
SENDING: STREAM CONNECT ID=KXe1O836ednEUg1eUJf-hHbVDZGSjWH9w3THvi4EJieN-1rlhrQKgUVmMb5R7 DESTINATION=o0...AAA SILENT=

Compilation issues

I'm getting this error message: make: x86_64-w64-mingw32-gcc: Command not found

(base) marco@pc01:~/cpp$ git clone https://github.com/i2p/libsam3.git
Cloning into 'libsam3'...
remote: Enumerating objects: 495, done.
remote: Counting objects: 100% (168/168), done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 495 (delta 66), reused 127 (delta 36), pack-reused 327
Receiving objects: 100% (495/495), 232.88 KiB | 989.00 KiB/s, done. 
Resolving deltas: 100% (209/209), done.

(base) marco@pc01:~/cpp$ cd libsam3/

(base) marco@pc01:~/cpp/libsam3$ cmake .
CMake Error: The source directory "/home/marco/cpp/libsam3" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
(base) marco@pc01:~/cpp/libsam3$ make -j4
cc -Wall -g -O2 -std=gnu99  -c src/libsam3/libsam3.c -o src/libsam3/libsam3.o
cc -Wall -g -O2 -std=gnu99  -c src/libsam3a/libsam3a.c -o src/libsam3a/libsam3a.o
cc -Wall -g -O2 -std=gnu99  -c src/ext/tinytest.c -o src/ext/tinytest.o
cc -Wall -g -O2 -std=gnu99  -c test/test.c -o test/test.o
cc -Wall -g -O2 -std=gnu99  -c test/libsam3/test_b32.c -o test/libsam3/test_b32.o
src/libsam3/libsam3.c: In function ‘sam3GenerateKeys’:
src/libsam3/libsam3.c:709:24: warning: unused variable ‘sigtypes’ [-Wunused-variable]
  709 |     static const char *sigtypes[5] = {
      |                        ^~~~~~~~
At top level:
src/libsam3/libsam3.c:709:24: warning: ‘sigtypes’ defined but not used [-Wunused-variable]
ar -sr libsam3.a src/libsam3/libsam3.o src/libsam3a/libsam3a.o
ar: creating libsam3.a
cc src/ext/tinytest.o test/test.o test/libsam3/test_b32.o libsam3.a -o libsam3-tests
./libsam3-tests
b32/encode: OK
1 tests ok.  (0 skipped)

(base) marco@pc01:~/cpp/libsam3$ make check
./libsam3-tests
b32/encode: OK
1 tests ok.  (0 skipped)


(base) marco@pc01:~/cpp/libsam3/examples/sam3a$ ls -lah
total 36K
drwxrwxr-x 3 marco marco 4,0K apr 22 14:05 .
drwxrwxr-x 4 marco marco 4,0K apr 22 13:12 ..
drwxrwxr-x 2 marco marco 4,0K apr 22 14:04 libsam3a
-rw-rw-r-- 1 marco marco 5,8K apr 22 13:12 test00.c
-rw-rw-r-- 1 marco marco 6,1K apr 22 13:36 test_sc.c
-rw-rw-r-- 1 marco marco 6,8K apr 22 13:12 test_ss.c

When trying to compile the test_sc.c of sam3a I get these errors:

(base) marco@pc01:~/cpp/libsam3/examples/sam3a$ g++ -std=c++17 -I ./libsam3a/ -L /home/marco/cpp/libsam3/libsam3.a 
test_sc.c -o test_sc
/tmp/ccNHvtB7.o: In function `sam3aCreateSession':
test_sc.c:(.text+0x44): undefined reference to `sam3aCreateSessionEx'
/tmp/ccNHvtB7.o: In function `sam3aStreamConnect':
test_sc.c:(.text+0x77): undefined reference to `sam3aStreamConnectEx'
/tmp/ccNHvtB7.o: In function `ccbSent(Sam3AConnection*)':
test_sc.c:(.text+0x1c0): undefined reference to `sam3aSend'
test_sc.c:(.text+0x1fa): undefined reference to `sam3aCancelSession'
test_sc.c:(.text+0x214): undefined reference to `sam3aSend'
test_sc.c:(.text+0x24a): undefined reference to `sam3aCancelSession'
/tmp/ccNHvtB7.o: In function `scbCreated(Sam3ASession*)':
test_sc.c:(.text+0x3ea): undefined reference to `sam3aCancelSession'
test_sc.c:(.text+0x45b): undefined reference to `sam3aCancelSession'
test_sc.c:(.text+0x4c9): undefined reference to `sam3aCancelSession'
/tmp/ccNHvtB7.o: In function `main':
test_sc.c:(.text+0x5c2): undefined reference to `libsam3a_debug'
test_sc.c:(.text+0x632): undefined reference to `sam3aIsActiveSession'
test_sc.c:(.text+0x6a8): undefined reference to `sam3aIsActiveSession'
test_sc.c:(.text+0x6ce): undefined reference to `sam3aAddSessionToFDS'
test_sc.c:(.text+0x705): undefined reference to `sam3ams2timeval'
test_sc.c:(.text+0x7b4): undefined reference to `sam3aIsActiveSession'
test_sc.c:(.text+0x7e1): undefined reference to `sam3aProcessSessionIO'
test_sc.c:(.text+0x7fc): undefined reference to `sam3aCloseSession'
collect2: error: ld returned 1 exit status








(base) marco@pc01:~/cpp/libsam3/examples/sam3a$ clang -v -L. -l/home/marco/cpp/libsam3/sam3.a test_sc.c -o test_sc
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/lib/llvm-6.0/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-
value-names -main-file-name test_sc.c -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-   
verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -v  
  -resource-dir /usr/lib/llvm-6.0/lib/clang/6.0.0 -I/usr/local/include/ -internal-isystem /usr/local/include -internal-isystem /usr/lib
    /llvm-6. 0/lib/clang/6.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include  
    -internal-externc-isystem /usr/include -fdebug-compilation-dir /home/marco/cpp/libsam3/examples/sam3a -ferror-limit 19 
    -fmessage-length 144 -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/test_sc-44a6ba.o -x c 
test_sc.c
    clang -cc1 version 6.0.0 based upon LLVM 6.0.0 default target x86_64-pc-linux-gnu
    ignoring nonexistent directory "/include"
    ignoring duplicate directory "/usr/local/include"
  as it is a non-system directory that duplicates a system directory
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/llvm-6.0/lib/clang/6.0.0/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
 "/usr/bin/ld" -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o test_sc 
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-  
gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/9/crtbegin.o -L. -L/usr/bin/../lib/gcc/x86_64-linux-gnu/9 -L/usr/bin/../lib/gcc/x86_64-
linux-gnu/9/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-
linux-gnu/9/../../.. -L/usr/lib/llvm-6.0/bin/../lib -L/lib -L/usr/lib -l/home/marco/cpp/libsam3/sam3.a /tmp/test_sc-44a6ba.o -lgcc 
--as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib/gcc/x86_64-linux-gnu/9/crtend.o 
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
/usr/bin/ld: cannot find -l/home/marco/cpp/libsam3/sam3.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)

(base) marco@pc01:~/cpp/libsam3/examples/sam3a$ gcc -L. -l /../../sam3.a test_sc.c -o test_sc

What am I missing? How to correctly compile the test_sc.c file ?

  • O.S. : Ubuntu 18.04.4 Desktop
  • gcc version 9.3.0 (Ubuntu 9.3.0-11ubuntu0~18.04.1)

Build fails on macOS: error: unknown type name 'ssize_t'; error: 'SOL_SOCKET' undeclared (first use in this function); etc.

In file included from src/libsam3a/libsam3a.c:12:
src/libsam3a/libsam3a.h:55:46: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
   55 | extern uint64_t sam3atimeval2ms(const struct timeval *tv);
      |                                              ^~~~~~~
src/libsam3a/libsam3a.h:56:36: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
   56 | extern void sam3ams2timeval(struct timeval *tv, uint64_t ms);
      |                                    ^~~~~~~
In file included from src/libsam3/libsam3.c:10:
src/libsam3/libsam3.h:66:8: error: unknown type name 'ssize_t'
   66 | extern ssize_t sam3tcpReceiveEx(int fd, void *buf, size_t bufSize,
      |        ^~~~~~~
src/libsam3/libsam3.h:69:8: error: unknown type name 'ssize_t'
   69 | extern ssize_t sam3tcpReceive(int fd, void *buf, size_t bufSize);
      |        ^~~~~~~
src/libsam3/libsam3.h:293:8: error: unknown type name 'ssize_t'
  293 | extern ssize_t sam3DatagramReceive(Sam3Session *ses, void *buf, size_t bufsize);
      |        ^~~~~~~
src/libsam3/libsam3.h:309:8: error: unknown type name 'ssize_t'
  309 | extern ssize_t sam3Base32Encode(char *dest, size_t destsz, const void *srcbuf,
      |        ^~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpSetTimeoutSend':
src/libsam3/libsam3.c:65:13: warning: implicit declaration of function 'setsockopt' [-Wimplicit-function-declaration]
   65 |     return (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0 ? -1
      |             ^~~~~~~~~~
src/libsam3a/libsam3a.c:53:10: error: conflicting types for 'sam3atimeval2ms'; have 'uint64_t(const struct timeval *)' {aka 'long long unsigned int(const struct timeval *)'}
   53 | uint64_t sam3atimeval2ms(const struct timeval *tv) {
      |          ^~~~~~~~~~~~~~~
src/libsam3a/libsam3a.h:55:17: note: previous declaration of 'sam3atimeval2ms' with type 'uint64_t(const struct timeval *)' {aka 'long long unsigned int(const struct timeval *)'}
   55 | extern uint64_t sam3atimeval2ms(const struct timeval *tv);
      |                 ^~~~~~~~~~~~~~~
src/libsam3/libsam3.c:65:28: error: 'SOL_SOCKET' undeclared (first use in this function)
   65 |     return (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0 ? -1
      |                            ^~~~~~~~~~
src/libsam3a/libsam3a.c:57:6: error: conflicting types for 'sam3ams2timeval'; have 'void(struct timeval *, uint64_t)' {aka 'void(struct timeval *, long long unsigned int)'}
   57 | void sam3ams2timeval(struct timeval *tv, uint64_t ms) {
      |      ^~~~~~~~~~~~~~~
src/libsam3/libsam3.c:65:28: note: each undeclared identifier is reported only once for each function it appears in
src/libsam3a/libsam3a.h:56:13: note: previous declaration of 'sam3ams2timeval' with type 'void(struct timeval *, uint64_t)' {aka 'void(struct timeval *, long long unsigned int)'}
   56 | extern void sam3ams2timeval(struct timeval *tv, uint64_t ms);
      |             ^~~~~~~~~~~~~~~
src/libsam3/libsam3.c:65:40: error: 'SO_SNDTIMEO' undeclared (first use in this function)
   65 |     return (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0 ? -1
      |                                        ^~~~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpSetTimeoutReceive':
src/libsam3/libsam3.c:76:28: error: 'SOL_SOCKET' undeclared (first use in this function)
   76 |     return (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0 ? -1
      |                            ^~~~~~~~~~
src/libsam3/libsam3.c:76:40: error: 'SO_RCVTIMEO' undeclared (first use in this function)
   76 |     return (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0 ? -1
      |                                        ^~~~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpConnectIP':
src/libsam3/libsam3.c:91:22: error: storage size of 'addr' isn't known
   91 |   struct sockaddr_in addr;
      |                      ^~~~
src/libsam3a/libsam3a.c: In function 'sam3aBytesAvail':
src/libsam3a/libsam3a.c:117:7: warning: implicit declaration of function 'ioctl' [-Wimplicit-function-declaration]
  117 |   if (ioctl(fd, FIONREAD, &av) < 0)
      |       ^~~~~
src/libsam3/libsam3.c:98:13: warning: implicit declaration of function 'socket' [-Wimplicit-function-declaration]
   98 |   if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
      |             ^~~~~~
src/libsam3a/libsam3a.c:117:17: error: 'FIONREAD' undeclared (first use in this function)
  117 |   if (ioctl(fd, FIONREAD, &av) < 0)
      |                 ^~~~~~~~
src/libsam3a/libsam3a.c:117:17: note: each undeclared identifier is reported only once for each function it appears in
src/libsam3/libsam3.c:98:20: error: 'AF_INET' undeclared (first use in this function)
   98 |   if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
      |                    ^~~~~~~
src/libsam3a/libsam3a.c: In function 'sam3aResolveHost':
src/libsam3a/libsam3a.c:127:15: warning: implicit declaration of function 'gethostbyname'; did you mean 'gethostname'? [-Wimplicit-function-declaration]
  127 |   if ((host = gethostbyname(hostname)) == NULL || host->h_name == NULL ||
      |               ^~~~~~~~~~~~~
      |               gethostname
src/libsam3/libsam3.c:98:29: error: 'SOCK_STREAM' undeclared (first use in this function)
   98 |   if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
      |                             ^~~~~~~~~~~
src/libsam3a/libsam3a.c:127:13: warning: assignment to 'struct hostent *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
  127 |   if ((host = gethostbyname(hostname)) == NULL || host->h_name == NULL ||
      |             ^
src/libsam3a/libsam3a.c:127:55: error: invalid use of undefined type 'struct hostent'
  127 |   if ((host = gethostbyname(hostname)) == NULL || host->h_name == NULL ||
      |                                                       ^~
src/libsam3a/libsam3a.c:128:12: error: invalid use of undefined type 'struct hostent'
  128 |       !host->h_addr_list[0][0]) {
      |            ^~
src/libsam3a/libsam3a.c:133:33: error: invalid use of undefined type 'struct hostent'
  133 |   return ((struct in_addr *)host->h_addr_list[0])->s_addr;
      |                                 ^~
src/libsam3/libsam3.c:111:9: warning: implicit declaration of function 'getnameinfo' [-Wimplicit-function-declaration]
  111 |     if (getnameinfo((struct sockaddr *)&addr, sizeof(struct sockaddr_in), ipstr,
      |         ^~~~~~~~~~~
src/libsam3/libsam3.c:111:54: error: invalid application of 'sizeof' to incomplete type 'struct sockaddr_in'
  111 |     if (getnameinfo((struct sockaddr *)&addr, sizeof(struct sockaddr_in), ipstr,
      |                                                      ^~~~~~
src/libsam3a/libsam3a.c: In function 'sam3aConnect':
src/libsam3a/libsam3a.c:145:13: warning: implicit declaration of function 'socket' [-Wimplicit-function-declaration]
  145 |   if ((fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0)) < 0)
      |             ^~~~~~
src/libsam3/libsam3.c:112:45: error: 'NI_NUMERICHOST' undeclared (first use in this function)
  112 |                     sizeof(ipstr), NULL, 0, NI_NUMERICHOST) == 0) {
      |                                             ^~~~~~~~~~~~~~
src/libsam3a/libsam3a.c:145:20: error: 'AF_INET' undeclared (first use in this function)
  145 |   if ((fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0)) < 0)
      |                    ^~~~~~~
src/libsam3/libsam3.c:117:18: error: 'SOL_SOCKET' undeclared (first use in this function)
  117 |   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
      |                  ^~~~~~~~~~
src/libsam3a/libsam3a.c:145:29: error: 'SOCK_STREAM' undeclared (first use in this function)
  145 |   if ((fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0)) < 0)
      |                             ^~~~~~~~~~~
src/libsam3/libsam3.c:117:30: error: 'SO_KEEPALIVE' undeclared (first use in this function)
  117 |   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
      |                              ^~~~~~~~~~~~
src/libsam3a/libsam3a.c:145:43: error: 'SOCK_NONBLOCK' undeclared (first use in this function); did you mean 'SIG_UNBLOCK'?
  145 |   if ((fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0)) < 0)
      |                                           ^~~~~~~~~~~~~
      |                                           SIG_UNBLOCK
src/libsam3/libsam3.c:119:7: warning: implicit declaration of function 'connect' [-Wimplicit-function-declaration]
  119 |   if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) {
      |       ^~~~~~~
src/libsam3/libsam3.c:119:52: error: invalid application of 'sizeof' to incomplete type 'struct sockaddr_in'
  119 |   if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) {
      |                                                    ^~~~~~
src/libsam3a/libsam3a.c:145:59: error: 'SOCK_CLOEXEC' undeclared (first use in this function)
  145 |   if ((fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0)) < 0)
      |                                                           ^~~~~~~~~~~~
src/libsam3/libsam3.c:91:22: warning: unused variable 'addr' [-Wunused-variable]
   91 |   struct sockaddr_in addr;
      |                      ^~~~
src/libsam3a/libsam3a.c:148:3: warning: implicit declaration of function 'setsockopt' [-Wimplicit-function-declaration]
  148 |   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
      |   ^~~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpConnect':
src/libsam3/libsam3.c:139:10: warning: implicit declaration of function 'gethostbyname'; did you mean 'gethostname'? [-Wimplicit-function-declaration]
  139 |   host = gethostbyname(hostname);
      |          ^~~~~~~~~~~~~
      |          gethostname
src/libsam3a/libsam3a.c:148:18: error: 'SOL_SOCKET' undeclared (first use in this function)
  148 |   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
      |                  ^~~~~~~~~~
src/libsam3/libsam3.c:139:8: warning: assignment to 'struct hostent *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
  139 |   host = gethostbyname(hostname);
      |        ^
src/libsam3/libsam3.c:140:27: error: invalid use of undefined type 'struct hostent'
  140 |   if (host == NULL || host->h_name == NULL || !host->h_name[0]) {
      |                           ^~
src/libsam3/libsam3.c:140:52: error: invalid use of undefined type 'struct hostent'
  140 |   if (host == NULL || host->h_name == NULL || !host->h_name[0]) {
      |                                                    ^~
src/libsam3/libsam3.c:149:24: error: storage size of 'addr' isn't known
  149 |     struct sockaddr_in addr;
      |                        ^~~~
src/libsam3a/libsam3a.c:148:30: error: 'SO_KEEPALIVE' undeclared (first use in this function)
  148 |   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
      |                              ^~~~~~~~~~~~
src/libsam3a/libsam3a.c:151:24: error: storage size of 'addr' isn't known
  151 |     struct sockaddr_in addr;
      |                        ^~~~
src/libsam3a/libsam3a.c:158:9: warning: implicit declaration of function 'connect' [-Wimplicit-function-declaration]
  158 |     if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) {
      |         ^~~~~~~
src/libsam3/libsam3.c:151:23: error: 'AF_INET' undeclared (first use in this function)
  151 |     addr.sin_family = AF_INET;
      |                       ^~~~~~~
src/libsam3a/libsam3a.c:158:54: error: invalid application of 'sizeof' to incomplete type 'struct sockaddr_in'
  158 |     if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) {
      |                                                      ^~~~~~
src/libsam3/libsam3.c:153:45: error: invalid use of undefined type 'struct hostent'
  153 |     addr.sin_addr = *((struct in_addr *)host->h_addr);
      |                                             ^~
src/libsam3/libsam3.c:155:54: error: invalid application of 'sizeof' to incomplete type 'struct sockaddr_in'
  155 |     if (getnameinfo((struct sockaddr *)&addr, sizeof(struct sockaddr_in), ipstr,
      |                                                      ^~~~~~
src/libsam3a/libsam3a.c:151:24: warning: unused variable 'addr' [-Wunused-variable]
  151 |     struct sockaddr_in addr;
      |                        ^~~~
src/libsam3a/libsam3a.c: In function 'sam3aDisconnect':
src/libsam3a/libsam3a.c:179:5: warning: implicit declaration of function 'shutdown' [-Wimplicit-function-declaration]
  179 |     shutdown(fd, SHUT_RDWR);
      |     ^~~~~~~~
src/libsam3/libsam3.c:156:45: error: 'NI_NUMERICHOST' undeclared (first use in this function)
  156 |                     sizeof(ipstr), NULL, 0, NI_NUMERICHOST) == 0) {
      |                                             ^~~~~~~~~~~~~~
src/libsam3/libsam3.c:149:24: warning: unused variable 'addr' [-Wunused-variable]
  149 |     struct sockaddr_in addr;
      |                        ^~~~
src/libsam3/libsam3.c:162:34: error: invalid use of undefined type 'struct hostent'
  162 |     *ip = ((struct in_addr *)host->h_addr)->s_addr;
      |                                  ^~
src/libsam3/libsam3.c:163:50: error: invalid use of undefined type 'struct hostent'
  163 |   return sam3tcpConnectIP(((struct in_addr *)host->h_addr)->s_addr, port);
      |                                                  ^~
src/libsam3a/libsam3a.c:179:18: error: 'SHUT_RDWR' undeclared (first use in this function)
  179 |     shutdown(fd, SHUT_RDWR);
      |                  ^~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpDisconnect':
src/libsam3/libsam3.c:169:5: warning: implicit declaration of function 'shutdown' [-Wimplicit-function-declaration]
  169 |     shutdown(fd, SHUT_RDWR);
      |     ^~~~~~~~
src/libsam3a/libsam3a.c: In function 'sam3aSendBytes':
src/libsam3a/libsam3a.c:196:14: warning: implicit declaration of function 'send' [-Wimplicit-function-declaration]
  196 |     int wr = send(fd, c, bufSize, MSG_NOSIGNAL);
      |              ^~~~
src/libsam3/libsam3.c:169:18: error: 'SHUT_RDWR' undeclared (first use in this function)
  169 |     shutdown(fd, SHUT_RDWR);
      |                  ^~~~~~~~~
src/libsam3a/libsam3a.c:196:35: error: 'MSG_NOSIGNAL' undeclared (first use in this function)
  196 |     int wr = send(fd, c, bufSize, MSG_NOSIGNAL);
      |                                   ^~~~~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpSend':
src/libsam3/libsam3.c:185:14: warning: implicit declaration of function 'send' [-Wimplicit-function-declaration]
  185 |     int wr = send(fd, c, bufSize, MSG_NOSIGNAL);
      |              ^~~~
src/libsam3/libsam3.c:185:35: error: 'MSG_NOSIGNAL' undeclared (first use in this function)
  185 |     int wr = send(fd, c, bufSize, MSG_NOSIGNAL);
      |                                   ^~~~~~~~~~~~
src/libsam3/libsam3.c: At top level:
src/libsam3/libsam3.c:201:9: error: conflicting types for 'sam3tcpReceiveEx'; have 'ssize_t(int,  void *, size_t,  int)' {aka 'long int(int,  void *, long unsigned int,  int)'}
  201 | ssize_t sam3tcpReceiveEx(int fd, void *buf, size_t bufSize, int allowPartial) {
      |         ^~~~~~~~~~~~~~~~
src/libsam3/libsam3.h:66:16: note: previous declaration of 'sam3tcpReceiveEx' with type 'int(int,  void *, size_t,  int)' {aka 'int(int,  void *, long unsigned int,  int)'}
   66 | extern ssize_t sam3tcpReceiveEx(int fd, void *buf, size_t bufSize,
      |                ^~~~~~~~~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpReceiveEx':
src/libsam3/libsam3.c:209:14: warning: implicit declaration of function 'recv' [-Wimplicit-function-declaration]
  209 |     int rd = recv(fd, c, bufSize, 0);
      |              ^~~~
src/libsam3/libsam3.c: At top level:
src/libsam3/libsam3.c:227:9: error: conflicting types for 'sam3tcpReceive'; have 'ssize_t(int,  void *, size_t)' {aka 'long int(int,  void *, long unsigned int)'}
  227 | ssize_t sam3tcpReceive(int fd, void *buf, size_t bufSize) {
      |         ^~~~~~~~~~~~~~
src/libsam3/libsam3.h:69:16: note: previous declaration of 'sam3tcpReceive' with type 'int(int,  void *, size_t)' {aka 'int(int,  void *, long unsigned int)'}
   69 | extern ssize_t sam3tcpReceive(int fd, void *buf, size_t bufSize);
      |                ^~~~~~~~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpReceiveStr':
src/libsam3/libsam3.c:281:39: error: 'MSG_PEEK' undeclared (first use in this function)
  281 |     int rd = recv(fd, d, maxSize - 1, MSG_PEEK);
      |                                       ^~~~~~~~
src/libsam3/libsam3.c: In function 'sam3udpSendToIP':
src/libsam3/libsam3.c:320:22: error: storage size of 'addr' isn't known
  320 |   struct sockaddr_in addr;
      |                      ^~~~
src/libsam3/libsam3.c:328:20: error: 'AF_INET' undeclared (first use in this function)
  328 |   if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
      |                    ^~~~~~~
src/libsam3/libsam3.c:328:29: error: 'SOCK_DGRAM' undeclared (first use in this function)
  328 |   if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
      |                             ^~~~~~~~~~
src/libsam3/libsam3.c:328:41: error: 'IPPROTO_UDP' undeclared (first use in this function)
  328 |   if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
      |                                         ^~~~~~~~~~~
src/libsam3/libsam3.c:339:9: warning: implicit declaration of function 'sendto' [-Wimplicit-function-declaration]
  339 |   res = sendto(fd, buf, bufSize, 0, (struct sockaddr *)&addr, sizeof(addr));
      |         ^~~~~~
src/libsam3a/libsam3a.c: In function 'genSeed':
src/libsam3a/libsam3a.c:654:18: error: storage size of 'sy' isn't known
  654 |   struct sysinfo sy;
      |                  ^~
src/libsam3/libsam3.c:320:22: warning: unused variable 'addr' [-Wunused-variable]
  320 |   struct sockaddr_in addr;
      |                      ^~~~
src/libsam3a/libsam3a.c:657:3: warning: implicit declaration of function 'sysinfo' [-Wimplicit-function-declaration]
  657 |   sysinfo(&sy);
      |   ^~~~~~~
src/libsam3/libsam3.c: In function 'sam3udpSendTo':
src/libsam3/libsam3.c:368:8: warning: assignment to 'struct hostent *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
  368 |   host = gethostbyname(hostname);
      |        ^
src/libsam3/libsam3.c:369:27: error: invalid use of undefined type 'struct hostent'
  369 |   if (host == NULL || host->h_name == NULL || !host->h_name[0]) {
      |                           ^~
src/libsam3/libsam3.c:369:52: error: invalid use of undefined type 'struct hostent'
  369 |   if (host == NULL || host->h_name == NULL || !host->h_name[0]) {
      |                                                    ^~
src/libsam3a/libsam3a.c:654:18: warning: unused variable 'sy' [-Wunused-variable]
  654 |   struct sysinfo sy;
      |                  ^~
src/libsam3/libsam3.c:376:34: error: invalid use of undefined type 'struct hostent'
  376 |     *ip = ((struct in_addr *)host->h_addr)->s_addr;
      |                                  ^~
src/libsam3/libsam3.c:377:49: error: invalid use of undefined type 'struct hostent'
  377 |   return sam3udpSendToIP(((struct in_addr *)host->h_addr)->s_addr, port, buf,
      |                                                 ^~
src/libsam3a/libsam3a.c: In function 'connDisconnect':
src/libsam3a/libsam3a.c:733:24: error: 'SHUT_RDWR' undeclared (first use in this function)
  733 |     shutdown(conn->fd, SHUT_RDWR);
      |                        ^~~~~~~~~
src/libsam3a/libsam3a.c: In function 'sesDisconnect':
src/libsam3a/libsam3a.c:747:23: error: 'SHUT_RDWR' undeclared (first use in this function)
  747 |     shutdown(ses->fd, SHUT_RDWR);
      |                       ^~~~~~~~~
src/libsam3a/libsam3a.c: In function 'aioLineReader':
src/libsam3a/libsam3a.c:799:15: warning: implicit declaration of function 'recv' [-Wimplicit-function-declaration]
  799 |     if ((rd = recv(fd, aio->data + aio->dataPos, rd, MSG_PEEK)) < 0) {
      |               ^~~~
src/libsam3/libsam3.c: In function 'genSeed':
src/libsam3a/libsam3a.c:799:54: error: 'MSG_PEEK' undeclared (first use in this function)
  799 |     if ((rd = recv(fd, aio->data + aio->dataPos, rd, MSG_PEEK)) < 0) {
      |                                                      ^~~~~~~~
src/libsam3/libsam3.c:614:18: error: storage size of 'sy' isn't known
  614 |   struct sysinfo sy;
      |                  ^~
src/libsam3/libsam3.c:617:3: warning: implicit declaration of function 'sysinfo' [-Wimplicit-function-declaration]
  617 |   sysinfo(&sy);
      |   ^~~~~~~
src/libsam3/libsam3.c:614:18: warning: unused variable 'sy' [-Wunused-variable]
  614 |   struct sysinfo sy;
      |                  ^~
src/libsam3a/libsam3a.c: In function 'aioSesConnected':
src/libsam3a/libsam3a.c:1002:3: error: unknown type name 'socklen_t'
 1002 |   socklen_t len = sizeof(res);
      |   ^~~~~~~~~
src/libsam3a/libsam3a.c:1004:7: warning: implicit declaration of function 'getsockopt'; did you mean 'getsubopt'? [-Wimplicit-function-declaration]
 1004 |   if (getsockopt(ses->fd, SOL_SOCKET, SO_ERROR, &res, &len) == 0 && res == 0) {
      |       ^~~~~~~~~~
      |       getsubopt
src/libsam3a/libsam3a.c:1004:27: error: 'SOL_SOCKET' undeclared (first use in this function)
 1004 |   if (getsockopt(ses->fd, SOL_SOCKET, SO_ERROR, &res, &len) == 0 && res == 0) {
      |                           ^~~~~~~~~~
src/libsam3a/libsam3a.c:1004:39: error: 'SO_ERROR' undeclared (first use in this function)
 1004 |   if (getsockopt(ses->fd, SOL_SOCKET, SO_ERROR, &res, &len) == 0 && res == 0) {
      |                                       ^~~~~~~~
src/libsam3/libsam3.c: At top level:
src/libsam3/libsam3.c:1160:9: error: conflicting types for 'sam3DatagramReceive'; have 'ssize_t(Sam3Session *, void *, size_t)' {aka 'long int(Sam3Session *, void *, long unsigned int)'}
 1160 | ssize_t sam3DatagramReceive(Sam3Session *ses, void *buf, size_t bufsize) {
      |         ^~~~~~~~~~~~~~~~~~~
src/libsam3/libsam3.h:293:16: note: previous declaration of 'sam3DatagramReceive' with type 'int(Sam3Session *, void *, size_t)' {aka 'int(Sam3Session *, void *, long unsigned int)'}
  293 | extern ssize_t sam3DatagramReceive(Sam3Session *ses, void *buf, size_t bufsize);
      |                ^~~~~~~~~~~~~~~~~~~
src/libsam3/libsam3.c:1227:9: error: conflicting types for 'sam3Base32Encode'; have 'ssize_t(char *, size_t,  const void *, size_t)' {aka 'long int(char *, long unsigned int,  const void *, long unsigned int)'}
 1227 | ssize_t sam3Base32Encode(char *dest, size_t destsz, const void *srcbuf,
      |         ^~~~~~~~~~~~~~~~
src/libsam3/libsam3.h:309:16: note: previous declaration of 'sam3Base32Encode' with type 'int(char *, size_t,  const void *, size_t)' {aka 'int(char *, long unsigned int,  const void *, long unsigned int)'}
  309 | extern ssize_t sam3Base32Encode(char *dest, size_t destsz, const void *srcbuf,
      |                ^~~~~~~~~~~~~~~~
src/libsam3a/libsam3a.c: In function 'aioConnConnected':
src/libsam3a/libsam3a.c:1458:3: error: unknown type name 'socklen_t'
 1458 |   socklen_t len = sizeof(res);
      |   ^~~~~~~~~
src/libsam3a/libsam3a.c:1460:28: error: 'SOL_SOCKET' undeclared (first use in this function)
 1460 |   if (getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &res, &len) == 0 && res == 0) {
      |                            ^~~~~~~~~~
src/libsam3a/libsam3a.c:1460:40: error: 'SO_ERROR' undeclared (first use in this function)
 1460 |   if (getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &res, &len) == 0 && res == 0) {
      |                                        ^~~~~~~~
src/libsam3/libsam3.c: In function 'sam3tcpConnect':
src/libsam3/libsam3.c:164:1: warning: control reaches end of non-void function [-Wreturn-type]
  164 | }
      | ^
src/libsam3/libsam3.c: In function 'sam3udpSendTo':
src/libsam3/libsam3.c:379:1: warning: control reaches end of non-void function [-Wreturn-type]
  379 | }
      | ^
src/libsam3a/libsam3a.c: In function 'sam3aResolveHost':
src/libsam3a/libsam3a.c:134:1: warning: control reaches end of non-void function [-Wreturn-type]
  134 | }
      | ^
make: *** [src/libsam3/libsam3.o] Error 1

Implement SAM v3.2

SAM v3.2 added support for:

  • Source and destination ports (inside I2P)
  • Configurable protocol number for raw datagrams
  • Authorization and SSL
  • Concurrent pending STREAM ACCEPTs
  • Session keep-alive.

Blocks on #1 because SAM versioning requires that implementations support all features between the minimum and maximum advertised version.

ERROR: NO KEY FILE! when executing /sam3a/test_sc

(base) marco@pc01:~/cpp/libsam3/examples/sam3a$ cc -Wall -g -O2 -std=gnu99 ../../src/libsam3a/libsam3a.c test_sc.c -o 
test_sc
(base) marco@pc01:~/cpp/libsam3/examples/sam3a$ ls -lah
total 168K
drwxrwxr-x 3 marco marco 4,0K apr 22 16:47 .
drwxrwxr-x 4 marco marco 4,0K apr 22 13:12 ..
drwxrwxr-x 2 marco marco 4,0K apr 22 14:04 libsam3a
-rw-rw-r-- 1 marco marco 5,8K apr 22 13:12 test00.c
-rwxrwxr-x 1 marco marco 132K apr 22 16:47 test_sc
-rw-rw-r-- 1 marco marco 6,1K apr 22 13:36 test_sc.c
-rw-rw-r-- 1 marco marco 6,8K apr 22 13:12 test_ss.c

 (base) marco@pc01:~/cpp/libsam3/examples/sam3a$ ./test_sc
...................
===============================
SESION_CREATED
PRIV:     
         


 PUB:

===============================
ERROR: NO KEY FILE!

===============================
SESION_DISCONNECTED
===============================

===============================
SESION_DESTROYED
===============================

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.