Giter VIP home page Giter VIP logo

jerson / react-native-fast-rsa Goto Github PK

View Code? Open in Web Editor NEW
31.0 4.0 11.0 178.82 MB

RSA for react native made with golang for fast performance

Home Page: https://www.npmjs.com/package/react-native-fast-rsa

License: MIT License

Java 3.52% Objective-C 1.08% Ruby 1.78% TypeScript 70.96% JavaScript 7.79% Shell 1.44% Makefile 0.08% CMake 0.36% C++ 4.61% Kotlin 1.33% C 5.04% Swift 0.03% Objective-C++ 1.98%
rsa golang react-native fast crypt autolink react xcode oaep pkcs15

react-native-fast-rsa's Introduction

react-native-fast-rsa

Android iOS

Getting started

$ npm install react-native-fast-rsa --save

JSI

If you want to use with JSI instead of NativeModules you need to set

import RSA from "react-native-fast-rsa";

RSA.useJSI = true;

if you need to use generate methods it is a good idea to disable it, because for now JSI will block your UI but it is faster compared to NativeModules

Usage

export interface PCKS12KeyPair {
  publicKey: string;
  privateKey: string;
  certificate: string;
}
export interface KeyPair {
  publicKey: string;
  privateKey: string;
}

export enum Hash {
  MD5 = 0,
  SHA1 = 1,
  SHA224 = 2,
  SHA256 = 3,
  SHA384 = 4,
  SHA512 = 5,
}

export enum PEMCipher {
  DES = 0,
  D3DES = 1,
  AES128 = 2,
  AES192 = 3,
  AES256 = 4,
}

export enum SaltLength {
  AUTO = 0,
  EQUALS_HASH = 1,
}

class RSA {
  static convertJWKToPrivateKey(data: any, keyId: string): Promise<string>
  static convertJWKToPublicKey(data: any, keyId: string): Promise<string>

  static convertKeyPairToPKCS12(privateKey: string, certificate: string, password: string): Promise<string>
  static convertPKCS12ToKeyPair(pkcs12: string, password: string,): Promise<PCKS12KeyPair>

  static convertPrivateKeyToPKCS8(privateKey: string,): Promise<string>
  static convertPrivateKeyToPKCS1(privateKey: string): Promise<string>
  static convertPrivateKeyToJWK(privateKey: string): Promise<any>
  static convertPrivateKeyToPublicKey(privateKey: string): Promise<string>

  static convertPublicKeyToPKIX(publicKey: string): Promise<string>
  static convertPublicKeyToPKCS1(publicKey: string): Promise<string>
  static convertPublicKeyToJWK(publicKey: string): Promise<any>

  static decryptPrivateKey(privateKeyEncrypted: string, password: string,): Promise<string>
  static encryptPrivateKey(privateKey: string, password: string, cipherName: Cipher): Promise<string>

  static decryptOAEP(message: string, label: string, hashName: Hash, privateKey: string): Promise<string>
  static decryptPKCS1v15(message: string, privateKey: string,): Promise<string>

  static encryptOAEP(message: string,label: string, hashName: Hash, publicKey: string): Promise<string>
  static encryptPKCS1v15(message: string, publicKey: string): Promise<string>

  static signPSS(message: string, hashName: Hash, saltLengthName: SaltLength, privateKey: string): Promise<string>
  static signPKCS1v15(message: string, hashName: Hash, privateKey: string): Promise<string>

  static verifyPSS(signature: string, message: string, hashName: Hash, saltLengthName: SaltLength, publicKey: string): Promise<boolean>
  static verifyPKCS1v15(signature: string, message: string, hashName: Hash, publicKey: string): Promise<boolean>

  static hash(message: string, name: Hash): Promise<string>
  static base64(message: string): Promise<string>

  static generate(bits: number): Promise<KeyPair>
}

Native Code

the native library is made in Golang for faster performance

https://github.com/jerson/rsa-mobile

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT

react-native-fast-rsa's People

Contributors

jerson avatar lauraklipfel avatar ngregory-rbi avatar shwetalii 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

Watchers

 avatar  avatar  avatar  avatar

react-native-fast-rsa's Issues

response on .decryptOAEP() padded with nonsense

v2.3.6
RN 4.10.0

when provided an input, the output is unexpectedly longer (and incorrect), but decryption does not appear to fail. Cipher selection: RSA/ECB/OAEPWithSHA-256AndMGF1Padding

encrypted input (b64):

QK5pP83ZaaHF+HOr8XAZ6kXyFvSCQWEKlGgEdEQbCvpEa4rq57poO38+gBYXOtrsvTtxOKAbW96Fgybr
VRdrW95IkyqUN121FuiHBCkhSUNav188KYKqmZEj4Kf+V7h9pljtQrcxaVNp9nOSfGyO70v18ATOuSlU
EP0QiJVsynnuf7t+SQTNuSHqSjAnoQcu9/KsZFakfRSETg6Z1FuNeex3hkOhRl2K3fVhhZsQsEAW1KKr
P2ONHEtoSlV09CWpaTlx9nEnmNovh/1FAuHZ7+Nu2UqQKKT+rpa8kaij2Ks7Fb87uhZRnA8gU+APcMnH
Bfca+GHMvMX7jJQuOujSiA==

key (RSA-2048):

MIIEpAIBAAKCAQEAqINTkDRjJ3dtq28jbWJaUhIWN4OKaLj50D6V0bDkspXDgviLf2ZvEfmg6DlrplVl
4156lDojylFvpuNDEC9YItcuVD43095mvmho/LOypLcwx1RKN6etY5RYX1YZC0si9qsDMgElZUrTEwXe
EYaYLS5VG+uOixxa94f1seEy9usLd8ISMzcb0sEvurZTx6hBwE61R9slJTlL7paWvJ6vbnaUEDyo7uLN
qsyl0158wfHRFJJ9itA689Yk3cEZL50IBMpShmu7flqxXbKQGSu8Vcw1zLIrSruvUuUD+w2SZVY3Kj3W
9bQm+OW6DY2llB7/mTApo2yNoS3mS8hOeZhVIQIDAQABAoIBAAdqii+vQore3G5+TGiYusFgZuZoDVwZ
AfOKgZTyLEp4wVs+/YKsmyhHHHAD8Osn2H1Wb94cpe0WQuvtFgs9DiuwXStbdqEGKW7pUO+IKA1MO6MW
IFMNN9oJUg9WDnGbC62f7prRhpgL4Di22iRa0FEyuA+rwQD5zT4WF3fN4ayQrrmQaiLAYw0QvYZQDl7J
K4ocQbVjgB7cHmPjB8G/zFKZhHwgLrYwDEnL7mz5f2t2aMLrURovc1Opnwgk14SqdUGpJ1XMPE6TIzxa
TPdqncGBpwTTspr5iJqvriYW2GjAT72HIXy3t3BpBOJt4P5A7D0p9jTHJQRY+1QFgcr9Ec0CgYEA5J2H
sYV1HPKoolvYhvFYXkTLTqDn9rKnHJP4MxTTQcSstjCgzAuDN7TlrXo5csNC6t7AElO22wPWwiEL9dM/
O5VEQ0V/3+veABp6dIRh+TTKR6miNQ9UNrUjCdhrOW40FX23oEZIFMpstId8/yA81oXVenda//uxhHDe
1nJac/UCgYEAvLLDRNxPLr4ICQcfPiw/kplgUDSn0z0vIZLl9bQ3Q0pX9eoF5gqxORbViBmZzzfsz2oo
9LN3aaV9bUaarINmWTH0slm+vLk2b2eyCGPlulS9RhNgmrrCazdqssWu1yBMIxBdvRmxEP6GZdpROn01
4cuZDFi/zaQ+TXwiFzdLTP0CgYAEVukoeXwLnJ+O1Wd6yEIBKBUj3PIKQMHjTPu9HHwWF4Gfw7SJqv5G
pGxnqpZEk2hFxQyoTGaAKcZ90NrFQ8lDfEXbcQpIWdXQ8q+4XnrtnA7q5VFq6GuUzkNoAG+om2rprYU6
yZq8qkr98kRxI0+EUu4GcRWNHl30QaA5Odp1sQKBgQCK+e4vbUM0Xel1HLW6CMTZp/TznZRtVAa+Z37O
s+hvuvWFvNKTVxSnw1WJY7GQmNPk/38imns8aBI0xWdt32kmEFD0enysaozZCDprS4gK8BZm4iaoTxyZ
8rq26DmZX8Qznv4rJBzxM0SxB1YECewBXP5fxY2eW3U3hFFnX+Yp0QKBgQDbY41wFkswdz9BnzRF25eM
lBQnAjbXnO93FWWtexPXzLmqXJOt4lgF2YTv6YlosS5zrAGhaDHCZTiPrajqILeheS4RmYyzm6UvI2w6
QJ9NbxR/6plxTdCuhuL8JTBIakjRNAWWQa2l71rDvOeMvkh8ES00We9PRLTyG3iMruasEA==

expected output (b64):

lhbURqJZxnDN8W7X6G3GB2msDEP0wJlwnKSu1l/Ddxc=

can be checked via:

cat data | base64 -d | openssl pkeyutl -inkey key \
    -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -decrypt | base64

error seen when calling:

RSA.decryptOAEP(input, '', Hash.SHA256, privateKey)
        .then((res: string) => {
            console.debug(`res_length:${res.length}`);
            console.debug(`res_b64:${Buffer.from(res).toString('base64')}`);
        });

gives output:

 DEBUG  res_length:23
 DEBUG  res_b64:wpYW1IbColnGsM2xbteobcaHacKsDEP0gJmwwpzCpMKu1p/Dtxc=

but at byte level, the outputs are very similar:

01 [correct]: 96 16 d4 46 a2 59 c6 70 cd f1 6e d7 e8 6d c6 07 69 ac 0c 43 f4 c0 99 70 9c a4 ae d6 5f c3 77 17
02 [incorrect]: c2 96 16 d4 86 c2 a2 59 c6 b0 cd b1 6e d7 a8 6d c6 87 69 c2 ac 0c 43 f4 80 99 b0 c2 9c c2 a4 c2 ae d6 9f c3 b7 17

(byte-diff in cyberchef)

wondering if it's an encoding issue creeping in somewhere?

Android not able to open app in debug mode

Hi, I am not able to open app debug mode in android when I start debugging in the app, app automatically close but it works fine when I disable debug mode and also works fine in ios debug mode and without debug mode. can you please help me find the solution

Direct local .aar file dependencies are not supported when building an AAR

I recently upgraded my app project from react native 0.67.4 to react native 0.68.3 and now when I assembleRelease it, I get:

  • What went wrong:
    Execution failed for task ':react-native-fast-rsa:bundleReleaseLocalLintAar'.

Error while evaluating property 'hasLocalAarDeps' of task ':react-native-fast-rsa:bundleReleaseLocalLintAar'
Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken because the classes and Android resources from any local .aar file dependencies would not be packaged in the resulting AAR. Previous versions of the Android Gradle Plugin produce broken AARs in this case too (despite not throwing this error). The following direct local .aar file dependencies of the :react-native-fast-rsa project caused this error: /Users/nahuelprinsich/Documents/Proyectos/mobile-client/node_modules/react-native-fast-rsa/android/libs/Rsa.aar

I tried copy the Rsa.aar file to a lib folder an import in build.gradle but nothing work.

how can i use this library?

there is no example.

i'm using expo framework, this library looks so good.

import RSA from "react-native-fast-rsa";

const somenamefunction = async () => {
const result = await RSA.generate(512)
console.log(result)
}
in useeffect and onPress
is not working. did i some thing wrong?

Encoding Uint8Array to message string

Hi, I'm having a little trouble converting my data to use in the RSA.signPSS function. I've worked out that the signature parameter should be a base64 string, but I can't work out how to encode the message parameter when trying to sign arbitrary Uint8Array data. I've tried Buffer.from(messageBytes).toString() and B64js.fromByteArray(messageBytes) but neither seem to work.

TL;DR Could someone help me with handling signing of Uint8Array messages?

Error with react-native link

I try to run react-native link react-native-fast-rsa and I get the following error. If I instead ignore the error and try to react-native run-android I get the same error come up again.

error EPERM: operation not permitted, scandir 'C:/path/to/react-native-app/node_modules/react-native-fast-rsa/ios/Rsa.framework/Headers'.

This is preventing me from running my application and from using this package.

  • OS: windows
  • Node.js v14.7.0

docs: you need admin privs on windows to install

On windows it appears that you need admin privileges to install this package, I suggest you add a note about that to the readme. This appears to be because symlinks require admin privileges on Windows.

Potential fix for Hermes + Android crashes with react-native-fast-rsa

Hi! ๐Ÿ‘‹

Firstly, thanks for your work on this project! ๐Ÿ™‚

Today I used patch-package to patch [email protected] for the project I'm working on.

Here is the diff that solved my problem:

diff --git a/node_modules/react-native-fast-rsa/android/src/main/java/com/reactnativefastrsa/FastRsaModule.kt b/node_modules/react-native-fast-rsa/android/src/main/java/com/reactnativefastrsa/FastRsaModule.kt
index 8a03f79..71ae0da 100644
--- a/node_modules/react-native-fast-rsa/android/src/main/java/com/reactnativefastrsa/FastRsaModule.kt
+++ b/node_modules/react-native-fast-rsa/android/src/main/java/com/reactnativefastrsa/FastRsaModule.kt
@@ -62,7 +62,9 @@ internal class FastRsaModule(reactContext: ReactApplicationContext) :
 
     override fun initialize() {
         super.initialize()
-        initialize(this.reactApplicationContext.javaScriptContextHolder.get())
+        reactApplicationContext.runOnJSQueueThread {
+          initialize(this.reactApplicationContext.javaScriptContextHolder.get())
+        }
     }
 
     override fun onCatalystInstanceDestroy() {

This issue body was partially generated by patch-package.

I am encountering issues with the heremes engine(Android). Once remove this library i am able to run the app

2022-04-28 17:41:42.762 14139-14139/? A/DEBUG:       #01 pc 000000000004d6a0  /data/app/~~F0HRFT9qEER4Bn1BiMpn_Q==/com.singlife.mobile-PBFjK9LYZj4tC91sqlePbw==/lib/arm64/libfast-rsa.so (fastRSA::install(facebook::jsi::Runtime&)+400) (BuildId: 67d2fe1a04e902d28e26c0b4ac92f38983823823)
2022-04-28 17:41:42.762 14139-14139/? A/DEBUG:       #02 pc 00000000000504ec  /data/app/~~F0HRFT9qEER4Bn1BiMpn_Q==/com.singlife.mobile-PBFjK9LYZj4tC91sqlePbw==/lib/arm64/libfast-rsa.so (Java_com_reactnativefastrsa_FastRsaModule_initialize+60) (BuildId: 67d2fe1a04e902d28e26c0b4ac92f38983823823)
2022-04-28 17:41:42.763 14139-14139/? A/DEBUG:       #10 pc 0000000000cf8e4c  /data/app/~~F0HRFT9qEER4Bn1BiMpn_Q==/com.singlife.mobile-PBFjK9LYZj4tC91sqlePbw==/oat/arm64/base.vdex (com.reactnativefastrsa.FastRsaModule.initialize+40)

Expo EAS Build - "CMake '3.18.1' found in SDK did not satisfy requested version"

Expo: Attempting to create a development build with eas build --platform android --profile development produces the following error:

[stderr] 
[CXX1300] CMake '3.10.2' was not found in SDK, PATH, or by cmake.dir property.
[stderr] 
[CXX1301] - CMake '3.18.1' found in SDK did not satisfy requested version.
[stderr] 
[CXX1300] CMake '3.10.2' was not found in SDK, PATH, or by cmake.dir property.
[stderr] 
[CXX1301] - CMake '3.18.1' found in SDK did not satisfy requested version.
[stderr] 
FAILURE: Build failed with an exception.
[stderr] 
* What went wrong:
[stderr] 
A problem occurred configuring project ':react-native-fast-rsa'.
[stderr] 
> [CXX1300] CMake '3.10.2' was not found in SDK, PATH, or by cmake.dir property.

eas.json is boilerplate, and has worked fine when creating dev builds to support other packages that use native modules:

{
    "cli": {
        "version": ">= 3.12.1"
    },
    "build": {
        "development": {
            "developmentClient": true,
            "distribution": "internal"
        },
        "preview": {
            "distribution": "internal"
        },
        "production": {}
    },
    "submit": {
        "production": {}
    }
}

Not sure what to do here, since EAS manages CMake and doesn't seem to allow pinning it to a specific version. Tried to force EAS to install CMake 3.10.2 with a pre-install hook, without success.

App transitions to background when executing decryptPrivateKey

Hi all,
I am trying to use decryptPrivateKey. However, whenever I fire it (with an await construct), my app goes to background. Actually, it probably goes to pause (I see it in overview on Android) since a console.log immediately following the statement (and in the catch statement) never fires.

For testing, just before the decryptPrivateKey call I did a await RSA.generate(2048), which works as expected.

I made sure to have RSA.useJSI = false; just to be sure.

On resuming the App the bundle gets reloaded and the App starts over. But this is probably out of scope here...

The code is this

import RSA from 'react-native-fast-rsa';
export async function test(encryptedRSAKey, password) {
  try {
    debugger;
    const key = await RSA.generate(2048);
    debugger;
    let result = '';
    result = await RSA.decryptPrivateKey(encryptedRSAKey, password)
    console.log('Done')
    return result;
  } catch(error) {
    console.log ('Failed to extract / unlock the RSA Private key - ' + error)
    throw error;
  } 
}

[ios]: Multiple commands produce

I got an issue when running the command: xcodebuild archive!

โŒ  error: Multiple commands produce '/Users/teammobile/Library/Developer/Xcode/DerivedData/app-bjmyswgopqbdlkakulhumanlxapx/Build/Intermediates.noindex/ArchiveIntermediates/app_staging/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/react_native_fast_rsa.framework/Headers/librsa_bridge.h'

Thanks.

Windows build error try with development mode and with admin previlages did not work

`* What went wrong:
Execution failed for task ':react-native-fast-rsa:generateJsonModelDebug'.

D:\Private\React-Native\test\node_modules\react-native-fast-rsa\android\CMakeLists.txt : C/C++ debug|armeabi-v7a : CMake Error at D:\Private\Reac
t-Native\test\node_modules\react-native-fast-rsa\android\CMakeLists.txt:14 (add_library):
Syntax error in cmake code when parsing string

  D:\Private\React-Native\test\android/../node_modules/react-native/ReactCommon/jsi/jsi/jsi.cpp

Invalid character escape '\P'.`

Cannot find source file jsi.cpp in monorepo with hoisted packages

Hello, i have a monorepo where i use expo(SDK 51) in local app development.

Because this recomendation i have node-linker=hoisted in my .npmrc.

Running npx expo run:android then results in this error message:
`CMake Error at CMakeLists.txt:18 (add_library):
Cannot find source file:

  /Users/ecsilveira/Desktop/www/my-project/examples/expo/node_modules/react-native/ReactCommon/jsi/jsi/jsi.cpp

Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm .h
.hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .hip .ispc

CMake Error at CMakeLists.txt:18 (add_library):
No SOURCES given to target: fast-rsa`

The react native package is not inside expo/node_modules, but my-project/node_modules.

Removing node-linker=hoisted results in correct compilation but the app crashes immediately.

I'm currently attempting to resolve the issues created by remover the hoisted behavior, but i`d like to ask if anyone has any suggestions.

Thanks.

Cannot read property 'call' of null

When I try to use any method. For example:

const generate = async () => {
const result = await RSA.generate(512);
console.log('THIS IS THE RESULT: ', result);
};

I have the error: Cannot read property 'call' of null.

Do you know what is the issue?

library 'react-native-fast-rsa' not found

Attempting to build for ios with Xcode 15 fails, with error library 'react-native-fast-rsa' not found.
The build is successful for android.
The build get successful when I remove react-native-fast-rsa.
Are there any other installation steps for ios?

question: what is public exponent / salt length?

I am having problems importing a key created with this library externally and I think this is because the public exponents differ (in my case I am using 65537), or because the salt length differs (mine is 32).

What public exponent do you use?

What value corresponds to the auto salt length?

Update repo with latest version of rsa-mobile

is this repo using the latest version of rsa-mobile

static encryptOAEP(message: string, label: string, hashName: RSAHash, pkcs12: string, passphrase: string): Promise<string>;

the latest rsa-mobile code doesn't not seem to have the passphrase?

Can you additionally add some example call specifically for the above mentioned function?

we get the following error when we pass the public RSA key to the function

pkcs12: error reading P12 data: asn1: structure error: tags don't match (2 vs {class:0 tag:16 length:13 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} int @2" UserInfo={NSLocalizedDescription=pkcs12: error reading P12 data: asn1: structure error: tags don't match (2 vs {class:0 tag:16 length:13 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} int @2}

Thanks

RSA-OAEP Encrypt and decrypt issues with specifying the correct HASH type

Hi,

so background

I have a server that uses openSSL (in fact libcrypto) to perform various RSA operations. The very first thing is to encrypt something using a public key provided by a client. For the last 2 years, I have a Webapp, using the Webcrypto API, that fully interoperates with the server. Both the server and Webapp are using RSA-OAEP with SHA-1 (not sure what is the MGF is used by presumably it is MGF1 for both).

I now have the need to create a mobile app and I decided to use react-native.

Main problem
My react-native app fails at decrypting the reply from the server... :-(

So I decided to create a test harness that I could run in both the Webapp and in the react-native app. The data set provides a key pair (in PEM format), a cipher text and the expected clear text per set. I have multiple sets, some generated with react-native-fast-rsa and other with the openSSL cipher text (and corresponding keys).

On a per data set, the test does this:

  1. validates the key pair by encrypting 'Hello' and decrypting it.
  2. try to decrypt the provided cipher text and, on success, validate the result with the expected clear text

Over time I came to realize that the issue was probably related to the HASH selection.

HASH related problem / observation
The following tests / observations are made using a data set that provides a cipher text generated with react-native-fast-rsa (encryptOAEP using SHA1 and no label)

  1. During the key pair validation phase, the result is always successful regardless of the hash name provided to encrypt and decrypt, even if the hash name is invalid (I use the string value '1' and well as the integer 1)
  2. When decrypting the provided cipher text, decryption fails if the hash name is '1' but succeeds for ALL valid hash name (actually I tested with SHA1, SHA256 and SHA512) as well as with the integer 1. In other words, if a valid hash name is provided (or the numeral 1), decryptOAEP decrypts the same cipher text using different hash, which is a non-sense.

I am using a debugger so RSA.useJSI = false;

At this stage, I do not what is going on. And more specifically, which HASH is effectively used. It appears that it is not SHA1since interoperation with OpenSSL and Webcrypto is broken.

Any suggestion?

Cannot decrypt using PrivateKey generated with Node-RSA

Hi, I tried decrypting an encrypted string sent to the client-side using a privateKey generated using Node-RSA on the server-side with decryptPKCS1v15(message, privateKey) and I got a Error: stringResponse: crypto/rsa: decryption error PrivateKey is a PEM string and crypto was gotten from browserify, pls what am I missing. Meanwhile the privateKey works fine with Node-RSA just that it is slow decrypting small size of data

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.