Search in sources :

Example 1 with Errors

use of com.icodici.universa.Errors in project universa by UniversaBlockchain.

the class Contract method addError.

/**
 * Add error to contract
 * @param code error code
 * @param field path to contract field error found in
 * @param text error message
 */
@Override
public void addError(Errors code, String field, String text) {
    Errors code1 = code;
    String field1 = field;
    String text1 = text;
    errors.add(new ErrorRecord(code1, field1, text1));
}
Also used : Errors(com.icodici.universa.Errors)

Example 2 with Errors

use of com.icodici.universa.Errors in project universa by UniversaBlockchain.

the class Contract method verifySealedKeys.

/**
 * Verify signatures in sealed contract (if needed) and forms a map of sealed keys.
 * Errors found can be accessed with {@link #getErrors()}
 *
 * @param isQuantise if needed quantisation verifying signatures
 * @throws Quantiser.QuantiserException when quantas limit was reached during check
 */
public void verifySealedKeys(boolean isQuantise) throws Quantiser.QuantiserException {
    if (sealedBinary == null)
        return;
    if (!isNeedVerifySealedKeys) {
        if (isQuantise)
            // Add key verify quanta again (we just reset quantiser)
            for (PublicKey key : sealedByKeys.keySet()) if (key != null)
                verifySignatureQuantized(key);
        return;
    }
    Binder data = Boss.unpack(sealedBinary);
    if (!data.getStringOrThrow("type").equals("unicapsule"))
        throw new IllegalArgumentException("wrong object type, unicapsule required");
    List signatures = (List) data.getOrThrow("signatures");
    if (signatures.size() == 0)
        return;
    byte[] contractBytes = data.getBinaryOrThrow("data");
    // fill sealedByKeys from signatures matching with roles
    HashMap<Bytes, PublicKey> keys = new HashMap<Bytes, PublicKey>();
    Consumer<Role> extractKeys = role -> {
        RoleExtractor.extractKeys(role).forEach(key -> keys.put(ExtendedSignature.keyId(key), key));
        RoleExtractor.extractAnonymousIds(role).forEach(anonId -> {
            getTransactionPack().getKeysForPack().forEach(key -> {
                try {
                    if (key.matchAnonymousId(anonId.getBytes())) {
                        keys.put(ExtendedSignature.keyId(key), key);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        });
        RoleExtractor.extractKeyAddresses(role).forEach(keyAddr -> {
            getTransactionPack().getKeysForPack().forEach(key -> {
                try {
                    if (key.isMatchingKeyAddress(keyAddr)) {
                        keys.put(ExtendedSignature.keyId(key), key);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        });
    };
    roles.values().forEach(extractKeys);
    state.roles.values().forEach(extractKeys);
    // verify signatures
    for (Object signature : signatures) {
        byte[] s = ((Bytes) signature).toArray();
        PublicKey key = ExtendedSignature.extractPublicKey(s);
        if (key == null) {
            Bytes keyId = ExtendedSignature.extractKeyId(s);
            key = keys.get(keyId);
        }
        if (key != null) {
            if (isQuantise)
                verifySignatureQuantized(key);
            ExtendedSignature es = ExtendedSignature.verify(key, s, contractBytes);
            if (es != null) {
                sealedByKeys.put(key, es);
            } else
                addError(Errors.BAD_SIGNATURE, "keytag:" + key.info().getBase64Tag(), "the signature is broken");
        }
    }
    isNeedVerifySealedKeys = false;
}
Also used : NonNull(org.checkerframework.checker.nullness.qual.NonNull) java.util(java.util) ZonedDateTime(java.time.ZonedDateTime) ObjectDataSequence(org.bouncycastle.asn1.bc.ObjectDataSequence) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Client(com.icodici.universa.node2.network.Client) Binder(net.sergeych.tools.Binder) Ut(net.sergeych.utils.Ut) Yaml(org.yaml.snakeyaml.Yaml) com.icodici.universa.contract.permissions(com.icodici.universa.contract.permissions) com.icodici.universa.contract.roles(com.icodici.universa.contract.roles) Matcher(java.util.regex.Matcher) com.icodici.universa.contract.jsapi(com.icodici.universa.contract.jsapi) NSmartContract(com.icodici.universa.contract.services.NSmartContract) Base64u(net.sergeych.utils.Base64u) PUBLIC_KEY_BI_ADAPTER(com.icodici.crypto.PublicKey.PUBLIC_KEY_BI_ADAPTER) Arrays.asList(java.util.Arrays.asList) Config(com.icodici.universa.node2.Config) Nullable(org.checkerframework.checker.nullness.qual.Nullable) ScriptException(javax.script.ScriptException) ItemResult(com.icodici.universa.node.ItemResult) UnsContract(com.icodici.universa.contract.services.UnsContract) FollowerContract(com.icodici.universa.contract.services.FollowerContract) com.icodici.crypto(com.icodici.crypto) Do(net.sergeych.tools.Do) IOException(java.io.IOException) Quantiser(com.icodici.universa.node2.Quantiser) ClientError(com.icodici.universa.node2.network.ClientError) Bytes(net.sergeych.utils.Bytes) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) ZoneId(java.time.ZoneId) com.icodici.universa(com.icodici.universa) Consumer(java.util.function.Consumer) ChronoZonedDateTime(java.time.chrono.ChronoZonedDateTime) ChronoUnit(java.time.temporal.ChronoUnit) net.sergeych.biserializer(net.sergeych.biserializer) Multimap(net.sergeych.collections.Multimap) FileReader(java.io.FileReader) Pattern(java.util.regex.Pattern) Errors(com.icodici.universa.Errors) SlotContract(com.icodici.universa.contract.services.SlotContract) Boss(net.sergeych.boss.Boss) InputStream(java.io.InputStream) IOException(java.io.IOException) ScriptException(javax.script.ScriptException) IOException(java.io.IOException) Binder(net.sergeych.tools.Binder) Bytes(net.sergeych.utils.Bytes) Arrays.asList(java.util.Arrays.asList)

Aggregations

Errors (com.icodici.universa.Errors)2 com.icodici.crypto (com.icodici.crypto)1 PUBLIC_KEY_BI_ADAPTER (com.icodici.crypto.PublicKey.PUBLIC_KEY_BI_ADAPTER)1 com.icodici.universa (com.icodici.universa)1 com.icodici.universa.contract.jsapi (com.icodici.universa.contract.jsapi)1 com.icodici.universa.contract.permissions (com.icodici.universa.contract.permissions)1 com.icodici.universa.contract.roles (com.icodici.universa.contract.roles)1 FollowerContract (com.icodici.universa.contract.services.FollowerContract)1 NSmartContract (com.icodici.universa.contract.services.NSmartContract)1 SlotContract (com.icodici.universa.contract.services.SlotContract)1 UnsContract (com.icodici.universa.contract.services.UnsContract)1 ItemResult (com.icodici.universa.node.ItemResult)1 Config (com.icodici.universa.node2.Config)1 Quantiser (com.icodici.universa.node2.Quantiser)1 Client (com.icodici.universa.node2.network.Client)1 ClientError (com.icodici.universa.node2.network.ClientError)1 FileReader (java.io.FileReader)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Instant (java.time.Instant)1