Skip to content

Commit

Permalink
feat: WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
solidsnakedev committed Mar 14, 2024
1 parent 97a93b3 commit 2e1f3e2
Show file tree
Hide file tree
Showing 29 changed files with 1,421 additions and 724 deletions.
2 changes: 1 addition & 1 deletion docs/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/** @type {import("eslint").Linter.Config} */
module.exports = {
root: true,
extends: ["@lucid-evolution/eslint-config/next.js"],
extends: ["@anastasia-labs/eslint-config/next.js"],
parser: "@typescript-eslint/parser",
parserOptions: {
project: true,
Expand Down
4 changes: 2 additions & 2 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
},
"devDependencies": {
"@next/eslint-plugin-next": "^14.0.4",
"@lucid-evolution/eslint-config": "workspace:*",
"@lucid-evolution/typescript-config": "workspace:*",
"@anastasia-labs/eslint-config": "workspace:*",
"@anastasia-labs/typescript-config": "workspace:*",
"@types/eslint": "^8.56.1",
"@types/node": "^20.10.6",
"@types/react": "^18.2.46",
Expand Down
2 changes: 1 addition & 1 deletion docs/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"extends": "@lucid-evolution/typescript-config/nextjs.json",
"extends": "@anastasia-labs/typescript-config/nextjs.json",
"compilerOptions": {
"plugins": [
{
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
},
"devDependencies": {
"@changesets/cli": "^2.27.1",
"@lucid-evolution/eslint-config": "workspace:*",
"@lucid-evolution/typescript-config": "workspace:*",
"@anastasia-labs/eslint-config": "workspace:*",
"@anastasia-labs/typescript-config": "workspace:*",
"prettier": "^3.1.1",
"turbo": "latest"
},
Expand Down
2 changes: 1 addition & 1 deletion packages/eslint-config/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@lucid-evolution/eslint-config",
"name": "@anastasia-labs/eslint-config",
"version": "0.1.0",
"private": true,
"files": [
Expand Down
30 changes: 30 additions & 0 deletions packages/message/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "@anastasia-labs/message",
"version": "0.0.1",
"description": "",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"type": "module",
"files": [
"dist"
],
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "tsup-node src/index.ts --format esm,cjs --dts --clean",
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
},
"keywords": [],
"author": "",
"license": "MIT",
"devDependencies": {
"@anastasia-labs/core-types": "workspace:*",
"@anastasia-labs/core-utils": "workspace:*",
"@dcspark/cardano-multiplatform-lib-nodejs": "^5.1.0",
"@emurgo/cardano-message-signing-nodejs": "^1.0.1",
"@types/node": "^20.11.24",
"tsup": "^8.0.2",
"typescript": "^5.3.3"
}
}
1 change: 1 addition & 0 deletions packages/message/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// export * from "./sign_data.js"
161 changes: 161 additions & 0 deletions packages/message/src/sign_data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
import { fromHex, toHex } from "@anastasia-labs/core-utils";
import {
KeyHash,
Payload,
PrivateKey,
SignedMessage,
} from "@anastasia-labs/core-types";
import * as CML from "@dcspark/cardano-multiplatform-lib-nodejs";
import * as M from "@emurgo/cardano-message-signing-nodejs";

export function signData(
addressHex: string,
payload: Payload,
privateKey: PrivateKey,
): SignedMessage {
const protectedHeaders = M.HeaderMap.new();
protectedHeaders.set_algorithm_id(
M.Label.from_algorithm_id(M.AlgorithmId.EdDSA),
);
protectedHeaders.set_header(
M.Label.new_text("address"),
M.CBORValue.new_bytes(fromHex(addressHex)),
);
const protectedSerialized = M.ProtectedHeaderMap.new(protectedHeaders);
const unprotectedHeaders = M.HeaderMap.new();
const headers = M.Headers.new(protectedSerialized, unprotectedHeaders);
const builder = M.COSESign1Builder.new(headers, fromHex(payload), false);
const toSign = builder.make_data_to_sign().to_bytes();

const priv = CML.PrivateKey.from_bech32(privateKey);

const signedSigStruc = priv.sign(toSign).to_raw_bytes();
const coseSign1 = builder.build(signedSigStruc);

const key = M.COSEKey.new(
M.Label.from_key_type(M.KeyType.OKP), //OKP
);
key.set_algorithm_id(M.Label.from_algorithm_id(M.AlgorithmId.EdDSA));
key.set_header(
M.Label.new_int(M.Int.new_negative(M.BigNum.from_str("1"))),
M.CBORValue.new_int(
M.Int.new_i32(6), //M.CurveType.Ed25519
),
); // crv (-1) set to Ed25519 (6)
key.set_header(
M.Label.new_int(M.Int.new_negative(M.BigNum.from_str("2"))),
M.CBORValue.new_bytes(priv.to_public().to_raw_bytes()),
); // x (-2) set to public key

return {
signature: toHex(coseSign1.to_bytes()),
key: toHex(key.to_bytes()),
};
}

export function verifyData(
addressHex: string,
keyHash: KeyHash,
payload: Payload,
signedMessage: SignedMessage,
): boolean {
const cose1 = M.COSESign1.from_bytes(fromHex(signedMessage.signature));
const key = M.COSEKey.from_bytes(fromHex(signedMessage.key));

const protectedHeaders = cose1.headers().protected().deserialized_headers();

const cose1Address = (() => {
try {
return toHex(
protectedHeaders.header(M.Label.new_text("address"))?.as_bytes()!,
);
} catch (_e) {
throw new Error("No address found in signature.");
}
})();

const cose1AlgorithmId = (() => {
try {
const int = protectedHeaders.algorithm_id()?.as_int();
if (int?.is_positive()) return parseInt(int.as_positive()?.to_str()!);
return parseInt(int?.as_negative()?.to_str()!);
} catch (_e) {
throw new Error("Failed to retrieve Algorithm Id.");
}
})();

const keyAlgorithmId = (() => {
try {
const int = key.algorithm_id()?.as_int();
if (int?.is_positive()) return parseInt(int.as_positive()?.to_str()!);
return parseInt(int?.as_negative()?.to_str()!);
} catch (_e) {
throw new Error("Failed to retrieve Algorithm Id.");
}
})();

const keyCurve = (() => {
try {
const int = key
.header(M.Label.new_int(M.Int.new_negative(M.BigNum.from_str("1"))))
?.as_int();
if (int?.is_positive()) return parseInt(int.as_positive()?.to_str()!);
return parseInt(int?.as_negative()?.to_str()!);
} catch (_e) {
throw new Error("Failed to retrieve Curve.");
}
})();

const keyType = (() => {
try {
const int = key.key_type().as_int();
if (int?.is_positive()) return parseInt(int.as_positive()?.to_str()!);
return parseInt(int?.as_negative()?.to_str()!);
} catch (_e) {
throw new Error("Failed to retrieve Key Type.");
}
})();

const publicKey = (() => {
try {
return CML.PublicKey.from_bytes(
key
.header(M.Label.new_int(M.Int.new_negative(M.BigNum.from_str("2"))))
?.as_bytes()!,
);
} catch (_e) {
throw new Error("No public key found.");
}
})();

const cose1Payload = (() => {
try {
return toHex(cose1.payload()!);
} catch (_e) {
throw new Error("No payload found.");
}
})();

const signature = CML.Ed25519Signature.from_raw_bytes(cose1.signature());

const data = cose1.signed_data(undefined, undefined).to_bytes();

if (cose1Address !== addressHex) return false;

if (keyHash !== publicKey.hash().to_hex()) return false;

if (
cose1AlgorithmId !== keyAlgorithmId &&
cose1AlgorithmId !== M.AlgorithmId.EdDSA
) {
return false;
}

if (keyCurve !== 6) return false;

if (keyType !== 1) return false;

if (cose1Payload !== payload) return false;

return publicKey.verify(data, signature);
}
110 changes: 110 additions & 0 deletions packages/message/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */

/* Projects */
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */

/* Language and Environment */
"target": "esnext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */

/* Modules */
"module": "nodenext", /* Specify what module code is generated. */
"rootDir": "src", /* Specify the root folder within your source files. */
"moduleResolution": "nodenext", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
"resolveJsonModule": true, /* Enable importing .json files. */
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */

/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */

/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
"outDir": "dist", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */

/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */

/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */

/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
},
"include": ["./src/**/*"]
}
1 change: 1 addition & 0 deletions packages/plutus/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"license": "MIT",
"devDependencies": {
"@anastasia-labs/core-types": "workspace:*",
"@anastasia-labs/core-utils": "workspace:*",
"@dcspark/cardano-multiplatform-lib-nodejs": "^5.1.0",
"@sinclair/typebox": "^0.32.15",
"@types/node": "^20.11.24",
Expand Down
2 changes: 1 addition & 1 deletion packages/plutus/src/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
} from "@sinclair/typebox";
export * from "@sinclair/typebox";
import { Datum, Exact, Json, Redeemer } from "@anastasia-labs/core-types";
import { fromHex, fromText, toHex } from "../utils/utils.js";
import { fromHex, fromText, toHex } from "@anastasia-labs/core-utils";
import * as CML from "@dcspark/cardano-multiplatform-lib-nodejs";

export class Constr<T> {
Expand Down
2 changes: 1 addition & 1 deletion packages/plutus/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// export * from "./data.js"
export * from "./data.js"
export * from "./time.js";
Loading

0 comments on commit 2e1f3e2

Please sign in to comment.